Add quirks setting to control DECSET/DECRST 12

Fixes #5314
This commit is contained in:
Daniel Imms
2025-12-28 07:34:55 -08:00
parent fb10cd62c9
commit ca5a681363
4 changed files with 36 additions and 5 deletions
+8 -4
View File
@@ -1877,7 +1877,7 @@ export class InputHandler extends Disposable implements IInputHandler {
* | 7 | Auto-wrap Mode (DECAWM). | #Y |
* | 8 | Auto-repeat Keys (DECARM). Always on. | #N |
* | 9 | X10 xterm mouse protocol. | #Y |
* | 12 | Start Blinking Cursor. | #Y |
* | 12 | Start Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |
* | 25 | Show Cursor (DECTCEM). | #Y |
* | 45 | Reverse wrap-around. | #Y |
* | 47 | Use Alternate Screen Buffer. | #Y |
@@ -1930,7 +1930,9 @@ export class InputHandler extends Disposable implements IInputHandler {
this._coreService.decPrivateModes.wraparound = true;
break;
case 12:
this._optionsService.options.cursorBlink = true;
if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {
this._optionsService.options.cursorBlink = true;
}
break;
case 45:
this._coreService.decPrivateModes.reverseWraparound = true;
@@ -2125,7 +2127,7 @@ export class InputHandler extends Disposable implements IInputHandler {
* | 7 | No Wraparound Mode (DECAWM). | #Y |
* | 8 | No Auto-repeat Keys (DECARM). | #N |
* | 9 | Don't send Mouse X & Y on button press. | #Y |
* | 12 | Stop Blinking Cursor. | #Y |
* | 12 | Stop Blinking Cursor. | #P[Requires the allowSetCursorBlink quirk option enabled.] |
* | 25 | Hide Cursor (DECTCEM). | #Y |
* | 45 | No reverse wrap-around. | #Y |
* | 47 | Use Normal Screen Buffer. | #Y |
@@ -2171,7 +2173,9 @@ export class InputHandler extends Disposable implements IInputHandler {
this._coreService.decPrivateModes.wraparound = false;
break;
case 12:
this._optionsService.options.cursorBlink = false;
if (this._optionsService.rawOptions.quirks?.allowSetCursorBlink) {
this._optionsService.options.cursorBlink = false;
}
break;
case 45:
this._coreService.decPrivateModes.reverseWraparound = false;
+2 -1
View File
@@ -53,7 +53,8 @@ export const DEFAULT_OPTIONS: Readonly<Required<ITerminalOptions>> = {
convertEol: false,
termName: 'xterm',
cancelEvents: false,
overviewRuler: {}
overviewRuler: {},
quirks: {}
};
const FONT_WEIGHT_OPTIONS: Extract<FontWeight, string>[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'];
+5
View File
@@ -262,6 +262,7 @@ export interface ITerminalOptions {
windowOptions?: IWindowOptions;
wordSeparator?: string;
overviewRuler?: IOverviewRulerOptions;
quirks?: ITerminalQuirks;
scrollOnEraseInDisplay?: boolean;
[key: string]: any;
@@ -300,6 +301,10 @@ export interface ITheme {
extendedAnsi?: string[];
}
export interface ITerminalQuirks {
allowSetCursorBlink?: boolean;
}
export const IOscLinkService = createDecorator<IOscLinkService>('OscLinkService');
export interface IOscLinkService {
serviceBrand: undefined;
+21
View File
@@ -197,6 +197,12 @@ declare module '@xterm/xterm' {
*/
minimumContrastRatio?: number;
/**
* Control various quirks features that are either non-standard or standard
* in but generally rejected in modern terminals.
*/
quirks?: ITerminalQuirks;
/**
* Whether to reflow the line containing the cursor when the terminal is
* resized. Defaults to false, because shells usually handle this
@@ -406,6 +412,21 @@ declare module '@xterm/xterm' {
extendedAnsi?: string[];
}
/**
* Control various quirks features that are either non-standard or standard
* in but generally rejected in modern terminals.
*/
export interface ITerminalQuirks {
/**
* Enables support for DECSET 12 and DECRST 12 which controls cursor blink.
* Programs such as `vim` may use this to set the cursor blink state but may
* not change it back when exiting. Generally the terminal emulator should
* be in control of whether the cursor blinks or not and the application in
* modern terminals. Note that DECRQM works regardless of this option.
*/
allowSetCursorBlink?: boolean;
}
/**
* Pty information for Windows.
*/