Files
86Box/src/qt/evdev_keyboard.cpp
2025-11-07 20:25:29 -05:00

162 lines
5.6 KiB
C++

/*
* 86Box A hypervisor and IBM PC system emulator that specializes in
* running old operating systems and software designed for IBM
* PC systems and compatibles from 1981 through fairly recent
* system designs based on the PCI bus.
*
* This file is part of the 86Box distribution.
*
* evdev keyboard input module.
*
* Authors: RichardG, <richardg867@gmail.com>
*
* Copyright 2023 RichardG.
*/
#include <unordered_map>
#include <QtDebug>
static std::unordered_map<uint32_t, uint16_t> evdev_keycodes = {
{ 184, 0x46 }, /* F14 => Scroll Lock (for Apple keyboards) */
{ 86, 0x56 }, /* 102ND */
{ 87, 0x57 }, /* F11 */
{ 88, 0x58 }, /* F12 */
{ 186, 0x5d }, /* F16 => F13 */
{ 187, 0x5e }, /* F17 => F14 */
{ 188, 0x5f }, /* F18 => F15 */
/* Japanese keys. */
{ 95, 0x5c }, /* KPJPCOMMA */
{ 93, 0x70 }, /* KATAKANAHIRAGANA */
{ 89, 0x73 }, /* RO */
{ 85, 0x76 }, /* ZENKAKUHANKAKU */
{ 91, 0x77 }, /* HIRAGANA */
{ 90, 0x78 }, /* KATAKANA */
{ 92, 0x79 }, /* HENKAN */
{ 94, 0x7b }, /* MUHENKAN */
{ 124, 0x7d }, /* YEN */
{ 121, 0x7e }, /* KPCOMMA */
/* Korean keys. */
{ 123, 0xf1 }, /* HANJA */
{ 122, 0xf2 }, /* HANGUL */
{ 96, 0x11c }, /* KPENTER */
{ 97, 0x11d }, /* RIGHTCTRL */
{ 98, 0x135 }, /* KPSLASH */
{ 99, 0x137 }, /* SYSRQ */
{ 183, 0x137 }, /* F13 => SysRq (for Apple keyboards) */
{ 100, 0x138 }, /* RIGHTALT */
{ 119, 0x145 }, /* PAUSE */
{ 411, 0x145 }, /* BREAK */
{ 185, 0x145 }, /* F15 => Pause (for Apple keyboards) */
{ 102, 0x147 }, /* HOME */
{ 103, 0x148 }, /* UP */
{ 104, 0x149 }, /* PAGEUP */
{ 105, 0x14b }, /* LEFT */
{ 106, 0x14d }, /* RIGHT */
{ 107, 0x14f }, /* END */
{ 108, 0x150 }, /* DOWN */
{ 109, 0x151 }, /* PAGEDOWN */
{ 110, 0x152 }, /* INSERT */
{ 111, 0x153 }, /* DELETE */
{ 125, 0x15b }, /* LEFTMETA */
{ 126, 0x15c }, /* RIGHTMETA */
{ 127, 0x15d }, /* COMPOSE => Menu */
/* Multimedia keys. Guideline is to try and follow the Microsoft standard, then
fill in remaining scancodes with OEM-specific keys for redundancy sake. Keys
marked with # are not translated into evdev codes by the standard atkbd driver. */
{ 634, 0x54 }, /* SELECTIVE_SCREENSHOT# => Alt+SysRq */
{ 117, 0x59 }, /* KPEQUAL */
{ 418, 0x6a }, /* ZOOMIN# => Logitech */
{ 420, 0x6b }, /* ZOOMRESET# => Logitech */
{ 223, 0x6d }, /* CANCEL# => Logitech */
{ 132, 0x101 }, /* # Logitech Task Select */
{ 148, 0x102 }, /* PROG1# => Samsung */
{ 149, 0x103 }, /* PROG2# => Samsung */
{ 419, 0x104 }, /* ZOOMOUT# => Logitech */
{ 144, 0x105 }, /* FILE# => Messenger/Files */
{ 216, 0x105 }, /* CHAT# => Messenger/Files */
{ 430, 0x105 }, /* MESSENGER# */
{ 182, 0x107 }, /* REDO# */
{ 131, 0x108 }, /* UNDO# */
{ 135, 0x10a }, /* PASTE# */
{ 177, 0x10b }, /* SCROLLUP# => normal speed */
{ 165, 0x110 }, /* PREVIOUSSONG */
{ 136, 0x112 }, /* FIND# => Logitech */
{ 421, 0x113 }, /* WORDPROCESSOR# => Word */
{ 423, 0x114 }, /* SPREADSHEET# => Excel */
{ 397, 0x115 }, /* CALENDAR# */
{ 433, 0x116 }, /* LOGOFF# */
{ 137, 0x117 }, /* CUT# */
{ 133, 0x118 }, /* COPY# */
{ 163, 0x119 }, /* NEXTSONG */
{ 154, 0x11e }, /* CYCLEWINDOWS => Application Right (no left counterpart) */
{ 113, 0x120 }, /* MUTE */
{ 140, 0x121 }, /* CALC */
{ 164, 0x122 }, /* PLAYPAUSE */
{ 432, 0x123 }, /* SPELLCHECK# */
{ 166, 0x124 }, /* STOPCD */
{ 139, 0x126 }, /* MENU# => Shortcut/Menu/Help for a few OEMs */
{ 114, 0x12e }, /* VOL- */
{ 160, 0x12f }, /* CLOSECD# => Logitech Eject */
{ 161, 0x12f }, /* EJECTCD# => Logitech */
{ 162, 0x12f }, /* EJECTCLOSECD# => Logitech */
{ 115, 0x130 }, /* VOL+ */
{ 150, 0x132 }, /* WWW# */
{ 172, 0x132 }, /* HOMEPAGE */
{ 138, 0x13b }, /* HELP# */
{ 213, 0x13c }, /* SOUND# => My Music/Office Home */
{ 360, 0x13c }, /* VENDOR# => My Music/Office Home */
{ 204, 0x13d }, /* DASHBOARD# => Task Pane */
{ 181, 0x13e }, /* NEW# */
{ 134, 0x13f }, /* OPEN# */
{ 206, 0x140 }, /* CLOSE# */
{ 232, 0x141 }, /* REPLY# */
{ 233, 0x142 }, /* FORWARDMAIL# */
{ 231, 0x143 }, /* SEND# */
{ 151, 0x144 }, /* MSDOS# */
{ 112, 0x14c }, /* MACRO */
{ 179, 0x14c }, /* KPLEFTPAREN# */
{ 118, 0x14e }, /* KPPLUSMINUS */
{ 235, 0x155 }, /* DOCUMENTS# => Logitech */
{ 234, 0x157 }, /* SAVE# */
{ 210, 0x158 }, /* PRINT# */
{ 116, 0x15e }, /* POWER */
{ 142, 0x15f }, /* SLEEP */
{ 143, 0x163 }, /* WAKEUP */
{ 180, 0x164 }, /* KPRIGHTPAREN# */
{ 212, 0x164 }, /* CAMERA# => My Pictures */
{ 217, 0x165 }, /* SEARCH */
{ 156, 0x166 }, /* BOOKMARKS => Favorites */
{ 364, 0x166 }, /* FAVORITES# */
{ 173, 0x167 }, /* REFRESH */
{ 128, 0x168 }, /* STOP */
{ 159, 0x169 }, /* FORWARD */
{ 158, 0x16a }, /* BACK */
{ 157, 0x16b }, /* COMPUTER */
{ 155, 0x16c }, /* MAIL */
{ 215, 0x16c }, /* EMAIL# */
{ 226, 0x16d }, /* MEDIA */
{ 167, 0x178 }, /* RECORD# => Logitech */
{ 152, 0x17a }, /* COFFEE/SCREENLOCK# */
{ 178, 0x18b }, /* SCROLLDOWN# => normal speed */
};
uint16_t
evdev_translate(uint32_t keycode)
{
/* "for 1-83 (0x01-0x53) scancode equals keycode" */
auto ret = (keycode <= 0x53) ? keycode : evdev_keycodes[keycode];
if (!ret)
qWarning() << "Evdev Keyboard: Unknown key" << keycode;
#if 0
else
qInfo() << "Evdev Keyboard: Key" << keycode << "scancode" << QString::number(ret, 16);
#endif
return ret;
}