FreeBASIC  0.91.0
scancodes_x11.c
Go to the documentation of this file.
1 #include "../fb.h"
3 
4 #ifndef DISABLE_X11
5 
6 typedef struct KeysymToScancode {
7  KeySym keysym;
8  int scancode;
10 
12 {
13  { XK_Escape , SC_ESCAPE },
14  { XK_F1 , SC_F1 },
15  { XK_F2 , SC_F2 },
16  { XK_F3 , SC_F3 },
17  { XK_F4 , SC_F4 },
18  { XK_F5 , SC_F5 },
19  { XK_F6 , SC_F6 },
20  { XK_F7 , SC_F7 },
21  { XK_F8 , SC_F8 },
22  { XK_F9 , SC_F9 },
23  { XK_F10 , SC_F10 },
24  { XK_F11 , SC_F11 },
25  { XK_F12 , SC_F12 },
26  { XK_Scroll_Lock , SC_SCROLLLOCK },
27  { XK_grave , SC_TILDE },
28  { XK_quoteleft , SC_TILDE },
29  { XK_asciitilde , SC_TILDE },
30  { XK_1 , SC_1 },
31  { XK_2 , SC_2 },
32  { XK_3 , SC_3 },
33  { XK_4 , SC_4 },
34  { XK_5 , SC_5 },
35  { XK_6 , SC_6 },
36  { XK_7 , SC_7 },
37  { XK_8 , SC_8 },
38  { XK_9 , SC_9 },
39  { XK_0 , SC_0 },
40  { XK_minus , SC_MINUS },
41  { XK_equal , SC_EQUALS },
42  { XK_backslash , SC_BACKSLASH },
43  { XK_BackSpace , SC_BACKSPACE },
44  { XK_Tab , SC_TAB },
45  { XK_q , SC_Q },
46  { XK_w , SC_W },
47  { XK_e , SC_E },
48  { XK_r , SC_R },
49  { XK_t , SC_T },
50  { XK_y , SC_Y },
51  { XK_u , SC_U },
52  { XK_i , SC_I },
53  { XK_o , SC_O },
54  { XK_p , SC_P },
55  { XK_bracketleft , SC_LEFTBRACKET },
56  { XK_bracketright, SC_RIGHTBRACKET },
57  { XK_Return , SC_ENTER },
58  { XK_Caps_Lock , SC_CAPSLOCK },
59  { XK_a , SC_A },
60  { XK_s , SC_S },
61  { XK_d , SC_D },
62  { XK_f , SC_F },
63  { XK_g , SC_G },
64  { XK_h , SC_H },
65  { XK_j , SC_J },
66  { XK_k , SC_K },
67  { XK_l , SC_L },
68  { XK_semicolon , SC_SEMICOLON },
69  { XK_apostrophe , SC_QUOTE },
70  { XK_Shift_L , SC_LSHIFT },
71  { XK_z , SC_Z },
72  { XK_x , SC_X },
73  { XK_c , SC_C },
74  { XK_v , SC_V },
75  { XK_b , SC_B },
76  { XK_n , SC_N },
77  { XK_m , SC_M },
78  { XK_comma , SC_COMMA },
79  { XK_period , SC_PERIOD },
80  { XK_slash , SC_SLASH },
81  { XK_Shift_R , SC_RSHIFT },
82  { XK_Control_L , SC_CONTROL },
83  { XK_Meta_L , SC_LWIN },
84  { XK_Alt_L , SC_ALT },
85  { XK_space , SC_SPACE },
86  { XK_Alt_R , SC_ALT },
87  { XK_Meta_R , SC_RWIN },
88  { XK_Menu , SC_MENU },
89  { XK_Control_R , SC_CONTROL },
90  { XK_Insert , SC_INSERT },
91  { XK_Home , SC_HOME },
92  { XK_Prior , SC_PAGEUP },
93  { XK_Delete , SC_DELETE },
94  { XK_End , SC_END },
95  { XK_Next , SC_PAGEDOWN },
96  { XK_Up , SC_UP },
97  { XK_Left , SC_LEFT },
98  { XK_Down , SC_DOWN },
99  { XK_Right , SC_RIGHT },
100  { XK_Num_Lock , SC_NUMLOCK },
101  { XK_KP_Divide , SC_SLASH },
102  { XK_KP_Multiply , SC_MULTIPLY },
103  { XK_KP_Subtract , SC_MINUS },
104  { XK_KP_Home , SC_HOME },
105  { XK_KP_Up , SC_UP },
106  { XK_KP_Prior , SC_PAGEUP },
107  { XK_KP_Add , SC_PLUS },
108  { XK_KP_Left , SC_LEFT },
109  { XK_KP_Begin , SC_CLEAR },
110  { XK_KP_Right , SC_RIGHT },
111  { XK_KP_End , SC_END },
112  { XK_KP_Down , SC_DOWN },
113  { XK_KP_Next , SC_PAGEDOWN },
114  { XK_KP_Enter , SC_ENTER },
115  { XK_KP_Insert , SC_INSERT },
116  { XK_KP_Delete , SC_DELETE },
117  { NoSymbol , 0 }
118 };
119 
120 unsigned char fb_x11keycode_to_scancode[256];
121 
123  (
124  Display *display,
125  XDISPLAYKEYCODES DisplayKeycodes,
126  XGETKEYBOARDMAPPING GetKeyboardMapping
127  )
128 {
129  int keycode_min, keycode_max, i, j;
130  int keysyms_per_keycode_return;
131  KeySym keysym;
132 
133  DisplayKeycodes( display, &keycode_min, &keycode_max );
134  if( keycode_min < 0 ) keycode_min = 0;
135  if( keycode_max > 255 ) keycode_max = 255;
136 
137  for( i = keycode_min; i <= keycode_max; i++ ) {
138  keysym = *GetKeyboardMapping( display, i, 1, &keysyms_per_keycode_return );
139  if( keysym != NoSymbol ) {
140  for( j = 0;
141  keysym_to_scancode[j].scancode &&
142  (keysym_to_scancode[j].keysym != keysym);
143  j++ )
144  ;
145  fb_x11keycode_to_scancode[i] = keysym_to_scancode[j].scancode;
146  }
147  }
148 }
149 
150 #endif