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