1 module gfx.window.xkeyboard; 2 3 version(linux): 4 5 import gfx.core.rc : Disposable; 6 import gfx.window : gfxWindowLog, KeyEvent, KeyHandler; 7 import gfx.window.keys; 8 9 import xkbcommon.keysyms; 10 import xkbcommon.xkbcommon; 11 12 /// Keyboard class whose state is driven by xkbcommon 13 abstract class XKeyboard : Disposable 14 { 15 private xkb_context* _ctx; 16 private xkb_keymap* _keymap; 17 private xkb_state* _state; 18 private KeyMods _mods; 19 20 this(xkb_context* ctx, xkb_keymap* keymap, xkb_state* state) 21 { 22 _ctx = ctx; 23 _keymap = keymap; 24 _state = state; 25 } 26 27 override void dispose() 28 { 29 xkb_state_unref(_state); 30 xkb_keymap_unref(_keymap); 31 xkb_context_unref(_ctx); 32 } 33 34 void updateState(uint depressedMods, uint latchedMods, uint lockedMods, 35 uint depressedLayout, uint latchedLayout, uint lockedLayout) 36 { 37 xkb_state_update_mask(_state, 38 depressedMods, latchedMods, lockedMods, 39 depressedLayout, latchedLayout, lockedLayout 40 ); 41 } 42 43 @property KeyMods mods() const 44 { 45 return _mods; 46 } 47 48 void processKeyDown(uint keycode, KeyHandler handler) 49 { 50 import std.exception : assumeUnique; 51 52 const code = codeForKeycode(keycode); 53 const mods = modsForCode(code); 54 _mods |= mods; 55 56 if (!handler) return; 57 58 const keysym = xkb_state_key_get_one_sym(_state, keycode); 59 const sym = symForKeysym(keysym); 60 const size = xkb_state_key_get_utf8(_state, keycode, null, 0); 61 string text; 62 if (size > 0) { 63 char[] buf = new char[size+1]; 64 xkb_state_key_get_utf8(_state, keycode, buf.ptr, size+1); 65 buf = buf[0 .. size]; 66 text = assumeUnique(buf); 67 } 68 69 handler(KeyEvent(sym, code, mods, text)); 70 } 71 72 void processKeyUp(uint keycode, KeyHandler handler) 73 { 74 import std.exception : assumeUnique; 75 76 const code = codeForKeycode(keycode); 77 const mods = modsForCode(code); 78 _mods &= ~mods; 79 80 if (!handler) return; 81 82 const keysym = xkb_state_key_get_one_sym(_state, keycode); 83 const sym = symForKeysym(keysym); 84 85 handler(KeyEvent(sym, code, mods, null)); 86 } 87 88 } 89 90 KeyMods modsForCode(in KeyCode code) 91 { 92 switch(code) 93 { 94 case KeyCode.leftCtrl: return KeyMods.leftCtrl; 95 case KeyCode.leftShift: return KeyMods.leftShift; 96 case KeyCode.leftAlt: return KeyMods.leftAlt; 97 case KeyCode.leftSuper: return KeyMods.leftSuper; 98 case KeyCode.rightCtrl: return KeyMods.rightCtrl; 99 case KeyCode.rightShift: return KeyMods.rightShift; 100 case KeyCode.rightAlt: return KeyMods.rightAlt; 101 case KeyCode.rightSuper: return KeyMods.rightSuper; 102 default: return KeyMods.none; 103 } 104 } 105 106 107 KeySym symForKeysym(uint keysym) 108 { 109 if (keysym >= 0x20 && keysym < 0x80) { 110 if (keysym >= 0x61 && keysym <= 0x7a) { 111 keysym &= ~KeySym.latin1SmallMask; 112 } 113 return cast(KeySym)keysym; 114 } 115 if (keysym >= XKB_KEY_F1 && keysym <= XKB_KEY_F24) { 116 return cast(KeySym)(KeySym.f1 + (keysym - XKB_KEY_F1)); 117 } 118 auto k = (keysym in keysymMap); 119 if (k) { 120 return *k; 121 } 122 return KeySym.unknown; 123 } 124 125 126 KeyCode codeForKeycode(xkb_keycode_t keycode) 127 { 128 if (keycode >= keycodeTable.length) 129 { 130 gfxWindowLog.warningf("keycode 0x%x is out of bounds", keycode); 131 return KeyCode.unknown; 132 } 133 return keycodeTable[keycode]; 134 } 135 136 137 private 138 { 139 immutable KeySym[uint] keysymMap; 140 immutable KeyCode[256] keycodeTable; 141 142 shared static this() { 143 144 keycodeTable = [ 145 // 0x00 0 146 KeyCode.unknown, 147 KeyCode.unknown, 148 KeyCode.unknown, 149 KeyCode.unknown, 150 KeyCode.unknown, 151 KeyCode.unknown, 152 KeyCode.unknown, 153 KeyCode.unknown, 154 KeyCode.unknown, 155 KeyCode.escape, 156 KeyCode.d1, 157 KeyCode.d2, 158 KeyCode.d3, 159 KeyCode.d4, 160 KeyCode.d5, 161 KeyCode.d6, 162 // 0x10 16 163 KeyCode.d7, 164 KeyCode.d8, 165 KeyCode.d9, 166 KeyCode.d0, 167 KeyCode.minus, 168 KeyCode.equals, 169 KeyCode.backspace, 170 KeyCode.tab, 171 KeyCode.q, 172 KeyCode.w, 173 KeyCode.e, 174 KeyCode.r, 175 KeyCode.t, 176 KeyCode.y, 177 KeyCode.u, 178 KeyCode.i, 179 // 0x20 32 180 KeyCode.o, 181 KeyCode.p, 182 KeyCode.leftBracket, 183 KeyCode.rightBracket, 184 KeyCode.enter, 185 KeyCode.leftCtrl, 186 KeyCode.a, 187 KeyCode.s, 188 KeyCode.d, 189 KeyCode.f, 190 KeyCode.g, 191 KeyCode.h, 192 KeyCode.j, 193 KeyCode.k, 194 KeyCode.l, 195 KeyCode.semicolon, 196 // 0x30 48 197 KeyCode.quote, 198 KeyCode.grave, 199 KeyCode.uK_Hash, 200 KeyCode.leftShift, 201 KeyCode.z, 202 KeyCode.x, 203 KeyCode.c, 204 KeyCode.v, 205 KeyCode.b, 206 KeyCode.n, 207 KeyCode.m, 208 KeyCode.comma, 209 KeyCode.period, 210 KeyCode.slash, 211 KeyCode.rightShift, 212 KeyCode.kp_Multiply, 213 // 0x40 64 214 KeyCode.leftAlt, 215 KeyCode.space, 216 KeyCode.capsLock, 217 KeyCode.f1, 218 KeyCode.f2, 219 KeyCode.f3, 220 KeyCode.f4, 221 KeyCode.f5, 222 KeyCode.f6, 223 KeyCode.f7, 224 KeyCode.f8, 225 KeyCode.f9, 226 KeyCode.f10, 227 KeyCode.kp_NumLock, 228 KeyCode.scrollLock, 229 KeyCode.kp_7, 230 // 0x50 80 231 KeyCode.kp_8, 232 KeyCode.kp_9, 233 KeyCode.kp_Subtract, 234 KeyCode.kp_4, 235 KeyCode.kp_5, 236 KeyCode.kp_6, 237 KeyCode.kp_Add, 238 KeyCode.kp_1, 239 KeyCode.kp_2, 240 KeyCode.kp_3, 241 KeyCode.kp_0, 242 KeyCode.kp_Period, 243 KeyCode.unknown, 244 KeyCode.unknown, 245 KeyCode.uK_Backslash, 246 KeyCode.f11, 247 // 0x60 96 248 KeyCode.f12, 249 KeyCode.unknown, 250 KeyCode.lang3, // Katakana 251 KeyCode.lang4, // Hiragana 252 KeyCode.unknown, // Henkan 253 KeyCode.unknown, // Hiragana_Katakana 254 KeyCode.unknown, // Muhenkan 255 KeyCode.unknown, 256 KeyCode.kp_Enter, 257 KeyCode.rightCtrl, 258 KeyCode.kp_Divide, 259 KeyCode.printScreen, 260 KeyCode.rightAlt, 261 KeyCode.unknown, // line feed 262 KeyCode.home, 263 KeyCode.up, 264 // 0x70 112 265 KeyCode.pageUp, 266 KeyCode.left, 267 KeyCode.right, 268 KeyCode.end, 269 KeyCode.down, 270 KeyCode.pageDown, 271 KeyCode.insert, 272 KeyCode.delete_, 273 KeyCode.unknown, 274 KeyCode.mute, 275 KeyCode.volumeDown, 276 KeyCode.volumeUp, 277 KeyCode.unknown, // power off 278 KeyCode.kp_Equal, 279 KeyCode.kp_PlusMinus, 280 KeyCode.pause, 281 // 0x80 128 282 KeyCode.unknown, // launch A 283 KeyCode.kp_Decimal, 284 KeyCode.lang1, // hangul 285 KeyCode.lang2, // hangul/hanja toggle 286 KeyCode.unknown, 287 KeyCode.unknown, 288 KeyCode.unknown, 289 KeyCode.menu, 290 KeyCode.cancel, 291 KeyCode.again, 292 KeyCode.unknown, // SunProps 293 KeyCode.undo, 294 KeyCode.unknown, // SunFront 295 KeyCode.copy, 296 KeyCode.unknown, // Open 297 KeyCode.paste, 298 // 0x90 144 299 KeyCode.find, 300 KeyCode.cut, 301 KeyCode.help, 302 KeyCode.unknown, // XF86MenuKB 303 KeyCode.unknown, // XF86Calculator 304 KeyCode.unknown, 305 KeyCode.unknown, //XF86Sleep 306 KeyCode.unknown, //XF86Wakeup 307 KeyCode.unknown, //XF86Explorer 308 KeyCode.unknown, //XF86Send 309 KeyCode.unknown, 310 KeyCode.unknown, //Xfer 311 KeyCode.unknown, //launch1 312 KeyCode.unknown, //launch2 313 KeyCode.unknown, //WWW 314 KeyCode.unknown, //DOS 315 // 0xA0 160 316 KeyCode.unknown, // Screensaver 317 KeyCode.unknown, 318 KeyCode.unknown, // RotateWindows 319 KeyCode.unknown, // Mail 320 KeyCode.unknown, // Favorites 321 KeyCode.unknown, // MyComputer 322 KeyCode.unknown, // Back 323 KeyCode.unknown, // Forward 324 KeyCode.unknown, 325 KeyCode.unknown, // Eject 326 KeyCode.unknown, // Eject 327 KeyCode.unknown, // AudioNext 328 KeyCode.unknown, // AudioPlay 329 KeyCode.unknown, // AudioPrev 330 KeyCode.unknown, // AudioStop 331 KeyCode.unknown, // AudioRecord 332 // 0xB0 176 333 KeyCode.unknown, // AudioRewind 334 KeyCode.unknown, // Phone 335 KeyCode.unknown, 336 KeyCode.unknown, // Tools 337 KeyCode.unknown, // HomePage 338 KeyCode.unknown, // Reload 339 KeyCode.unknown, // Close 340 KeyCode.unknown, 341 KeyCode.unknown, 342 KeyCode.unknown, // ScrollUp 343 KeyCode.unknown, // ScrollDown 344 KeyCode.unknown, // parentleft 345 KeyCode.unknown, // parentright 346 KeyCode.unknown, // New 347 KeyCode.unknown, // Redo 348 KeyCode.unknown, // Tools 349 // 0xC0 192 350 KeyCode.unknown, // Launch5 351 KeyCode.unknown, // Launch6 352 KeyCode.unknown, // Launch7 353 KeyCode.unknown, // Launch8 354 KeyCode.unknown, // Launch9 355 KeyCode.unknown, 356 KeyCode.unknown, // AudioMicMute 357 KeyCode.unknown, // TouchpadToggle 358 KeyCode.unknown, // TouchpadPadOn 359 KeyCode.unknown, // TouchpadOff 360 KeyCode.unknown, 361 KeyCode.unknown, // Mode_switch 362 KeyCode.unknown, // Alt_L 363 KeyCode.unknown, // Meta_L 364 KeyCode.unknown, // Super_L 365 KeyCode.unknown, // Hyper_L 366 // 0xD0 208 367 KeyCode.unknown, // AudioPlay 368 KeyCode.unknown, // AudioPause 369 KeyCode.unknown, // Launch3 370 KeyCode.unknown, // Launch4 371 KeyCode.unknown, // LaunchB 372 KeyCode.unknown, // Suspend 373 KeyCode.unknown, // Close 374 KeyCode.unknown, // AudioPlay 375 KeyCode.unknown, // AudioForward 376 KeyCode.unknown, 377 KeyCode.unknown, // Print 378 KeyCode.unknown, 379 KeyCode.unknown, // WebCam 380 KeyCode.unknown, 381 KeyCode.unknown, 382 KeyCode.unknown, // Mail 383 // 0xE0 224 384 KeyCode.unknown, // Messenger 385 KeyCode.unknown, // Seach 386 KeyCode.unknown, // GO 387 KeyCode.unknown, // Finance 388 KeyCode.unknown, // Game 389 KeyCode.unknown, // Shop 390 KeyCode.unknown, 391 KeyCode.unknown, // Cancel 392 KeyCode.unknown, // MonBrightnessDown 393 KeyCode.unknown, // MonBrightnessUp 394 KeyCode.unknown, // AudioMedia 395 KeyCode.unknown, // Display 396 KeyCode.unknown, // KbdLightOnOff 397 KeyCode.unknown, // KbdBrightnessDown 398 KeyCode.unknown, // KbdBrightnessUp 399 KeyCode.unknown, // Send 400 // 0xF0 240 401 KeyCode.unknown, // Reply 402 KeyCode.unknown, // MailForward 403 KeyCode.unknown, // Save 404 KeyCode.unknown, // Documents 405 KeyCode.unknown, // Battery 406 KeyCode.unknown, // Bluetooth 407 KeyCode.unknown, // WLan 408 KeyCode.unknown, 409 KeyCode.unknown, 410 KeyCode.unknown, 411 KeyCode.unknown, 412 KeyCode.unknown, 413 KeyCode.unknown, 414 KeyCode.unknown, 415 KeyCode.unknown, 416 KeyCode.unknown 417 ]; 418 419 420 421 KeySym[uint] map; 422 423 map[XKB_KEY_Escape] = KeySym.escape; 424 map[XKB_KEY_Tab] = KeySym.tab; 425 map[XKB_KEY_ISO_Left_Tab] = KeySym.leftTab; 426 map[XKB_KEY_BackSpace] = KeySym.backspace; 427 map[XKB_KEY_Return] = KeySym.return_; 428 map[XKB_KEY_Insert] = KeySym.insert; 429 map[XKB_KEY_Delete] = KeySym.delete_; 430 map[XKB_KEY_Clear] = KeySym.delete_; 431 map[XKB_KEY_Pause] = KeySym.pause; 432 map[XKB_KEY_Print] = KeySym.print; 433 map[0x1005FF60] = KeySym.sysRq; // hardcoded Sun SysReq 434 map[0x1007ff00] = KeySym.sysRq; // hardcoded X386 SysReq 435 436 // cursor movement 437 438 map[XKB_KEY_Home] = KeySym.home; 439 map[XKB_KEY_End] = KeySym.end; 440 map[XKB_KEY_Left] = KeySym.left; 441 map[XKB_KEY_Up] = KeySym.up; 442 map[XKB_KEY_Right] = KeySym.right; 443 map[XKB_KEY_Down] = KeySym.down; 444 map[XKB_KEY_Page_Up] = KeySym.pageUp; 445 map[XKB_KEY_Page_Down] = KeySym.pageDown; 446 map[XKB_KEY_Prior] = KeySym.pageUp; 447 map[XKB_KEY_Next] = KeySym.pageDown; 448 449 // modifiers 450 451 map[XKB_KEY_Shift_L] = KeySym.leftShift; 452 map[XKB_KEY_Shift_R] = KeySym.rightShift; 453 map[XKB_KEY_Shift_Lock] = KeySym.shift; 454 map[XKB_KEY_Control_L] = KeySym.leftCtrl; 455 map[XKB_KEY_Control_R] = KeySym.rightCtrl; 456 //map[XKB_KEY_Meta_L] = KeySym.leftMeta; 457 //map[XKB_KEY_Meta_R] = KeySym.rightMeta; 458 map[XKB_KEY_Alt_L] = KeySym.leftAlt; 459 map[XKB_KEY_Alt_R] = KeySym.rightAlt; 460 map[XKB_KEY_Caps_Lock] = KeySym.capsLock; 461 map[XKB_KEY_Num_Lock] = KeySym.numLock; 462 map[XKB_KEY_Scroll_Lock] = KeySym.scrollLock; 463 map[XKB_KEY_Super_L] = KeySym.leftSuper; 464 map[XKB_KEY_Super_R] = KeySym.rightSuper; 465 map[XKB_KEY_Menu] = KeySym.menu; 466 map[XKB_KEY_Help] = KeySym.help; 467 map[0x1000FF74] = KeySym.leftTab; // hardcoded HP backtab 468 map[0x1005FF10] = KeySym.f11; // hardcoded Sun F36 (labeled F11) 469 map[0x1005FF11] = KeySym.f12; // hardcoded Sun F37 (labeled F12) 470 471 // numeric and function keypad keys 472 473 map[XKB_KEY_KP_Enter] = KeySym.kp_Enter; 474 map[XKB_KEY_KP_Delete] = KeySym.kp_Delete; 475 map[XKB_KEY_KP_Home] = KeySym.kp_Home; 476 map[XKB_KEY_KP_Begin] = KeySym.kp_Begin; 477 map[XKB_KEY_KP_End] = KeySym.kp_End; 478 map[XKB_KEY_KP_Page_Up] = KeySym.kp_PageUp; 479 map[XKB_KEY_KP_Page_Down] = KeySym.kp_PageDown; 480 map[XKB_KEY_KP_Up] = KeySym.kp_Up; 481 map[XKB_KEY_KP_Down] = KeySym.kp_Down; 482 map[XKB_KEY_KP_Left] = KeySym.kp_Left; 483 map[XKB_KEY_KP_Right] = KeySym.kp_Right; 484 map[XKB_KEY_KP_Equal] = KeySym.kp_Equal; 485 map[XKB_KEY_KP_Multiply] = KeySym.kp_Multiply; 486 map[XKB_KEY_KP_Add] = KeySym.kp_Add; 487 map[XKB_KEY_KP_Divide] = KeySym.kp_Divide; 488 map[XKB_KEY_KP_Subtract] = KeySym.kp_Subtract; 489 map[XKB_KEY_KP_Decimal] = KeySym.kp_Decimal; 490 map[XKB_KEY_KP_Separator] = KeySym.kp_Separator; 491 492 map[XKB_KEY_KP_0] = KeySym.kp_0; 493 map[XKB_KEY_KP_1] = KeySym.kp_1; 494 map[XKB_KEY_KP_2] = KeySym.kp_2; 495 map[XKB_KEY_KP_3] = KeySym.kp_3; 496 map[XKB_KEY_KP_4] = KeySym.kp_4; 497 map[XKB_KEY_KP_6] = KeySym.kp_6; 498 map[XKB_KEY_KP_7] = KeySym.kp_7; 499 map[XKB_KEY_KP_8] = KeySym.kp_8; 500 map[XKB_KEY_KP_9] = KeySym.kp_9; 501 502 // International input method support keys 503 504 // International & multi-key character composition 505 map[XKB_KEY_ISO_Level3_Shift] = KeySym.altGr; 506 //map[XKB_KEY_Multi_key] = KeySym.multi_key; 507 //map[XKB_KEY_Codeinput] = KeySym.codeinput; 508 //map[XKB_KEY_SingleCandidate] = KeySym.singleCandidate; 509 //map[XKB_KEY_MultipleCandidate] = KeySym.multipleCandidate; 510 //map[XKB_KEY_PreviousCandidate] = KeySym.previousCandidate; 511 512 // Misc Functions 513 map[XKB_KEY_Mode_switch] = KeySym.modeSwitch; 514 515 //// Japanese keyboard support 516 //map[XKB_KEY_Kanji] = KeySym.kanji; 517 //map[XKB_KEY_Muhenkan] = KeySym.muhenkan; 518 //map[XKB_KEY_Henkan_Mode] = KeySym.henkan_Mode; 519 //map[XKB_KEY_Henkan_Mode] = KeySym.henkan; 520 //map[XKB_KEY_Henkan] = KeySym.henkan; 521 //map[XKB_KEY_Romaji] = KeySym.romaji; 522 //map[XKB_KEY_Hiragana] = KeySym.hiragana; 523 //map[XKB_KEY_Katakana] = KeySym.katakana; 524 //map[XKB_KEY_Hiragana_Katakana] = KeySym.hiragana_Katakana; 525 //map[XKB_KEY_Zenkaku] = KeySym.zenkaku; 526 //map[XKB_KEY_Hankaku] = KeySym.hankaku; 527 //map[XKB_KEY_Zenkaku_Hankaku] = KeySym.zenkaku_Hankaku; 528 //map[XKB_KEY_Touroku] = KeySym.touroku; 529 //map[XKB_KEY_Massyo] = KeySym.massyo; 530 //map[XKB_KEY_Kana_Lock] = KeySym.kana_Lock; 531 //map[XKB_KEY_Kana_Shift] = KeySym.kana_Shift; 532 //map[XKB_KEY_Eisu_Shift] = KeySym.eisu_Shift; 533 //map[XKB_KEY_Eisu_toggle] = KeySym.eisu_toggle; 534 //map[XKB_KEY_Kanji_Bangou] = KeySym.kanji_Bangou; 535 //map[XKB_KEY_Zen_Koho] = KeySym.zen_Koho; 536 //map[XKB_KEY_Mae_Koho] = KeySym.mae_Koho; 537 //map[XKB_KEY_Kanji_Bangou] = KeySym.codeinput; 538 //map[XKB_KEY_Zen_Koho] = KeySym.multipleCandidate; 539 //map[XKB_KEY_Mae_Koho] = KeySym.previousCandidate; 540 541 //// Korean keyboard support 542 //map[XKB_KEY_HANGul] = KeySym.hangul; 543 //map[XKB_KEY_HANGul_Start] = KeySym.hangul_Start; 544 //map[XKB_KEY_HANGul_End] = KeySym.hangul_End; 545 //map[XKB_KEY_HANGul_Hanja] = KeySym.hangul_Hanja; 546 //map[XKB_KEY_HANGul_Jamo] = KeySym.hangul_Jamo; 547 //map[XKB_KEY_HANGul_Romaja] = KeySym.hangul_Romaja; 548 //map[XKB_KEY_HANGul_Codeinput] = KeySym.hangul_Codeinput; 549 //map[XKB_KEY_HANGul_Codeinput] = KeySym.codeinput; 550 //map[XKB_KEY_HANGul_Jeonja] = KeySym.hangul_Jeonja; 551 //map[XKB_KEY_HANGul_Banja] = KeySym.hangul_Banja; 552 //map[XKB_KEY_HANGul_PreHanja] = KeySym.hangul_PreHanja; 553 //map[XKB_KEY_HANGul_PostHanja] = KeySym.hangul_PostHanja; 554 //map[XKB_KEY_HANGul_SingleCandidate] = KeySym.hangul_SingleCandidate; 555 //map[XKB_KEY_HANGul_MultipleCandidate] = KeySym.hangul_MultipleCandidate; 556 //map[XKB_KEY_HANGul_PreviousCandidate] = KeySym.hangul_PreviousCandidate; 557 //map[XKB_KEY_HANGul_SingleCandidate] = KeySym.singleCandidate; 558 //map[XKB_KEY_HANGul_MultipleCandidate] = KeySym.multipleCandidate; 559 //map[XKB_KEY_HANGul_PreviousCandidate] = KeySym.previousCandidate; 560 //map[XKB_KEY_HANGul_Special] = KeySym.hangul_Special; 561 //map[XKB_KEY_HANGul_switch] = KeySym.hangul_switch; 562 //map[XKB_KEY_HANGul_switch] = KeySym.Mode_switch; 563 564 565 // Special keys from X.org - This include multimedia keys, 566 // wireless/bluetooth/uwb keys, special launcher keys, etc. 567 map[XKB_KEY_XF86Back] = KeySym.browserBack; 568 map[XKB_KEY_XF86Forward] = KeySym.browserForward; 569 map[XKB_KEY_XF86Stop] = KeySym.browserStop; 570 map[XKB_KEY_XF86Refresh] = KeySym.browserRefresh; 571 map[XKB_KEY_XF86Favorites] = KeySym.browserFavorites; 572 map[XKB_KEY_XF86AudioMedia] = KeySym.launchMedia; 573 map[XKB_KEY_XF86OpenURL] = KeySym.openUrl; 574 map[XKB_KEY_XF86HomePage] = KeySym.browserHome; 575 map[XKB_KEY_XF86Search] = KeySym.browserSearch; 576 map[XKB_KEY_XF86AudioLowerVolume] = KeySym.volumeDown; 577 map[XKB_KEY_XF86AudioMute] = KeySym.volumeMute; 578 map[XKB_KEY_XF86AudioRaiseVolume] = KeySym.volumeUp; 579 map[XKB_KEY_XF86AudioPlay] = KeySym.mediaPlay; 580 map[XKB_KEY_XF86AudioStop] = KeySym.mediaStop; 581 map[XKB_KEY_XF86AudioPrev] = KeySym.mediaPrevious; 582 map[XKB_KEY_XF86AudioNext] = KeySym.mediaNext; 583 map[XKB_KEY_XF86AudioRecord] = KeySym.mediaRecord; 584 map[XKB_KEY_XF86AudioPause] = KeySym.mediaPause; 585 map[XKB_KEY_XF86Mail] = KeySym.launchMail; 586 map[XKB_KEY_XF86MyComputer] = KeySym.myComputer; 587 map[XKB_KEY_XF86Calculator] = KeySym.calculator; 588 map[XKB_KEY_XF86Memo] = KeySym.memo; 589 map[XKB_KEY_XF86ToDoList] = KeySym.todoList; 590 map[XKB_KEY_XF86Calendar] = KeySym.calendar; 591 map[XKB_KEY_XF86PowerDown] = KeySym.powerDown; 592 map[XKB_KEY_XF86ContrastAdjust] = KeySym.contrastAdjust; 593 map[XKB_KEY_XF86Standby] = KeySym.standby; 594 map[XKB_KEY_XF86MonBrightnessUp] = KeySym.monBrightnessUp; 595 map[XKB_KEY_XF86MonBrightnessDown] = KeySym.monBrightnessDown; 596 map[XKB_KEY_XF86KbdLightOnOff] = KeySym.keyboardLightOnOff; 597 map[XKB_KEY_XF86KbdBrightnessUp] = KeySym.keyboardBrightnessUp; 598 map[XKB_KEY_XF86KbdBrightnessDown] = KeySym.keyboardBrightnessDown; 599 map[XKB_KEY_XF86PowerOff] = KeySym.powerOff; 600 map[XKB_KEY_XF86WakeUp] = KeySym.wakeUp; 601 map[XKB_KEY_XF86Eject] = KeySym.eject; 602 map[XKB_KEY_XF86ScreenSaver] = KeySym.screenSaver; 603 map[XKB_KEY_XF86WWW] = KeySym.www; 604 map[XKB_KEY_XF86Sleep] = KeySym.sleep; 605 map[XKB_KEY_XF86LightBulb] = KeySym.lightBulb; 606 map[XKB_KEY_XF86Shop] = KeySym.shop; 607 map[XKB_KEY_XF86History] = KeySym.history; 608 map[XKB_KEY_XF86AddFavorite] = KeySym.addFavorite; 609 map[XKB_KEY_XF86HotLinks] = KeySym.hotLinks; 610 map[XKB_KEY_XF86BrightnessAdjust] = KeySym.brightnessAdjust; 611 map[XKB_KEY_XF86Finance] = KeySym.finance; 612 map[XKB_KEY_XF86Community] = KeySym.community; 613 map[XKB_KEY_XF86AudioRewind] = KeySym.audioRewind; 614 map[XKB_KEY_XF86BackForward] = KeySym.backForward; 615 map[XKB_KEY_XF86ApplicationLeft] = KeySym.applicationLeft; 616 map[XKB_KEY_XF86ApplicationRight] = KeySym.applicationRight; 617 map[XKB_KEY_XF86Book] = KeySym.book; 618 map[XKB_KEY_XF86CD] = KeySym.cd; 619 map[XKB_KEY_XF86Calculater] = KeySym.calculator; 620 map[XKB_KEY_XF86Clear] = KeySym.clear; 621 map[XKB_KEY_XF86ClearGrab] = KeySym.clearGrab; 622 map[XKB_KEY_XF86Close] = KeySym.close; 623 map[XKB_KEY_XF86Copy] = KeySym.copy; 624 map[XKB_KEY_XF86Cut] = KeySym.cut; 625 map[XKB_KEY_XF86Display] = KeySym.display; 626 map[XKB_KEY_XF86DOS] = KeySym.dos; 627 map[XKB_KEY_XF86Documents] = KeySym.documents; 628 map[XKB_KEY_XF86Excel] = KeySym.excel; 629 map[XKB_KEY_XF86Explorer] = KeySym.explorer; 630 map[XKB_KEY_XF86Game] = KeySym.game; 631 map[XKB_KEY_XF86Go] = KeySym.go; 632 map[XKB_KEY_XF86iTouch] = KeySym.iTouch; 633 map[XKB_KEY_XF86LogOff] = KeySym.logOff; 634 map[XKB_KEY_XF86Market] = KeySym.market; 635 map[XKB_KEY_XF86Meeting] = KeySym.meeting; 636 map[XKB_KEY_XF86MenuKB] = KeySym.menuKB; 637 map[XKB_KEY_XF86MenuPB] = KeySym.menuPB; 638 map[XKB_KEY_XF86MySites] = KeySym.mySites; 639 map[XKB_KEY_XF86New] = KeySym.new_; 640 map[XKB_KEY_XF86News] = KeySym.news; 641 map[XKB_KEY_XF86OfficeHome] = KeySym.officeHome; 642 map[XKB_KEY_XF86Open] = KeySym.open; 643 map[XKB_KEY_XF86Option] = KeySym.option; 644 map[XKB_KEY_XF86Paste] = KeySym.paste; 645 map[XKB_KEY_XF86Phone] = KeySym.phone; 646 map[XKB_KEY_XF86Reply] = KeySym.reply; 647 map[XKB_KEY_XF86Reload] = KeySym.reload; 648 map[XKB_KEY_XF86RotateWindows] = KeySym.rotateWindows; 649 map[XKB_KEY_XF86RotationPB] = KeySym.rotationPB; 650 map[XKB_KEY_XF86RotationKB] = KeySym.rotationKB; 651 map[XKB_KEY_XF86Save] = KeySym.save; 652 map[XKB_KEY_XF86Send] = KeySym.send; 653 map[XKB_KEY_XF86Spell] = KeySym.spell; 654 map[XKB_KEY_XF86SplitScreen] = KeySym.splitScreen; 655 map[XKB_KEY_XF86Support] = KeySym.support; 656 map[XKB_KEY_XF86TaskPane] = KeySym.taskPane; 657 map[XKB_KEY_XF86Terminal] = KeySym.terminal; 658 map[XKB_KEY_XF86Tools] = KeySym.tools; 659 map[XKB_KEY_XF86Travel] = KeySym.travel; 660 map[XKB_KEY_XF86Video] = KeySym.video; 661 map[XKB_KEY_XF86Word] = KeySym.word; 662 map[XKB_KEY_XF86Xfer] = KeySym.xfer; 663 map[XKB_KEY_XF86ZoomIn] = KeySym.zoomIn; 664 map[XKB_KEY_XF86ZoomOut] = KeySym.zoomOut; 665 map[XKB_KEY_XF86Away] = KeySym.away; 666 map[XKB_KEY_XF86Messenger] = KeySym.messenger; 667 map[XKB_KEY_XF86WebCam] = KeySym.webCam; 668 map[XKB_KEY_XF86MailForward] = KeySym.mailForward; 669 map[XKB_KEY_XF86Pictures] = KeySym.pictures; 670 map[XKB_KEY_XF86Music] = KeySym.music; 671 map[XKB_KEY_XF86Battery] = KeySym.battery; 672 map[XKB_KEY_XF86Bluetooth] = KeySym.bluetooth; 673 map[XKB_KEY_XF86WLAN] = KeySym.wlan; 674 map[XKB_KEY_XF86UWB] = KeySym.uwb; 675 map[XKB_KEY_XF86AudioForward] = KeySym.audioForward; 676 map[XKB_KEY_XF86AudioRepeat] = KeySym.audioRepeat; 677 map[XKB_KEY_XF86AudioRandomPlay] = KeySym.audioRandomPlay; 678 map[XKB_KEY_XF86Subtitle] = KeySym.subtitle; 679 map[XKB_KEY_XF86AudioCycleTrack] = KeySym.audioCycleTrack; 680 map[XKB_KEY_XF86Time] = KeySym.time; 681 map[XKB_KEY_XF86Select] = KeySym.select; 682 map[XKB_KEY_XF86View] = KeySym.view; 683 map[XKB_KEY_XF86TopMenu] = KeySym.topMenu; 684 map[XKB_KEY_XF86Red] = KeySym.red; 685 map[XKB_KEY_XF86Green] = KeySym.green; 686 map[XKB_KEY_XF86Yellow] = KeySym.yellow; 687 map[XKB_KEY_XF86Blue] = KeySym.blue; 688 map[XKB_KEY_XF86Bluetooth] = KeySym.bluetooth; 689 map[XKB_KEY_XF86Suspend] = KeySym.suspend; 690 map[XKB_KEY_XF86Hibernate] = KeySym.hibernate; 691 map[XKB_KEY_XF86TouchpadToggle] = KeySym.touchpadToggle; 692 map[XKB_KEY_XF86TouchpadOn] = KeySym.touchpadOn; 693 map[XKB_KEY_XF86TouchpadOff] = KeySym.touchpadOff; 694 map[XKB_KEY_XF86AudioMicMute] = KeySym.micMute; 695 map[XKB_KEY_XF86Launch0] = KeySym.launch0; 696 map[XKB_KEY_XF86Launch1] = KeySym.launch1; 697 map[XKB_KEY_XF86Launch2] = KeySym.launch2; 698 map[XKB_KEY_XF86Launch3] = KeySym.launch3; 699 map[XKB_KEY_XF86Launch4] = KeySym.launch4; 700 map[XKB_KEY_XF86Launch5] = KeySym.launch5; 701 map[XKB_KEY_XF86Launch6] = KeySym.launch6; 702 map[XKB_KEY_XF86Launch7] = KeySym.launch7; 703 map[XKB_KEY_XF86Launch8] = KeySym.launch8; 704 map[XKB_KEY_XF86Launch9] = KeySym.launch9; 705 map[XKB_KEY_XF86LaunchA] = KeySym.launchA; 706 map[XKB_KEY_XF86LaunchB] = KeySym.launchB; 707 map[XKB_KEY_XF86LaunchC] = KeySym.launchC; 708 map[XKB_KEY_XF86LaunchD] = KeySym.launchD; 709 map[XKB_KEY_XF86LaunchE] = KeySym.launchE; 710 map[XKB_KEY_XF86LaunchF] = KeySym.launchF; 711 712 map.rehash(); 713 714 715 import std.exception : assumeUnique; 716 717 keysymMap = assumeUnique(map); 718 } 719 720 }