Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 22 additions & 5 deletions packages/core/src/terminal/LayerManager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -313,19 +313,36 @@ describe('LayerManager - Resize', () => {
expect(layer.cells[0].length).toBe(20);
});

it('clears dirty regions on resize', () => {
it('marks entire layer as dirty on resize so it is recomposited', () => {
const lm = new LayerManager(10, 10);

const layer = lm.createLayer('base', 0);

lm.setCell('base', 1, 1, {
char: 'A',
lm.resize(20, 15);

expect(layer.dirtyRegion).toEqual({
x: 0,
y: 0,
width: 20,
height: 15,
});
});

expect(layer.dirtyRegion).not.toBeNull();
it('composites layer content after resize', () => {
const lm = new LayerManager(10, 10);
const layer = lm.createLayer('overlay', 100);
lm.setCell('overlay', 1, 1, { char: 'X' });

// Resize should set dirtyRegion to full area
lm.resize(20, 15);

expect(layer.dirtyRegion).toBeNull();
// Write to the new size
lm.setCell('overlay', 10, 5, { char: 'Y' });

const screen = new Screen(20, 15);
lm.composite(screen);
Comment thread
coderabbitai[bot] marked this conversation as resolved.

// Content written after resize should appear
expect(screen.back[5][10].char).toBe('Y');
});
});
2 changes: 1 addition & 1 deletion packages/core/src/terminal/LayerManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ export class LayerManager {

for (const layer of this._layers.values()) {
layer.cells = this._createGrid();
layer.dirtyRegion = null;
layer.dirtyRegion = { x: 0, y: 0, width: cols, height: rows };
}

this._allocateHitGrids();
Expand Down
22 changes: 22 additions & 0 deletions packages/core/src/terminal/Screen.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,28 @@ describe('Screen', () => {
expect(screen.front[0][0].char).toBe('\0');
});

it('resize resets all ancillary state', () => {
const screen = new Screen(10, 5);

// Set up some state
screen.pushClip({ x: 0, y: 0, width: 5, height: 3 });
screen.pushTranslateY(2);
screen.writeAnsi('\x1b[31m');
screen.applyBackdropFilter({ x: 0, y: 0, width: 3, height: 3 });

// Resize
screen.resize(20, 10);

expect(screen.cols).toBe(20);
expect(screen.rows).toBe(10);
expect(screen.activeClip).toBeNull();
expect(screen.drainAnsiQueue()).toBe('');
expect(screen.getPreviousLine(0)).toBe('');
// Write after resize and verify it lands correctly (no stale clip/translate)
screen.setCell(15, 8, { char: 'Z' });
expect(screen.back[8][15].char).toBe('Z');
});
Comment thread
ionfwsrijan marked this conversation as resolved.

it('writeString applies style attributes (bold, fg)', () => {
const screen = new Screen(10, 5);
screen.writeString(0, 0, 'Hi', { bold: true, fg: { type: 'named', name: 'red' } });
Expand Down
8 changes: 8 additions & 0 deletions packages/core/src/terminal/Screen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,14 @@ export class Screen {
this.front = this._createGrid(cols, rows);
this.back = this._createGrid(cols, rows);
this._previousLines = [];
this._previousStyleLines = [];
this._clipStack = [];
this._translateYStack = [];
this._translateY = 0;
this._ansiQueue = [];
this._flushEpoch = -1;
this._swapping = false;
this._backdropFilters = [];
}

/**
Expand Down
Loading