@xterm/xterm 6.1.0-beta.19 → 6.1.0-beta.190

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/README.md +60 -38
  2. package/css/xterm.css +29 -22
  3. package/lib/xterm.js +1 -1
  4. package/lib/xterm.js.map +1 -1
  5. package/lib/xterm.mjs +8 -34
  6. package/lib/xterm.mjs.map +4 -4
  7. package/package.json +25 -14
  8. package/src/browser/AccessibilityManager.ts +6 -3
  9. package/src/browser/Clipboard.ts +6 -3
  10. package/src/browser/CoreBrowserTerminal.ts +147 -318
  11. package/src/browser/Dom.ts +178 -0
  12. package/src/browser/Linkifier.ts +11 -11
  13. package/src/browser/OscLinkProvider.ts +3 -1
  14. package/src/browser/RenderDebouncer.ts +2 -2
  15. package/src/browser/TimeBasedDebouncer.ts +2 -2
  16. package/src/browser/Types.ts +12 -11
  17. package/src/browser/Viewport.ts +37 -20
  18. package/src/browser/decorations/BufferDecorationRenderer.ts +1 -1
  19. package/src/browser/decorations/OverviewRulerRenderer.ts +15 -16
  20. package/src/browser/input/CompositionHelper.ts +44 -8
  21. package/src/browser/public/Terminal.ts +25 -28
  22. package/src/browser/renderer/dom/DomRenderer.ts +128 -8
  23. package/src/browser/renderer/dom/DomRendererRowFactory.ts +19 -13
  24. package/src/browser/renderer/dom/WidthCache.ts +54 -52
  25. package/src/browser/renderer/shared/Constants.ts +7 -0
  26. package/src/browser/renderer/shared/TextBlinkStateManager.ts +97 -0
  27. package/src/browser/renderer/shared/Types.ts +8 -2
  28. package/src/browser/scrollable/abstractScrollbar.ts +300 -0
  29. package/src/browser/scrollable/fastDomNode.ts +126 -0
  30. package/src/browser/scrollable/globalPointerMoveMonitor.ts +90 -0
  31. package/src/browser/scrollable/horizontalScrollbar.ts +85 -0
  32. package/src/browser/scrollable/mouseEvent.ts +292 -0
  33. package/src/browser/scrollable/scrollable.ts +486 -0
  34. package/src/browser/scrollable/scrollableElement.ts +579 -0
  35. package/src/browser/scrollable/scrollableElementOptions.ts +161 -0
  36. package/src/browser/scrollable/scrollbarArrow.ts +110 -0
  37. package/src/browser/scrollable/scrollbarState.ts +246 -0
  38. package/src/browser/scrollable/scrollbarVisibilityController.ts +113 -0
  39. package/src/browser/scrollable/touch.ts +485 -0
  40. package/src/browser/scrollable/verticalScrollbar.ts +143 -0
  41. package/src/browser/scrollable/widget.ts +23 -0
  42. package/src/browser/services/CharSizeService.ts +2 -2
  43. package/src/browser/services/CoreBrowserService.ts +7 -5
  44. package/src/browser/services/KeyboardService.ts +67 -0
  45. package/src/browser/services/LinkProviderService.ts +1 -1
  46. package/src/browser/services/MouseCoordsService.ts +47 -0
  47. package/src/browser/services/MouseService.ts +518 -25
  48. package/src/browser/services/RenderService.ts +22 -15
  49. package/src/browser/services/SelectionService.ts +16 -8
  50. package/src/browser/services/Services.ts +40 -17
  51. package/src/browser/services/ThemeService.ts +2 -2
  52. package/src/common/Async.ts +105 -0
  53. package/src/common/CircularList.ts +2 -2
  54. package/src/common/Color.ts +8 -0
  55. package/src/common/CoreTerminal.ts +28 -18
  56. package/src/common/Event.ts +118 -0
  57. package/src/common/InputHandler.ts +256 -36
  58. package/src/common/Lifecycle.ts +113 -0
  59. package/src/common/Platform.ts +13 -3
  60. package/src/common/SortedList.ts +7 -3
  61. package/src/common/TaskQueue.ts +9 -3
  62. package/src/common/Types.ts +35 -15
  63. package/src/common/Version.ts +9 -0
  64. package/src/common/buffer/Buffer.ts +20 -14
  65. package/src/common/buffer/BufferLine.ts +4 -5
  66. package/src/common/buffer/BufferSet.ts +7 -6
  67. package/src/common/buffer/CellData.ts +57 -0
  68. package/src/common/buffer/Marker.ts +2 -2
  69. package/src/common/buffer/Types.ts +6 -2
  70. package/src/common/data/EscapeSequences.ts +71 -70
  71. package/src/common/input/Keyboard.ts +14 -7
  72. package/src/common/input/KittyKeyboard.ts +496 -0
  73. package/src/common/input/Win32InputMode.ts +297 -0
  74. package/src/common/input/WriteBuffer.ts +34 -2
  75. package/src/common/input/XParseColor.ts +2 -2
  76. package/src/common/parser/ApcParser.ts +245 -0
  77. package/src/common/parser/Constants.ts +22 -4
  78. package/src/common/parser/DcsParser.ts +5 -5
  79. package/src/common/parser/EscapeSequenceParser.ts +75 -22
  80. package/src/common/parser/OscParser.ts +5 -5
  81. package/src/common/parser/Types.ts +34 -1
  82. package/src/common/public/BufferLineApiView.ts +2 -2
  83. package/src/common/public/BufferNamespaceApi.ts +2 -2
  84. package/src/common/public/ParserApi.ts +3 -0
  85. package/src/common/services/BufferService.ts +8 -5
  86. package/src/common/services/CharsetService.ts +4 -0
  87. package/src/common/services/CoreService.ts +18 -4
  88. package/src/common/services/DecorationService.ts +24 -8
  89. package/src/common/services/LogService.ts +1 -31
  90. package/src/common/services/{CoreMouseService.ts → MouseStateService.ts} +21 -132
  91. package/src/common/services/OptionsService.ts +13 -4
  92. package/src/common/services/Services.ts +47 -40
  93. package/src/common/services/UnicodeService.ts +1 -1
  94. package/typings/xterm.d.ts +319 -35
  95. package/src/common/TypedArrayUtils.ts +0 -17
  96. package/src/vs/base/browser/browser.ts +0 -141
  97. package/src/vs/base/browser/canIUse.ts +0 -49
  98. package/src/vs/base/browser/dom.ts +0 -2369
  99. package/src/vs/base/browser/fastDomNode.ts +0 -316
  100. package/src/vs/base/browser/globalPointerMoveMonitor.ts +0 -112
  101. package/src/vs/base/browser/iframe.ts +0 -135
  102. package/src/vs/base/browser/keyboardEvent.ts +0 -213
  103. package/src/vs/base/browser/mouseEvent.ts +0 -229
  104. package/src/vs/base/browser/touch.ts +0 -372
  105. package/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +0 -303
  106. package/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +0 -114
  107. package/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +0 -720
  108. package/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +0 -165
  109. package/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +0 -114
  110. package/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +0 -243
  111. package/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +0 -118
  112. package/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +0 -116
  113. package/src/vs/base/browser/ui/widget.ts +0 -57
  114. package/src/vs/base/browser/window.ts +0 -14
  115. package/src/vs/base/common/arrays.ts +0 -887
  116. package/src/vs/base/common/arraysFind.ts +0 -202
  117. package/src/vs/base/common/assert.ts +0 -71
  118. package/src/vs/base/common/async.ts +0 -1992
  119. package/src/vs/base/common/cancellation.ts +0 -148
  120. package/src/vs/base/common/charCode.ts +0 -450
  121. package/src/vs/base/common/collections.ts +0 -140
  122. package/src/vs/base/common/decorators.ts +0 -130
  123. package/src/vs/base/common/equals.ts +0 -146
  124. package/src/vs/base/common/errors.ts +0 -303
  125. package/src/vs/base/common/event.ts +0 -1778
  126. package/src/vs/base/common/functional.ts +0 -32
  127. package/src/vs/base/common/hash.ts +0 -316
  128. package/src/vs/base/common/iterator.ts +0 -159
  129. package/src/vs/base/common/keyCodes.ts +0 -526
  130. package/src/vs/base/common/keybindings.ts +0 -284
  131. package/src/vs/base/common/lazy.ts +0 -47
  132. package/src/vs/base/common/lifecycle.ts +0 -801
  133. package/src/vs/base/common/linkedList.ts +0 -142
  134. package/src/vs/base/common/map.ts +0 -202
  135. package/src/vs/base/common/numbers.ts +0 -98
  136. package/src/vs/base/common/observable.ts +0 -76
  137. package/src/vs/base/common/observableInternal/api.ts +0 -31
  138. package/src/vs/base/common/observableInternal/autorun.ts +0 -281
  139. package/src/vs/base/common/observableInternal/base.ts +0 -489
  140. package/src/vs/base/common/observableInternal/debugName.ts +0 -145
  141. package/src/vs/base/common/observableInternal/derived.ts +0 -428
  142. package/src/vs/base/common/observableInternal/lazyObservableValue.ts +0 -146
  143. package/src/vs/base/common/observableInternal/logging.ts +0 -328
  144. package/src/vs/base/common/observableInternal/promise.ts +0 -209
  145. package/src/vs/base/common/observableInternal/utils.ts +0 -610
  146. package/src/vs/base/common/platform.ts +0 -281
  147. package/src/vs/base/common/scrollable.ts +0 -522
  148. package/src/vs/base/common/sequence.ts +0 -34
  149. package/src/vs/base/common/stopwatch.ts +0 -43
  150. package/src/vs/base/common/strings.ts +0 -557
  151. package/src/vs/base/common/symbols.ts +0 -9
  152. package/src/vs/base/common/uint.ts +0 -59
  153. package/src/vs/patches/nls.ts +0 -90
  154. package/src/vs/typings/base-common.d.ts +0 -20
  155. package/src/vs/typings/require.d.ts +0 -42
  156. package/src/vs/typings/vscode-globals-nls.d.ts +0 -36
  157. package/src/vs/typings/vscode-globals-product.d.ts +0 -33
