@xterm/xterm 5.4.0-beta.1

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 (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +235 -0
  3. package/css/xterm.css +209 -0
  4. package/lib/xterm.js +2 -0
  5. package/lib/xterm.js.map +1 -0
  6. package/package.json +101 -0
  7. package/src/browser/AccessibilityManager.ts +278 -0
  8. package/src/browser/Clipboard.ts +93 -0
  9. package/src/browser/ColorContrastCache.ts +34 -0
  10. package/src/browser/Lifecycle.ts +33 -0
  11. package/src/browser/Linkifier2.ts +416 -0
  12. package/src/browser/LocalizableStrings.ts +12 -0
  13. package/src/browser/OscLinkProvider.ts +128 -0
  14. package/src/browser/RenderDebouncer.ts +83 -0
  15. package/src/browser/Terminal.ts +1317 -0
  16. package/src/browser/TimeBasedDebouncer.ts +86 -0
  17. package/src/browser/Types.d.ts +181 -0
  18. package/src/browser/Viewport.ts +401 -0
  19. package/src/browser/decorations/BufferDecorationRenderer.ts +134 -0
  20. package/src/browser/decorations/ColorZoneStore.ts +117 -0
  21. package/src/browser/decorations/OverviewRulerRenderer.ts +218 -0
  22. package/src/browser/input/CompositionHelper.ts +246 -0
  23. package/src/browser/input/Mouse.ts +54 -0
  24. package/src/browser/input/MoveToCell.ts +249 -0
  25. package/src/browser/public/Terminal.ts +260 -0
  26. package/src/browser/renderer/dom/DomRenderer.ts +509 -0
  27. package/src/browser/renderer/dom/DomRendererRowFactory.ts +526 -0
  28. package/src/browser/renderer/dom/WidthCache.ts +160 -0
  29. package/src/browser/renderer/shared/CellColorResolver.ts +137 -0
  30. package/src/browser/renderer/shared/CharAtlasCache.ts +96 -0
  31. package/src/browser/renderer/shared/CharAtlasUtils.ts +75 -0
  32. package/src/browser/renderer/shared/Constants.ts +14 -0
  33. package/src/browser/renderer/shared/CursorBlinkStateManager.ts +146 -0
  34. package/src/browser/renderer/shared/CustomGlyphs.ts +687 -0
  35. package/src/browser/renderer/shared/DevicePixelObserver.ts +41 -0
  36. package/src/browser/renderer/shared/README.md +1 -0
  37. package/src/browser/renderer/shared/RendererUtils.ts +58 -0
  38. package/src/browser/renderer/shared/SelectionRenderModel.ts +91 -0
  39. package/src/browser/renderer/shared/TextureAtlas.ts +1082 -0
  40. package/src/browser/renderer/shared/Types.d.ts +173 -0
  41. package/src/browser/selection/SelectionModel.ts +144 -0
  42. package/src/browser/selection/Types.d.ts +15 -0
  43. package/src/browser/services/CharSizeService.ts +102 -0
  44. package/src/browser/services/CharacterJoinerService.ts +339 -0
  45. package/src/browser/services/CoreBrowserService.ts +137 -0
  46. package/src/browser/services/MouseService.ts +46 -0
  47. package/src/browser/services/RenderService.ts +279 -0
  48. package/src/browser/services/SelectionService.ts +1031 -0
  49. package/src/browser/services/Services.ts +147 -0
  50. package/src/browser/services/ThemeService.ts +237 -0
  51. package/src/common/CircularList.ts +241 -0
  52. package/src/common/Clone.ts +23 -0
  53. package/src/common/Color.ts +357 -0
  54. package/src/common/CoreTerminal.ts +284 -0
  55. package/src/common/EventEmitter.ts +78 -0
  56. package/src/common/InputHandler.ts +3461 -0
  57. package/src/common/Lifecycle.ts +108 -0
  58. package/src/common/MultiKeyMap.ts +42 -0
  59. package/src/common/Platform.ts +44 -0
  60. package/src/common/SortedList.ts +118 -0
  61. package/src/common/TaskQueue.ts +166 -0
  62. package/src/common/TypedArrayUtils.ts +17 -0
  63. package/src/common/Types.d.ts +553 -0
  64. package/src/common/WindowsMode.ts +27 -0
  65. package/src/common/buffer/AttributeData.ts +196 -0
  66. package/src/common/buffer/Buffer.ts +654 -0
  67. package/src/common/buffer/BufferLine.ts +524 -0
  68. package/src/common/buffer/BufferRange.ts +13 -0
  69. package/src/common/buffer/BufferReflow.ts +223 -0
  70. package/src/common/buffer/BufferSet.ts +134 -0
  71. package/src/common/buffer/CellData.ts +94 -0
  72. package/src/common/buffer/Constants.ts +149 -0
  73. package/src/common/buffer/Marker.ts +43 -0
  74. package/src/common/buffer/Types.d.ts +52 -0
  75. package/src/common/data/Charsets.ts +256 -0
  76. package/src/common/data/EscapeSequences.ts +153 -0
  77. package/src/common/input/Keyboard.ts +398 -0
  78. package/src/common/input/TextDecoder.ts +346 -0
  79. package/src/common/input/UnicodeV6.ts +145 -0
  80. package/src/common/input/WriteBuffer.ts +246 -0
  81. package/src/common/input/XParseColor.ts +80 -0
  82. package/src/common/parser/Constants.ts +58 -0
  83. package/src/common/parser/DcsParser.ts +192 -0
  84. package/src/common/parser/EscapeSequenceParser.ts +792 -0
  85. package/src/common/parser/OscParser.ts +238 -0
  86. package/src/common/parser/Params.ts +229 -0
  87. package/src/common/parser/Types.d.ts +275 -0
  88. package/src/common/public/AddonManager.ts +53 -0
  89. package/src/common/public/BufferApiView.ts +35 -0
  90. package/src/common/public/BufferLineApiView.ts +29 -0
  91. package/src/common/public/BufferNamespaceApi.ts +36 -0
  92. package/src/common/public/ParserApi.ts +37 -0
  93. package/src/common/public/UnicodeApi.ts +27 -0
  94. package/src/common/services/BufferService.ts +151 -0
  95. package/src/common/services/CharsetService.ts +34 -0
  96. package/src/common/services/CoreMouseService.ts +318 -0
  97. package/src/common/services/CoreService.ts +87 -0
  98. package/src/common/services/DecorationService.ts +140 -0
  99. package/src/common/services/InstantiationService.ts +85 -0
  100. package/src/common/services/LogService.ts +124 -0
  101. package/src/common/services/OptionsService.ts +202 -0
  102. package/src/common/services/OscLinkService.ts +115 -0
  103. package/src/common/services/ServiceRegistry.ts +49 -0
  104. package/src/common/services/Services.ts +373 -0
  105. package/src/common/services/UnicodeService.ts +111 -0
  106. package/src/headless/Terminal.ts +136 -0
  107. package/src/headless/public/Terminal.ts +195 -0
  108. package/typings/xterm.d.ts +1857 -0
@@ -0,0 +1,398 @@
1
+ /**
2
+ * Copyright (c) 2014 The xterm.js authors. All rights reserved.
3
+ * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
4
+ * @license MIT
5
+ */
6
+
7
+ import { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from 'common/Types';
8
+ import { C0 } from 'common/data/EscapeSequences';
9
+
10
+ // reg + shift key mappings for digits and special chars
11
+ const KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {
12
+ // digits 0-9
13
+ 48: ['0', ')'],
14
+ 49: ['1', '!'],
15
+ 50: ['2', '@'],
16
+ 51: ['3', '#'],
17
+ 52: ['4', '$'],
18
+ 53: ['5', '%'],
19
+ 54: ['6', '^'],
20
+ 55: ['7', '&'],
21
+ 56: ['8', '*'],
22
+ 57: ['9', '('],
23
+
24
+ // special chars
25
+ 186: [';', ':'],
26
+ 187: ['=', '+'],
27
+ 188: [',', '<'],
28
+ 189: ['-', '_'],
29
+ 190: ['.', '>'],
30
+ 191: ['/', '?'],
31
+ 192: ['`', '~'],
32
+ 219: ['[', '{'],
33
+ 220: ['\\', '|'],
34
+ 221: [']', '}'],
35
+ 222: ['\'', '"']
36
+ };
37
+
38
+ export function evaluateKeyboardEvent(
39
+ ev: IKeyboardEvent,
40
+ applicationCursorMode: boolean,
41
+ isMac: boolean,
42
+ macOptionIsMeta: boolean
43
+ ): IKeyboardResult {
44
+ const result: IKeyboardResult = {
45
+ type: KeyboardResultType.SEND_KEY,
46
+ // Whether to cancel event propagation (NOTE: this may not be needed since the event is
47
+ // canceled at the end of keyDown
48
+ cancel: false,
49
+ // The new key even to emit
50
+ key: undefined
51
+ };
52
+ const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);
53
+ switch (ev.keyCode) {
54
+ case 0:
55
+ if (ev.key === 'UIKeyInputUpArrow') {
56
+ if (applicationCursorMode) {
57
+ result.key = C0.ESC + 'OA';
58
+ } else {
59
+ result.key = C0.ESC + '[A';
60
+ }
61
+ }
62
+ else if (ev.key === 'UIKeyInputLeftArrow') {
63
+ if (applicationCursorMode) {
64
+ result.key = C0.ESC + 'OD';
65
+ } else {
66
+ result.key = C0.ESC + '[D';
67
+ }
68
+ }
69
+ else if (ev.key === 'UIKeyInputRightArrow') {
70
+ if (applicationCursorMode) {
71
+ result.key = C0.ESC + 'OC';
72
+ } else {
73
+ result.key = C0.ESC + '[C';
74
+ }
75
+ }
76
+ else if (ev.key === 'UIKeyInputDownArrow') {
77
+ if (applicationCursorMode) {
78
+ result.key = C0.ESC + 'OB';
79
+ } else {
80
+ result.key = C0.ESC + '[B';
81
+ }
82
+ }
83
+ break;
84
+ case 8:
85
+ // backspace
86
+ if (ev.altKey) {
87
+ result.key = C0.ESC + C0.DEL; // \e ^?
88
+ break;
89
+ }
90
+ result.key = C0.DEL; // ^?
91
+ break;
92
+ case 9:
93
+ // tab
94
+ if (ev.shiftKey) {
95
+ result.key = C0.ESC + '[Z';
96
+ break;
97
+ }
98
+ result.key = C0.HT;
99
+ result.cancel = true;
100
+ break;
101
+ case 13:
102
+ // return/enter
103
+ result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;
104
+ result.cancel = true;
105
+ break;
106
+ case 27:
107
+ // escape
108
+ result.key = C0.ESC;
109
+ if (ev.altKey) {
110
+ result.key = C0.ESC + C0.ESC;
111
+ }
112
+ result.cancel = true;
113
+ break;
114
+ case 37:
115
+ // left-arrow
116
+ if (ev.metaKey) {
117
+ break;
118
+ }
119
+ if (modifiers) {
120
+ result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';
121
+ // HACK: Make Alt + left-arrow behave like Ctrl + left-arrow: move one word backwards
122
+ // http://unix.stackexchange.com/a/108106
123
+ // macOS uses different escape sequences than linux
124
+ if (result.key === C0.ESC + '[1;3D') {
125
+ result.key = C0.ESC + (isMac ? 'b' : '[1;5D');
126
+ }
127
+ } else if (applicationCursorMode) {
128
+ result.key = C0.ESC + 'OD';
129
+ } else {
130
+ result.key = C0.ESC + '[D';
131
+ }
132
+ break;
133
+ case 39:
134
+ // right-arrow
135
+ if (ev.metaKey) {
136
+ break;
137
+ }
138
+ if (modifiers) {
139
+ result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';
140
+ // HACK: Make Alt + right-arrow behave like Ctrl + right-arrow: move one word forward
141
+ // http://unix.stackexchange.com/a/108106
142
+ // macOS uses different escape sequences than linux
143
+ if (result.key === C0.ESC + '[1;3C') {
144
+ result.key = C0.ESC + (isMac ? 'f' : '[1;5C');
145
+ }
146
+ } else if (applicationCursorMode) {
147
+ result.key = C0.ESC + 'OC';
148
+ } else {
149
+ result.key = C0.ESC + '[C';
150
+ }
151
+ break;
152
+ case 38:
153
+ // up-arrow
154
+ if (ev.metaKey) {
155
+ break;
156
+ }
157
+ if (modifiers) {
158
+ result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';
159
+ // HACK: Make Alt + up-arrow behave like Ctrl + up-arrow
160
+ // http://unix.stackexchange.com/a/108106
161
+ // macOS uses different escape sequences than linux
162
+ if (!isMac && result.key === C0.ESC + '[1;3A') {
163
+ result.key = C0.ESC + '[1;5A';
164
+ }
165
+ } else if (applicationCursorMode) {
166
+ result.key = C0.ESC + 'OA';
167
+ } else {
168
+ result.key = C0.ESC + '[A';
169
+ }
170
+ break;
171
+ case 40:
172
+ // down-arrow
173
+ if (ev.metaKey) {
174
+ break;
175
+ }
176
+ if (modifiers) {
177
+ result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';
178
+ // HACK: Make Alt + down-arrow behave like Ctrl + down-arrow
179
+ // http://unix.stackexchange.com/a/108106
180
+ // macOS uses different escape sequences than linux
181
+ if (!isMac && result.key === C0.ESC + '[1;3B') {
182
+ result.key = C0.ESC + '[1;5B';
183
+ }
184
+ } else if (applicationCursorMode) {
185
+ result.key = C0.ESC + 'OB';
186
+ } else {
187
+ result.key = C0.ESC + '[B';
188
+ }
189
+ break;
190
+ case 45:
191
+ // insert
192
+ if (!ev.shiftKey && !ev.ctrlKey) {
193
+ // <Ctrl> or <Shift> + <Insert> are used to
194
+ // copy-paste on some systems.
195
+ result.key = C0.ESC + '[2~';
196
+ }
197
+ break;
198
+ case 46:
199
+ // delete
200
+ if (modifiers) {
201
+ result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';
202
+ } else {
203
+ result.key = C0.ESC + '[3~';
204
+ }
205
+ break;
206
+ case 36:
207
+ // home
208
+ if (modifiers) {
209
+ result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';
210
+ } else if (applicationCursorMode) {
211
+ result.key = C0.ESC + 'OH';
212
+ } else {
213
+ result.key = C0.ESC + '[H';
214
+ }
215
+ break;
216
+ case 35:
217
+ // end
218
+ if (modifiers) {
219
+ result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';
220
+ } else if (applicationCursorMode) {
221
+ result.key = C0.ESC + 'OF';
222
+ } else {
223
+ result.key = C0.ESC + '[F';
224
+ }
225
+ break;
226
+ case 33:
227
+ // page up
228
+ if (ev.shiftKey) {
229
+ result.type = KeyboardResultType.PAGE_UP;
230
+ } else if (ev.ctrlKey) {
231
+ result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';
232
+ } else {
233
+ result.key = C0.ESC + '[5~';
234
+ }
235
+ break;
236
+ case 34:
237
+ // page down
238
+ if (ev.shiftKey) {
239
+ result.type = KeyboardResultType.PAGE_DOWN;
240
+ } else if (ev.ctrlKey) {
241
+ result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';
242
+ } else {
243
+ result.key = C0.ESC + '[6~';
244
+ }
245
+ break;
246
+ case 112:
247
+ // F1-F12
248
+ if (modifiers) {
249
+ result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';
250
+ } else {
251
+ result.key = C0.ESC + 'OP';
252
+ }
253
+ break;
254
+ case 113:
255
+ if (modifiers) {
256
+ result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';
257
+ } else {
258
+ result.key = C0.ESC + 'OQ';
259
+ }
260
+ break;
261
+ case 114:
262
+ if (modifiers) {
263
+ result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';
264
+ } else {
265
+ result.key = C0.ESC + 'OR';
266
+ }
267
+ break;
268
+ case 115:
269
+ if (modifiers) {
270
+ result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';
271
+ } else {
272
+ result.key = C0.ESC + 'OS';
273
+ }
274
+ break;
275
+ case 116:
276
+ if (modifiers) {
277
+ result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';
278
+ } else {
279
+ result.key = C0.ESC + '[15~';
280
+ }
281
+ break;
282
+ case 117:
283
+ if (modifiers) {
284
+ result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';
285
+ } else {
286
+ result.key = C0.ESC + '[17~';
287
+ }
288
+ break;
289
+ case 118:
290
+ if (modifiers) {
291
+ result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';
292
+ } else {
293
+ result.key = C0.ESC + '[18~';
294
+ }
295
+ break;
296
+ case 119:
297
+ if (modifiers) {
298
+ result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';
299
+ } else {
300
+ result.key = C0.ESC + '[19~';
301
+ }
302
+ break;
303
+ case 120:
304
+ if (modifiers) {
305
+ result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';
306
+ } else {
307
+ result.key = C0.ESC + '[20~';
308
+ }
309
+ break;
310
+ case 121:
311
+ if (modifiers) {
312
+ result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';
313
+ } else {
314
+ result.key = C0.ESC + '[21~';
315
+ }
316
+ break;
317
+ case 122:
318
+ if (modifiers) {
319
+ result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';
320
+ } else {
321
+ result.key = C0.ESC + '[23~';
322
+ }
323
+ break;
324
+ case 123:
325
+ if (modifiers) {
326
+ result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';
327
+ } else {
328
+ result.key = C0.ESC + '[24~';
329
+ }
330
+ break;
331
+ default:
332
+ // a-z and space
333
+ if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {
334
+ if (ev.keyCode >= 65 && ev.keyCode <= 90) {
335
+ result.key = String.fromCharCode(ev.keyCode - 64);
336
+ } else if (ev.keyCode === 32) {
337
+ result.key = C0.NUL;
338
+ } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {
339
+ // escape, file sep, group sep, record sep, unit sep
340
+ result.key = String.fromCharCode(ev.keyCode - 51 + 27);
341
+ } else if (ev.keyCode === 56) {
342
+ result.key = C0.DEL;
343
+ } else if (ev.keyCode === 219) {
344
+ result.key = C0.ESC;
345
+ } else if (ev.keyCode === 220) {
346
+ result.key = C0.FS;
347
+ } else if (ev.keyCode === 221) {
348
+ result.key = C0.GS;
349
+ }
350
+ } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {
351
+ // On macOS this is a third level shift when !macOptionIsMeta. Use <Esc> instead.
352
+ const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];
353
+ const key = keyMapping?.[!ev.shiftKey ? 0 : 1];
354
+ if (key) {
355
+ result.key = C0.ESC + key;
356
+ } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {
357
+ const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;
358
+ let keyString = String.fromCharCode(keyCode);
359
+ if (ev.shiftKey) {
360
+ keyString = keyString.toUpperCase();
361
+ }
362
+ result.key = C0.ESC + keyString;
363
+ } else if (ev.keyCode === 32) {
364
+ result.key = C0.ESC + (ev.ctrlKey ? C0.NUL : ' ');
365
+ } else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {
366
+ // Reference: https://github.com/xtermjs/xterm.js/issues/3725
367
+ // Alt will produce a "dead key" (initate composition) with some
368
+ // of the letters in US layout (e.g. N/E/U).
369
+ // It's safe to match against Key* since no other `code` values begin with "Key".
370
+ // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac
371
+ let keyString = ev.code.slice(3, 4);
372
+ if (!ev.shiftKey) {
373
+ keyString = keyString.toLowerCase();
374
+ }
375
+ result.key = C0.ESC + keyString;
376
+ result.cancel = true;
377
+ }
378
+ } else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {
379
+ if (ev.keyCode === 65) { // cmd + a
380
+ result.type = KeyboardResultType.SELECT_ALL;
381
+ }
382
+ } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {
383
+ // Include only keys that that result in a _single_ character; don't include num lock,
384
+ // volume up, etc.
385
+ result.key = ev.key;
386
+ } else if (ev.key && ev.ctrlKey) {
387
+ if (ev.key === '_') { // ^_
388
+ result.key = C0.US;
389
+ }
390
+ if (ev.key === '@') { // ^ + shift + 2 = ^ + @
391
+ result.key = C0.NUL;
392
+ }
393
+ }
394
+ break;
395
+ }
396
+
397
+ return result;
398
+ }