]>
Commit | Line | Data |
---|---|---|
9782d4a3 PO |
1 | /* |
2 | * noVNC: HTML5 VNC client | |
84586c0f | 3 | * Copyright (C) 2018 The noVNC Authors |
9782d4a3 PO |
4 | * Licensed under MPL 2.0 or any later version (see LICENSE.txt) |
5 | */ | |
6 | ||
afb621d5 | 7 | import KeyTable from "./keysym.js"; |
9782d4a3 PO |
8 | |
9 | /* | |
10 | * Mapping between HTML key values and VNC/X11 keysyms for "special" | |
11 | * keys that cannot be handled via their Unicode codepoint. | |
12 | * | |
13 | * See https://www.w3.org/TR/uievents-key/ for possible values. | |
14 | */ | |
15 | ||
2b5f94fa | 16 | const DOMKeyTable = {}; |
9782d4a3 | 17 | |
a9888115 | 18 | function addStandard(key, standard) { |
84a5a2d8 JD |
19 | if (standard === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); |
20 | if (key in DOMKeyTable) throw new Error("Duplicate entry for key \"" + key + "\""); | |
9782d4a3 PO |
21 | DOMKeyTable[key] = [standard, standard, standard, standard]; |
22 | } | |
23 | ||
a9888115 | 24 | function addLeftRight(key, left, right) { |
84a5a2d8 JD |
25 | if (left === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); |
26 | if (right === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); | |
27 | if (key in DOMKeyTable) throw new Error("Duplicate entry for key \"" + key + "\""); | |
9782d4a3 PO |
28 | DOMKeyTable[key] = [left, left, right, left]; |
29 | } | |
30 | ||
a9888115 | 31 | function addNumpad(key, standard, numpad) { |
84a5a2d8 JD |
32 | if (standard === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); |
33 | if (numpad === undefined) throw new Error("Undefined keysym for key \"" + key + "\""); | |
34 | if (key in DOMKeyTable) throw new Error("Duplicate entry for key \"" + key + "\""); | |
9782d4a3 PO |
35 | DOMKeyTable[key] = [standard, standard, standard, numpad]; |
36 | } | |
37 | ||
38 | // 2.2. Modifier Keys | |
39 | ||
40 | addLeftRight("Alt", KeyTable.XK_Alt_L, KeyTable.XK_Alt_R); | |
41 | addStandard("AltGraph", KeyTable.XK_ISO_Level3_Shift); | |
42 | addStandard("CapsLock", KeyTable.XK_Caps_Lock); | |
43 | addLeftRight("Control", KeyTable.XK_Control_L, KeyTable.XK_Control_R); | |
44 | // - Fn | |
45 | // - FnLock | |
9782d4a3 PO |
46 | addLeftRight("Meta", KeyTable.XK_Super_L, KeyTable.XK_Super_R); |
47 | addStandard("NumLock", KeyTable.XK_Num_Lock); | |
48 | addStandard("ScrollLock", KeyTable.XK_Scroll_Lock); | |
49 | addLeftRight("Shift", KeyTable.XK_Shift_L, KeyTable.XK_Shift_R); | |
9782d4a3 PO |
50 | // - Symbol |
51 | // - SymbolLock | |
52 | ||
53 | // 2.3. Whitespace Keys | |
54 | ||
55 | addNumpad("Enter", KeyTable.XK_Return, KeyTable.XK_KP_Enter); | |
56 | addStandard("Tab", KeyTable.XK_Tab); | |
57 | addNumpad(" ", KeyTable.XK_space, KeyTable.XK_KP_Space); | |
58 | ||
59 | // 2.4. Navigation Keys | |
60 | ||
61 | addNumpad("ArrowDown", KeyTable.XK_Down, KeyTable.XK_KP_Down); | |
62 | addNumpad("ArrowUp", KeyTable.XK_Up, KeyTable.XK_KP_Up); | |
63 | addNumpad("ArrowLeft", KeyTable.XK_Left, KeyTable.XK_KP_Left); | |
64 | addNumpad("ArrowRight", KeyTable.XK_Right, KeyTable.XK_KP_Right); | |
65 | addNumpad("End", KeyTable.XK_End, KeyTable.XK_KP_End); | |
66 | addNumpad("Home", KeyTable.XK_Home, KeyTable.XK_KP_Home); | |
67 | addNumpad("PageDown", KeyTable.XK_Next, KeyTable.XK_KP_Next); | |
68 | addNumpad("PageUp", KeyTable.XK_Prior, KeyTable.XK_KP_Prior); | |
69 | ||
70 | // 2.5. Editing Keys | |
71 | ||
72 | addStandard("Backspace", KeyTable.XK_BackSpace); | |
dd4341fe PO |
73 | // Browsers send "Clear" for the numpad 5 without NumLock because |
74 | // Windows uses VK_Clear for that key. But Unix expects KP_Begin for | |
75 | // that scenario. | |
5858f472 | 76 | addNumpad("Clear", KeyTable.XK_Clear, KeyTable.XK_KP_Begin); |
9782d4a3 PO |
77 | addStandard("Copy", KeyTable.XF86XK_Copy); |
78 | // - CrSel | |
79 | addStandard("Cut", KeyTable.XF86XK_Cut); | |
80 | addNumpad("Delete", KeyTable.XK_Delete, KeyTable.XK_KP_Delete); | |
81 | // - EraseEof | |
82 | // - ExSel | |
83 | addNumpad("Insert", KeyTable.XK_Insert, KeyTable.XK_KP_Insert); | |
84 | addStandard("Paste", KeyTable.XF86XK_Paste); | |
85 | addStandard("Redo", KeyTable.XK_Redo); | |
86 | addStandard("Undo", KeyTable.XK_Undo); | |
87 | ||
88 | // 2.6. UI Keys | |
89 | ||
90 | // - Accept | |
91 | // - Again (could just be XK_Redo) | |
92 | // - Attn | |
93 | addStandard("Cancel", KeyTable.XK_Cancel); | |
94 | addStandard("ContextMenu", KeyTable.XK_Menu); | |
95 | addStandard("Escape", KeyTable.XK_Escape); | |
96 | addStandard("Execute", KeyTable.XK_Execute); | |
97 | addStandard("Find", KeyTable.XK_Find); | |
98 | addStandard("Help", KeyTable.XK_Help); | |
99 | addStandard("Pause", KeyTable.XK_Pause); | |
100 | // - Play | |
101 | // - Props | |
102 | addStandard("Select", KeyTable.XK_Select); | |
103 | addStandard("ZoomIn", KeyTable.XF86XK_ZoomIn); | |
104 | addStandard("ZoomOut", KeyTable.XF86XK_ZoomOut); | |
105 | ||
106 | // 2.7. Device Keys | |
107 | ||
108 | addStandard("BrightnessDown", KeyTable.XF86XK_MonBrightnessDown); | |
109 | addStandard("BrightnessUp", KeyTable.XF86XK_MonBrightnessUp); | |
110 | addStandard("Eject", KeyTable.XF86XK_Eject); | |
111 | addStandard("LogOff", KeyTable.XF86XK_LogOff); | |
112 | addStandard("Power", KeyTable.XF86XK_PowerOff); | |
113 | addStandard("PowerOff", KeyTable.XF86XK_PowerDown); | |
114 | addStandard("PrintScreen", KeyTable.XK_Print); | |
115 | addStandard("Hibernate", KeyTable.XF86XK_Hibernate); | |
116 | addStandard("Standby", KeyTable.XF86XK_Standby); | |
117 | addStandard("WakeUp", KeyTable.XF86XK_WakeUp); | |
118 | ||
119 | // 2.8. IME and Composition Keys | |
120 | ||
121 | addStandard("AllCandidates", KeyTable.XK_MultipleCandidate); | |
bd1bb2ed | 122 | addStandard("Alphanumeric", KeyTable.XK_Eisu_toggle); |
9782d4a3 PO |
123 | addStandard("CodeInput", KeyTable.XK_Codeinput); |
124 | addStandard("Compose", KeyTable.XK_Multi_key); | |
125 | addStandard("Convert", KeyTable.XK_Henkan); | |
126 | // - Dead | |
127 | // - FinalMode | |
128 | addStandard("GroupFirst", KeyTable.XK_ISO_First_Group); | |
129 | addStandard("GroupLast", KeyTable.XK_ISO_Last_Group); | |
130 | addStandard("GroupNext", KeyTable.XK_ISO_Next_Group); | |
131 | addStandard("GroupPrevious", KeyTable.XK_ISO_Prev_Group); | |
132 | // - ModeChange (XK_Mode_switch is often used for AltGr) | |
133 | // - NextCandidate | |
134 | addStandard("NonConvert", KeyTable.XK_Muhenkan); | |
135 | addStandard("PreviousCandidate", KeyTable.XK_PreviousCandidate); | |
136 | // - Process | |
137 | addStandard("SingleCandidate", KeyTable.XK_SingleCandidate); | |
138 | addStandard("HangulMode", KeyTable.XK_Hangul); | |
139 | addStandard("HanjaMode", KeyTable.XK_Hangul_Hanja); | |
140 | addStandard("JunjuaMode", KeyTable.XK_Hangul_Jeonja); | |
141 | addStandard("Eisu", KeyTable.XK_Eisu_toggle); | |
142 | addStandard("Hankaku", KeyTable.XK_Hankaku); | |
143 | addStandard("Hiragana", KeyTable.XK_Hiragana); | |
144 | addStandard("HiraganaKatakana", KeyTable.XK_Hiragana_Katakana); | |
145 | addStandard("KanaMode", KeyTable.XK_Kana_Shift); // could also be _Kana_Lock | |
146 | addStandard("KanjiMode", KeyTable.XK_Kanji); | |
147 | addStandard("Katakana", KeyTable.XK_Katakana); | |
148 | addStandard("Romaji", KeyTable.XK_Romaji); | |
149 | addStandard("Zenkaku", KeyTable.XK_Zenkaku); | |
150 | addStandard("ZenkakuHanaku", KeyTable.XK_Zenkaku_Hankaku); | |
151 | ||
152 | // 2.9. General-Purpose Function Keys | |
153 | ||
154 | addStandard("F1", KeyTable.XK_F1); | |
155 | addStandard("F2", KeyTable.XK_F2); | |
156 | addStandard("F3", KeyTable.XK_F3); | |
157 | addStandard("F4", KeyTable.XK_F4); | |
158 | addStandard("F5", KeyTable.XK_F5); | |
159 | addStandard("F6", KeyTable.XK_F6); | |
160 | addStandard("F7", KeyTable.XK_F7); | |
161 | addStandard("F8", KeyTable.XK_F8); | |
162 | addStandard("F9", KeyTable.XK_F9); | |
163 | addStandard("F10", KeyTable.XK_F10); | |
164 | addStandard("F11", KeyTable.XK_F11); | |
165 | addStandard("F12", KeyTable.XK_F12); | |
166 | addStandard("F13", KeyTable.XK_F13); | |
167 | addStandard("F14", KeyTable.XK_F14); | |
168 | addStandard("F15", KeyTable.XK_F15); | |
169 | addStandard("F16", KeyTable.XK_F16); | |
170 | addStandard("F17", KeyTable.XK_F17); | |
171 | addStandard("F18", KeyTable.XK_F18); | |
172 | addStandard("F19", KeyTable.XK_F19); | |
173 | addStandard("F20", KeyTable.XK_F20); | |
174 | addStandard("F21", KeyTable.XK_F21); | |
175 | addStandard("F22", KeyTable.XK_F22); | |
176 | addStandard("F23", KeyTable.XK_F23); | |
177 | addStandard("F24", KeyTable.XK_F24); | |
178 | addStandard("F25", KeyTable.XK_F25); | |
179 | addStandard("F26", KeyTable.XK_F26); | |
180 | addStandard("F27", KeyTable.XK_F27); | |
181 | addStandard("F28", KeyTable.XK_F28); | |
182 | addStandard("F29", KeyTable.XK_F29); | |
183 | addStandard("F30", KeyTable.XK_F30); | |
184 | addStandard("F31", KeyTable.XK_F31); | |
185 | addStandard("F32", KeyTable.XK_F32); | |
186 | addStandard("F33", KeyTable.XK_F33); | |
187 | addStandard("F34", KeyTable.XK_F34); | |
188 | addStandard("F35", KeyTable.XK_F35); | |
189 | // - Soft1... | |
190 | ||
191 | // 2.10. Multimedia Keys | |
192 | ||
193 | // - ChannelDown | |
194 | // - ChannelUp | |
195 | addStandard("Close", KeyTable.XF86XK_Close); | |
196 | addStandard("MailForward", KeyTable.XF86XK_MailForward); | |
197 | addStandard("MailReply", KeyTable.XF86XK_Reply); | |
10965554 | 198 | addStandard("MailSend", KeyTable.XF86XK_Send); |
ebee9cdd | 199 | // - MediaClose |
9782d4a3 PO |
200 | addStandard("MediaFastForward", KeyTable.XF86XK_AudioForward); |
201 | addStandard("MediaPause", KeyTable.XF86XK_AudioPause); | |
202 | addStandard("MediaPlay", KeyTable.XF86XK_AudioPlay); | |
203 | addStandard("MediaRecord", KeyTable.XF86XK_AudioRecord); | |
204 | addStandard("MediaRewind", KeyTable.XF86XK_AudioRewind); | |
205 | addStandard("MediaStop", KeyTable.XF86XK_AudioStop); | |
206 | addStandard("MediaTrackNext", KeyTable.XF86XK_AudioNext); | |
207 | addStandard("MediaTrackPrevious", KeyTable.XF86XK_AudioPrev); | |
208 | addStandard("New", KeyTable.XF86XK_New); | |
209 | addStandard("Open", KeyTable.XF86XK_Open); | |
210 | addStandard("Print", KeyTable.XK_Print); | |
211 | addStandard("Save", KeyTable.XF86XK_Save); | |
212 | addStandard("SpellCheck", KeyTable.XF86XK_Spell); | |
213 | ||
214 | // 2.11. Multimedia Numpad Keys | |
215 | ||
216 | // - Key11 | |
217 | // - Key12 | |
218 | ||
219 | // 2.12. Audio Keys | |
220 | ||
221 | // - AudioBalanceLeft | |
222 | // - AudioBalanceRight | |
9782d4a3 PO |
223 | // - AudioBassBoostDown |
224 | // - AudioBassBoostToggle | |
225 | // - AudioBassBoostUp | |
9782d4a3 PO |
226 | // - AudioFaderFront |
227 | // - AudioFaderRear | |
228 | // - AudioSurroundModeNext | |
229 | // - AudioTrebleDown | |
230 | // - AudioTrebleUp | |
231 | addStandard("AudioVolumeDown", KeyTable.XF86XK_AudioLowerVolume); | |
232 | addStandard("AudioVolumeUp", KeyTable.XF86XK_AudioRaiseVolume); | |
233 | addStandard("AudioVolumeMute", KeyTable.XF86XK_AudioMute); | |
234 | // - MicrophoneToggle | |
235 | // - MicrophoneVolumeDown | |
236 | // - MicrophoneVolumeUp | |
237 | addStandard("MicrophoneVolumeMute", KeyTable.XF86XK_AudioMicMute); | |
238 | ||
239 | // 2.13. Speech Keys | |
240 | ||
241 | // - SpeechCorrectionList | |
242 | // - SpeechInputToggle | |
243 | ||
244 | // 2.14. Application Keys | |
245 | ||
ebee9cdd PO |
246 | addStandard("LaunchApplication1", KeyTable.XF86XK_MyComputer); |
247 | addStandard("LaunchApplication2", KeyTable.XF86XK_Calculator); | |
9782d4a3 PO |
248 | addStandard("LaunchCalendar", KeyTable.XF86XK_Calendar); |
249 | addStandard("LaunchMail", KeyTable.XF86XK_Mail); | |
250 | addStandard("LaunchMediaPlayer", KeyTable.XF86XK_AudioMedia); | |
251 | addStandard("LaunchMusicPlayer", KeyTable.XF86XK_Music); | |
9782d4a3 PO |
252 | addStandard("LaunchPhone", KeyTable.XF86XK_Phone); |
253 | addStandard("LaunchScreenSaver", KeyTable.XF86XK_ScreenSaver); | |
254 | addStandard("LaunchSpreadsheet", KeyTable.XF86XK_Excel); | |
255 | addStandard("LaunchWebBrowser", KeyTable.XF86XK_WWW); | |
256 | addStandard("LaunchWebCam", KeyTable.XF86XK_WebCam); | |
257 | addStandard("LaunchWordProcessor", KeyTable.XF86XK_Word); | |
258 | ||
259 | // 2.15. Browser Keys | |
260 | ||
261 | addStandard("BrowserBack", KeyTable.XF86XK_Back); | |
262 | addStandard("BrowserFavorites", KeyTable.XF86XK_Favorites); | |
263 | addStandard("BrowserForward", KeyTable.XF86XK_Forward); | |
264 | addStandard("BrowserHome", KeyTable.XF86XK_HomePage); | |
265 | addStandard("BrowserRefresh", KeyTable.XF86XK_Refresh); | |
266 | addStandard("BrowserSearch", KeyTable.XF86XK_Search); | |
267 | addStandard("BrowserStop", KeyTable.XF86XK_Stop); | |
268 | ||
269 | // 2.16. Mobile Phone Keys | |
270 | ||
271 | // - A whole bunch... | |
272 | ||
273 | // 2.17. TV Keys | |
274 | ||
275 | // - A whole bunch... | |
276 | ||
277 | // 2.18. Media Controller Keys | |
278 | ||
279 | // - A whole bunch... | |
280 | addStandard("Dimmer", KeyTable.XF86XK_BrightnessAdjust); | |
281 | addStandard("MediaAudioTrack", KeyTable.XF86XK_AudioCycleTrack); | |
282 | addStandard("RandomToggle", KeyTable.XF86XK_AudioRandomPlay); | |
283 | addStandard("SplitScreenToggle", KeyTable.XF86XK_SplitScreen); | |
284 | addStandard("Subtitle", KeyTable.XF86XK_Subtitle); | |
285 | addStandard("VideoModeNext", KeyTable.XF86XK_Next_VMode); | |
286 | ||
287 | // Extra: Numpad | |
288 | ||
289 | addNumpad("=", KeyTable.XK_equal, KeyTable.XK_KP_Equal); | |
290 | addNumpad("+", KeyTable.XK_plus, KeyTable.XK_KP_Add); | |
291 | addNumpad("-", KeyTable.XK_minus, KeyTable.XK_KP_Subtract); | |
292 | addNumpad("*", KeyTable.XK_asterisk, KeyTable.XK_KP_Multiply); | |
293 | addNumpad("/", KeyTable.XK_slash, KeyTable.XK_KP_Divide); | |
294 | addNumpad(".", KeyTable.XK_period, KeyTable.XK_KP_Decimal); | |
295 | addNumpad(",", KeyTable.XK_comma, KeyTable.XK_KP_Separator); | |
296 | addNumpad("0", KeyTable.XK_0, KeyTable.XK_KP_0); | |
297 | addNumpad("1", KeyTable.XK_1, KeyTable.XK_KP_1); | |
298 | addNumpad("2", KeyTable.XK_2, KeyTable.XK_KP_2); | |
299 | addNumpad("3", KeyTable.XK_3, KeyTable.XK_KP_3); | |
300 | addNumpad("4", KeyTable.XK_4, KeyTable.XK_KP_4); | |
301 | addNumpad("5", KeyTable.XK_5, KeyTable.XK_KP_5); | |
302 | addNumpad("6", KeyTable.XK_6, KeyTable.XK_KP_6); | |
303 | addNumpad("7", KeyTable.XK_7, KeyTable.XK_KP_7); | |
304 | addNumpad("8", KeyTable.XK_8, KeyTable.XK_KP_8); | |
305 | addNumpad("9", KeyTable.XK_9, KeyTable.XK_KP_9); | |
306 | ||
307 | export default DOMKeyTable; |