@@ -0,0 +1,496 @@
1
+ /**
2
+ * Copyright (c) 2025 The xterm.js authors. All rights reserved.
3
+ * @license MIT
4
+ *
5
+ * Kitty keyboard protocol implementation.
6
+ * @see https://sw.kovidgoyal.net/kitty/keyboard-protocol/
7
+ */
8
+
9
+ import { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from 'common/Types';
10
+ import { C0 } from 'common/data/EscapeSequences';
11
+
12
+ /**
13
+ * Kitty keyboard protocol enhancement flags (bitfield).
14
+ */
15
+ export const enum KittyKeyboardFlags {
16
+ NONE = 0b00000,
17
+ /** Disambiguate escape codes - fixes ambiguous legacy encodings */
18
+ DISAMBIGUATE_ESCAPE_CODES = 0b00001,
19
+ /** Report event types - press/repeat/release */
20
+ REPORT_EVENT_TYPES = 0b00010,
21
+ /** Report alternate keys - shifted key and base layout key */
22
+ REPORT_ALTERNATE_KEYS = 0b00100,
23
+ /** Report all keys as escape codes - text-producing keys as CSI u */
24
+ REPORT_ALL_KEYS_AS_ESCAPE_CODES = 0b01000,
25
+ /** Report associated text - includes text codepoints in escape code */
26
+ REPORT_ASSOCIATED_TEXT = 0b10000,
27
+ }
28
+
29
+ /**
30
+ * Kitty keyboard event types.
31
+ */
32
+ export const enum KittyKeyboardEventType {
33
+ PRESS = 1,
34
+ REPEAT = 2,
35
+ RELEASE = 3,
36
+ }
37
+
38
+ /**
39
+ * Kitty modifier bits (different from xterm modifier encoding).
40
+ * Value sent = 1 + modifier_bits
41
+ */
42
+ export const enum KittyKeyboardModifiers {
43
+ SHIFT = 0b00000001,
44
+ ALT = 0b00000010,
45
+ CTRL = 0b00000100,
46
+ SUPER = 0b00001000,
47
+ HYPER = 0b00010000,
48
+ META = 0b00100000,
49
+ CAPS_LOCK = 0b01000000,
50
+ NUM_LOCK = 0b10000000,
51
+ }
52
+
53
+ /**
54
+ * Kitty keyboard protocol handler class.
55
+ * Encapsulates all key code mappings and encoding logic.
56
+ */
57
+ export class KittyKeyboard {
58
+ /**
59
+ * Functional key codes for Kitty protocol.
60
+ * Keys that don't produce text have specific unicode codepoint mappings.
61
+ */
62
+ private readonly _functionalKeyCodes: { [key: string]: number } = {
63
+ 'Escape': 27,
64
+ 'Enter': 13,
65
+ 'Tab': 9,
66
+ 'Backspace': 127,
67
+ 'CapsLock': 57358,
68
+ 'ScrollLock': 57359,
69
+ 'NumLock': 57360,
70
+ 'PrintScreen': 57361,
71
+ 'Pause': 57362,
72
+ 'ContextMenu': 57363,
73
+ // F13-F35 (F1-F12 use legacy encoding)
74
+ 'F13': 57376,
75
+ 'F14': 57377,
76
+ 'F15': 57378,
77
+ 'F16': 57379,
78
+ 'F17': 57380,
79
+ 'F18': 57381,
80
+ 'F19': 57382,
81
+ 'F20': 57383,
82
+ 'F21': 57384,
83
+ 'F22': 57385,
84
+ 'F23': 57386,
85
+ 'F24': 57387,
86
+ 'F25': 57388,
87
+ // Keypad keys
88
+ 'KP_0': 57399,
89
+ 'KP_1': 57400,
90
+ 'KP_2': 57401,
91
+ 'KP_3': 57402,
92
+ 'KP_4': 57403,
93
+ 'KP_5': 57404,
94
+ 'KP_6': 57405,
95
+ 'KP_7': 57406,
96
+ 'KP_8': 57407,
97
+ 'KP_9': 57408,
98
+ 'KP_Decimal': 57409,
99
+ 'KP_Divide': 57410,
100
+ 'KP_Multiply': 57411,
101
+ 'KP_Subtract': 57412,
102
+ 'KP_Add': 57413,
103
+ 'KP_Enter': 57414,
104
+ 'KP_Equal': 57415,
105
+ // Modifier keys
106
+ 'ShiftLeft': 57441,
107
+ 'ShiftRight': 57447,
108
+ 'ControlLeft': 57442,
109
+ 'ControlRight': 57448,
110
+ 'AltLeft': 57443,
111
+ 'AltRight': 57449,
112
+ 'MetaLeft': 57444,
113
+ 'MetaRight': 57450,
114
+ // Media keys
115
+ 'MediaPlayPause': 57430,
116
+ 'MediaStop': 57432,
117
+ 'MediaTrackNext': 57435,
118
+ 'MediaTrackPrevious': 57436,
119
+ 'AudioVolumeDown': 57438,
120
+ 'AudioVolumeUp': 57439,
121
+ 'AudioVolumeMute': 57440
122
+ };
123
+
124
+ /**
125
+ * Keys that use CSI ~ encoding with a number parameter.
126
+ */
127
+ private readonly _csiTildeKeys: { [key: string]: number } = {
128
+ 'Insert': 2,
129
+ 'Delete': 3,
130
+ 'PageUp': 5,
131
+ 'PageDown': 6,
132
+ 'F5': 15,
133
+ 'F6': 17,
134
+ 'F7': 18,
135
+ 'F8': 19,
136
+ 'F9': 20,
137
+ 'F10': 21,
138
+ 'F11': 23,
139
+ 'F12': 24
140
+ };
141
+
142
+ /**
143
+ * Keys that use CSI letter encoding (arrows, Home, End).
144
+ */
145
+ private readonly _csiLetterKeys: { [key: string]: string } = {
146
+ 'ArrowUp': 'A',
147
+ 'ArrowDown': 'B',
148
+ 'ArrowRight': 'C',
149
+ 'ArrowLeft': 'D',
150
+ 'Home': 'H',
151
+ 'End': 'F'
152
+ };
153
+
154
+ /**
155
+ * Function keys F1-F4 use SS3 encoding without modifiers.
156
+ */
157
+ private readonly _ss3FunctionKeys: { [key: string]: string } = {
158
+ 'F1': 'P',
159
+ 'F2': 'Q',
160
+ 'F3': 'R',
161
+ 'F4': 'S'
162
+ };
163
+
164
+ /**
165
+ * Map browser key codes to Kitty numpad codes.
166
+ */
167
+ private _getNumpadKeyCode(ev: IKeyboardEvent): number | undefined {
168
+ if (ev.code.startsWith('Numpad')) {
169
+ const suffix = ev.code.slice(6);
170
+ if (suffix >= '0' && suffix <= '9') {
171
+ return 57399 + parseInt(suffix, 10);
172
+ }
173
+ switch (suffix) {
174
+ case 'Decimal': return 57409;
175
+ case 'Divide': return 57410;
176
+ case 'Multiply': return 57411;
177
+ case 'Subtract': return 57412;
178
+ case 'Add': return 57413;
179
+ case 'Enter': return 57414;
180
+ case 'Equal': return 57415;
181
+ }
182
+ }
183
+ return undefined;
184
+ }
185
+
186
+ /**
187
+ * Get modifier key code from code property.
188
+ */
189
+ private _getModifierKeyCode(ev: IKeyboardEvent): number | undefined {
190
+ switch (ev.code) {
191
+ case 'ShiftLeft': return 57441;
192
+ case 'ShiftRight': return 57447;
193
+ case 'ControlLeft': return 57442;
194
+ case 'ControlRight': return 57448;
195
+ case 'AltLeft': return 57443;
196
+ case 'AltRight': return 57449;
197
+ case 'MetaLeft': return 57444;
198
+ case 'MetaRight': return 57450;
199
+ }
200
+ return undefined;
201
+ }
202
+
203
+ /**
204
+ * Encode modifiers for Kitty protocol.
205
+ * Returns 1 + modifier bits, or 0 if no modifiers.
206
+ */
207
+ private _encodeModifiers(ev: IKeyboardEvent): number {
208
+ let mods = 0;
209
+ if (ev.shiftKey) mods |= KittyKeyboardModifiers.SHIFT;
210
+ if (ev.altKey) mods |= KittyKeyboardModifiers.ALT;
211
+ if (ev.ctrlKey) mods |= KittyKeyboardModifiers.CTRL;
212
+ if (ev.metaKey) mods |= KittyKeyboardModifiers.SUPER;
213
+ return mods > 0 ? mods + 1 : 0;
214
+ }
215
+
216
+ /**
217
+ * Get the unicode key code for a keyboard event.
218
+ * Returns the lowercase codepoint for letters.
219
+ * For shifted keys, uses the code property to get the base key.
220
+ */
221
+ private _getKeyCode(ev: IKeyboardEvent): number | undefined {
222
+ const numpadCode = this._getNumpadKeyCode(ev);
223
+ if (numpadCode !== undefined) {
224
+ return numpadCode;
225
+ }
226
+
227
+ const modifierCode = this._getModifierKeyCode(ev);
228
+ if (modifierCode !== undefined) {
229
+ return modifierCode;
230
+ }
231
+
232
+ const funcCode = this._functionalKeyCodes[ev.key];
233
+ if (funcCode !== undefined) {
234
+ return funcCode;
235
+ }
236
+
237
+ if (ev.shiftKey && ev.code) {
238
+ if (ev.code.startsWith('Digit') && ev.code.length === 6) {
239
+ const digit = ev.code.charAt(5);
240
+ if (digit >= '0' && digit <= '9') {
241
+ return digit.charCodeAt(0);
242
+ }
243
+ }
244
+ if (ev.code.startsWith('Key') && ev.code.length === 4) {
245
+ const letter = ev.code.charAt(3).toLowerCase();
246
+ return letter.charCodeAt(0);
247
+ }
248
+ }
249
+
250
+ if (ev.key.length === 1) {
251
+ const code = ev.key.codePointAt(0)!;
252
+ if (code >= 65 && code <= 90) {
253
+ return code + 32;
254
+ }
255
+ return code;
256
+ }
257
+
258
+ return undefined;
259
+ }
260
+
261
+ /**
262
+ * Check if a key is a modifier key.
263
+ */
264
+ private _isModifierKey(ev: IKeyboardEvent): boolean {
265
+ return ev.key === 'Shift' || ev.key === 'Control' || ev.key === 'Alt' || ev.key === 'Meta';
266
+ }
267
+
268
+ /**
269
+ * Build CSI letter sequence for arrow keys, Home, End.
270
+ * Format: CSI [1;mod] letter
271
+ */
272
+ private _buildCsiLetterSequence(
273
+ letter: string,
274
+ modifiers: number,
275
+ eventType: KittyKeyboardEventType,
276
+ reportEventTypes: boolean
277
+ ): string {
278
+ const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;
279
+
280
+ if (modifiers > 0 || needsEventType) {
281
+ let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');
282
+ if (needsEventType) {
283
+ seq += ':' + eventType;
284
+ }
285
+ seq += letter;
286
+ return seq;
287
+ }
288
+ return C0.ESC + '[' + letter;
289
+ }
290
+
291
+ /**
292
+ * Build SS3 sequence for F1-F4.
293
+ * Without modifiers: SS3 letter
294
+ * With modifiers: CSI 1;mod letter
295
+ */
296
+ private _buildSs3Sequence(
297
+ letter: string,
298
+ modifiers: number,
299
+ eventType: KittyKeyboardEventType,
300
+ reportEventTypes: boolean
301
+ ): string {
302
+ const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;
303
+
304
+ if (modifiers > 0 || needsEventType) {
305
+ let seq = C0.ESC + '[1;' + (modifiers > 0 ? modifiers : '1');
306
+ if (needsEventType) {
307
+ seq += ':' + eventType;
308
+ }
309
+ seq += letter;
310
+ return seq;
311
+ }
312
+ return C0.ESC + 'O' + letter;
313
+ }
314
+
315
+ /**
316
+ * Build CSI ~ sequence for Insert, Delete, PageUp/Down, F5-F12.
317
+ * Format: CSI number [;mod[:event]] ~
318
+ */
319
+ private _buildCsiTildeSequence(
320
+ number: number,
321
+ modifiers: number,
322
+ eventType: KittyKeyboardEventType,
323
+ reportEventTypes: boolean
324
+ ): string {
325
+ const needsEventType = reportEventTypes && eventType !== KittyKeyboardEventType.PRESS;
326
+
327
+ let seq = C0.ESC + '[' + number;
328
+ if (modifiers > 0 || needsEventType) {
329
+ seq += ';' + (modifiers > 0 ? modifiers : '1');
330
+ if (needsEventType) {
331
+ seq += ':' + eventType;
332
+ }
333
+ }
334
+ seq += '~';
335
+ return seq;
336
+ }
337
+
338
+ /**
339
+ * Build CSI u sequence.
340
+ * Format: CSI keycode[:shifted[:base]] [;mod[:event][;text]] u
341
+ */
342
+ private _buildCsiUSequence(
343
+ ev: IKeyboardEvent,
344
+ keyCode: number,
345
+ modifiers: number,
346
+ eventType: KittyKeyboardEventType,
347
+ flags: number,
348
+ isFunc: boolean,
349
+ isMod: boolean
350
+ ): string {
351
+ const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);
352
+ const reportAlternateKeys = !!(flags & KittyKeyboardFlags.REPORT_ALTERNATE_KEYS);
353
+
354
+ let seq = C0.ESC + '[' + keyCode;
355
+
356
+ let shiftedKey: number | undefined;
357
+ if (reportAlternateKeys && ev.shiftKey && ev.key.length === 1 && !isFunc && !isMod) {
358
+ shiftedKey = ev.key.codePointAt(0);
359
+ seq += ':' + shiftedKey;
360
+ }
361
+
362
+ const reportAssociatedText = !!(flags & KittyKeyboardFlags.REPORT_ASSOCIATED_TEXT) &&
363
+ eventType !== KittyKeyboardEventType.RELEASE &&
364
+ ev.key.length === 1 &&
365
+ !isFunc &&
366
+ !isMod &&
367
+ !ev.ctrlKey;
368
+ const textCode = reportAssociatedText ? ev.key.codePointAt(0) : undefined;
369
+
370
+ const needsEventType = reportEventTypes &&
371
+ eventType !== KittyKeyboardEventType.PRESS &&
372
+ (eventType === KittyKeyboardEventType.RELEASE || textCode === undefined);
373
+
374
+ if (modifiers > 0 || needsEventType || textCode !== undefined) {
375
+ seq += ';';
376
+ if (modifiers > 0) {
377
+ seq += modifiers;
378
+ } else if (needsEventType) {
379
+ seq += '1';
380
+ }
381
+ if (needsEventType) {
382
+ seq += ':' + eventType;
383
+ }
384
+ }
385
+
386
+ if (textCode !== undefined) {
387
+ seq += ';' + textCode;
388
+ }
389
+
390
+ seq += 'u';
391
+ return seq;
392
+ }
393
+
394
+ /**
395
+ * Evaluate a keyboard event using Kitty keyboard protocol.
396
+ *
397
+ * @param ev The keyboard event.
398
+ * @param flags The active Kitty keyboard enhancement flags.
399
+ * @param eventType The event type (press, repeat, release).
400
+ * @returns The keyboard result with the encoded key sequence.
401
+ */
402
+ public evaluate(
403
+ ev: IKeyboardEvent,
404
+ flags: number,
405
+ eventType: KittyKeyboardEventType = KittyKeyboardEventType.PRESS
406
+ ): IKeyboardResult {
407
+ const result: IKeyboardResult = {
408
+ type: KeyboardResultType.SEND_KEY,
409
+ cancel: false,
410
+ key: undefined
411
+ };
412
+
413
+ const modifiers = this._encodeModifiers(ev);
414
+ const isMod = this._isModifierKey(ev);
415
+ const reportEventTypes = !!(flags & KittyKeyboardFlags.REPORT_EVENT_TYPES);
416
+
417
+ if (!reportEventTypes && eventType === KittyKeyboardEventType.RELEASE) {
418
+ return result;
419
+ }
420
+
421
+ if (isMod && !(flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES)) {
422
+ return result;
423
+ }
424
+
425
+ const csiLetter = this._csiLetterKeys[ev.key];
426
+ if (csiLetter) {
427
+ result.key = this._buildCsiLetterSequence(csiLetter, modifiers, eventType, reportEventTypes);
428
+ result.cancel = true;
429
+ return result;
430
+ }
431
+
432
+ const ss3Letter = this._ss3FunctionKeys[ev.key];
433
+ if (ss3Letter) {
434
+ result.key = this._buildSs3Sequence(ss3Letter, modifiers, eventType, reportEventTypes);
435
+ result.cancel = true;
436
+ return result;
437
+ }
438
+
439
+ const tildeCode = this._csiTildeKeys[ev.key];
440
+ if (tildeCode !== undefined) {
441
+ result.key = this._buildCsiTildeSequence(tildeCode, modifiers, eventType, reportEventTypes);
442
+ result.cancel = true;
443
+ return result;
444
+ }
445
+
446
+ const keyCode = this._getKeyCode(ev);
447
+ if (keyCode === undefined) {
448
+ return result;
449
+ }
450
+
451
+ const isFunc = this._functionalKeyCodes[ev.key] !== undefined || this._getNumpadKeyCode(ev) !== undefined;
452
+
453
+ let useCsiU = false;
454
+
455
+ if (flags & KittyKeyboardFlags.REPORT_ALL_KEYS_AS_ESCAPE_CODES) {
456
+ useCsiU = true;
457
+ } else if (reportEventTypes) {
458
+ useCsiU = true;
459
+ } else if (flags & KittyKeyboardFlags.DISAMBIGUATE_ESCAPE_CODES) {
460
+ // Per spec, Enter/Tab/Backspace "still generate the same bytes as in legacy
461
+ // mode" and consider space to be a text-generating key, so these skip the isFunc fast-path
462
+ // and only get CSI u when modifiers are present (handled below).
463
+ const isDisambiguateLegacy = keyCode === 13 || keyCode === 9 || keyCode === 127;
464
+ if (isFunc && !isDisambiguateLegacy) {
465
+ useCsiU = true;
466
+ } else if (modifiers > 0) {
467
+ if (ev.shiftKey && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.key.length === 1) {
468
+ useCsiU = false;
469
+ } else {
470
+ useCsiU = true;
471
+ }
472
+ }
473
+ }
474
+
475
+ if (useCsiU) {
476
+ result.key = this._buildCsiUSequence(ev, keyCode, modifiers, eventType, flags, isFunc, isMod);
477
+ result.cancel = true;
478
+ } else {
479
+ const legacyByte = keyCode === 13 ? '\r' : keyCode === 9 ? '\t' : keyCode === 127 ? '\x7f' : undefined;
480
+ if (legacyByte) {
481
+ result.key = legacyByte;
482
+ } else if (ev.key.length === 1 && !ev.ctrlKey && !ev.altKey && !ev.metaKey) {
483
+ result.key = ev.key;
484
+ }
485
+ }
486
+
487
+ return result;
488
+ }
489
+
490
+ /**
491
+ * Check if Kitty protocol should be used based on flags.
492
+ */
493
+ public static shouldUseProtocol(flags: number): boolean {
494
+ return flags > 0;
495
+ }
496
+ }