From 57b48f60480f77d39c605289c9902d08e5921103 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 27 May 2026 21:28:36 +0000 Subject: [PATCH 1/2] Allow markers on alt buffer in headless terminal Remove the alt-buffer guard in headless registerMarker so behavior matches the browser terminal. Update headless public API and typings to return IMarker instead of IMarker | undefined. Co-authored-by: Daniel Imms --- src/headless/Terminal.ts | 7 +------ src/headless/public/Terminal.test.ts | 17 +++++++++++++---- src/headless/public/Terminal.ts | 4 ++-- typings/xterm-headless.d.ts | 9 +++------ 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/headless/Terminal.ts b/src/headless/Terminal.ts index e53c00fbb..a348ae824 100644 --- a/src/headless/Terminal.ts +++ b/src/headless/Terminal.ts @@ -69,12 +69,7 @@ export class Terminal extends CoreTerminal { return this.buffer.markers; } - public registerMarker(cursorYOffset: number): IMarker | undefined { - // Disallow markers on the alt buffer - if (this.buffer !== this.buffers.normal) { - return; - } - + public registerMarker(cursorYOffset: number): IMarker { return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset); } diff --git a/src/headless/public/Terminal.test.ts b/src/headless/public/Terminal.test.ts index 0c4739744..73e2f4865 100644 --- a/src/headless/public/Terminal.test.ts +++ b/src/headless/public/Terminal.test.ts @@ -120,10 +120,10 @@ describe('Headless API Tests', function (): void { await writeSync('\n\rtest' + i); } const markers = [ - term.registerMarker(1)!, - term.registerMarker(2)!, - term.registerMarker(3)!, - term.registerMarker(4)! + term.registerMarker(1), + term.registerMarker(2), + term.registerMarker(3), + term.registerMarker(4) ]; let disposeCount = 0; for (const marker of markers) { @@ -419,6 +419,15 @@ describe('Headless API Tests', function (): void { strictEqual(term.buffer.normal.getLine(0)!.translateToString(), 'norm '); strictEqual(term.buffer.alternate.getLine(0), undefined); }); + + it('registerMarker on alternate buffer', async () => { + term = new Terminal({ cols: 5, allowProposedApi: true }); + await writeSync('\x1b[?47h'); + const marker = term.registerMarker(0); + strictEqual(term.buffer.active.type, 'alternate'); + strictEqual(term.markers.length, 1); + strictEqual(term.markers[0], marker); + }); }); describe('modes', () => { diff --git a/src/headless/public/Terminal.ts b/src/headless/public/Terminal.ts index 87eaf3976..d593dea15 100644 --- a/src/headless/public/Terminal.ts +++ b/src/headless/public/Terminal.ts @@ -130,11 +130,11 @@ export class Terminal extends Disposable implements ITerminalApi { this._verifyIntegers(columns, rows); this._core.resize(columns, rows); } - public registerMarker(cursorYOffset: number = 0): IMarker | undefined { + public registerMarker(cursorYOffset: number = 0): IMarker { this._verifyIntegers(cursorYOffset); return this._core.registerMarker(cursorYOffset); } - public addMarker(cursorYOffset: number): IMarker | undefined { + public addMarker(cursorYOffset: number): IMarker { return this.registerMarker(cursorYOffset); } public dispose(): void { diff --git a/typings/xterm-headless.d.ts b/typings/xterm-headless.d.ts index d3b62346d..a6db39b50 100644 --- a/typings/xterm-headless.d.ts +++ b/typings/xterm-headless.d.ts @@ -653,8 +653,7 @@ declare module '@xterm/headless' { readonly buffer: IBufferNamespace; /** - * Get all markers registered against the buffer. If the alt buffer is - * active this will always return []. + * Get all markers registered against the active buffer. */ readonly markers: ReadonlyArray; @@ -825,12 +824,10 @@ declare module '@xterm/headless' { resize(columns: number, rows: number): void; /** - * Adds a marker to the normal buffer and returns it. If the alt buffer is - * active, undefined is returned. + * Adds a marker to the active buffer and returns it. * @param cursorYOffset The y position offset of the marker from the cursor. - * @returns The new marker or undefined. */ - registerMarker(cursorYOffset?: number): IMarker | undefined; + registerMarker(cursorYOffset?: number): IMarker; /* * Disposes of the terminal, detaching it from the DOM and removing any From fdcd1c272092b73c85d4bf16cc439d1e3a9ff3f4 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 27 May 2026 21:46:20 +0000 Subject: [PATCH 2/2] Align xterm-headless marker JSDoc with xterm.d.ts Co-authored-by: Daniel Imms --- typings/xterm-headless.d.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/typings/xterm-headless.d.ts b/typings/xterm-headless.d.ts index a6db39b50..d51dc096d 100644 --- a/typings/xterm-headless.d.ts +++ b/typings/xterm-headless.d.ts @@ -653,7 +653,8 @@ declare module '@xterm/headless' { readonly buffer: IBufferNamespace; /** - * Get all markers registered against the active buffer. + * Get all markers registered against the buffer. If the alt buffer is + * active this will always return []. */ readonly markers: ReadonlyArray; @@ -824,8 +825,9 @@ declare module '@xterm/headless' { resize(columns: number, rows: number): void; /** - * Adds a marker to the active buffer and returns it. + * Adds a marker to the normal buffer and returns it. * @param cursorYOffset The y position offset of the marker from the cursor. + * @returns The new marker or undefined. */ registerMarker(cursorYOffset?: number): IMarker;