1 uint8_t scancode[256];
2
3 enum XScancode {
4 Escape, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12,
5 ScrollLock, Pause, Tilde,
6 Num1, Num2, Num3, Num4, Num5, Num6, Num7, Num8, Num9, Num0,
7 Dash, Equal, Backspace,
8 Insert, Delete, Home, End, PageUp, PageDown,
9 A, B, C, D, E, F, G, H, I, J, K, L, M,
10 N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
11 LeftBracket, RightBracket, Backslash, Semicolon, Apostrophe, Comma, Period, Slash,
12 Keypad1, Keypad2, Keypad3, Keypad4, Keypad5, Keypad6, Keypad7, Keypad8, Keypad9, Keypad0,
13 Point, Enter, Add, Subtract, Multiply, Divide,
14 Up, Down, Left, Right,
15 Tab, Return, Spacebar, Menu,
16 LeftShift, RightShift, LeftControl, RightControl, LeftAlt, RightAlt, LeftSuper, RightSuper,
17 };
18
x_poll(int16_t * table)19 void x_poll(int16_t *table) {
20 char state[32];
21 Display *display = XOpenDisplay(0);
22 XQueryKeymap(display, state);
23 XCloseDisplay(display);
24
25 #define key(id) table[keyboard(0)[id]]
26 #define pressed(id) (bool)(state[scancode[id] >> 3] & (1 << (scancode[id] & 7)))
27
28 key(Keyboard::Escape) = pressed(Escape);
29
30 key(Keyboard::F1) = pressed(F1);
31 key(Keyboard::F2) = pressed(F2);
32 key(Keyboard::F3) = pressed(F3);
33 key(Keyboard::F4) = pressed(F4);
34 key(Keyboard::F5) = pressed(F5);
35 key(Keyboard::F6) = pressed(F6);
36 key(Keyboard::F7) = pressed(F7);
37 key(Keyboard::F8) = pressed(F8);
38 key(Keyboard::F9) = pressed(F9);
39 key(Keyboard::F10) = pressed(F10);
40 key(Keyboard::F11) = pressed(F11);
41 key(Keyboard::F12) = pressed(F12);
42
43 key(Keyboard::ScrollLock) = pressed(ScrollLock);
44 key(Keyboard::Pause) = pressed(Pause);
45 key(Keyboard::Tilde) = pressed(Tilde);
46
47 key(Keyboard::Num1) = pressed(Num1);
48 key(Keyboard::Num2) = pressed(Num2);
49 key(Keyboard::Num3) = pressed(Num3);
50 key(Keyboard::Num4) = pressed(Num4);
51 key(Keyboard::Num5) = pressed(Num5);
52 key(Keyboard::Num6) = pressed(Num6);
53 key(Keyboard::Num7) = pressed(Num7);
54 key(Keyboard::Num8) = pressed(Num8);
55 key(Keyboard::Num9) = pressed(Num9);
56 key(Keyboard::Num0) = pressed(Num0);
57
58 key(Keyboard::Dash) = pressed(Dash);
59 key(Keyboard::Equal) = pressed(Equal);
60 key(Keyboard::Backspace) = pressed(Backspace);
61
62 key(Keyboard::Insert) = pressed(Insert);
63 key(Keyboard::Delete) = pressed(Delete);
64 key(Keyboard::Home) = pressed(Home);
65 key(Keyboard::End) = pressed(End);
66 key(Keyboard::PageUp) = pressed(PageUp);
67 key(Keyboard::PageDown) = pressed(PageDown);
68
69 key(Keyboard::A) = pressed(A);
70 key(Keyboard::B) = pressed(B);
71 key(Keyboard::C) = pressed(C);
72 key(Keyboard::D) = pressed(D);
73 key(Keyboard::E) = pressed(E);
74 key(Keyboard::F) = pressed(F);
75 key(Keyboard::G) = pressed(G);
76 key(Keyboard::H) = pressed(H);
77 key(Keyboard::I) = pressed(I);
78 key(Keyboard::J) = pressed(J);
79 key(Keyboard::K) = pressed(K);
80 key(Keyboard::L) = pressed(L);
81 key(Keyboard::M) = pressed(M);
82 key(Keyboard::N) = pressed(N);
83 key(Keyboard::O) = pressed(O);
84 key(Keyboard::P) = pressed(P);
85 key(Keyboard::Q) = pressed(Q);
86 key(Keyboard::R) = pressed(R);
87 key(Keyboard::S) = pressed(S);
88 key(Keyboard::T) = pressed(T);
89 key(Keyboard::U) = pressed(U);
90 key(Keyboard::V) = pressed(V);
91 key(Keyboard::W) = pressed(W);
92 key(Keyboard::X) = pressed(X);
93 key(Keyboard::Y) = pressed(Y);
94 key(Keyboard::Z) = pressed(Z);
95
96 key(Keyboard::LeftBracket) = pressed(LeftBracket);
97 key(Keyboard::RightBracket) = pressed(RightBracket);
98 key(Keyboard::Backslash) = pressed(Backslash);
99 key(Keyboard::Semicolon) = pressed(Semicolon);
100 key(Keyboard::Apostrophe) = pressed(Apostrophe);
101 key(Keyboard::Comma) = pressed(Comma);
102 key(Keyboard::Period) = pressed(Period);
103 key(Keyboard::Slash) = pressed(Slash);
104
105 key(Keyboard::Keypad1) = pressed(Keypad1);
106 key(Keyboard::Keypad2) = pressed(Keypad2);
107 key(Keyboard::Keypad3) = pressed(Keypad3);
108 key(Keyboard::Keypad4) = pressed(Keypad4);
109 key(Keyboard::Keypad5) = pressed(Keypad5);
110 key(Keyboard::Keypad6) = pressed(Keypad6);
111 key(Keyboard::Keypad7) = pressed(Keypad7);
112 key(Keyboard::Keypad8) = pressed(Keypad8);
113 key(Keyboard::Keypad9) = pressed(Keypad9);
114 key(Keyboard::Keypad0) = pressed(Keypad0);
115
116 key(Keyboard::Point) = pressed(Point);
117 key(Keyboard::Enter) = pressed(Enter);
118 key(Keyboard::Add) = pressed(Add);
119 key(Keyboard::Subtract) = pressed(Subtract);
120 key(Keyboard::Multiply) = pressed(Multiply);
121 key(Keyboard::Divide) = pressed(Divide);
122
123 key(Keyboard::Up) = pressed(Up);
124 key(Keyboard::Down) = pressed(Down);
125 key(Keyboard::Left) = pressed(Left);
126 key(Keyboard::Right) = pressed(Right);
127
128 key(Keyboard::Tab) = pressed(Tab);
129 key(Keyboard::Return) = pressed(Return);
130 key(Keyboard::Spacebar) = pressed(Spacebar);
131 key(Keyboard::Menu) = pressed(Menu);
132
133 key(Keyboard::Shift) = pressed(LeftShift) || pressed(RightShift);
134 key(Keyboard::Control) = pressed(LeftControl) || pressed(RightControl);
135 key(Keyboard::Alt) = pressed(LeftAlt) || pressed(RightAlt);
136 key(Keyboard::Super) = pressed(LeftSuper) || pressed(RightSuper);
137
138 #undef key
139 #undef pressed
140 }
141
x_init()142 void x_init() {
143 Display *display = XOpenDisplay(0);
144 memset(&scancode, 0, sizeof scancode);
145
146 #define assign(x, y) scancode[x] = XKeysymToKeycode(display, y)
147 assign(Escape, XK_Escape);
148
149 assign(F1, XK_F1);
150 assign(F2, XK_F2);
151 assign(F3, XK_F3);
152 assign(F4, XK_F4);
153 assign(F5, XK_F5);
154 assign(F6, XK_F6);
155 assign(F7, XK_F7);
156 assign(F8, XK_F8);
157 assign(F9, XK_F9);
158 assign(F10, XK_F10);
159 assign(F11, XK_F11);
160 assign(F12, XK_F12);
161
162 assign(ScrollLock, XK_Scroll_Lock);
163 assign(Pause, XK_Pause);
164
165 assign(Tilde, XK_asciitilde);
166
167 assign(Num0, XK_0);
168 assign(Num1, XK_1);
169 assign(Num2, XK_2);
170 assign(Num3, XK_3);
171 assign(Num4, XK_4);
172 assign(Num5, XK_5);
173 assign(Num6, XK_6);
174 assign(Num7, XK_7);
175 assign(Num8, XK_8);
176 assign(Num9, XK_9);
177
178 assign(Dash, XK_minus);
179 assign(Equal, XK_equal);
180 assign(Backspace, XK_BackSpace);
181
182 assign(Insert, XK_Insert);
183 assign(Delete, XK_Delete);
184 assign(Home, XK_Home);
185 assign(End, XK_End);
186 assign(PageUp, XK_Prior);
187 assign(PageDown, XK_Next);
188
189 assign(A, XK_A);
190 assign(B, XK_B);
191 assign(C, XK_C);
192 assign(D, XK_D);
193 assign(E, XK_E);
194 assign(F, XK_F);
195 assign(G, XK_G);
196 assign(H, XK_H);
197 assign(I, XK_I);
198 assign(J, XK_J);
199 assign(K, XK_K);
200 assign(L, XK_L);
201 assign(M, XK_M);
202 assign(N, XK_N);
203 assign(O, XK_O);
204 assign(P, XK_P);
205 assign(Q, XK_Q);
206 assign(R, XK_R);
207 assign(S, XK_S);
208 assign(T, XK_T);
209 assign(U, XK_U);
210 assign(V, XK_V);
211 assign(W, XK_W);
212 assign(X, XK_X);
213 assign(Y, XK_Y);
214 assign(Z, XK_Z);
215
216 assign(LeftBracket, XK_bracketleft);
217 assign(RightBracket, XK_bracketright);
218 assign(Backslash, XK_backslash);
219 assign(Semicolon, XK_semicolon);
220 assign(Apostrophe, XK_apostrophe);
221 assign(Comma, XK_comma);
222 assign(Period, XK_period);
223 assign(Slash, XK_slash);
224
225 assign(Keypad0, XK_KP_0);
226 assign(Keypad1, XK_KP_1);
227 assign(Keypad2, XK_KP_2);
228 assign(Keypad3, XK_KP_3);
229 assign(Keypad4, XK_KP_4);
230 assign(Keypad5, XK_KP_5);
231 assign(Keypad6, XK_KP_6);
232 assign(Keypad7, XK_KP_7);
233 assign(Keypad8, XK_KP_8);
234 assign(Keypad9, XK_KP_9);
235
236 assign(Add, XK_KP_Add);
237 assign(Subtract, XK_KP_Subtract);
238 assign(Multiply, XK_KP_Multiply);
239 assign(Divide, XK_KP_Divide);
240 assign(Enter, XK_KP_Enter);
241
242 assign(Up, XK_Up);
243 assign(Down, XK_Down);
244 assign(Left, XK_Left);
245 assign(Right, XK_Right);
246
247 assign(Tab, XK_Tab);
248 assign(Return, XK_Return);
249 assign(Spacebar, XK_space);
250
251 assign(LeftControl, XK_Control_L);
252 assign(RightControl, XK_Control_R);
253 assign(LeftAlt, XK_Alt_L);
254 assign(RightAlt, XK_Alt_R);
255 assign(LeftShift, XK_Shift_L);
256 assign(RightShift, XK_Shift_R);
257 assign(LeftSuper, XK_Super_L);
258 assign(RightSuper, XK_Super_R);
259 assign(Menu, XK_Menu);
260
261 #undef assign
262
263 XCloseDisplay(display);
264 }
265