]> git.tdb.fi Git - libs/gui.git/blob - source/input/keys.cpp
062b9be8e6b74ef9887901ba2859c45aba0ed9db
[libs/gui.git] / source / input / keys.cpp
1 /* $Id$
2
3 This file is part of libmspgbase
4 Copyright © 2008, 2010 Mikko Rasa, Mikkosoft Productions
5 Distributed under the LGPL
6 */
7
8 #include <map>
9 #ifdef WIN32
10 #include <windows.h>
11 #else
12 #include <X11/X.h>
13 #include <X11/keysym.h>
14 #endif
15 #include <msp/core/except.h>
16 #include "keys.h"
17
18 using namespace std;
19
20 namespace {
21
22 unsigned keymap[Msp::Input::N_KEYS_]=
23 {
24 #ifndef WIN32
25         0, 0, 0, 0, 0, 0, 0, 0,
26         XK_BackSpace, XK_Tab, XK_Return, 0, 0, 0, 0, 0,
27         0, 0, 0, 0, 0, 0, 0, 0,
28         0, 0, 0, XK_Escape, 0, 0, 0, 0,
29
30         XK_space, 0, 0, 0, 0, 0, 0, 0,
31         0, 0, 0, XK_plus, XK_comma, XK_minus, XK_period, XK_slash,
32         XK_0, XK_1, XK_2, XK_3, XK_4, XK_5, XK_6, XK_7,
33         XK_8, XK_9, 0, XK_semicolon, XK_less, XK_equal, 0, 0,
34
35         0, XK_a, XK_b, XK_c, XK_d, XK_e, XK_f, XK_g,
36         XK_h, XK_i, XK_j, XK_k, XK_l, XK_m, XK_n, XK_o,
37         XK_p, XK_q, XK_r, XK_s, XK_t, XK_u, XK_v, XK_w,
38         XK_x, XK_y, XK_z, XK_bracketleft, XK_backslash, XK_bracketright, 0, 0,
39
40         XK_grave, 0, 0, 0, 0, 0, 0, 0,
41         0, 0, 0, 0, 0, 0, 0, 0,
42         0, 0, 0, 0, 0, 0, 0, 0,
43         0, 0, 0, 0, 0, 0, 0, 0,
44
45         XK_adiaeresis, XK_odiaeresis, XK_udiaeresis, XK_aring, 0, 0, 0, 0,
46         0, 0, 0, 0, 0, 0, 0, 0,
47         0, 0, 0, 0, 0, 0, 0, 0,
48         0, 0, 0, 0, 0, 0, 0, 0,
49
50         XK_Left, XK_Right, XK_Up, XK_Down, 0, 0, 0, 0,
51         XK_Home, XK_End, XK_Page_Up, XK_Page_Down, XK_Insert, XK_Delete, 0, 0,
52         XK_F1, XK_F2, XK_F3, XK_F4, XK_F5, XK_F6, XK_F7, XK_F8,
53         XK_F9, XK_F10, XK_F11, XK_F12, 0, 0, 0, 0,
54
55         XK_Shift_L, XK_Shift_R, XK_Control_L, XK_Control_R, XK_Alt_L, XK_Alt_R, XK_Super_L, XK_Super_R,
56         XK_Caps_Lock, XK_Scroll_Lock, XK_Num_Lock, 0, 0, 0, 0, 0,
57         XK_KP_0, XK_KP_1, XK_KP_2, XK_KP_3, XK_KP_4, XK_KP_5, XK_KP_6, XK_KP_7,
58         XK_KP_8, XK_KP_9, XK_KP_Add, XK_KP_Subtract, XK_KP_Multiply, XK_KP_Divide, XK_KP_Separator, 0,
59
60         XK_Pause, XK_Print, XK_Menu, 0, 0, 0, 0, 0,
61         0, 0, 0, 0, 0, 0, 0, 0,
62         0, 0, 0, 0, 0, 0, 0, 0,
63         0, 0, 0, 0, 0, 0, 0, 0,
64 #else
65         0, 0, 0, 0, 0, 0, 0, 0,
66         VK_BACK, VK_TAB, VK_RETURN, 0, 0, 0, 0, 0,
67         0, 0, 0, 0, 0, 0, 0, 0,
68         0, 0, 0, VK_ESCAPE, 0, 0, 0, 0,
69
70         VK_SPACE, 0, 0, 0, 0, 0, 0, 0,
71         0, 0, 0, 0, 0, 0, 0, 0,
72         '0', '1', '2', '3', '4', '5', '6', '7',
73         '8', '9', 0, 0, 0, 0, 0, 0,
74
75         0, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
76         'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
77         'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
78         'X', 'Y', 'Z', 0, 0, 0, 0, 0,
79
80         0, 0, 0, 0, 0, 0, 0, 0,
81         0, 0, 0, 0, 0, 0, 0, 0,
82         0, 0, 0, 0, 0, 0, 0, 0,
83         0, 0, 0, 0, 0, 0, 0, 0,
84
85         0, 0, 0, 0, 0, 0, 0, 0,
86         0, 0, 0, 0, 0, 0, 0, 0,
87         0, 0, 0, 0, 0, 0, 0, 0,
88         0, 0, 0, 0, 0, 0, 0, 0,
89
90         VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN, 0, 0, 0, 0,
91         VK_HOME, VK_END, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE, 0, 0,
92         0, VK_F1, VK_F2, VK_F3, VK_F4, VK_F5, VK_F6, VK_F7,
93         VK_F8, VK_F9, VK_F10, VK_F11, VK_F12, 0, 0, 0,
94
95         VK_LSHIFT, VK_RSHIFT, VK_LCONTROL, VK_RCONTROL, 0, 0, VK_LWIN, VK_RWIN,
96         VK_CAPITAL, VK_SCROLL, VK_NUMLOCK, 0, 0, 0, 0, 0,
97         VK_NUMPAD0, VK_NUMPAD1, VK_NUMPAD2, VK_NUMPAD3, VK_NUMPAD4, VK_NUMPAD5, VK_NUMPAD6, VK_NUMPAD7,
98         VK_NUMPAD8, VK_NUMPAD9, VK_ADD, VK_SUBTRACT, VK_MULTIPLY, VK_DIVIDE, VK_SEPARATOR, 0,
99
100         VK_PAUSE, VK_SNAPSHOT, 0, 0, 0, 0, 0, 0,
101         0, 0, 0, 0, 0, 0, 0, 0,
102         0, 0, 0, 0, 0, 0, 0, 0,
103         0, 0, 0, 0, 0, 0, 0, 0,
104 #endif
105 };
106
107 unsigned modmap[Msp::Input::N_MODS_]=
108 {
109 #ifndef WIN32
110         ShiftMask, ControlMask, Mod1Mask, Mod4Mask
111 #else
112         1, 2, 4, 8
113 #endif
114 };
115
116 }
117
118 namespace Msp {
119 namespace Input {
120
121 unsigned key_from_sys(unsigned code)
122 {
123         static bool init_done=false;
124         static map<unsigned, unsigned> reverse_map;
125
126         if(!init_done)
127         {
128                 for(unsigned i=0; i<N_KEYS_; ++i)
129                         if(keymap[i])
130                                 reverse_map[keymap[i]]=i;
131
132                 init_done=true;
133         }
134
135         map<unsigned, unsigned>::const_iterator i=reverse_map.find(code);
136         if(i!=reverse_map.end())
137                 return i->second;
138
139         return 0;
140 }
141
142 unsigned key_to_sys(unsigned key)
143 {
144         if(key>=N_KEYS_)
145                 throw InvalidParameterValue("Key out of range");
146         return keymap[key];
147 }
148
149 unsigned mod_from_sys(unsigned mod)
150 {
151         unsigned result = 0;
152         for(unsigned i=0; i<N_MODS_; ++i)
153                 if(mod&modmap[i])
154                         result|=1<<i;
155         return result;
156 }
157
158 } // namespace Input
159 } // namespace Msp