summaryrefslogtreecommitdiffstats
path: root/xbmc/input/XBMC_keytable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/input/XBMC_keytable.cpp')
-rw-r--r--xbmc/input/XBMC_keytable.cpp354
1 files changed, 354 insertions, 0 deletions
diff --git a/xbmc/input/XBMC_keytable.cpp b/xbmc/input/XBMC_keytable.cpp
new file mode 100644
index 0000000..95ddb4c
--- /dev/null
+++ b/xbmc/input/XBMC_keytable.cpp
@@ -0,0 +1,354 @@
+/*
+ * Copyright (C) 2007-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "input/XBMC_keytable.h"
+
+#include "input/XBMC_keysym.h"
+#include "input/XBMC_vkeys.h"
+#include "utils/StringUtils.h"
+
+// The array of XBMCKEYTABLEs used in XBMC.
+// scancode, sym, unicode, ascii, vkey, keyname
+static const XBMCKEYTABLE XBMCKeyTable[] = {
+ {XBMCK_BACKSPACE, 0, 0, XBMCVK_BACK, "backspace"},
+ {XBMCK_TAB, 0, 0, XBMCVK_TAB, "tab"},
+ {XBMCK_RETURN, 0, 0, XBMCVK_RETURN, "return"},
+ {XBMCK_ESCAPE, 0, 0, XBMCVK_ESCAPE, "escape"},
+ {0, 0, 0, XBMCVK_ESCAPE, "esc"} // Allowed abbreviation for "escape"
+
+ // Number keys on the main keyboard
+ ,
+ {XBMCK_0, '0', '0', XBMCVK_0, "zero"},
+ {XBMCK_1, '1', '1', XBMCVK_1, "one"},
+ {XBMCK_2, '2', '2', XBMCVK_2, "two"},
+ {XBMCK_3, '3', '3', XBMCVK_3, "three"},
+ {XBMCK_4, '4', '4', XBMCVK_4, "four"},
+ {XBMCK_5, '5', '5', XBMCVK_5, "five"},
+ {XBMCK_6, '6', '6', XBMCVK_6, "six"},
+ {XBMCK_7, '7', '7', XBMCVK_7, "seven"},
+ {XBMCK_8, '8', '8', XBMCVK_8, "eight"},
+ {XBMCK_9, '9', '9', XBMCVK_9, "nine"}
+
+ // A to Z - note that upper case A-Z don't have a matching name or
+ // vkey. Only the lower case a-z are used in key mappings.
+ ,
+ {XBMCK_a, 'A', 'A', XBMCVK_A, NULL},
+ {XBMCK_b, 'B', 'B', XBMCVK_B, NULL},
+ {XBMCK_c, 'C', 'C', XBMCVK_C, NULL},
+ {XBMCK_d, 'D', 'D', XBMCVK_D, NULL},
+ {XBMCK_e, 'E', 'E', XBMCVK_E, NULL},
+ {XBMCK_f, 'F', 'F', XBMCVK_F, NULL},
+ {XBMCK_g, 'G', 'G', XBMCVK_G, NULL},
+ {XBMCK_h, 'H', 'H', XBMCVK_H, NULL},
+ {XBMCK_i, 'I', 'I', XBMCVK_I, NULL},
+ {XBMCK_j, 'J', 'J', XBMCVK_J, NULL},
+ {XBMCK_k, 'K', 'K', XBMCVK_K, NULL},
+ {XBMCK_l, 'L', 'L', XBMCVK_L, NULL},
+ {XBMCK_m, 'M', 'M', XBMCVK_M, NULL},
+ {XBMCK_n, 'N', 'N', XBMCVK_N, NULL},
+ {XBMCK_o, 'O', 'O', XBMCVK_O, NULL},
+ {XBMCK_p, 'P', 'P', XBMCVK_P, NULL},
+ {XBMCK_q, 'Q', 'Q', XBMCVK_Q, NULL},
+ {XBMCK_r, 'R', 'R', XBMCVK_R, NULL},
+ {XBMCK_s, 'S', 'S', XBMCVK_S, NULL},
+ {XBMCK_t, 'T', 'T', XBMCVK_T, NULL},
+ {XBMCK_u, 'U', 'U', XBMCVK_U, NULL},
+ {XBMCK_v, 'V', 'V', XBMCVK_V, NULL},
+ {XBMCK_w, 'W', 'W', XBMCVK_W, NULL},
+ {XBMCK_x, 'X', 'X', XBMCVK_X, NULL},
+ {XBMCK_y, 'Y', 'Y', XBMCVK_Y, NULL},
+ {XBMCK_z, 'Z', 'Z', XBMCVK_Z, NULL}
+
+ ,
+ {XBMCK_a, 'a', 'a', XBMCVK_A, "a"},
+ {XBMCK_b, 'b', 'b', XBMCVK_B, "b"},
+ {XBMCK_c, 'c', 'c', XBMCVK_C, "c"},
+ {XBMCK_d, 'd', 'd', XBMCVK_D, "d"},
+ {XBMCK_e, 'e', 'e', XBMCVK_E, "e"},
+ {XBMCK_f, 'f', 'f', XBMCVK_F, "f"},
+ {XBMCK_g, 'g', 'g', XBMCVK_G, "g"},
+ {XBMCK_h, 'h', 'h', XBMCVK_H, "h"},
+ {XBMCK_i, 'i', 'i', XBMCVK_I, "i"},
+ {XBMCK_j, 'j', 'j', XBMCVK_J, "j"},
+ {XBMCK_k, 'k', 'k', XBMCVK_K, "k"},
+ {XBMCK_l, 'l', 'l', XBMCVK_L, "l"},
+ {XBMCK_m, 'm', 'm', XBMCVK_M, "m"},
+ {XBMCK_n, 'n', 'n', XBMCVK_N, "n"},
+ {XBMCK_o, 'o', 'o', XBMCVK_O, "o"},
+ {XBMCK_p, 'p', 'p', XBMCVK_P, "p"},
+ {XBMCK_q, 'q', 'q', XBMCVK_Q, "q"},
+ {XBMCK_r, 'r', 'r', XBMCVK_R, "r"},
+ {XBMCK_s, 's', 's', XBMCVK_S, "s"},
+ {XBMCK_t, 't', 't', XBMCVK_T, "t"},
+ {XBMCK_u, 'u', 'u', XBMCVK_U, "u"},
+ {XBMCK_v, 'v', 'v', XBMCVK_V, "v"},
+ {XBMCK_w, 'w', 'w', XBMCVK_W, "w"},
+ {XBMCK_x, 'x', 'x', XBMCVK_X, "x"},
+ {XBMCK_y, 'y', 'y', XBMCVK_Y, "y"},
+ {XBMCK_z, 'z', 'z', XBMCVK_Z, "z"}
+
+ // Misc printing characters
+ ,
+ {XBMCK_SPACE, ' ', ' ', XBMCVK_SPACE, "space"},
+ {XBMCK_EXCLAIM, '!', '!', XBMCVK_EXCLAIM, "exclaim"},
+ {XBMCK_QUOTEDBL, '"', '"', XBMCVK_QUOTEDBL, "doublequote"},
+ {XBMCK_HASH, '#', '#', XBMCVK_HASH, "hash"},
+ {XBMCK_DOLLAR, '$', '$', XBMCVK_DOLLAR, "dollar"},
+ {XBMCK_PERCENT, '%', '%', XBMCVK_PERCENT, "percent"},
+ {XBMCK_AMPERSAND, '&', '&', XBMCVK_AMPERSAND, "ampersand"},
+ {XBMCK_QUOTE, '\'', '\'', XBMCVK_QUOTE, "quote"},
+ {XBMCK_LEFTPAREN, '(', '(', XBMCVK_LEFTPAREN, "leftbracket"},
+ {XBMCK_RIGHTPAREN, ')', ')', XBMCVK_RIGHTPAREN, "rightbracket"},
+ {XBMCK_ASTERISK, '*', '*', XBMCVK_ASTERISK, "asterisk"},
+ {XBMCK_PLUS, '+', '+', XBMCVK_PLUS, "plus"},
+ {XBMCK_COMMA, ',', ',', XBMCVK_COMMA, "comma"},
+ {XBMCK_MINUS, '-', '-', XBMCVK_MINUS, "minus"},
+ {XBMCK_PERIOD, '.', '.', XBMCVK_PERIOD, "period"},
+ {XBMCK_SLASH, '/', '/', XBMCVK_SLASH, "forwardslash"}
+
+ ,
+ {XBMCK_COLON, ':', ':', XBMCVK_COLON, "colon"},
+ {XBMCK_SEMICOLON, ';', ';', XBMCVK_SEMICOLON, "semicolon"},
+ {XBMCK_LESS, '<', '<', XBMCVK_LESS, "lessthan"},
+ {XBMCK_EQUALS, '=', '=', XBMCVK_EQUALS, "equals"},
+ {XBMCK_GREATER, '>', '>', XBMCVK_GREATER, "greaterthan"},
+ {XBMCK_QUESTION, '?', '?', XBMCVK_QUESTION, "questionmark"},
+ {XBMCK_AT, '@', '@', XBMCVK_AT, "at"}
+
+ ,
+ {XBMCK_LEFTBRACKET, '[', '[', XBMCVK_LEFTBRACKET, "opensquarebracket"},
+ {XBMCK_BACKSLASH, '\\', '\\', XBMCVK_BACKSLASH, "backslash"},
+ {XBMCK_RIGHTBRACKET, ']', ']', XBMCVK_RIGHTBRACKET, "closesquarebracket"},
+ {XBMCK_CARET, '^', '^', XBMCVK_CARET, "caret"},
+ {XBMCK_UNDERSCORE, '_', '_', XBMCVK_UNDERSCORE, "underline"},
+ {XBMCK_BACKQUOTE, '`', '`', XBMCVK_BACKQUOTE, "leftquote"}
+
+ ,
+ {XBMCK_LEFTBRACE, '{', '{', XBMCVK_LEFTBRACE, "openbrace"},
+ {XBMCK_PIPE, '|', '|', XBMCVK_PIPE, "pipe"},
+ {XBMCK_RIGHTBRACE, '}', '}', XBMCVK_RIGHTBRACE, "closebrace"},
+ {XBMCK_TILDE, '~', '~', XBMCVK_TILDE, "tilde"}
+
+ // Numeric keypad
+ ,
+ {XBMCK_KP0, '0', '0', XBMCVK_NUMPAD0, "numpadzero"},
+ {XBMCK_KP1, '1', '1', XBMCVK_NUMPAD1, "numpadone"},
+ {XBMCK_KP2, '2', '2', XBMCVK_NUMPAD2, "numpadtwo"},
+ {XBMCK_KP3, '3', '3', XBMCVK_NUMPAD3, "numpadthree"},
+ {XBMCK_KP4, '4', '4', XBMCVK_NUMPAD4, "numpadfour"},
+ {XBMCK_KP5, '5', '5', XBMCVK_NUMPAD5, "numpadfive"},
+ {XBMCK_KP6, '6', '6', XBMCVK_NUMPAD6, "numpadsix"},
+ {XBMCK_KP7, '7', '7', XBMCVK_NUMPAD7, "numpadseven"},
+ {XBMCK_KP8, '8', '8', XBMCVK_NUMPAD8, "numpadeight"},
+ {XBMCK_KP9, '9', '9', XBMCVK_NUMPAD9, "numpadnine"}
+
+ ,
+ {XBMCK_KP_DIVIDE, '/', '/', XBMCVK_NUMPADDIVIDE, "numpaddivide"},
+ {XBMCK_KP_MULTIPLY, '*', '*', XBMCVK_NUMPADTIMES, "numpadtimes"},
+ {XBMCK_KP_MINUS, '-', '-', XBMCVK_NUMPADMINUS, "numpadminus"},
+ {XBMCK_KP_PLUS, '+', '+', XBMCVK_NUMPADPLUS, "numpadplus"},
+ {XBMCK_KP_ENTER, 0, 0, XBMCVK_NUMPADENTER, "enter"},
+ {XBMCK_KP_PERIOD, '.', '.', XBMCVK_NUMPADPERIOD, "numpadperiod"}
+
+ // Multimedia keys
+ ,
+ {XBMCK_BROWSER_BACK, 0, 0, XBMCVK_BROWSER_BACK, "browser_back"},
+ {XBMCK_BROWSER_FORWARD, 0, 0, XBMCVK_BROWSER_FORWARD, "browser_forward"},
+ {XBMCK_BROWSER_REFRESH, 0, 0, XBMCVK_BROWSER_REFRESH, "browser_refresh"},
+ {XBMCK_BROWSER_STOP, 0, 0, XBMCVK_BROWSER_STOP, "browser_stop"},
+ {XBMCK_BROWSER_SEARCH, 0, 0, XBMCVK_BROWSER_SEARCH, "browser_search"},
+ {XBMCK_BROWSER_FAVORITES, 0, 0, XBMCVK_BROWSER_FAVORITES, "browser_favorites"},
+ {XBMCK_BROWSER_HOME, 0, 0, XBMCVK_BROWSER_HOME, "browser_home"},
+ {XBMCK_VOLUME_MUTE, 0, 0, XBMCVK_VOLUME_MUTE, "volume_mute"},
+ {XBMCK_VOLUME_DOWN, 0, 0, XBMCVK_VOLUME_DOWN, "volume_down"},
+ {XBMCK_VOLUME_UP, 0, 0, XBMCVK_VOLUME_UP, "volume_up"},
+ {XBMCK_MEDIA_NEXT_TRACK, 0, 0, XBMCVK_MEDIA_NEXT_TRACK, "next_track"},
+ {XBMCK_MEDIA_PREV_TRACK, 0, 0, XBMCVK_MEDIA_PREV_TRACK, "prev_track"},
+ {XBMCK_MEDIA_STOP, 0, 0, XBMCVK_MEDIA_STOP, "stop"},
+ {XBMCK_MEDIA_PLAY_PAUSE, 0, 0, XBMCVK_MEDIA_PLAY_PAUSE, "play_pause"},
+ {XBMCK_MEDIA_REWIND, 0, 0, XBMCVK_MEDIA_REWIND, "rewind"},
+ {XBMCK_MEDIA_FASTFORWARD, 0, 0, XBMCVK_MEDIA_FASTFORWARD, "fastforward"},
+ {XBMCK_LAUNCH_MAIL, 0, 0, XBMCVK_LAUNCH_MAIL, "launch_mail"},
+ {XBMCK_LAUNCH_MEDIA_SELECT, 0, 0, XBMCVK_LAUNCH_MEDIA_SELECT, "launch_media_select"},
+ {XBMCK_LAUNCH_APP1, 0, 0, XBMCVK_LAUNCH_APP1, "launch_app1_pc_icon"},
+ {XBMCK_LAUNCH_APP2, 0, 0, XBMCVK_LAUNCH_APP2, "launch_app2_pc_icon"},
+ {XBMCK_LAUNCH_FILE_BROWSER, 0, 0, XBMCVK_LAUNCH_FILE_BROWSER, "launch_file_browser"},
+ {XBMCK_LAUNCH_MEDIA_CENTER, 0, 0, XBMCVK_LAUNCH_MEDIA_CENTER, "launch_media_center"},
+ {XBMCK_PLAY, 0, 0, XBMCVK_MEDIA_PLAY_PAUSE, "play_pause"},
+ {XBMCK_STOP, 0, 0, XBMCVK_MEDIA_STOP, "stop"},
+ {XBMCK_REWIND, 0, 0, XBMCVK_MEDIA_REWIND, "rewind"},
+ {XBMCK_FASTFORWARD, 0, 0, XBMCVK_MEDIA_FASTFORWARD, "fastforward"},
+ {XBMCK_RECORD, 0, 0, XBMCVK_MEDIA_RECORD, "record"}
+
+ // Function keys
+ ,
+ {XBMCK_F1, 0, 0, XBMCVK_F1, "f1"},
+ {XBMCK_F2, 0, 0, XBMCVK_F2, "f2"},
+ {XBMCK_F3, 0, 0, XBMCVK_F3, "f3"},
+ {XBMCK_F4, 0, 0, XBMCVK_F4, "f4"},
+ {XBMCK_F5, 0, 0, XBMCVK_F5, "f5"},
+ {XBMCK_F6, 0, 0, XBMCVK_F6, "f6"},
+ {XBMCK_F7, 0, 0, XBMCVK_F7, "f7"},
+ {XBMCK_F8, 0, 0, XBMCVK_F8, "f8"},
+ {XBMCK_F9, 0, 0, XBMCVK_F9, "f9"},
+ {XBMCK_F10, 0, 0, XBMCVK_F10, "f10"},
+ {XBMCK_F11, 0, 0, XBMCVK_F11, "f11"},
+ {XBMCK_F12, 0, 0, XBMCVK_F12, "f12"},
+ {XBMCK_F13, 0, 0, XBMCVK_F13, "f13"},
+ {XBMCK_F14, 0, 0, XBMCVK_F14, "f14"},
+ {XBMCK_F15, 0, 0, XBMCVK_F15, "f15"}
+
+ // Misc non-printing keys
+ ,
+ {XBMCK_UP, 0, 0, XBMCVK_UP, "up"},
+ {XBMCK_DOWN, 0, 0, XBMCVK_DOWN, "down"},
+ {XBMCK_RIGHT, 0, 0, XBMCVK_RIGHT, "right"},
+ {XBMCK_LEFT, 0, 0, XBMCVK_LEFT, "left"},
+ {XBMCK_INSERT, 0, 0, XBMCVK_INSERT, "insert"},
+ {XBMCK_DELETE, 0, 0, XBMCVK_DELETE, "delete"},
+ {XBMCK_HOME, 0, 0, XBMCVK_HOME, "home"},
+ {XBMCK_END, 0, 0, XBMCVK_END, "end"},
+ {XBMCK_PAGEUP, 0, 0, XBMCVK_PAGEUP, "pageup"},
+ {XBMCK_PAGEDOWN, 0, 0, XBMCVK_PAGEDOWN, "pagedown"},
+ {XBMCK_NUMLOCK, 0, 0, XBMCVK_NUMLOCK, "numlock"},
+ {XBMCK_CAPSLOCK, 0, 0, XBMCVK_CAPSLOCK, "capslock"},
+ {XBMCK_RSHIFT, 0, 0, XBMCVK_RSHIFT, "rightshift"},
+ {XBMCK_LSHIFT, 0, 0, XBMCVK_LSHIFT, "leftshift"},
+ {XBMCK_RCTRL, 0, 0, XBMCVK_RCONTROL, "rightctrl"},
+ {XBMCK_LCTRL, 0, 0, XBMCVK_LCONTROL, "leftctrl"},
+ {XBMCK_LALT, 0, 0, XBMCVK_LMENU, "leftalt"},
+ {XBMCK_LSUPER, 0, 0, XBMCVK_LWIN, "leftwindows"},
+ {XBMCK_RSUPER, 0, 0, XBMCVK_RWIN, "rightwindows"},
+ {XBMCK_MENU, 0, 0, XBMCVK_MENU, "menu"},
+ {XBMCK_PAUSE, 0, 0, XBMCVK_PAUSE, "pause"},
+ {XBMCK_SCROLLOCK, 0, 0, XBMCVK_SCROLLLOCK, "scrolllock"},
+ {XBMCK_PRINT, 0, 0, XBMCVK_PRINTSCREEN, "printscreen"},
+ {XBMCK_POWER, 0, 0, XBMCVK_POWER, "power"},
+ {XBMCK_SLEEP, 0, 0, XBMCVK_SLEEP, "sleep"},
+ {XBMCK_GUIDE, 0, 0, XBMCVK_GUIDE, "guide"},
+ {XBMCK_SETTINGS, 0, 0, XBMCVK_SETTINGS, "settings"},
+ {XBMCK_INFO, 0, 0, XBMCVK_INFO, "info"},
+ {XBMCK_RED, 0, 0, XBMCVK_RED, "red"},
+ {XBMCK_GREEN, 0, 0, XBMCVK_GREEN, "green"},
+ {XBMCK_YELLOW, 0, 0, XBMCVK_YELLOW, "yellow"},
+ {XBMCK_BLUE, 0, 0, XBMCVK_BLUE, "blue"},
+ {XBMCK_ZOOM, 0, 0, XBMCVK_ZOOM, "zoom"},
+ {XBMCK_TEXT, 0, 0, XBMCVK_TEXT, "text"},
+ {XBMCK_FAVORITES, 0, 0, XBMCVK_FAVORITES, "favorites"},
+ {XBMCK_HOMEPAGE, 0, 0, XBMCVK_HOMEPAGE, "homepage"},
+ {XBMCK_CONFIG, 0, 0, XBMCVK_CONFIG, "config"},
+ {XBMCK_EPG, 0, 0, XBMCVK_EPG, "epg"}};
+
+static int XBMCKeyTableSize = sizeof(XBMCKeyTable) / sizeof(XBMCKEYTABLE);
+
+bool KeyTableLookupName(std::string keyname, XBMCKEYTABLE* keytable)
+{
+ // If the name being searched for is empty there will be no match
+ if (keyname.empty())
+ return false;
+
+ // We need the button name to be in lowercase
+ StringUtils::ToLower(keyname);
+
+ // Look up the key name in XBMCKeyTable
+ for (int i = 0; i < XBMCKeyTableSize; i++)
+ {
+ if (XBMCKeyTable[i].keyname)
+ {
+ if (strcmp(keyname.c_str(), XBMCKeyTable[i].keyname) == 0)
+ {
+ *keytable = XBMCKeyTable[i];
+ return true;
+ }
+ }
+ }
+
+ // The name wasn't found
+ return false;
+}
+
+bool KeyTableLookupSym(uint16_t sym, XBMCKEYTABLE* keytable)
+{
+ // If the sym being searched for is zero there will be no match
+ if (sym == 0)
+ return false;
+
+ // Look up the sym in XBMCKeyTable
+ for (int i = 0; i < XBMCKeyTableSize; i++)
+ {
+ if (sym == XBMCKeyTable[i].sym)
+ {
+ *keytable = XBMCKeyTable[i];
+ return true;
+ }
+ }
+
+ // The name wasn't found
+ return false;
+}
+
+bool KeyTableLookupUnicode(uint16_t unicode, XBMCKEYTABLE* keytable)
+{
+ // If the unicode being searched for is zero there will be no match
+ if (unicode == 0)
+ return false;
+
+ // Look up the unicode in XBMCKeyTable
+ for (int i = 0; i < XBMCKeyTableSize; i++)
+ {
+ if (unicode == XBMCKeyTable[i].unicode)
+ {
+ *keytable = XBMCKeyTable[i];
+ return true;
+ }
+ }
+
+ // The name wasn't found
+ return false;
+}
+
+bool KeyTableLookupSymAndUnicode(uint16_t sym, uint16_t unicode, XBMCKEYTABLE* keytable)
+{
+ // If the sym being searched for is zero there will be no match (the
+ // unicode can be zero if the sym is non-zero)
+ if (sym == 0)
+ return false;
+
+ // Look up the sym and unicode in XBMCKeyTable
+ for (int i = 0; i < XBMCKeyTableSize; i++)
+ {
+ if (sym == XBMCKeyTable[i].sym && unicode == XBMCKeyTable[i].unicode)
+ {
+ *keytable = XBMCKeyTable[i];
+ return true;
+ }
+ }
+
+ // The sym and unicode weren't found
+ return false;
+}
+
+bool KeyTableLookupVKeyName(uint32_t vkey, XBMCKEYTABLE* keytable)
+{
+ // If the vkey being searched for is zero there will be no match
+ if (vkey == 0)
+ return false;
+
+ // Look up the vkey in XBMCKeyTable
+ for (int i = 0; i < XBMCKeyTableSize; i++)
+ {
+ if (vkey == XBMCKeyTable[i].vkey && XBMCKeyTable[i].keyname)
+ {
+ *keytable = XBMCKeyTable[i];
+ return true;
+ }
+ }
+
+ // The name wasn't found
+ return false;
+}