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