Path: blob/master/platform/linuxbsd/x11/key_mapping_x11.cpp
10278 views
/**************************************************************************/1/* key_mapping_x11.cpp */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#include "key_mapping_x11.h"3132void KeyMappingX11::initialize() {33// X11 Keysym to Godot Key map.3435xkeysym_map[XK_Escape] = Key::ESCAPE;36xkeysym_map[XK_Tab] = Key::TAB;37xkeysym_map[XK_ISO_Left_Tab] = Key::BACKTAB;38xkeysym_map[XK_BackSpace] = Key::BACKSPACE;39xkeysym_map[XK_Return] = Key::ENTER;40xkeysym_map[XK_Insert] = Key::INSERT;41xkeysym_map[XK_Delete] = Key::KEY_DELETE;42xkeysym_map[XK_Clear] = Key::KEY_DELETE;43xkeysym_map[XK_Pause] = Key::PAUSE;44xkeysym_map[XK_Print] = Key::PRINT;45xkeysym_map[XK_Home] = Key::HOME;46xkeysym_map[XK_End] = Key::END;47xkeysym_map[XK_Left] = Key::LEFT;48xkeysym_map[XK_Up] = Key::UP;49xkeysym_map[XK_Right] = Key::RIGHT;50xkeysym_map[XK_Down] = Key::DOWN;51xkeysym_map[XK_Prior] = Key::PAGEUP;52xkeysym_map[XK_Next] = Key::PAGEDOWN;53xkeysym_map[XK_Shift_L] = Key::SHIFT;54xkeysym_map[XK_Shift_R] = Key::SHIFT;55xkeysym_map[XK_Shift_Lock] = Key::SHIFT;56xkeysym_map[XK_Control_L] = Key::CTRL;57xkeysym_map[XK_Control_R] = Key::CTRL;58xkeysym_map[XK_Meta_L] = Key::META;59xkeysym_map[XK_Meta_R] = Key::META;60xkeysym_map[XK_Alt_L] = Key::ALT;61xkeysym_map[XK_Alt_R] = Key::ALT;62xkeysym_map[XK_Caps_Lock] = Key::CAPSLOCK;63xkeysym_map[XK_Num_Lock] = Key::NUMLOCK;64xkeysym_map[XK_Scroll_Lock] = Key::SCROLLLOCK;65xkeysym_map[XK_less] = Key::QUOTELEFT;66xkeysym_map[XK_grave] = Key::SECTION;67xkeysym_map[XK_Super_L] = Key::META;68xkeysym_map[XK_Super_R] = Key::META;69xkeysym_map[XK_Menu] = Key::MENU;70xkeysym_map[XK_Hyper_L] = Key::HYPER;71xkeysym_map[XK_Hyper_R] = Key::HYPER;72xkeysym_map[XK_Help] = Key::HELP;73xkeysym_map[XK_KP_Space] = Key::SPACE;74xkeysym_map[XK_KP_Tab] = Key::TAB;75xkeysym_map[XK_KP_Enter] = Key::KP_ENTER;76xkeysym_map[XK_Home] = Key::HOME;77xkeysym_map[XK_Left] = Key::LEFT;78xkeysym_map[XK_Up] = Key::UP;79xkeysym_map[XK_Right] = Key::RIGHT;80xkeysym_map[XK_Down] = Key::DOWN;81xkeysym_map[XK_Prior] = Key::PAGEUP;82xkeysym_map[XK_Next] = Key::PAGEDOWN;83xkeysym_map[XK_End] = Key::END;84xkeysym_map[XK_Begin] = Key::CLEAR;85xkeysym_map[XK_Insert] = Key::INSERT;86xkeysym_map[XK_Delete] = Key::KEY_DELETE;87xkeysym_map[XK_KP_Equal] = Key::EQUAL;88xkeysym_map[XK_KP_Separator] = Key::COMMA;89xkeysym_map[XK_KP_Decimal] = Key::KP_PERIOD;90xkeysym_map[XK_KP_Multiply] = Key::KP_MULTIPLY;91xkeysym_map[XK_KP_Divide] = Key::KP_DIVIDE;92xkeysym_map[XK_KP_Subtract] = Key::KP_SUBTRACT;93xkeysym_map[XK_KP_Add] = Key::KP_ADD;94xkeysym_map[XK_KP_0] = Key::KP_0;95xkeysym_map[XK_KP_1] = Key::KP_1;96xkeysym_map[XK_KP_2] = Key::KP_2;97xkeysym_map[XK_KP_3] = Key::KP_3;98xkeysym_map[XK_KP_4] = Key::KP_4;99xkeysym_map[XK_KP_5] = Key::KP_5;100xkeysym_map[XK_KP_6] = Key::KP_6;101xkeysym_map[XK_KP_7] = Key::KP_7;102xkeysym_map[XK_KP_8] = Key::KP_8;103xkeysym_map[XK_KP_9] = Key::KP_9;104// Same keys but with numlock off.105xkeysym_map[XK_KP_Insert] = Key::INSERT;106xkeysym_map[XK_KP_Delete] = Key::KEY_DELETE;107xkeysym_map[XK_KP_End] = Key::END;108xkeysym_map[XK_KP_Down] = Key::DOWN;109xkeysym_map[XK_KP_Page_Down] = Key::PAGEDOWN;110xkeysym_map[XK_KP_Left] = Key::LEFT;111// X11 documents this (numpad 5) as "begin of line" but no toolkit seems to interpret it this way.112// On Windows this is emitting Key::Clear so for consistency it will be mapped to Key::Clear113xkeysym_map[XK_KP_Begin] = Key::CLEAR;114xkeysym_map[XK_KP_Right] = Key::RIGHT;115xkeysym_map[XK_KP_Home] = Key::HOME;116xkeysym_map[XK_KP_Up] = Key::UP;117xkeysym_map[XK_KP_Page_Up] = Key::PAGEUP;118xkeysym_map[XK_F1] = Key::F1;119xkeysym_map[XK_F2] = Key::F2;120xkeysym_map[XK_F3] = Key::F3;121xkeysym_map[XK_F4] = Key::F4;122xkeysym_map[XK_F5] = Key::F5;123xkeysym_map[XK_F6] = Key::F6;124xkeysym_map[XK_F7] = Key::F7;125xkeysym_map[XK_F8] = Key::F8;126xkeysym_map[XK_F9] = Key::F9;127xkeysym_map[XK_F10] = Key::F10;128xkeysym_map[XK_F11] = Key::F11;129xkeysym_map[XK_F12] = Key::F12;130xkeysym_map[XK_F13] = Key::F13;131xkeysym_map[XK_F14] = Key::F14;132xkeysym_map[XK_F15] = Key::F15;133xkeysym_map[XK_F16] = Key::F16;134xkeysym_map[XK_F17] = Key::F17;135xkeysym_map[XK_F18] = Key::F18;136xkeysym_map[XK_F19] = Key::F19;137xkeysym_map[XK_F20] = Key::F20;138xkeysym_map[XK_F21] = Key::F21;139xkeysym_map[XK_F22] = Key::F22;140xkeysym_map[XK_F23] = Key::F23;141xkeysym_map[XK_F24] = Key::F24;142xkeysym_map[XK_F25] = Key::F25;143xkeysym_map[XK_F26] = Key::F26;144xkeysym_map[XK_F27] = Key::F27;145xkeysym_map[XK_F28] = Key::F28;146xkeysym_map[XK_F29] = Key::F29;147xkeysym_map[XK_F30] = Key::F30;148xkeysym_map[XK_F31] = Key::F31;149xkeysym_map[XK_F32] = Key::F32;150xkeysym_map[XK_F33] = Key::F33;151xkeysym_map[XK_F34] = Key::F34;152xkeysym_map[XK_F35] = Key::F35;153xkeysym_map[XK_yen] = Key::YEN;154xkeysym_map[XK_section] = Key::SECTION;155// Media keys.156xkeysym_map[XF86XK_Back] = Key::BACK;157xkeysym_map[XF86XK_Forward] = Key::FORWARD;158xkeysym_map[XF86XK_Stop] = Key::STOP;159xkeysym_map[XF86XK_Refresh] = Key::REFRESH;160xkeysym_map[XF86XK_Favorites] = Key::FAVORITES;161xkeysym_map[XF86XK_OpenURL] = Key::OPENURL;162xkeysym_map[XF86XK_HomePage] = Key::HOMEPAGE;163xkeysym_map[XF86XK_Search] = Key::SEARCH;164xkeysym_map[XF86XK_AudioLowerVolume] = Key::VOLUMEDOWN;165xkeysym_map[XF86XK_AudioMute] = Key::VOLUMEMUTE;166xkeysym_map[XF86XK_AudioRaiseVolume] = Key::VOLUMEUP;167xkeysym_map[XF86XK_AudioPlay] = Key::MEDIAPLAY;168xkeysym_map[XF86XK_AudioStop] = Key::MEDIASTOP;169xkeysym_map[XF86XK_AudioPrev] = Key::MEDIAPREVIOUS;170xkeysym_map[XF86XK_AudioNext] = Key::MEDIANEXT;171xkeysym_map[XF86XK_AudioRecord] = Key::MEDIARECORD;172xkeysym_map[XF86XK_Standby] = Key::STANDBY;173// Launch keys.174xkeysym_map[XF86XK_Mail] = Key::LAUNCHMAIL;175xkeysym_map[XF86XK_AudioMedia] = Key::LAUNCHMEDIA;176xkeysym_map[XF86XK_MyComputer] = Key::LAUNCH0;177xkeysym_map[XF86XK_Calculator] = Key::LAUNCH1;178xkeysym_map[XF86XK_Launch0] = Key::LAUNCH2;179xkeysym_map[XF86XK_Launch1] = Key::LAUNCH3;180xkeysym_map[XF86XK_Launch2] = Key::LAUNCH4;181xkeysym_map[XF86XK_Launch3] = Key::LAUNCH5;182xkeysym_map[XF86XK_Launch4] = Key::LAUNCH6;183xkeysym_map[XF86XK_Launch5] = Key::LAUNCH7;184xkeysym_map[XF86XK_Launch6] = Key::LAUNCH8;185xkeysym_map[XF86XK_Launch7] = Key::LAUNCH9;186xkeysym_map[XF86XK_Launch8] = Key::LAUNCHA;187xkeysym_map[XF86XK_Launch9] = Key::LAUNCHB;188xkeysym_map[XF86XK_LaunchA] = Key::LAUNCHC;189xkeysym_map[XF86XK_LaunchB] = Key::LAUNCHD;190xkeysym_map[XF86XK_LaunchC] = Key::LAUNCHE;191xkeysym_map[XF86XK_LaunchD] = Key::LAUNCHF;192193// Scancode to Godot Key map.194scancode_map[0x09] = Key::ESCAPE;195scancode_map[0x0A] = Key::KEY_1;196scancode_map[0x0B] = Key::KEY_2;197scancode_map[0x0C] = Key::KEY_3;198scancode_map[0x0D] = Key::KEY_4;199scancode_map[0x0E] = Key::KEY_5;200scancode_map[0x0F] = Key::KEY_6;201scancode_map[0x10] = Key::KEY_7;202scancode_map[0x11] = Key::KEY_8;203scancode_map[0x12] = Key::KEY_9;204scancode_map[0x13] = Key::KEY_0;205scancode_map[0x14] = Key::MINUS;206scancode_map[0x15] = Key::EQUAL;207scancode_map[0x16] = Key::BACKSPACE;208scancode_map[0x17] = Key::TAB;209scancode_map[0x18] = Key::Q;210scancode_map[0x19] = Key::W;211scancode_map[0x1A] = Key::E;212scancode_map[0x1B] = Key::R;213scancode_map[0x1C] = Key::T;214scancode_map[0x1D] = Key::Y;215scancode_map[0x1E] = Key::U;216scancode_map[0x1F] = Key::I;217scancode_map[0x20] = Key::O;218scancode_map[0x21] = Key::P;219scancode_map[0x22] = Key::BRACKETLEFT;220scancode_map[0x23] = Key::BRACKETRIGHT;221scancode_map[0x24] = Key::ENTER;222scancode_map[0x25] = Key::CTRL; // Left223scancode_map[0x26] = Key::A;224scancode_map[0x27] = Key::S;225scancode_map[0x28] = Key::D;226scancode_map[0x29] = Key::F;227scancode_map[0x2A] = Key::G;228scancode_map[0x2B] = Key::H;229scancode_map[0x2C] = Key::J;230scancode_map[0x2D] = Key::K;231scancode_map[0x2E] = Key::L;232scancode_map[0x2F] = Key::SEMICOLON;233scancode_map[0x30] = Key::APOSTROPHE;234scancode_map[0x31] = Key::QUOTELEFT;235scancode_map[0x32] = Key::SHIFT; // Left236scancode_map[0x33] = Key::BACKSLASH;237scancode_map[0x34] = Key::Z;238scancode_map[0x35] = Key::X;239scancode_map[0x36] = Key::C;240scancode_map[0x37] = Key::V;241scancode_map[0x38] = Key::B;242scancode_map[0x39] = Key::N;243scancode_map[0x3A] = Key::M;244scancode_map[0x3B] = Key::COMMA;245scancode_map[0x3C] = Key::PERIOD;246scancode_map[0x3D] = Key::SLASH;247scancode_map[0x3E] = Key::SHIFT; // Right248scancode_map[0x3F] = Key::KP_MULTIPLY;249scancode_map[0x40] = Key::ALT; // Left250scancode_map[0x41] = Key::SPACE;251scancode_map[0x42] = Key::CAPSLOCK;252scancode_map[0x43] = Key::F1;253scancode_map[0x44] = Key::F2;254scancode_map[0x45] = Key::F3;255scancode_map[0x46] = Key::F4;256scancode_map[0x47] = Key::F5;257scancode_map[0x48] = Key::F6;258scancode_map[0x49] = Key::F7;259scancode_map[0x4A] = Key::F8;260scancode_map[0x4B] = Key::F9;261scancode_map[0x4C] = Key::F10;262scancode_map[0x4D] = Key::NUMLOCK;263scancode_map[0x4E] = Key::SCROLLLOCK;264scancode_map[0x4F] = Key::KP_7;265scancode_map[0x50] = Key::KP_8;266scancode_map[0x51] = Key::KP_9;267scancode_map[0x52] = Key::KP_SUBTRACT;268scancode_map[0x53] = Key::KP_4;269scancode_map[0x54] = Key::KP_5;270scancode_map[0x55] = Key::KP_6;271scancode_map[0x56] = Key::KP_ADD;272scancode_map[0x57] = Key::KP_1;273scancode_map[0x58] = Key::KP_2;274scancode_map[0x59] = Key::KP_3;275scancode_map[0x5A] = Key::KP_0;276scancode_map[0x5B] = Key::KP_PERIOD;277//scancode_map[0x5C]278//scancode_map[0x5D] // Zenkaku Hankaku279scancode_map[0x5E] = Key::SECTION;280scancode_map[0x5F] = Key::F11;281scancode_map[0x60] = Key::F12;282//scancode_map[0x61] // Romaji283//scancode_map[0x62] // Katakana284//scancode_map[0x63] // Hiragana285//scancode_map[0x64] // Henkan286//scancode_map[0x65] // Hiragana Katakana287//scancode_map[0x66] // Muhenkan288scancode_map[0x67] = Key::COMMA; // KP_Separator289scancode_map[0x68] = Key::KP_ENTER;290scancode_map[0x69] = Key::CTRL; // Right291scancode_map[0x6A] = Key::KP_DIVIDE;292scancode_map[0x6B] = Key::PRINT;293scancode_map[0x6C] = Key::ALT; // Right294scancode_map[0x6D] = Key::ENTER;295scancode_map[0x6E] = Key::HOME;296scancode_map[0x6F] = Key::UP;297scancode_map[0x70] = Key::PAGEUP;298scancode_map[0x71] = Key::LEFT;299scancode_map[0x72] = Key::RIGHT;300scancode_map[0x73] = Key::END;301scancode_map[0x74] = Key::DOWN;302scancode_map[0x75] = Key::PAGEDOWN;303scancode_map[0x76] = Key::INSERT;304scancode_map[0x77] = Key::KEY_DELETE;305//scancode_map[0x78] // Macro306scancode_map[0x79] = Key::VOLUMEMUTE;307scancode_map[0x7A] = Key::VOLUMEDOWN;308scancode_map[0x7B] = Key::VOLUMEUP;309//scancode_map[0x7C] // Power310scancode_map[0x7D] = Key::EQUAL; // KP_Equal311//scancode_map[0x7E] // KP_PlusMinus312scancode_map[0x7F] = Key::PAUSE;313scancode_map[0x80] = Key::LAUNCH0;314scancode_map[0x81] = Key::COMMA; // KP_Comma315//scancode_map[0x82] // Hangul316//scancode_map[0x83] // Hangul_Hanja317scancode_map[0x84] = Key::YEN;318scancode_map[0x85] = Key::META; // Left319scancode_map[0x86] = Key::META; // Right320scancode_map[0x87] = Key::MENU;321322scancode_map[0xA6] = Key::BACK; // On Chromebooks323scancode_map[0xA7] = Key::FORWARD; // On Chromebooks324325scancode_map[0xB5] = Key::REFRESH; // On Chromebooks326327scancode_map[0xBF] = Key::F13;328scancode_map[0xC0] = Key::F14;329scancode_map[0xC1] = Key::F15;330scancode_map[0xC2] = Key::F16;331scancode_map[0xC3] = Key::F17;332scancode_map[0xC4] = Key::F18;333scancode_map[0xC5] = Key::F19;334scancode_map[0xC6] = Key::F20;335scancode_map[0xC7] = Key::F21;336scancode_map[0xC8] = Key::F22;337scancode_map[0xC9] = Key::F23;338scancode_map[0xCA] = Key::F24;339scancode_map[0xCB] = Key::F25;340scancode_map[0xCC] = Key::F26;341scancode_map[0xCD] = Key::F27;342scancode_map[0xCE] = Key::F28;343scancode_map[0xCF] = Key::F29;344scancode_map[0xD0] = Key::F30;345scancode_map[0xD1] = Key::F31;346scancode_map[0xD2] = Key::F32;347scancode_map[0xD3] = Key::F33;348scancode_map[0xD4] = Key::F34;349scancode_map[0xD5] = Key::F35;350351// Godot to scancode map.352for (const KeyValue<unsigned int, Key> &E : scancode_map) {353scancode_map_inv[E.value] = E.key;354}355356// Keysym to Unicode map, tables taken from FOX toolkit.357xkeysym_unicode_map[0x01A1] = 0x0104;358xkeysym_unicode_map[0x01A2] = 0x02D8;359xkeysym_unicode_map[0x01A3] = 0x0141;360xkeysym_unicode_map[0x01A5] = 0x013D;361xkeysym_unicode_map[0x01A6] = 0x015A;362xkeysym_unicode_map[0x01A9] = 0x0160;363xkeysym_unicode_map[0x01AA] = 0x015E;364xkeysym_unicode_map[0x01AB] = 0x0164;365xkeysym_unicode_map[0x01AC] = 0x0179;366xkeysym_unicode_map[0x01AE] = 0x017D;367xkeysym_unicode_map[0x01AF] = 0x017B;368xkeysym_unicode_map[0x01B1] = 0x0105;369xkeysym_unicode_map[0x01B2] = 0x02DB;370xkeysym_unicode_map[0x01B3] = 0x0142;371xkeysym_unicode_map[0x01B5] = 0x013E;372xkeysym_unicode_map[0x01B6] = 0x015B;373xkeysym_unicode_map[0x01B7] = 0x02C7;374xkeysym_unicode_map[0x01B9] = 0x0161;375xkeysym_unicode_map[0x01BA] = 0x015F;376xkeysym_unicode_map[0x01BB] = 0x0165;377xkeysym_unicode_map[0x01BC] = 0x017A;378xkeysym_unicode_map[0x01BD] = 0x02DD;379xkeysym_unicode_map[0x01BE] = 0x017E;380xkeysym_unicode_map[0x01BF] = 0x017C;381xkeysym_unicode_map[0x01C0] = 0x0154;382xkeysym_unicode_map[0x01C3] = 0x0102;383xkeysym_unicode_map[0x01C5] = 0x0139;384xkeysym_unicode_map[0x01C6] = 0x0106;385xkeysym_unicode_map[0x01C8] = 0x010C;386xkeysym_unicode_map[0x01CA] = 0x0118;387xkeysym_unicode_map[0x01CC] = 0x011A;388xkeysym_unicode_map[0x01CF] = 0x010E;389xkeysym_unicode_map[0x01D0] = 0x0110;390xkeysym_unicode_map[0x01D1] = 0x0143;391xkeysym_unicode_map[0x01D2] = 0x0147;392xkeysym_unicode_map[0x01D5] = 0x0150;393xkeysym_unicode_map[0x01D8] = 0x0158;394xkeysym_unicode_map[0x01D9] = 0x016E;395xkeysym_unicode_map[0x01DB] = 0x0170;396xkeysym_unicode_map[0x01DE] = 0x0162;397xkeysym_unicode_map[0x01E0] = 0x0155;398xkeysym_unicode_map[0x01E3] = 0x0103;399xkeysym_unicode_map[0x01E5] = 0x013A;400xkeysym_unicode_map[0x01E6] = 0x0107;401xkeysym_unicode_map[0x01E8] = 0x010D;402xkeysym_unicode_map[0x01EA] = 0x0119;403xkeysym_unicode_map[0x01EC] = 0x011B;404xkeysym_unicode_map[0x01EF] = 0x010F;405xkeysym_unicode_map[0x01F0] = 0x0111;406xkeysym_unicode_map[0x01F1] = 0x0144;407xkeysym_unicode_map[0x01F2] = 0x0148;408xkeysym_unicode_map[0x01F5] = 0x0151;409xkeysym_unicode_map[0x01F8] = 0x0159;410xkeysym_unicode_map[0x01F9] = 0x016F;411xkeysym_unicode_map[0x01FB] = 0x0171;412xkeysym_unicode_map[0x01FE] = 0x0163;413xkeysym_unicode_map[0x01FF] = 0x02D9;414xkeysym_unicode_map[0x02A1] = 0x0126;415xkeysym_unicode_map[0x02A6] = 0x0124;416xkeysym_unicode_map[0x02A9] = 0x0130;417xkeysym_unicode_map[0x02AB] = 0x011E;418xkeysym_unicode_map[0x02AC] = 0x0134;419xkeysym_unicode_map[0x02B1] = 0x0127;420xkeysym_unicode_map[0x02B6] = 0x0125;421xkeysym_unicode_map[0x02B9] = 0x0131;422xkeysym_unicode_map[0x02BB] = 0x011F;423xkeysym_unicode_map[0x02BC] = 0x0135;424xkeysym_unicode_map[0x02C5] = 0x010A;425xkeysym_unicode_map[0x02C6] = 0x0108;426xkeysym_unicode_map[0x02D5] = 0x0120;427xkeysym_unicode_map[0x02D8] = 0x011C;428xkeysym_unicode_map[0x02DD] = 0x016C;429xkeysym_unicode_map[0x02DE] = 0x015C;430xkeysym_unicode_map[0x02E5] = 0x010B;431xkeysym_unicode_map[0x02E6] = 0x0109;432xkeysym_unicode_map[0x02F5] = 0x0121;433xkeysym_unicode_map[0x02F8] = 0x011D;434xkeysym_unicode_map[0x02FD] = 0x016D;435xkeysym_unicode_map[0x02FE] = 0x015D;436xkeysym_unicode_map[0x03A2] = 0x0138;437xkeysym_unicode_map[0x03A3] = 0x0156;438xkeysym_unicode_map[0x03A5] = 0x0128;439xkeysym_unicode_map[0x03A6] = 0x013B;440xkeysym_unicode_map[0x03AA] = 0x0112;441xkeysym_unicode_map[0x03AB] = 0x0122;442xkeysym_unicode_map[0x03AC] = 0x0166;443xkeysym_unicode_map[0x03B3] = 0x0157;444xkeysym_unicode_map[0x03B5] = 0x0129;445xkeysym_unicode_map[0x03B6] = 0x013C;446xkeysym_unicode_map[0x03BA] = 0x0113;447xkeysym_unicode_map[0x03BB] = 0x0123;448xkeysym_unicode_map[0x03BC] = 0x0167;449xkeysym_unicode_map[0x03BD] = 0x014A;450xkeysym_unicode_map[0x03BF] = 0x014B;451xkeysym_unicode_map[0x03C0] = 0x0100;452xkeysym_unicode_map[0x03C7] = 0x012E;453xkeysym_unicode_map[0x03CC] = 0x0116;454xkeysym_unicode_map[0x03CF] = 0x012A;455xkeysym_unicode_map[0x03D1] = 0x0145;456xkeysym_unicode_map[0x03D2] = 0x014C;457xkeysym_unicode_map[0x03D3] = 0x0136;458xkeysym_unicode_map[0x03D9] = 0x0172;459xkeysym_unicode_map[0x03DD] = 0x0168;460xkeysym_unicode_map[0x03DE] = 0x016A;461xkeysym_unicode_map[0x03E0] = 0x0101;462xkeysym_unicode_map[0x03E7] = 0x012F;463xkeysym_unicode_map[0x03EC] = 0x0117;464xkeysym_unicode_map[0x03EF] = 0x012B;465xkeysym_unicode_map[0x03F1] = 0x0146;466xkeysym_unicode_map[0x03F2] = 0x014D;467xkeysym_unicode_map[0x03F3] = 0x0137;468xkeysym_unicode_map[0x03F9] = 0x0173;469xkeysym_unicode_map[0x03FD] = 0x0169;470xkeysym_unicode_map[0x03FE] = 0x016B;471xkeysym_unicode_map[0x047E] = 0x203E;472xkeysym_unicode_map[0x04A1] = 0x3002;473xkeysym_unicode_map[0x04A2] = 0x300C;474xkeysym_unicode_map[0x04A3] = 0x300D;475xkeysym_unicode_map[0x04A4] = 0x3001;476xkeysym_unicode_map[0x04A5] = 0x30FB;477xkeysym_unicode_map[0x04A6] = 0x30F2;478xkeysym_unicode_map[0x04A7] = 0x30A1;479xkeysym_unicode_map[0x04A8] = 0x30A3;480xkeysym_unicode_map[0x04A9] = 0x30A5;481xkeysym_unicode_map[0x04AA] = 0x30A7;482xkeysym_unicode_map[0x04AB] = 0x30A9;483xkeysym_unicode_map[0x04AC] = 0x30E3;484xkeysym_unicode_map[0x04AD] = 0x30E5;485xkeysym_unicode_map[0x04AE] = 0x30E7;486xkeysym_unicode_map[0x04AF] = 0x30C3;487xkeysym_unicode_map[0x04B0] = 0x30FC;488xkeysym_unicode_map[0x04B1] = 0x30A2;489xkeysym_unicode_map[0x04B2] = 0x30A4;490xkeysym_unicode_map[0x04B3] = 0x30A6;491xkeysym_unicode_map[0x04B4] = 0x30A8;492xkeysym_unicode_map[0x04B5] = 0x30AA;493xkeysym_unicode_map[0x04B6] = 0x30AB;494xkeysym_unicode_map[0x04B7] = 0x30AD;495xkeysym_unicode_map[0x04B8] = 0x30AF;496xkeysym_unicode_map[0x04B9] = 0x30B1;497xkeysym_unicode_map[0x04BA] = 0x30B3;498xkeysym_unicode_map[0x04BB] = 0x30B5;499xkeysym_unicode_map[0x04BC] = 0x30B7;500xkeysym_unicode_map[0x04BD] = 0x30B9;501xkeysym_unicode_map[0x04BE] = 0x30BB;502xkeysym_unicode_map[0x04BF] = 0x30BD;503xkeysym_unicode_map[0x04C0] = 0x30BF;504xkeysym_unicode_map[0x04C1] = 0x30C1;505xkeysym_unicode_map[0x04C2] = 0x30C4;506xkeysym_unicode_map[0x04C3] = 0x30C6;507xkeysym_unicode_map[0x04C4] = 0x30C8;508xkeysym_unicode_map[0x04C5] = 0x30CA;509xkeysym_unicode_map[0x04C6] = 0x30CB;510xkeysym_unicode_map[0x04C7] = 0x30CC;511xkeysym_unicode_map[0x04C8] = 0x30CD;512xkeysym_unicode_map[0x04C9] = 0x30CE;513xkeysym_unicode_map[0x04CA] = 0x30CF;514xkeysym_unicode_map[0x04CB] = 0x30D2;515xkeysym_unicode_map[0x04CC] = 0x30D5;516xkeysym_unicode_map[0x04CD] = 0x30D8;517xkeysym_unicode_map[0x04CE] = 0x30DB;518xkeysym_unicode_map[0x04CF] = 0x30DE;519xkeysym_unicode_map[0x04D0] = 0x30DF;520xkeysym_unicode_map[0x04D1] = 0x30E0;521xkeysym_unicode_map[0x04D2] = 0x30E1;522xkeysym_unicode_map[0x04D3] = 0x30E2;523xkeysym_unicode_map[0x04D4] = 0x30E4;524xkeysym_unicode_map[0x04D5] = 0x30E6;525xkeysym_unicode_map[0x04D6] = 0x30E8;526xkeysym_unicode_map[0x04D7] = 0x30E9;527xkeysym_unicode_map[0x04D8] = 0x30EA;528xkeysym_unicode_map[0x04D9] = 0x30EB;529xkeysym_unicode_map[0x04DA] = 0x30EC;530xkeysym_unicode_map[0x04DB] = 0x30ED;531xkeysym_unicode_map[0x04DC] = 0x30EF;532xkeysym_unicode_map[0x04DD] = 0x30F3;533xkeysym_unicode_map[0x04DE] = 0x309B;534xkeysym_unicode_map[0x04DF] = 0x309C;535xkeysym_unicode_map[0x05AC] = 0x060C;536xkeysym_unicode_map[0x05BB] = 0x061B;537xkeysym_unicode_map[0x05BF] = 0x061F;538xkeysym_unicode_map[0x05C1] = 0x0621;539xkeysym_unicode_map[0x05C2] = 0x0622;540xkeysym_unicode_map[0x05C3] = 0x0623;541xkeysym_unicode_map[0x05C4] = 0x0624;542xkeysym_unicode_map[0x05C5] = 0x0625;543xkeysym_unicode_map[0x05C6] = 0x0626;544xkeysym_unicode_map[0x05C7] = 0x0627;545xkeysym_unicode_map[0x05C8] = 0x0628;546xkeysym_unicode_map[0x05C9] = 0x0629;547xkeysym_unicode_map[0x05CA] = 0x062A;548xkeysym_unicode_map[0x05CB] = 0x062B;549xkeysym_unicode_map[0x05CC] = 0x062C;550xkeysym_unicode_map[0x05CD] = 0x062D;551xkeysym_unicode_map[0x05CE] = 0x062E;552xkeysym_unicode_map[0x05CF] = 0x062F;553xkeysym_unicode_map[0x05D0] = 0x0630;554xkeysym_unicode_map[0x05D1] = 0x0631;555xkeysym_unicode_map[0x05D2] = 0x0632;556xkeysym_unicode_map[0x05D3] = 0x0633;557xkeysym_unicode_map[0x05D4] = 0x0634;558xkeysym_unicode_map[0x05D5] = 0x0635;559xkeysym_unicode_map[0x05D6] = 0x0636;560xkeysym_unicode_map[0x05D7] = 0x0637;561xkeysym_unicode_map[0x05D8] = 0x0638;562xkeysym_unicode_map[0x05D9] = 0x0639;563xkeysym_unicode_map[0x05DA] = 0x063A;564xkeysym_unicode_map[0x05E0] = 0x0640;565xkeysym_unicode_map[0x05E1] = 0x0641;566xkeysym_unicode_map[0x05E2] = 0x0642;567xkeysym_unicode_map[0x05E3] = 0x0643;568xkeysym_unicode_map[0x05E4] = 0x0644;569xkeysym_unicode_map[0x05E5] = 0x0645;570xkeysym_unicode_map[0x05E6] = 0x0646;571xkeysym_unicode_map[0x05E7] = 0x0647;572xkeysym_unicode_map[0x05E8] = 0x0648;573xkeysym_unicode_map[0x05E9] = 0x0649;574xkeysym_unicode_map[0x05EA] = 0x064A;575xkeysym_unicode_map[0x05EB] = 0x064B;576xkeysym_unicode_map[0x05EC] = 0x064C;577xkeysym_unicode_map[0x05ED] = 0x064D;578xkeysym_unicode_map[0x05EE] = 0x064E;579xkeysym_unicode_map[0x05EF] = 0x064F;580xkeysym_unicode_map[0x05F0] = 0x0650;581xkeysym_unicode_map[0x05F1] = 0x0651;582xkeysym_unicode_map[0x05F2] = 0x0652;583xkeysym_unicode_map[0x06A1] = 0x0452;584xkeysym_unicode_map[0x06A2] = 0x0453;585xkeysym_unicode_map[0x06A3] = 0x0451;586xkeysym_unicode_map[0x06A4] = 0x0454;587xkeysym_unicode_map[0x06A5] = 0x0455;588xkeysym_unicode_map[0x06A6] = 0x0456;589xkeysym_unicode_map[0x06A7] = 0x0457;590xkeysym_unicode_map[0x06A8] = 0x0458;591xkeysym_unicode_map[0x06A9] = 0x0459;592xkeysym_unicode_map[0x06AA] = 0x045A;593xkeysym_unicode_map[0x06AB] = 0x045B;594xkeysym_unicode_map[0x06AC] = 0x045C;595xkeysym_unicode_map[0x06AE] = 0x045E;596xkeysym_unicode_map[0x06AF] = 0x045F;597xkeysym_unicode_map[0x06B0] = 0x2116;598xkeysym_unicode_map[0x06B1] = 0x0402;599xkeysym_unicode_map[0x06B2] = 0x0403;600xkeysym_unicode_map[0x06B3] = 0x0401;601xkeysym_unicode_map[0x06B4] = 0x0404;602xkeysym_unicode_map[0x06B5] = 0x0405;603xkeysym_unicode_map[0x06B6] = 0x0406;604xkeysym_unicode_map[0x06B7] = 0x0407;605xkeysym_unicode_map[0x06B8] = 0x0408;606xkeysym_unicode_map[0x06B9] = 0x0409;607xkeysym_unicode_map[0x06BA] = 0x040A;608xkeysym_unicode_map[0x06BB] = 0x040B;609xkeysym_unicode_map[0x06BC] = 0x040C;610xkeysym_unicode_map[0x06BE] = 0x040E;611xkeysym_unicode_map[0x06BF] = 0x040F;612xkeysym_unicode_map[0x06C0] = 0x044E;613xkeysym_unicode_map[0x06C1] = 0x0430;614xkeysym_unicode_map[0x06C2] = 0x0431;615xkeysym_unicode_map[0x06C3] = 0x0446;616xkeysym_unicode_map[0x06C4] = 0x0434;617xkeysym_unicode_map[0x06C5] = 0x0435;618xkeysym_unicode_map[0x06C6] = 0x0444;619xkeysym_unicode_map[0x06C7] = 0x0433;620xkeysym_unicode_map[0x06C8] = 0x0445;621xkeysym_unicode_map[0x06C9] = 0x0438;622xkeysym_unicode_map[0x06CA] = 0x0439;623xkeysym_unicode_map[0x06CB] = 0x043A;624xkeysym_unicode_map[0x06CC] = 0x043B;625xkeysym_unicode_map[0x06CD] = 0x043C;626xkeysym_unicode_map[0x06CE] = 0x043D;627xkeysym_unicode_map[0x06CF] = 0x043E;628xkeysym_unicode_map[0x06D0] = 0x043F;629xkeysym_unicode_map[0x06D1] = 0x044F;630xkeysym_unicode_map[0x06D2] = 0x0440;631xkeysym_unicode_map[0x06D3] = 0x0441;632xkeysym_unicode_map[0x06D4] = 0x0442;633xkeysym_unicode_map[0x06D5] = 0x0443;634xkeysym_unicode_map[0x06D6] = 0x0436;635xkeysym_unicode_map[0x06D7] = 0x0432;636xkeysym_unicode_map[0x06D8] = 0x044C;637xkeysym_unicode_map[0x06D9] = 0x044B;638xkeysym_unicode_map[0x06DA] = 0x0437;639xkeysym_unicode_map[0x06DB] = 0x0448;640xkeysym_unicode_map[0x06DC] = 0x044D;641xkeysym_unicode_map[0x06DD] = 0x0449;642xkeysym_unicode_map[0x06DE] = 0x0447;643xkeysym_unicode_map[0x06DF] = 0x044A;644xkeysym_unicode_map[0x06E0] = 0x042E;645xkeysym_unicode_map[0x06E1] = 0x0410;646xkeysym_unicode_map[0x06E2] = 0x0411;647xkeysym_unicode_map[0x06E3] = 0x0426;648xkeysym_unicode_map[0x06E4] = 0x0414;649xkeysym_unicode_map[0x06E5] = 0x0415;650xkeysym_unicode_map[0x06E6] = 0x0424;651xkeysym_unicode_map[0x06E7] = 0x0413;652xkeysym_unicode_map[0x06E8] = 0x0425;653xkeysym_unicode_map[0x06E9] = 0x0418;654xkeysym_unicode_map[0x06EA] = 0x0419;655xkeysym_unicode_map[0x06EB] = 0x041A;656xkeysym_unicode_map[0x06EC] = 0x041B;657xkeysym_unicode_map[0x06ED] = 0x041C;658xkeysym_unicode_map[0x06EE] = 0x041D;659xkeysym_unicode_map[0x06EF] = 0x041E;660xkeysym_unicode_map[0x06F0] = 0x041F;661xkeysym_unicode_map[0x06F1] = 0x042F;662xkeysym_unicode_map[0x06F2] = 0x0420;663xkeysym_unicode_map[0x06F3] = 0x0421;664xkeysym_unicode_map[0x06F4] = 0x0422;665xkeysym_unicode_map[0x06F5] = 0x0423;666xkeysym_unicode_map[0x06F6] = 0x0416;667xkeysym_unicode_map[0x06F7] = 0x0412;668xkeysym_unicode_map[0x06F8] = 0x042C;669xkeysym_unicode_map[0x06F9] = 0x042B;670xkeysym_unicode_map[0x06FA] = 0x0417;671xkeysym_unicode_map[0x06FB] = 0x0428;672xkeysym_unicode_map[0x06FC] = 0x042D;673xkeysym_unicode_map[0x06FD] = 0x0429;674xkeysym_unicode_map[0x06FE] = 0x0427;675xkeysym_unicode_map[0x06FF] = 0x042A;676xkeysym_unicode_map[0x07A1] = 0x0386;677xkeysym_unicode_map[0x07A2] = 0x0388;678xkeysym_unicode_map[0x07A3] = 0x0389;679xkeysym_unicode_map[0x07A4] = 0x038A;680xkeysym_unicode_map[0x07A5] = 0x03AA;681xkeysym_unicode_map[0x07A7] = 0x038C;682xkeysym_unicode_map[0x07A8] = 0x038E;683xkeysym_unicode_map[0x07A9] = 0x03AB;684xkeysym_unicode_map[0x07AB] = 0x038F;685xkeysym_unicode_map[0x07AE] = 0x0385;686xkeysym_unicode_map[0x07AF] = 0x2015;687xkeysym_unicode_map[0x07B1] = 0x03AC;688xkeysym_unicode_map[0x07B2] = 0x03AD;689xkeysym_unicode_map[0x07B3] = 0x03AE;690xkeysym_unicode_map[0x07B4] = 0x03AF;691xkeysym_unicode_map[0x07B5] = 0x03CA;692xkeysym_unicode_map[0x07B6] = 0x0390;693xkeysym_unicode_map[0x07B7] = 0x03CC;694xkeysym_unicode_map[0x07B8] = 0x03CD;695xkeysym_unicode_map[0x07B9] = 0x03CB;696xkeysym_unicode_map[0x07BA] = 0x03B0;697xkeysym_unicode_map[0x07BB] = 0x03CE;698xkeysym_unicode_map[0x07C1] = 0x0391;699xkeysym_unicode_map[0x07C2] = 0x0392;700xkeysym_unicode_map[0x07C3] = 0x0393;701xkeysym_unicode_map[0x07C4] = 0x0394;702xkeysym_unicode_map[0x07C5] = 0x0395;703xkeysym_unicode_map[0x07C6] = 0x0396;704xkeysym_unicode_map[0x07C7] = 0x0397;705xkeysym_unicode_map[0x07C8] = 0x0398;706xkeysym_unicode_map[0x07C9] = 0x0399;707xkeysym_unicode_map[0x07CA] = 0x039A;708xkeysym_unicode_map[0x07CB] = 0x039B;709xkeysym_unicode_map[0x07CC] = 0x039C;710xkeysym_unicode_map[0x07CD] = 0x039D;711xkeysym_unicode_map[0x07CE] = 0x039E;712xkeysym_unicode_map[0x07CF] = 0x039F;713xkeysym_unicode_map[0x07D0] = 0x03A0;714xkeysym_unicode_map[0x07D1] = 0x03A1;715xkeysym_unicode_map[0x07D2] = 0x03A3;716xkeysym_unicode_map[0x07D4] = 0x03A4;717xkeysym_unicode_map[0x07D5] = 0x03A5;718xkeysym_unicode_map[0x07D6] = 0x03A6;719xkeysym_unicode_map[0x07D7] = 0x03A7;720xkeysym_unicode_map[0x07D8] = 0x03A8;721xkeysym_unicode_map[0x07D9] = 0x03A9;722xkeysym_unicode_map[0x07E1] = 0x03B1;723xkeysym_unicode_map[0x07E2] = 0x03B2;724xkeysym_unicode_map[0x07E3] = 0x03B3;725xkeysym_unicode_map[0x07E4] = 0x03B4;726xkeysym_unicode_map[0x07E5] = 0x03B5;727xkeysym_unicode_map[0x07E6] = 0x03B6;728xkeysym_unicode_map[0x07E7] = 0x03B7;729xkeysym_unicode_map[0x07E8] = 0x03B8;730xkeysym_unicode_map[0x07E9] = 0x03B9;731xkeysym_unicode_map[0x07EA] = 0x03BA;732xkeysym_unicode_map[0x07EB] = 0x03BB;733xkeysym_unicode_map[0x07EC] = 0x03BC;734xkeysym_unicode_map[0x07ED] = 0x03BD;735xkeysym_unicode_map[0x07EE] = 0x03BE;736xkeysym_unicode_map[0x07EF] = 0x03BF;737xkeysym_unicode_map[0x07F0] = 0x03C0;738xkeysym_unicode_map[0x07F1] = 0x03C1;739xkeysym_unicode_map[0x07F2] = 0x03C3;740xkeysym_unicode_map[0x07F3] = 0x03C2;741xkeysym_unicode_map[0x07F4] = 0x03C4;742xkeysym_unicode_map[0x07F5] = 0x03C5;743xkeysym_unicode_map[0x07F6] = 0x03C6;744xkeysym_unicode_map[0x07F7] = 0x03C7;745xkeysym_unicode_map[0x07F8] = 0x03C8;746xkeysym_unicode_map[0x07F9] = 0x03C9;747xkeysym_unicode_map[0x08A1] = 0x23B7;748xkeysym_unicode_map[0x08A2] = 0x250C;749xkeysym_unicode_map[0x08A3] = 0x2500;750xkeysym_unicode_map[0x08A4] = 0x2320;751xkeysym_unicode_map[0x08A5] = 0x2321;752xkeysym_unicode_map[0x08A6] = 0x2502;753xkeysym_unicode_map[0x08A7] = 0x23A1;754xkeysym_unicode_map[0x08A8] = 0x23A3;755xkeysym_unicode_map[0x08A9] = 0x23A4;756xkeysym_unicode_map[0x08AA] = 0x23A6;757xkeysym_unicode_map[0x08AB] = 0x239B;758xkeysym_unicode_map[0x08AC] = 0x239D;759xkeysym_unicode_map[0x08AD] = 0x239E;760xkeysym_unicode_map[0x08AE] = 0x23A0;761xkeysym_unicode_map[0x08AF] = 0x23A8;762xkeysym_unicode_map[0x08B0] = 0x23AC;763xkeysym_unicode_map[0x08BC] = 0x2264;764xkeysym_unicode_map[0x08BD] = 0x2260;765xkeysym_unicode_map[0x08BE] = 0x2265;766xkeysym_unicode_map[0x08BF] = 0x222B;767xkeysym_unicode_map[0x08C0] = 0x2234;768xkeysym_unicode_map[0x08C1] = 0x221D;769xkeysym_unicode_map[0x08C2] = 0x221E;770xkeysym_unicode_map[0x08C5] = 0x2207;771xkeysym_unicode_map[0x08C8] = 0x223C;772xkeysym_unicode_map[0x08C9] = 0x2243;773xkeysym_unicode_map[0x08CD] = 0x21D4;774xkeysym_unicode_map[0x08CE] = 0x21D2;775xkeysym_unicode_map[0x08CF] = 0x2261;776xkeysym_unicode_map[0x08D6] = 0x221A;777xkeysym_unicode_map[0x08DA] = 0x2282;778xkeysym_unicode_map[0x08DB] = 0x2283;779xkeysym_unicode_map[0x08DC] = 0x2229;780xkeysym_unicode_map[0x08DD] = 0x222A;781xkeysym_unicode_map[0x08DE] = 0x2227;782xkeysym_unicode_map[0x08DF] = 0x2228;783xkeysym_unicode_map[0x08EF] = 0x2202;784xkeysym_unicode_map[0x08F6] = 0x0192;785xkeysym_unicode_map[0x08FB] = 0x2190;786xkeysym_unicode_map[0x08FC] = 0x2191;787xkeysym_unicode_map[0x08FD] = 0x2192;788xkeysym_unicode_map[0x08FE] = 0x2193;789xkeysym_unicode_map[0x09E0] = 0x25C6;790xkeysym_unicode_map[0x09E1] = 0x2592;791xkeysym_unicode_map[0x09E2] = 0x2409;792xkeysym_unicode_map[0x09E3] = 0x240C;793xkeysym_unicode_map[0x09E4] = 0x240D;794xkeysym_unicode_map[0x09E5] = 0x240A;795xkeysym_unicode_map[0x09E8] = 0x2424;796xkeysym_unicode_map[0x09E9] = 0x240B;797xkeysym_unicode_map[0x09EA] = 0x2518;798xkeysym_unicode_map[0x09EB] = 0x2510;799xkeysym_unicode_map[0x09EC] = 0x250C;800xkeysym_unicode_map[0x09ED] = 0x2514;801xkeysym_unicode_map[0x09EE] = 0x253C;802xkeysym_unicode_map[0x09EF] = 0x23BA;803xkeysym_unicode_map[0x09F0] = 0x23BB;804xkeysym_unicode_map[0x09F1] = 0x2500;805xkeysym_unicode_map[0x09F2] = 0x23BC;806xkeysym_unicode_map[0x09F3] = 0x23BD;807xkeysym_unicode_map[0x09F4] = 0x251C;808xkeysym_unicode_map[0x09F5] = 0x2524;809xkeysym_unicode_map[0x09F6] = 0x2534;810xkeysym_unicode_map[0x09F7] = 0x252C;811xkeysym_unicode_map[0x09F8] = 0x2502;812xkeysym_unicode_map[0x0AA1] = 0x2003;813xkeysym_unicode_map[0x0AA2] = 0x2002;814xkeysym_unicode_map[0x0AA3] = 0x2004;815xkeysym_unicode_map[0x0AA4] = 0x2005;816xkeysym_unicode_map[0x0AA5] = 0x2007;817xkeysym_unicode_map[0x0AA6] = 0x2008;818xkeysym_unicode_map[0x0AA7] = 0x2009;819xkeysym_unicode_map[0x0AA8] = 0x200A;820xkeysym_unicode_map[0x0AA9] = 0x2014;821xkeysym_unicode_map[0x0AAA] = 0x2013;822xkeysym_unicode_map[0x0AAE] = 0x2026;823xkeysym_unicode_map[0x0AAF] = 0x2025;824xkeysym_unicode_map[0x0AB0] = 0x2153;825xkeysym_unicode_map[0x0AB1] = 0x2154;826xkeysym_unicode_map[0x0AB2] = 0x2155;827xkeysym_unicode_map[0x0AB3] = 0x2156;828xkeysym_unicode_map[0x0AB4] = 0x2157;829xkeysym_unicode_map[0x0AB5] = 0x2158;830xkeysym_unicode_map[0x0AB6] = 0x2159;831xkeysym_unicode_map[0x0AB7] = 0x215A;832xkeysym_unicode_map[0x0AB8] = 0x2105;833xkeysym_unicode_map[0x0ABB] = 0x2012;834xkeysym_unicode_map[0x0ABC] = 0x2329;835xkeysym_unicode_map[0x0ABE] = 0x232A;836xkeysym_unicode_map[0x0AC3] = 0x215B;837xkeysym_unicode_map[0x0AC4] = 0x215C;838xkeysym_unicode_map[0x0AC5] = 0x215D;839xkeysym_unicode_map[0x0AC6] = 0x215E;840xkeysym_unicode_map[0x0AC9] = 0x2122;841xkeysym_unicode_map[0x0ACA] = 0x2613;842xkeysym_unicode_map[0x0ACC] = 0x25C1;843xkeysym_unicode_map[0x0ACD] = 0x25B7;844xkeysym_unicode_map[0x0ACE] = 0x25CB;845xkeysym_unicode_map[0x0ACF] = 0x25AF;846xkeysym_unicode_map[0x0AD0] = 0x2018;847xkeysym_unicode_map[0x0AD1] = 0x2019;848xkeysym_unicode_map[0x0AD2] = 0x201C;849xkeysym_unicode_map[0x0AD3] = 0x201D;850xkeysym_unicode_map[0x0AD4] = 0x211E;851xkeysym_unicode_map[0x0AD6] = 0x2032;852xkeysym_unicode_map[0x0AD7] = 0x2033;853xkeysym_unicode_map[0x0AD9] = 0x271D;854xkeysym_unicode_map[0x0ADB] = 0x25AC;855xkeysym_unicode_map[0x0ADC] = 0x25C0;856xkeysym_unicode_map[0x0ADD] = 0x25B6;857xkeysym_unicode_map[0x0ADE] = 0x25CF;858xkeysym_unicode_map[0x0ADF] = 0x25AE;859xkeysym_unicode_map[0x0AE0] = 0x25E6;860xkeysym_unicode_map[0x0AE1] = 0x25AB;861xkeysym_unicode_map[0x0AE2] = 0x25AD;862xkeysym_unicode_map[0x0AE3] = 0x25B3;863xkeysym_unicode_map[0x0AE4] = 0x25BD;864xkeysym_unicode_map[0x0AE5] = 0x2606;865xkeysym_unicode_map[0x0AE6] = 0x2022;866xkeysym_unicode_map[0x0AE7] = 0x25AA;867xkeysym_unicode_map[0x0AE8] = 0x25B2;868xkeysym_unicode_map[0x0AE9] = 0x25BC;869xkeysym_unicode_map[0x0AEA] = 0x261C;870xkeysym_unicode_map[0x0AEB] = 0x261E;871xkeysym_unicode_map[0x0AEC] = 0x2663;872xkeysym_unicode_map[0x0AED] = 0x2666;873xkeysym_unicode_map[0x0AEE] = 0x2665;874xkeysym_unicode_map[0x0AF0] = 0x2720;875xkeysym_unicode_map[0x0AF1] = 0x2020;876xkeysym_unicode_map[0x0AF2] = 0x2021;877xkeysym_unicode_map[0x0AF3] = 0x2713;878xkeysym_unicode_map[0x0AF4] = 0x2717;879xkeysym_unicode_map[0x0AF5] = 0x266F;880xkeysym_unicode_map[0x0AF6] = 0x266D;881xkeysym_unicode_map[0x0AF7] = 0x2642;882xkeysym_unicode_map[0x0AF8] = 0x2640;883xkeysym_unicode_map[0x0AF9] = 0x260E;884xkeysym_unicode_map[0x0AFA] = 0x2315;885xkeysym_unicode_map[0x0AFB] = 0x2117;886xkeysym_unicode_map[0x0AFC] = 0x2038;887xkeysym_unicode_map[0x0AFD] = 0x201A;888xkeysym_unicode_map[0x0AFE] = 0x201E;889xkeysym_unicode_map[0x0BA3] = 0x003C;890xkeysym_unicode_map[0x0BA6] = 0x003E;891xkeysym_unicode_map[0x0BA8] = 0x2228;892xkeysym_unicode_map[0x0BA9] = 0x2227;893xkeysym_unicode_map[0x0BC0] = 0x00AF;894xkeysym_unicode_map[0x0BC2] = 0x22A5;895xkeysym_unicode_map[0x0BC3] = 0x2229;896xkeysym_unicode_map[0x0BC4] = 0x230A;897xkeysym_unicode_map[0x0BC6] = 0x005F;898xkeysym_unicode_map[0x0BCA] = 0x2218;899xkeysym_unicode_map[0x0BCC] = 0x2395;900xkeysym_unicode_map[0x0BCE] = 0x22A4;901xkeysym_unicode_map[0x0BCF] = 0x25CB;902xkeysym_unicode_map[0x0BD3] = 0x2308;903xkeysym_unicode_map[0x0BD6] = 0x222A;904xkeysym_unicode_map[0x0BD8] = 0x2283;905xkeysym_unicode_map[0x0BDA] = 0x2282;906xkeysym_unicode_map[0x0BDC] = 0x22A2;907xkeysym_unicode_map[0x0BFC] = 0x22A3;908xkeysym_unicode_map[0x0CDF] = 0x2017;909xkeysym_unicode_map[0x0CE0] = 0x05D0;910xkeysym_unicode_map[0x0CE1] = 0x05D1;911xkeysym_unicode_map[0x0CE2] = 0x05D2;912xkeysym_unicode_map[0x0CE3] = 0x05D3;913xkeysym_unicode_map[0x0CE4] = 0x05D4;914xkeysym_unicode_map[0x0CE5] = 0x05D5;915xkeysym_unicode_map[0x0CE6] = 0x05D6;916xkeysym_unicode_map[0x0CE7] = 0x05D7;917xkeysym_unicode_map[0x0CE8] = 0x05D8;918xkeysym_unicode_map[0x0CE9] = 0x05D9;919xkeysym_unicode_map[0x0CEA] = 0x05DA;920xkeysym_unicode_map[0x0CEB] = 0x05DB;921xkeysym_unicode_map[0x0CEC] = 0x05DC;922xkeysym_unicode_map[0x0CED] = 0x05DD;923xkeysym_unicode_map[0x0CEE] = 0x05DE;924xkeysym_unicode_map[0x0CEF] = 0x05DF;925xkeysym_unicode_map[0x0CF0] = 0x05E0;926xkeysym_unicode_map[0x0CF1] = 0x05E1;927xkeysym_unicode_map[0x0CF2] = 0x05E2;928xkeysym_unicode_map[0x0CF3] = 0x05E3;929xkeysym_unicode_map[0x0CF4] = 0x05E4;930xkeysym_unicode_map[0x0CF5] = 0x05E5;931xkeysym_unicode_map[0x0CF6] = 0x05E6;932xkeysym_unicode_map[0x0CF7] = 0x05E7;933xkeysym_unicode_map[0x0CF8] = 0x05E8;934xkeysym_unicode_map[0x0CF9] = 0x05E9;935xkeysym_unicode_map[0x0CFA] = 0x05EA;936xkeysym_unicode_map[0x0DA1] = 0x0E01;937xkeysym_unicode_map[0x0DA2] = 0x0E02;938xkeysym_unicode_map[0x0DA3] = 0x0E03;939xkeysym_unicode_map[0x0DA4] = 0x0E04;940xkeysym_unicode_map[0x0DA5] = 0x0E05;941xkeysym_unicode_map[0x0DA6] = 0x0E06;942xkeysym_unicode_map[0x0DA7] = 0x0E07;943xkeysym_unicode_map[0x0DA8] = 0x0E08;944xkeysym_unicode_map[0x0DA9] = 0x0E09;945xkeysym_unicode_map[0x0DAA] = 0x0E0A;946xkeysym_unicode_map[0x0DAB] = 0x0E0B;947xkeysym_unicode_map[0x0DAC] = 0x0E0C;948xkeysym_unicode_map[0x0DAD] = 0x0E0D;949xkeysym_unicode_map[0x0DAE] = 0x0E0E;950xkeysym_unicode_map[0x0DAF] = 0x0E0F;951xkeysym_unicode_map[0x0DB0] = 0x0E10;952xkeysym_unicode_map[0x0DB1] = 0x0E11;953xkeysym_unicode_map[0x0DB2] = 0x0E12;954xkeysym_unicode_map[0x0DB3] = 0x0E13;955xkeysym_unicode_map[0x0DB4] = 0x0E14;956xkeysym_unicode_map[0x0DB5] = 0x0E15;957xkeysym_unicode_map[0x0DB6] = 0x0E16;958xkeysym_unicode_map[0x0DB7] = 0x0E17;959xkeysym_unicode_map[0x0DB8] = 0x0E18;960xkeysym_unicode_map[0x0DB9] = 0x0E19;961xkeysym_unicode_map[0x0DBA] = 0x0E1A;962xkeysym_unicode_map[0x0DBB] = 0x0E1B;963xkeysym_unicode_map[0x0DBC] = 0x0E1C;964xkeysym_unicode_map[0x0DBD] = 0x0E1D;965xkeysym_unicode_map[0x0DBE] = 0x0E1E;966xkeysym_unicode_map[0x0DBF] = 0x0E1F;967xkeysym_unicode_map[0x0DC0] = 0x0E20;968xkeysym_unicode_map[0x0DC1] = 0x0E21;969xkeysym_unicode_map[0x0DC2] = 0x0E22;970xkeysym_unicode_map[0x0DC3] = 0x0E23;971xkeysym_unicode_map[0x0DC4] = 0x0E24;972xkeysym_unicode_map[0x0DC5] = 0x0E25;973xkeysym_unicode_map[0x0DC6] = 0x0E26;974xkeysym_unicode_map[0x0DC7] = 0x0E27;975xkeysym_unicode_map[0x0DC8] = 0x0E28;976xkeysym_unicode_map[0x0DC9] = 0x0E29;977xkeysym_unicode_map[0x0DCA] = 0x0E2A;978xkeysym_unicode_map[0x0DCB] = 0x0E2B;979xkeysym_unicode_map[0x0DCC] = 0x0E2C;980xkeysym_unicode_map[0x0DCD] = 0x0E2D;981xkeysym_unicode_map[0x0DCE] = 0x0E2E;982xkeysym_unicode_map[0x0DCF] = 0x0E2F;983xkeysym_unicode_map[0x0DD0] = 0x0E30;984xkeysym_unicode_map[0x0DD1] = 0x0E31;985xkeysym_unicode_map[0x0DD2] = 0x0E32;986xkeysym_unicode_map[0x0DD3] = 0x0E33;987xkeysym_unicode_map[0x0DD4] = 0x0E34;988xkeysym_unicode_map[0x0DD5] = 0x0E35;989xkeysym_unicode_map[0x0DD6] = 0x0E36;990xkeysym_unicode_map[0x0DD7] = 0x0E37;991xkeysym_unicode_map[0x0DD8] = 0x0E38;992xkeysym_unicode_map[0x0DD9] = 0x0E39;993xkeysym_unicode_map[0x0DDA] = 0x0E3A;994xkeysym_unicode_map[0x0DDF] = 0x0E3F;995xkeysym_unicode_map[0x0DE0] = 0x0E40;996xkeysym_unicode_map[0x0DE1] = 0x0E41;997xkeysym_unicode_map[0x0DE2] = 0x0E42;998xkeysym_unicode_map[0x0DE3] = 0x0E43;999xkeysym_unicode_map[0x0DE4] = 0x0E44;1000xkeysym_unicode_map[0x0DE5] = 0x0E45;1001xkeysym_unicode_map[0x0DE6] = 0x0E46;1002xkeysym_unicode_map[0x0DE7] = 0x0E47;1003xkeysym_unicode_map[0x0DE8] = 0x0E48;1004xkeysym_unicode_map[0x0DE9] = 0x0E49;1005xkeysym_unicode_map[0x0DEA] = 0x0E4A;1006xkeysym_unicode_map[0x0DEB] = 0x0E4B;1007xkeysym_unicode_map[0x0DEC] = 0x0E4C;1008xkeysym_unicode_map[0x0DED] = 0x0E4D;1009xkeysym_unicode_map[0x0DF0] = 0x0E50;1010xkeysym_unicode_map[0x0DF1] = 0x0E51;1011xkeysym_unicode_map[0x0DF2] = 0x0E52;1012xkeysym_unicode_map[0x0DF3] = 0x0E53;1013xkeysym_unicode_map[0x0DF4] = 0x0E54;1014xkeysym_unicode_map[0x0DF5] = 0x0E55;1015xkeysym_unicode_map[0x0DF6] = 0x0E56;1016xkeysym_unicode_map[0x0DF7] = 0x0E57;1017xkeysym_unicode_map[0x0DF8] = 0x0E58;1018xkeysym_unicode_map[0x0DF9] = 0x0E59;1019xkeysym_unicode_map[0x0EA1] = 0x3131;1020xkeysym_unicode_map[0x0EA2] = 0x3132;1021xkeysym_unicode_map[0x0EA3] = 0x3133;1022xkeysym_unicode_map[0x0EA4] = 0x3134;1023xkeysym_unicode_map[0x0EA5] = 0x3135;1024xkeysym_unicode_map[0x0EA6] = 0x3136;1025xkeysym_unicode_map[0x0EA7] = 0x3137;1026xkeysym_unicode_map[0x0EA8] = 0x3138;1027xkeysym_unicode_map[0x0EA9] = 0x3139;1028xkeysym_unicode_map[0x0EAA] = 0x313A;1029xkeysym_unicode_map[0x0EAB] = 0x313B;1030xkeysym_unicode_map[0x0EAC] = 0x313C;1031xkeysym_unicode_map[0x0EAD] = 0x313D;1032xkeysym_unicode_map[0x0EAE] = 0x313E;1033xkeysym_unicode_map[0x0EAF] = 0x313F;1034xkeysym_unicode_map[0x0EB0] = 0x3140;1035xkeysym_unicode_map[0x0EB1] = 0x3141;1036xkeysym_unicode_map[0x0EB2] = 0x3142;1037xkeysym_unicode_map[0x0EB3] = 0x3143;1038xkeysym_unicode_map[0x0EB4] = 0x3144;1039xkeysym_unicode_map[0x0EB5] = 0x3145;1040xkeysym_unicode_map[0x0EB6] = 0x3146;1041xkeysym_unicode_map[0x0EB7] = 0x3147;1042xkeysym_unicode_map[0x0EB8] = 0x3148;1043xkeysym_unicode_map[0x0EB9] = 0x3149;1044xkeysym_unicode_map[0x0EBA] = 0x314A;1045xkeysym_unicode_map[0x0EBB] = 0x314B;1046xkeysym_unicode_map[0x0EBC] = 0x314C;1047xkeysym_unicode_map[0x0EBD] = 0x314D;1048xkeysym_unicode_map[0x0EBE] = 0x314E;1049xkeysym_unicode_map[0x0EBF] = 0x314F;1050xkeysym_unicode_map[0x0EC0] = 0x3150;1051xkeysym_unicode_map[0x0EC1] = 0x3151;1052xkeysym_unicode_map[0x0EC2] = 0x3152;1053xkeysym_unicode_map[0x0EC3] = 0x3153;1054xkeysym_unicode_map[0x0EC4] = 0x3154;1055xkeysym_unicode_map[0x0EC5] = 0x3155;1056xkeysym_unicode_map[0x0EC6] = 0x3156;1057xkeysym_unicode_map[0x0EC7] = 0x3157;1058xkeysym_unicode_map[0x0EC8] = 0x3158;1059xkeysym_unicode_map[0x0EC9] = 0x3159;1060xkeysym_unicode_map[0x0ECA] = 0x315A;1061xkeysym_unicode_map[0x0ECB] = 0x315B;1062xkeysym_unicode_map[0x0ECC] = 0x315C;1063xkeysym_unicode_map[0x0ECD] = 0x315D;1064xkeysym_unicode_map[0x0ECE] = 0x315E;1065xkeysym_unicode_map[0x0ECF] = 0x315F;1066xkeysym_unicode_map[0x0ED0] = 0x3160;1067xkeysym_unicode_map[0x0ED1] = 0x3161;1068xkeysym_unicode_map[0x0ED2] = 0x3162;1069xkeysym_unicode_map[0x0ED3] = 0x3163;1070xkeysym_unicode_map[0x0ED4] = 0x11A8;1071xkeysym_unicode_map[0x0ED5] = 0x11A9;1072xkeysym_unicode_map[0x0ED6] = 0x11AA;1073xkeysym_unicode_map[0x0ED7] = 0x11AB;1074xkeysym_unicode_map[0x0ED8] = 0x11AC;1075xkeysym_unicode_map[0x0ED9] = 0x11AD;1076xkeysym_unicode_map[0x0EDA] = 0x11AE;1077xkeysym_unicode_map[0x0EDB] = 0x11AF;1078xkeysym_unicode_map[0x0EDC] = 0x11B0;1079xkeysym_unicode_map[0x0EDD] = 0x11B1;1080xkeysym_unicode_map[0x0EDE] = 0x11B2;1081xkeysym_unicode_map[0x0EDF] = 0x11B3;1082xkeysym_unicode_map[0x0EE0] = 0x11B4;1083xkeysym_unicode_map[0x0EE1] = 0x11B5;1084xkeysym_unicode_map[0x0EE2] = 0x11B6;1085xkeysym_unicode_map[0x0EE3] = 0x11B7;1086xkeysym_unicode_map[0x0EE4] = 0x11B8;1087xkeysym_unicode_map[0x0EE5] = 0x11B9;1088xkeysym_unicode_map[0x0EE6] = 0x11BA;1089xkeysym_unicode_map[0x0EE7] = 0x11BB;1090xkeysym_unicode_map[0x0EE8] = 0x11BC;1091xkeysym_unicode_map[0x0EE9] = 0x11BD;1092xkeysym_unicode_map[0x0EEA] = 0x11BE;1093xkeysym_unicode_map[0x0EEB] = 0x11BF;1094xkeysym_unicode_map[0x0EEC] = 0x11C0;1095xkeysym_unicode_map[0x0EED] = 0x11C1;1096xkeysym_unicode_map[0x0EEE] = 0x11C2;1097xkeysym_unicode_map[0x0EEF] = 0x316D;1098xkeysym_unicode_map[0x0EF0] = 0x3171;1099xkeysym_unicode_map[0x0EF1] = 0x3178;1100xkeysym_unicode_map[0x0EF2] = 0x317F;1101xkeysym_unicode_map[0x0EF3] = 0x3181;1102xkeysym_unicode_map[0x0EF4] = 0x3184;1103xkeysym_unicode_map[0x0EF5] = 0x3186;1104xkeysym_unicode_map[0x0EF6] = 0x318D;1105xkeysym_unicode_map[0x0EF7] = 0x318E;1106xkeysym_unicode_map[0x0EF8] = 0x11EB;1107xkeysym_unicode_map[0x0EF9] = 0x11F0;1108xkeysym_unicode_map[0x0EFA] = 0x11F9;1109xkeysym_unicode_map[0x0EFF] = 0x20A9;1110xkeysym_unicode_map[0x13A4] = 0x20AC;1111xkeysym_unicode_map[0x13BC] = 0x0152;1112xkeysym_unicode_map[0x13BD] = 0x0153;1113xkeysym_unicode_map[0x13BE] = 0x0178;1114xkeysym_unicode_map[0x20AC] = 0x20AC;11151116// Support keypad keycodes such as `XK_KP_Equal`.1117// Values can be found in `X11/keysymdef.h` on line 278.1118xkeysym_unicode_map[0xFF80] = 0x0020;1119xkeysym_unicode_map[0xFF89] = 0x0009;1120xkeysym_unicode_map[0xFFBD] = 0x003D;1121xkeysym_unicode_map[0xFFAA] = 0x002A;1122xkeysym_unicode_map[0xFFAB] = 0x002B;1123xkeysym_unicode_map[0xFFAC] = 0x002C;1124xkeysym_unicode_map[0xFFAD] = 0x002D;1125xkeysym_unicode_map[0xFFAE] = 0x002E;1126xkeysym_unicode_map[0xFFAF] = 0x002F;1127xkeysym_unicode_map[0xFFB0] = 0x0030;1128xkeysym_unicode_map[0xFFB1] = 0x0031;1129xkeysym_unicode_map[0xFFB2] = 0x0032;1130xkeysym_unicode_map[0xFFB3] = 0x0033;1131xkeysym_unicode_map[0xFFB4] = 0x0034;1132xkeysym_unicode_map[0xFFB5] = 0x0035;1133xkeysym_unicode_map[0xFFB6] = 0x0036;1134xkeysym_unicode_map[0xFFB7] = 0x0037;1135xkeysym_unicode_map[0xFFB8] = 0x0038;1136xkeysym_unicode_map[0xFFB9] = 0x0039;11371138// Scancode to physical location map.1139// Ctrl.1140location_map[0x25] = KeyLocation::LEFT;1141location_map[0x69] = KeyLocation::RIGHT;1142// Shift.1143location_map[0x32] = KeyLocation::LEFT;1144location_map[0x3E] = KeyLocation::RIGHT;1145// Alt.1146location_map[0x40] = KeyLocation::LEFT;1147location_map[0x6C] = KeyLocation::RIGHT;1148// Meta.1149location_map[0x85] = KeyLocation::LEFT;1150location_map[0x86] = KeyLocation::RIGHT;1151}11521153bool KeyMappingX11::is_sym_numpad(KeySym p_keysym) {1154switch (p_keysym) {1155case XK_KP_Equal:1156case XK_KP_Add:1157case XK_KP_Subtract:1158case XK_KP_Multiply:1159case XK_KP_Divide:1160case XK_KP_Separator:1161case XK_KP_Decimal:1162case XK_KP_Delete:1163case XK_KP_0:1164case XK_KP_1:1165case XK_KP_2:1166case XK_KP_3:1167case XK_KP_4:1168case XK_KP_5:1169case XK_KP_6:1170case XK_KP_7:1171case XK_KP_8:1172case XK_KP_9: {1173return true;1174} break;1175}11761177return false;1178}11791180Key KeyMappingX11::get_keycode(KeySym p_keysym) {1181if (p_keysym >= 0x20 && p_keysym < 0x7E) { // ASCII, maps 1-11182if (p_keysym > 0x60 && p_keysym < 0x7B) { // Lowercase ASCII.1183return (Key)(p_keysym - 32);1184} else {1185return (Key)p_keysym;1186}1187}11881189const Key *key = xkeysym_map.getptr(p_keysym);1190if (key) {1191return *key;1192}1193return Key::NONE;1194}11951196Key KeyMappingX11::get_scancode(unsigned int p_code) {1197const Key *key = scancode_map.getptr(p_code);1198if (key) {1199return *key;1200}12011202return Key::NONE;1203}12041205unsigned int KeyMappingX11::get_xlibcode(Key p_keysym) {1206const unsigned int *key = scancode_map_inv.getptr(p_keysym);1207if (key) {1208return *key;1209}1210return 0x00;1211}12121213char32_t KeyMappingX11::get_unicode_from_keysym(KeySym p_keysym) {1214// Latin-11215if (p_keysym >= 0x20 && p_keysym <= 0x7E) {1216return p_keysym;1217}1218if (p_keysym >= 0xA0 && p_keysym <= 0xFF) {1219return p_keysym;1220}12211222// Keypad to Latin-1.1223if (p_keysym >= 0xFFAA && p_keysym <= 0xFFB9) {1224return p_keysym - 0xFF80;1225}12261227// Unicode (may be present).1228if ((p_keysym & 0xFF000000) == 0x01000000) {1229return p_keysym & 0x00FFFFFF;1230}12311232const char32_t *c = xkeysym_unicode_map.getptr(p_keysym);1233if (c) {1234return *c;1235}1236return 0;1237}12381239KeyLocation KeyMappingX11::get_location(unsigned int p_code) {1240const KeyLocation *location = location_map.getptr(p_code);1241if (location) {1242return *location;1243}1244return KeyLocation::UNSPECIFIED;1245}124612471248