[cosmetics] update date in GPL header
[vuplus_xbmc] / xbmc / input / XBMC_keytable.cpp
1 /*
2  *      Copyright (C) 2007-2013 Team XBMC
3  *      http://www.xbmc.org
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, see
17  *  <http://www.gnu.org/licenses/>.
18  *
19  */
20
21 #include "system.h"
22 #include "utils/StdString.h"
23 #include "input/XBMC_keysym.h"
24 #include "input/XBMC_vkeys.h"
25 #include "input/XBMC_keytable.h"
26
27 // The array of XBMCKEYTABLEs used in XBMC.
28 // scancode, sym, unicode, ascii, vkey, keyname
29 static const XBMCKEYTABLE XBMCKeyTable[] =
30 { { XBMCK_BACKSPACE, 0,    0, XBMCVK_BACK,   "backspace" }
31 , { XBMCK_TAB,       0,    0, XBMCVK_TAB,    "tab" }
32 , { XBMCK_RETURN,    0,    0, XBMCVK_RETURN, "return" }
33 , { XBMCK_ESCAPE,    0,    0, XBMCVK_ESCAPE, "escape" }
34 , { 0,               0,    0, XBMCVK_ESCAPE, "esc" } // Allowed abbreviation for "escape"
35
36 // Number keys on the main keyboard
37 , { XBMCK_0,    '0',  '0', XBMCVK_0, "zero" }
38 , { XBMCK_1,    '1',  '1', XBMCVK_1, "one" }
39 , { XBMCK_2,    '2',  '2', XBMCVK_2, "two" }
40 , { XBMCK_3,    '3',  '3', XBMCVK_3, "three" }
41 , { XBMCK_4,    '4',  '4', XBMCVK_4, "four" }
42 , { XBMCK_5,    '5',  '5', XBMCVK_5, "five" }
43 , { XBMCK_6,    '6',  '6', XBMCVK_6, "six" }
44 , { XBMCK_7,    '7',  '7', XBMCVK_7, "seven" }
45 , { XBMCK_8,    '8',  '8', XBMCVK_8, "eight" }
46 , { XBMCK_9,    '9',  '9', XBMCVK_9, "nine" }
47
48 // A to Z - note that upper case A-Z don't have a matching name or
49 // vkey. Only the lower case a-z are used in key mappings.
50 , { XBMCK_a,    'A',  'A', XBMCVK_A, NULL }
51 , { XBMCK_b,    'B',  'B', XBMCVK_B, NULL }
52 , { XBMCK_c,    'C',  'C', XBMCVK_C, NULL }
53 , { XBMCK_d,    'D',  'D', XBMCVK_D, NULL }
54 , { XBMCK_e,    'E',  'E', XBMCVK_E, NULL }
55 , { XBMCK_f,    'F',  'F', XBMCVK_F, NULL }
56 , { XBMCK_g,    'G',  'G', XBMCVK_G, NULL }
57 , { XBMCK_h,    'H',  'H', XBMCVK_H, NULL }
58 , { XBMCK_i,    'I',  'I', XBMCVK_I, NULL }
59 , { XBMCK_j,    'J',  'J', XBMCVK_J, NULL }
60 , { XBMCK_k,    'K',  'K', XBMCVK_K, NULL }
61 , { XBMCK_l,    'L',  'L', XBMCVK_L, NULL }
62 , { XBMCK_m,    'M',  'M', XBMCVK_M, NULL }
63 , { XBMCK_n,    'N',  'N', XBMCVK_N, NULL }
64 , { XBMCK_o,    'O',  'O', XBMCVK_O, NULL }
65 , { XBMCK_p,    'P',  'P', XBMCVK_P, NULL }
66 , { XBMCK_q,    'Q',  'Q', XBMCVK_Q, NULL }
67 , { XBMCK_r,    'R',  'R', XBMCVK_R, NULL }
68 , { XBMCK_s,    'S',  'S', XBMCVK_S, NULL }
69 , { XBMCK_t,    'T',  'T', XBMCVK_T, NULL }
70 , { XBMCK_u,    'U',  'U', XBMCVK_U, NULL }
71 , { XBMCK_v,    'V',  'V', XBMCVK_V, NULL }
72 , { XBMCK_w,    'W',  'W', XBMCVK_W, NULL }
73 , { XBMCK_x,    'X',  'X', XBMCVK_X, NULL }
74 , { XBMCK_y,    'Y',  'Y', XBMCVK_Y, NULL }
75 , { XBMCK_z,    'Z',  'Z', XBMCVK_Z, NULL }
76
77 , { XBMCK_a,    'a',  'a', XBMCVK_A, "a" }
78 , { XBMCK_b,    'b',  'b', XBMCVK_B, "b" }
79 , { XBMCK_c,    'c',  'c', XBMCVK_C, "c" }
80 , { XBMCK_d,    'd',  'd', XBMCVK_D, "d" }
81 , { XBMCK_e,    'e',  'e', XBMCVK_E, "e" }
82 , { XBMCK_f,    'f',  'f', XBMCVK_F, "f" }
83 , { XBMCK_g,    'g',  'g', XBMCVK_G, "g" }
84 , { XBMCK_h,    'h',  'h', XBMCVK_H, "h" }
85 , { XBMCK_i,    'i',  'i', XBMCVK_I, "i" }
86 , { XBMCK_j,    'j',  'j', XBMCVK_J, "j" }
87 , { XBMCK_k,    'k',  'k', XBMCVK_K, "k" }
88 , { XBMCK_l,    'l',  'l', XBMCVK_L, "l" }
89 , { XBMCK_m,    'm',  'm', XBMCVK_M, "m" }
90 , { XBMCK_n,    'n',  'n', XBMCVK_N, "n" }
91 , { XBMCK_o,    'o',  'o', XBMCVK_O, "o" }
92 , { XBMCK_p,    'p',  'p', XBMCVK_P, "p" }
93 , { XBMCK_q,    'q',  'q', XBMCVK_Q, "q" }
94 , { XBMCK_r,    'r',  'r', XBMCVK_R, "r" }
95 , { XBMCK_s,    's',  's', XBMCVK_S, "s" }
96 , { XBMCK_t,    't',  't', XBMCVK_T, "t" }
97 , { XBMCK_u,    'u',  'u', XBMCVK_U, "u" }
98 , { XBMCK_v,    'v',  'v', XBMCVK_V, "v" }
99 , { XBMCK_w,    'w',  'w', XBMCVK_W, "w" }
100 , { XBMCK_x,    'x',  'x', XBMCVK_X, "x" }
101 , { XBMCK_y,    'y',  'y', XBMCVK_Y, "y" }
102 , { XBMCK_z,    'z',  'z', XBMCVK_Z, "z" }
103
104 // Misc printing characters
105 , { XBMCK_SPACE,                ' ',  ' ', XBMCVK_SPACE,         "space" }
106 , { XBMCK_EXCLAIM,              '!',  '!', XBMCVK_EXCLAIM,       "exclaim" }
107 , { XBMCK_QUOTEDBL,             '"',  '"', XBMCVK_QUOTEDBL,      "doublequote" }
108 , { XBMCK_HASH,                 '#',  '#', XBMCVK_HASH,          "hash" }
109 , { XBMCK_DOLLAR,               '$',  '$', XBMCVK_DOLLAR,        "dollar" }
110 , { XBMCK_PERCENT,              '%',  '%', XBMCVK_PERCENT,       "percent" }
111 , { XBMCK_AMPERSAND,            '&',  '&', XBMCVK_AMPERSAND,     "ampersand" }
112 , { XBMCK_QUOTE,                '\'', '\'', XBMCVK_QUOTE,         "quote" }
113 , { XBMCK_LEFTPAREN,            '(',  '(', XBMCVK_LEFTPAREN,     "leftbracket" }
114 , { XBMCK_RIGHTPAREN,           ')',  ')', XBMCVK_RIGHTPAREN,    "rightbracket" }
115 , { XBMCK_ASTERISK,             '*',  '*', XBMCVK_ASTERISK,      "asterisk" }
116 , { XBMCK_PLUS,                 '+',  '+', XBMCVK_PLUS,          "plus" }
117 , { XBMCK_COMMA,                ',',  ',', XBMCVK_COMMA,         "comma" }
118 , { XBMCK_MINUS,                '-',  '-', XBMCVK_MINUS,         "minus" }
119 , { XBMCK_PERIOD,               '.',  '.', XBMCVK_PERIOD,        "period" }
120 , { XBMCK_SLASH,                '/',  '/', XBMCVK_SLASH,         "forwardslash" }
121
122 , { XBMCK_COLON,                ':',  ':', XBMCVK_COLON,         "colon" }
123 , { XBMCK_SEMICOLON,            ';',  ';', XBMCVK_SEMICOLON,     "semicolon" }
124 , { XBMCK_LESS,                 '<',  '<', XBMCVK_LESS,          "lessthan" }
125 , { XBMCK_EQUALS,               '=',  '=', XBMCVK_EQUALS,        "equals" }
126 , { XBMCK_GREATER,              '>',  '>', XBMCVK_GREATER,       "greaterthan" }
127 , { XBMCK_QUESTION,             '?',  '?', XBMCVK_QUESTION,      "questionmark" }
128 , { XBMCK_AT,                   '@',  '@', XBMCVK_AT,            "at" }
129
130 , { XBMCK_LEFTBRACKET,          '[',  '[', XBMCVK_LEFTBRACKET,   "opensquarebracket" }
131 , { XBMCK_BACKSLASH,            '\\', '\\', XBMCVK_BACKSLASH,     "backslash" }
132 , { XBMCK_RIGHTBRACKET,         ']',  ']', XBMCVK_RIGHTBRACKET,  "closesquarebracket" }
133 , { XBMCK_CARET,                '^',  '^', XBMCVK_CARET,         "caret" }
134 , { XBMCK_UNDERSCORE,           '_',  '_', XBMCVK_UNDERSCORE,    "underline" }
135 , { XBMCK_BACKQUOTE,            '`',  '`', XBMCVK_BACKQUOTE,     "leftquote" }
136
137 , { XBMCK_LEFTBRACE,            '{',  '{', XBMCVK_LEFTBRACE,     "openbrace" }
138 , { XBMCK_PIPE,                 '|',  '|', XBMCVK_PIPE,          "pipe" }
139 , { XBMCK_RIGHTBRACE,           '}',  '}', XBMCVK_RIGHTBRACE,    "closebrace" }
140 , { XBMCK_TILDE,                '~',  '~', XBMCVK_TILDE,         "tilde" }
141
142 // Numeric keypad
143 , { XBMCK_KP0,                  '0',  '0', XBMCVK_NUMPAD0,       "numpadzero"}
144 , { XBMCK_KP1,                  '1',  '1', XBMCVK_NUMPAD1,       "numpadone"}
145 , { XBMCK_KP2,                  '2',  '2', XBMCVK_NUMPAD2,       "numpadtwo"}
146 , { XBMCK_KP3,                  '3',  '3', XBMCVK_NUMPAD3,       "numpadthree"}
147 , { XBMCK_KP4,                  '4',  '4', XBMCVK_NUMPAD4,       "numpadfour"}
148 , { XBMCK_KP5,                  '5',  '5', XBMCVK_NUMPAD5,       "numpadfive"}
149 , { XBMCK_KP6,                  '6',  '6', XBMCVK_NUMPAD6,       "numpadsix"}
150 , { XBMCK_KP7,                  '7',  '7', XBMCVK_NUMPAD7,       "numpadseven"}
151 , { XBMCK_KP8,                  '8',  '8', XBMCVK_NUMPAD8,       "numpadeight"}
152 , { XBMCK_KP9,                  '9',  '9', XBMCVK_NUMPAD9,       "numpadnine"}
153
154 , { XBMCK_KP_DIVIDE,            '/',  '/', XBMCVK_NUMPADDIVIDE,  "numpaddivide"}
155 , { XBMCK_KP_MULTIPLY,          '*',  '*', XBMCVK_NUMPADTIMES,   "numpadtimes"}
156 , { XBMCK_KP_MINUS,             '-',  '-', XBMCVK_NUMPADMINUS,   "numpadminus"}
157 , { XBMCK_KP_PLUS,              '+',  '+', XBMCVK_NUMPADPLUS,    "numpadplus"}
158 , { XBMCK_KP_ENTER,               0,    0, XBMCVK_NUMPADENTER,   "enter"}
159 , { XBMCK_KP_PERIOD,            '.',  '.', XBMCVK_NUMPADPERIOD,  "numpadperiod"}
160
161 // Multimedia keys
162 , { XBMCK_BROWSER_BACK,           0,    0, XBMCVK_BROWSER_BACK,        "browser_back" }
163 , { XBMCK_BROWSER_FORWARD,        0,    0, XBMCVK_BROWSER_FORWARD,     "browser_forward" }
164 , { XBMCK_BROWSER_REFRESH,        0,    0, XBMCVK_BROWSER_REFRESH,     "browser_refresh" }
165 , { XBMCK_BROWSER_STOP,           0,    0, XBMCVK_BROWSER_STOP,        "browser_stop" }
166 , { XBMCK_BROWSER_SEARCH,         0,    0, XBMCVK_BROWSER_SEARCH,      "browser_search" }
167 , { XBMCK_BROWSER_FAVORITES,      0,    0, XBMCVK_BROWSER_FAVORITES,   "browser_favorites" }
168 , { XBMCK_BROWSER_HOME,           0,    0, XBMCVK_BROWSER_HOME,        "browser_home" }
169 , { XBMCK_VOLUME_MUTE,            0,    0, XBMCVK_VOLUME_MUTE,         "volume_mute" }
170 , { XBMCK_VOLUME_DOWN,            0,    0, XBMCVK_VOLUME_DOWN,         "volume_down" }
171 , { XBMCK_VOLUME_UP,              0,    0, XBMCVK_VOLUME_UP,           "volume_up" }
172 , { XBMCK_MEDIA_NEXT_TRACK,       0,    0, XBMCVK_MEDIA_NEXT_TRACK,    "next_track" }
173 , { XBMCK_MEDIA_PREV_TRACK,       0,    0, XBMCVK_MEDIA_PREV_TRACK,    "prev_track" }
174 , { XBMCK_MEDIA_STOP,             0,    0, XBMCVK_MEDIA_STOP,          "stop" }
175 , { XBMCK_MEDIA_PLAY_PAUSE,       0,    0, XBMCVK_MEDIA_PLAY_PAUSE,    "play_pause" }
176 , { XBMCK_LAUNCH_MAIL,            0,    0, XBMCVK_LAUNCH_MAIL,         "launch_mail" }
177 , { XBMCK_LAUNCH_MEDIA_SELECT,    0,    0, XBMCVK_LAUNCH_MEDIA_SELECT, "launch_media_select" }
178 , { XBMCK_LAUNCH_APP1,            0,    0, XBMCVK_LAUNCH_APP1,         "launch_app1_pc_icon" }
179 , { XBMCK_LAUNCH_APP2,            0,    0, XBMCVK_LAUNCH_APP2,         "launch_app2_pc_icon" }
180 , { XBMCK_LAUNCH_FILE_BROWSER,    0,    0, XBMCVK_LAUNCH_FILE_BROWSER, "launch_file_browser" }
181 , { XBMCK_LAUNCH_MEDIA_CENTER,    0,    0, XBMCVK_LAUNCH_MEDIA_CENTER, "launch_media_center" }
182
183 // Function keys
184 , { XBMCK_F1,                     0,    0, XBMCVK_F1,            "f1"}
185 , { XBMCK_F2,                     0,    0, XBMCVK_F2,            "f2"}
186 , { XBMCK_F3,                     0,    0, XBMCVK_F3,            "f3"}
187 , { XBMCK_F4,                     0,    0, XBMCVK_F4,            "f4"}
188 , { XBMCK_F5,                     0,    0, XBMCVK_F5,            "f5"}
189 , { XBMCK_F6,                     0,    0, XBMCVK_F6,            "f6"}
190 , { XBMCK_F7,                     0,    0, XBMCVK_F7,            "f7"}
191 , { XBMCK_F8,                     0,    0, XBMCVK_F8,            "f8"}
192 , { XBMCK_F9,                     0,    0, XBMCVK_F9,            "f9"}
193 , { XBMCK_F10,                    0,    0, XBMCVK_F10,           "f10"}
194 , { XBMCK_F11,                    0,    0, XBMCVK_F11,           "f11"}
195 , { XBMCK_F12,                    0,    0, XBMCVK_F12,           "f12"}
196 , { XBMCK_F13,                    0,    0, XBMCVK_F13,           "f13"}
197 , { XBMCK_F14,                    0,    0, XBMCVK_F14,           "f14"}
198 , { XBMCK_F15,                    0,    0, XBMCVK_F15,           "f15"}
199
200 // Misc non-printing keys
201 , { XBMCK_UP,                     0,    0, XBMCVK_UP,            "up" }
202 , { XBMCK_DOWN,                   0,    0, XBMCVK_DOWN,          "down" }
203 , { XBMCK_RIGHT,                  0,    0, XBMCVK_RIGHT,         "right" }
204 , { XBMCK_LEFT,                   0,    0, XBMCVK_LEFT,          "left" }
205 , { XBMCK_INSERT,                 0,    0, XBMCVK_INSERT,        "insert" }
206 , { XBMCK_DELETE,                 0,    0, XBMCVK_DELETE,        "delete" }
207 , { XBMCK_HOME,                   0,    0, XBMCVK_HOME,          "home" }
208 , { XBMCK_END,                    0,    0, XBMCVK_END,           "end" }
209 , { XBMCK_PAGEUP,                 0,    0, XBMCVK_PAGEUP,        "pageup" }
210 , { XBMCK_PAGEDOWN,               0,    0, XBMCVK_PAGEDOWN,      "pagedown" }
211 , { XBMCK_NUMLOCK,                0,    0, XBMCVK_NUMLOCK,       "numlock" }
212 , { XBMCK_CAPSLOCK,               0,    0, XBMCVK_CAPSLOCK,      "capslock" }
213 , { XBMCK_RSHIFT,                 0,    0, XBMCVK_RSHIFT,        "rightshift" }
214 , { XBMCK_LSHIFT,                 0,    0, XBMCVK_LSHIFT,        "leftshift" }
215 , { XBMCK_RCTRL,                  0,    0, XBMCVK_RCONTROL,      "rightctrl" }
216 , { XBMCK_LCTRL,                  0,    0, XBMCVK_LCONTROL,      "leftctrl" }
217 , { XBMCK_LALT,                   0,    0, XBMCVK_LMENU,         "leftalt" }
218 , { XBMCK_LSUPER,                 0,    0, XBMCVK_LWIN,          "leftwindows" }
219 , { XBMCK_RSUPER,                 0,    0, XBMCVK_RWIN,          "rightwindows" }
220 , { XBMCK_MENU,                   0,    0, XBMCVK_MENU,          "menu" }
221 , { XBMCK_PAUSE,                  0,    0, XBMCVK_PAUSE,         "pause" }
222 , { XBMCK_SCROLLOCK,              0,    0, XBMCVK_SCROLLLOCK,    "scrolllock" }
223 , { XBMCK_PRINT,                  0,    0, XBMCVK_PRINTSCREEN,   "printscreen" }
224 , { XBMCK_POWER,                  0,    0, XBMCVK_POWER,         "power" }
225 , { XBMCK_SLEEP,                  0,    0, XBMCVK_SLEEP,         "sleep" }
226 };
227
228 static int XBMCKeyTableSize = sizeof(XBMCKeyTable)/sizeof(XBMCKEYTABLE);
229
230 bool KeyTableLookupName(const char* keyname, XBMCKEYTABLE* keytable)
231 {
232   // If the name being searched for is null or "" there will be no match
233   if (!keyname)
234     return false;
235   if (keyname[0] == '\0')
236     return false;
237
238   // We need the button name to be in lowercase
239   CStdString lkeyname = keyname;
240   lkeyname.ToLower();
241
242   // Look up the key name in XBMCKeyTable
243   for (int i = 0; i < XBMCKeyTableSize; i++)
244   { if (XBMCKeyTable[i].keyname)
245     { if (strcmp(lkeyname.c_str(), XBMCKeyTable[i].keyname) == 0)
246       { *keytable = XBMCKeyTable[i];
247         return true;
248       }
249     }
250   }
251
252   // The name wasn't found
253   return false;
254 }
255
256 bool KeyTableLookupSym(uint16_t sym, XBMCKEYTABLE* keytable)
257 {
258   // If the sym being searched for is zero there will be no match
259   if (sym == 0)
260     return false;
261
262   // Look up the sym in XBMCKeyTable
263   for (int i = 0; i < XBMCKeyTableSize; i++)
264   { if (sym == XBMCKeyTable[i].sym)
265     { *keytable = XBMCKeyTable[i];
266       return true;
267     }
268   }
269
270   // The name wasn't found
271   return false;
272 }
273
274 bool KeyTableLookupUnicode(uint16_t unicode, XBMCKEYTABLE* keytable)
275 {
276   // If the unicode being searched for is zero there will be no match
277   if (unicode == 0)
278     return false;
279
280   // Look up the unicode in XBMCKeyTable
281   for (int i = 0; i < XBMCKeyTableSize; i++)
282   { if (unicode == XBMCKeyTable[i].unicode)
283     { *keytable = XBMCKeyTable[i];
284       return true;
285     }
286   }
287
288   // The name wasn't found
289   return false;
290 }
291
292 bool KeyTableLookupSymAndUnicode(uint16_t sym, uint16_t unicode, XBMCKEYTABLE* keytable)
293 {
294   // If the sym being searched for is zero there will be no match (the
295   // unicode can be zero if the sym is non-zero)
296   if (sym == 0)
297     return false;
298
299   // Look up the sym and unicode in XBMCKeyTable
300   for (int i = 0; i < XBMCKeyTableSize; i++)
301   { if (sym == XBMCKeyTable[i].sym && unicode == XBMCKeyTable[i].unicode)
302     { *keytable = XBMCKeyTable[i];
303       return true;
304     }
305   }
306
307   // The sym and unicode weren't found
308   return false;
309 }
310
311 bool KeyTableLookupVKeyName(uint32_t vkey, XBMCKEYTABLE* keytable)
312 {
313   // If the vkey being searched for is zero there will be no match
314   if (vkey == 0)
315     return false;
316
317   // Look up the vkey in XBMCKeyTable
318   for (int i = 0; i < XBMCKeyTableSize; i++)
319   { if (vkey == XBMCKeyTable[i].vkey && XBMCKeyTable[i].keyname)
320     { *keytable = XBMCKeyTable[i];
321       return true;
322     }
323   }
324
325   // The name wasn't found
326   return false;
327 }