Skip to content

Commit 7f7156b

Browse files
committed
add modifier+F1-F12 keys
1 parent 62ce64f commit 7f7156b

2 files changed

Lines changed: 123 additions & 12 deletions

File tree

src/xterm.js

Lines changed: 84 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3016,18 +3016,90 @@
30163016
}
30173017
break;
30183018
// F1-F12
3019-
case 112: result.key = '\x1bOP'; break;
3020-
case 113: result.key = '\x1bOQ'; break;
3021-
case 114: result.key = '\x1bOR'; break;
3022-
case 115: result.key = '\x1bOS'; break;
3023-
case 116: result.key = '\x1b[15~'; break;
3024-
case 117: result.key = '\x1b[17~'; break;
3025-
case 118: result.key = '\x1b[18~'; break;
3026-
case 119: result.key = '\x1b[19~'; break;
3027-
case 120: result.key = '\x1b[20~'; break;
3028-
case 121: result.key = '\x1b[21~'; break;
3029-
case 122: result.key = '\x1b[23~'; break;
3030-
case 123: result.key = '\x1b[24~'; break;
3019+
case 112:
3020+
if (modifiers) {
3021+
result.key = '\x1b[1;' + (modifiers + 1) + 'P';
3022+
} else {
3023+
result.key = '\x1bOP';
3024+
}
3025+
break;
3026+
case 113:
3027+
if (modifiers) {
3028+
result.key = '\x1b[1;' + (modifiers + 1) + 'Q';
3029+
} else {
3030+
result.key = '\x1bOQ';
3031+
}
3032+
break;
3033+
case 114:
3034+
if (modifiers) {
3035+
result.key = '\x1b[1;' + (modifiers + 1) + 'R';
3036+
} else {
3037+
result.key = '\x1bOR';
3038+
}
3039+
break;
3040+
case 115:
3041+
if (modifiers) {
3042+
result.key = '\x1b[1;' + (modifiers + 1) + 'S';
3043+
} else {
3044+
result.key = '\x1bOS';
3045+
}
3046+
break;
3047+
case 116:
3048+
if (modifiers) {
3049+
result.key = '\x1b[15;' + (modifiers + 1) + '~';
3050+
} else {
3051+
result.key = '\x1b[15~';
3052+
}
3053+
break;
3054+
case 117:
3055+
if (modifiers) {
3056+
result.key = '\x1b[17;' + (modifiers + 1) + '~';
3057+
} else {
3058+
result.key = '\x1b[17~';
3059+
}
3060+
break;
3061+
case 118:
3062+
if (modifiers) {
3063+
result.key = '\x1b[18;' + (modifiers + 1) + '~';
3064+
} else {
3065+
result.key = '\x1b[18~';
3066+
}
3067+
break;
3068+
case 119:
3069+
if (modifiers) {
3070+
result.key = '\x1b[19;' + (modifiers + 1) + '~';
3071+
} else {
3072+
result.key = '\x1b[19~';
3073+
}
3074+
break;
3075+
case 120:
3076+
if (modifiers) {
3077+
result.key = '\x1b[20;' + (modifiers + 1) + '~';
3078+
} else {
3079+
result.key = '\x1b[20~';
3080+
}
3081+
break;
3082+
case 121:
3083+
if (modifiers) {
3084+
result.key = '\x1b[21;' + (modifiers + 1) + '~';
3085+
} else {
3086+
result.key = '\x1b[21~';
3087+
}
3088+
break;
3089+
case 122:
3090+
if (modifiers) {
3091+
result.key = '\x1b[23;' + (modifiers + 1) + '~';
3092+
} else {
3093+
result.key = '\x1b[23~';
3094+
}
3095+
break;
3096+
case 123:
3097+
if (modifiers) {
3098+
result.key = '\x1b[24;' + (modifiers + 1) + '~';
3099+
} else {
3100+
result.key = '\x1b[24~';
3101+
}
3102+
break;
30313103
default:
30323104
// a-z and space
30333105
if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {

test/test.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,45 @@ describe('xterm.js', function() {
8484
it('should return \\x1b[5B for alt+down', function() {
8585
assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 40 }).key, '\x1b[1;5B'); // CSI 5 B
8686
});
87+
it('should return the correct escape sequence for modified F1-F12 keys', function() {
88+
assert.equal(xterm.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 112 }).key, '\x1b[1;2P');
89+
assert.equal(xterm.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 113 }).key, '\x1b[1;2Q');
90+
assert.equal(xterm.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 114 }).key, '\x1b[1;2R');
91+
assert.equal(xterm.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 115 }).key, '\x1b[1;2S');
92+
assert.equal(xterm.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 116 }).key, '\x1b[15;2~');
93+
assert.equal(xterm.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 117 }).key, '\x1b[17;2~');
94+
assert.equal(xterm.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 118 }).key, '\x1b[18;2~');
95+
assert.equal(xterm.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 119 }).key, '\x1b[19;2~');
96+
assert.equal(xterm.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 120 }).key, '\x1b[20;2~');
97+
assert.equal(xterm.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 121 }).key, '\x1b[21;2~');
98+
assert.equal(xterm.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 122 }).key, '\x1b[23;2~');
99+
assert.equal(xterm.evaluateKeyEscapeSequence({ shiftKey: true, keyCode: 123 }).key, '\x1b[24;2~');
100+
assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 112 }).key, '\x1b[1;3P');
101+
assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 113 }).key, '\x1b[1;3Q');
102+
assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 114 }).key, '\x1b[1;3R');
103+
assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 115 }).key, '\x1b[1;3S');
104+
assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 116 }).key, '\x1b[15;3~');
105+
assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 117 }).key, '\x1b[17;3~');
106+
assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 118 }).key, '\x1b[18;3~');
107+
assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 119 }).key, '\x1b[19;3~');
108+
assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 120 }).key, '\x1b[20;3~');
109+
assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 121 }).key, '\x1b[21;3~');
110+
assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 122 }).key, '\x1b[23;3~');
111+
assert.equal(xterm.evaluateKeyEscapeSequence({ altKey: true, keyCode: 123 }).key, '\x1b[24;3~');
112+
113+
assert.equal(xterm.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 112 }).key, '\x1b[1;5P');
114+
assert.equal(xterm.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 113 }).key, '\x1b[1;5Q');
115+
assert.equal(xterm.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 114 }).key, '\x1b[1;5R');
116+
assert.equal(xterm.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 115 }).key, '\x1b[1;5S');
117+
assert.equal(xterm.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 116 }).key, '\x1b[15;5~');
118+
assert.equal(xterm.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 117 }).key, '\x1b[17;5~');
119+
assert.equal(xterm.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 118 }).key, '\x1b[18;5~');
120+
assert.equal(xterm.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 119 }).key, '\x1b[19;5~');
121+
assert.equal(xterm.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 120 }).key, '\x1b[20;5~');
122+
assert.equal(xterm.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 121 }).key, '\x1b[21;5~');
123+
assert.equal(xterm.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 122 }).key, '\x1b[23;5~');
124+
assert.equal(xterm.evaluateKeyEscapeSequence({ ctrlKey: true, keyCode: 123 }).key, '\x1b[24;5~');
125+
});
87126
});
88127

89128
describe('attachCustomEventHandler', function () {

0 commit comments

Comments
 (0)