diff --git a/bin/lint_changes.js b/bin/lint_changes.js index a8edb44c..6ed7ae5f 100644 --- a/bin/lint_changes.js +++ b/bin/lint_changes.js @@ -33,7 +33,7 @@ if (files.length === 0) { console.log(`Linting ${files.length} changed file(s)...`); -const eslintArgs = ['--max-warnings', '0']; +const eslintArgs = ['--max-warnings', '0', '--no-warn-ignored']; if (fix) { eslintArgs.push('--fix'); } diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts index a2db348e..554e8865 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -1087,7 +1087,8 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { // Use Kitty keyboard protocol if enabled, otherwise use legacy encoding const kittyFlags = this.coreService.kittyKeyboard.flags; - const result = shouldUseKittyProtocol(kittyFlags) + const useKitty = this.options.vtExtensions?.kittyKeyboard && shouldUseKittyProtocol(kittyFlags); + const result = useKitty ? evaluateKeyboardEventKitty(event, kittyFlags, event.repeat ? KittyKeyboardEventType.REPEAT : KittyKeyboardEventType.PRESS) : evaluateKeyboardEvent(event, this.coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta); @@ -1178,7 +1179,8 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { // Handle key release for Kitty keyboard protocol const kittyFlags = this.coreService.kittyKeyboard.flags; - if (shouldUseKittyProtocol(kittyFlags) && (kittyFlags & 0b10)) { // REPORT_EVENT_TYPES flag + const useKitty = this.options.vtExtensions?.kittyKeyboard && shouldUseKittyProtocol(kittyFlags); + if (useKitty && (kittyFlags & 0b10)) { // REPORT_EVENT_TYPES flag const result = evaluateKeyboardEventKitty(ev, kittyFlags, KittyKeyboardEventType.RELEASE); if (result.key) { this.coreService.triggerDataEvent(result.key, true); diff --git a/src/common/InputHandler.ts b/src/common/InputHandler.ts index ade124c2..4d37898f 100644 --- a/src/common/InputHandler.ts +++ b/src/common/InputHandler.ts @@ -2992,6 +2992,9 @@ export class InputHandler extends Disposable implements IInputHandler { * @vt: #Y CSI KKBDSET "Kitty Keyboard Set" "CSI = Ps ; Pm u" "Set Kitty keyboard protocol flags." */ public kittyKeyboardSet(params: IParams): boolean { + if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) { + return true; + } const flags = params.params[0] || 0; const mode = params.params[1] || 1; const state = this._coreService.kittyKeyboard; @@ -3018,6 +3021,9 @@ export class InputHandler extends Disposable implements IInputHandler { * @vt: #Y CSI KKBDQUERY "Kitty Keyboard Query" "CSI ? u" "Query Kitty keyboard protocol flags." */ public kittyKeyboardQuery(params: IParams): boolean { + if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) { + return true; + } const flags = this._coreService.kittyKeyboard.flags; this._coreService.triggerDataEvent(`${C0.ESC}[?${flags}u`); return true; @@ -3030,6 +3036,9 @@ export class InputHandler extends Disposable implements IInputHandler { * @vt: #Y CSI KKBDPUSH "Kitty Keyboard Push" "CSI > Ps u" "Push keyboard flags to stack and set new flags." */ public kittyKeyboardPush(params: IParams): boolean { + if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) { + return true; + } const flags = params.params[0] || 0; const state = this._coreService.kittyKeyboard; const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt; @@ -3048,6 +3057,9 @@ export class InputHandler extends Disposable implements IInputHandler { * @vt: #Y CSI KKBDPOP "Kitty Keyboard Pop" "CSI < Ps u" "Pop keyboard flags from stack." */ public kittyKeyboardPop(params: IParams): boolean { + if (!this._optionsService.rawOptions.vtExtensions?.kittyKeyboard) { + return true; + } const count = Math.max(1, params.params[0] || 1); const state = this._coreService.kittyKeyboard; const isAlt = this._bufferService.buffer === this._bufferService.buffers.alt; diff --git a/src/common/services/OptionsService.ts b/src/common/services/OptionsService.ts index 54c3db23..f08f61f8 100644 --- a/src/common/services/OptionsService.ts +++ b/src/common/services/OptionsService.ts @@ -54,7 +54,8 @@ export const DEFAULT_OPTIONS: Readonly> = { termName: 'xterm', cancelEvents: false, overviewRuler: {}, - quirks: {} + quirks: {}, + vtExtensions: {} }; const FONT_WEIGHT_OPTIONS: Extract[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900']; diff --git a/src/common/services/Services.ts b/src/common/services/Services.ts index fd595670..c3f69fb4 100644 --- a/src/common/services/Services.ts +++ b/src/common/services/Services.ts @@ -266,6 +266,7 @@ export interface ITerminalOptions { overviewRuler?: IOverviewRulerOptions; quirks?: ITerminalQuirks; scrollOnEraseInDisplay?: boolean; + vtExtensions?: IVtExtensions; [key: string]: any; cancelEvents: boolean; @@ -307,6 +308,10 @@ export interface ITerminalQuirks { allowSetCursorBlink?: boolean; } +export interface IVtExtensions { + kittyKeyboard?: boolean; +} + export const IOscLinkService = createDecorator('OscLinkService'); export interface IOscLinkService { serviceBrand: undefined; diff --git a/typings/xterm-headless.d.ts b/typings/xterm-headless.d.ts index abc28d08..7d2277d7 100644 --- a/typings/xterm-headless.d.ts +++ b/typings/xterm-headless.d.ts @@ -231,6 +231,11 @@ declare module '@xterm/headless' { * All features are disabled by default for security reasons. */ windowOptions?: IWindowOptions; + + /** + * Enable various VT extensions. All extensions are disabled by default. + */ + vtExtensions?: IVtExtensions; } /** @@ -313,6 +318,18 @@ declare module '@xterm/headless' { buildNumber?: number; } + /** + * Enable VT extensions that are not part of the core VT specification. + */ + export interface IVtExtensions { + /** + * Whether the kitty keyboard protocol is enabled. When enabled, the + * terminal will respond to keyboard protocol queries and allow programs to + * enable enhanced keyboard reporting. The default is false. + */ + kittyKeyboard?: boolean; + } + /** * A replacement logger for `console`. */ diff --git a/typings/xterm.d.ts b/typings/xterm.d.ts index fb74491c..86aeeb25 100644 --- a/typings/xterm.d.ts +++ b/typings/xterm.d.ts @@ -199,6 +199,12 @@ declare module '@xterm/xterm' { */ minimumContrastRatio?: number; + /** + * Controls the visibility and style of the overview ruler which visualizes + * decorations underneath the scroll bar. + */ + overviewRuler?: IOverviewRulerOptions; + /** * Control various quirks features that are either non-standard or standard * in but generally rejected in modern terminals. @@ -284,6 +290,11 @@ declare module '@xterm/xterm' { */ theme?: ITheme; + /** + * Enable various VT extensions. All extensions are disabled by default. + */ + vtExtensions?: IVtExtensions; + /** * Compatibility information when the pty is known to be hosted on Windows. * Setting this will turn on certain heuristics/workarounds depending on the @@ -313,12 +324,6 @@ declare module '@xterm/xterm' { * All features are disabled by default for security reasons. */ windowOptions?: IWindowOptions; - - /** - * Controls the visibility and style of the overview ruler which visualizes - * decorations underneath the scroll bar. - */ - overviewRuler?: IOverviewRulerOptions; } /** @@ -430,6 +435,20 @@ declare module '@xterm/xterm' { allowSetCursorBlink?: boolean; } + /** + * Enable certain optional VT extensions. + */ + export interface IVtExtensions { + /** + * Whether the [kitty keyboard protocol][0] (`CSI u`) is enabled. When + * enabled, the terminal will respond to keyboard protocol queries and allow + * programs to enable enhanced keyboard reporting. The default is false. + * + * [0]: https://sw.kovidgoyal.net/kitty/keyboard-protocol/ + */ + kittyKeyboard?: boolean; + } + /** * Pty information for Windows. */