FreeRDP
Loading...
Searching...
No Matches
scancode.c
1
20#include <winpr/config.h>
21#include <winpr/assert.h>
22#include <winpr/crt.h>
23
24#include <winpr/input.h>
25
26#include "../log.h"
27#define TAG WINPR_TAG("input.scancode")
28
40static const DWORD KBD4T[128] = {
41 KBD4_T00, KBD4_T01, KBD4_T02, KBD4_T03, KBD4_T04, KBD4_T05, KBD4_T06, KBD4_T07, KBD4_T08,
42 KBD4_T09, KBD4_T0A, KBD4_T0B, KBD4_T0C, KBD4_T0D, KBD4_T0E, KBD4_T0F, KBD4_T10, KBD4_T11,
43 KBD4_T12, KBD4_T13, KBD4_T14, KBD4_T15, KBD4_T16, KBD4_T17, KBD4_T18, KBD4_T19, KBD4_T1A,
44 KBD4_T1B, KBD4_T1C, KBD4_T1D, KBD4_T1E, KBD4_T1F, KBD4_T20, KBD4_T21, KBD4_T22, KBD4_T23,
45 KBD4_T24, KBD4_T25, KBD4_T26, KBD4_T27, KBD4_T28, KBD4_T29, KBD4_T2A, KBD4_T2B, KBD4_T2C,
46 KBD4_T2D, KBD4_T2E, KBD4_T2F, KBD4_T30, KBD4_T31, KBD4_T32, KBD4_T33, KBD4_T34, KBD4_T35,
47 KBD4_T36, KBD4_T37, KBD4_T38, KBD4_T39, KBD4_T3A, KBD4_T3B, KBD4_T3C, KBD4_T3D, KBD4_T3E,
48 KBD4_T3F, KBD4_T40, KBD4_T41, KBD4_T42, KBD4_T43, KBD4_T44, KBD4_T45, KBD4_T46, KBD4_T47,
49 KBD4_T48, KBD4_T49, KBD4_T4A, KBD4_T4B, KBD4_T4C, KBD4_T4D, KBD4_T4E, KBD4_T4F, KBD4_T50,
50 KBD4_T51, KBD4_T52, KBD4_T53, KBD4_T54, KBD4_T55, KBD4_T56, KBD4_T57, KBD4_T58, KBD4_T59,
51 KBD4_T5A, KBD4_T5B, KBD4_T5C, KBD4_T5D, KBD4_T5E, KBD4_T5F, KBD4_T60, KBD4_T61, KBD4_T62,
52 KBD4_T63, KBD4_T64, KBD4_T65, KBD4_T66, KBD4_T67, KBD4_T68, KBD4_T69, KBD4_T6A, KBD4_T6B,
53 KBD4_T6C, KBD4_T6D, KBD4_T6E, KBD4_T6F, KBD4_T70, KBD4_T71, KBD4_T72, KBD4_T73, KBD4_T74,
54 KBD4_T75, KBD4_T76, KBD4_T77, KBD4_T78, KBD4_T79, KBD4_T7A, KBD4_T7B, KBD4_T7C, KBD4_T7D,
55 KBD4_T7E, KBD4_T7F
56};
57
58static const DWORD KBD4X[128] = {
59 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
60 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, KBD4_X10, VK_NONE,
61 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, KBD4_X19, VK_NONE,
62 VK_NONE, KBD4_X1C, KBD4_X1D, VK_NONE, VK_NONE, KBD4_X20, KBD4_X21, KBD4_X22, VK_NONE,
63 KBD4_X24, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
64 VK_NONE, KBD4_X2E, VK_NONE, KBD4_X30, VK_NONE, KBD4_X32, VK_NONE, VK_NONE, KBD4_X35,
65 VK_NONE, KBD4_X37, KBD4_X38, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
66 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, KBD4_X46, KBD4_X47,
67 KBD4_X48, KBD4_X49, VK_NONE, KBD4_X4B, VK_NONE, KBD4_X4D, VK_NONE, KBD4_X4F, KBD4_X50,
68 KBD4_X51, KBD4_X52, KBD4_X53, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
69 VK_NONE, KBD4_X5B, KBD4_X5C, KBD4_X5D, KBD4_X5E, KBD4_X5F, VK_NONE, VK_NONE, VK_NONE,
70 VK_NONE, VK_NONE, KBD4_X65, KBD4_X66, KBD4_X67, KBD4_X68, KBD4_X69, KBD4_X6A, KBD4_X6B,
71 KBD4_X6C, KBD4_X6D, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
72 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
73 VK_NONE, VK_NONE,
74};
75
76static const DWORD KBD4X_1[128] = {
77 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
78 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
79 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_PAUSE,
80 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
81 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
82 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
83 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
84 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
85 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
86 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
87 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
88 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
89 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE
90};
91
99static const DWORD KBD7T[128] = {
100 KBD7_T00, KBD7_T01, KBD7_T02, KBD7_T03, KBD7_T04, KBD7_T05, KBD7_T06, KBD7_T07, KBD7_T08,
101 KBD7_T09, KBD7_T0A, KBD7_T0B, KBD7_T0C, KBD7_T0D, KBD7_T0E, KBD7_T0F, KBD7_T10, KBD7_T11,
102 KBD7_T12, KBD7_T13, KBD7_T14, KBD7_T15, KBD7_T16, KBD7_T17, KBD7_T18, KBD7_T19, KBD7_T1A,
103 KBD7_T1B, KBD7_T1C, KBD7_T1D, KBD7_T1E, KBD7_T1F, KBD7_T20, KBD7_T21, KBD7_T22, KBD7_T23,
104 KBD7_T24, KBD7_T25, KBD7_T26, KBD7_T27, KBD7_T28, KBD7_T29, KBD7_T2A, KBD7_T2B, KBD7_T2C,
105 KBD7_T2D, KBD7_T2E, KBD7_T2F, KBD7_T30, KBD7_T31, KBD7_T32, KBD7_T33, KBD7_T34, KBD7_T35,
106 KBD7_T36, KBD7_T37, KBD7_T38, KBD7_T39, KBD7_T3A, KBD7_T3B, KBD7_T3C, KBD7_T3D, KBD7_T3E,
107 KBD7_T3F, KBD7_T40, KBD7_T41, KBD7_T42, KBD7_T43, KBD7_T44, KBD7_T45, KBD7_T46, KBD7_T47,
108 KBD7_T48, KBD7_T49, KBD7_T4A, KBD7_T4B, KBD7_T4C, KBD7_T4D, KBD7_T4E, KBD7_T4F, KBD7_T50,
109 KBD7_T51, KBD7_T52, KBD7_T53, KBD7_T54, KBD7_T55, KBD7_T56, KBD7_T57, KBD7_T58, KBD7_T59,
110 KBD7_T5A, KBD7_T5B, KBD7_T5C, KBD7_T5D, KBD7_T5E, KBD7_T5F, KBD7_T60, KBD7_T61, KBD7_T62,
111 KBD7_T63, KBD7_T64, KBD7_T65, KBD7_T66, KBD7_T67, KBD7_T68, KBD7_T69, KBD7_T6A, KBD7_T6B,
112 KBD7_T6C, KBD7_T6D, KBD7_T6E, KBD7_T6F, KBD7_T70, KBD7_T71, KBD7_T72, KBD7_T73, KBD7_T74,
113 KBD7_T75, KBD7_T76, KBD7_T77, KBD7_T78, KBD7_T79, KBD7_T7A, KBD7_T7B, KBD7_T7C, KBD7_T7D,
114 KBD7_T7E, KBD7_T7F
115};
116
117static const DWORD KBD7X[256] = {
118 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
119 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, KBD7_X10, VK_NONE,
120 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, KBD7_X19, VK_NONE,
121 VK_NONE, KBD7_X1C, KBD7_X1D, VK_NONE, VK_NONE, KBD7_X20, KBD7_X21, KBD7_X22, VK_NONE,
122 KBD7_X24, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
123 VK_NONE, KBD7_X2E, VK_NONE, KBD7_X30, VK_NONE, KBD7_X32, KBD7_X33, VK_NONE, KBD7_X35,
124 VK_NONE, KBD7_X37, KBD7_X38, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
125 VK_NONE, VK_NONE, VK_NONE, KBD7_X42, KBD7_X43, KBD7_X44, VK_NONE, KBD7_X46, KBD7_X47,
126 KBD7_X48, KBD7_X49, VK_NONE, KBD7_X4B, VK_NONE, KBD7_X4D, VK_NONE, KBD7_X4F, KBD7_X50,
127 KBD7_X51, KBD7_X52, KBD7_X53, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
128 VK_NONE, KBD7_X5B, KBD7_X5C, KBD7_X5D, KBD7_X5E, KBD7_X5F, VK_NONE, VK_NONE, VK_NONE,
129 VK_NONE, VK_NONE, KBD7_X65, KBD7_X66, KBD7_X67, KBD7_X68, KBD7_X69, KBD7_X6A, KBD7_X6B,
130 KBD7_X6C, KBD7_X6D, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
131 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
132 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
133 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
134 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
135 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
136 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
137 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
138 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
139 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
140 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
141 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
142 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
143 KBD7_XF1, KBD7_XF2, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
144 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE
145};
146
147static const DWORD KBD7X_1[128] = {
148 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
149 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
150 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_PAUSE,
151 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
152 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
153 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
154 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
155 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
156 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
157 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
158 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
159 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
160 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE
161};
162
169static const DWORD KBD8T[128] = { // break here
170 VK_NONE, VK_ESCAPE,
171 VK_KEY_1, VK_KEY_2,
172 VK_KEY_3, VK_KEY_4,
173 VK_KEY_5, VK_KEY_6,
174 VK_KEY_7, VK_KEY_8,
175 VK_KEY_9, VK_KEY_0,
176 VK_OEM_MINUS, VK_OEM_PLUS,
177 VK_BACK, VK_TAB,
178 VK_KEY_Q, VK_KEY_W,
179 VK_KEY_E, VK_KEY_R,
180 VK_KEY_T, VK_KEY_Y,
181 VK_KEY_U, VK_KEY_I,
182 VK_KEY_O, VK_KEY_P,
183 VK_OEM_4, VK_OEM_6,
184 VK_RETURN, VK_LCONTROL,
185 VK_KEY_A, VK_KEY_S,
186 VK_KEY_D, VK_KEY_F,
187 VK_KEY_G, VK_KEY_H,
188 VK_KEY_J, VK_KEY_K,
189 VK_KEY_L, VK_OEM_1,
190 VK_OEM_7, VK_OEM_3,
191 VK_LSHIFT, VK_OEM_5,
192 VK_KEY_Z, VK_KEY_X,
193 VK_KEY_C, VK_KEY_V,
194 VK_KEY_B, VK_KEY_N,
195 VK_KEY_M, VK_OEM_COMMA,
196 VK_OEM_PERIOD, VK_OEM_2,
197 VK_RSHIFT, VK_MULTIPLY,
198 VK_LMENU, VK_SPACE,
199 VK_CAPITAL, VK_F1,
200 VK_F2, VK_F3,
201 VK_F4, VK_F5,
202 VK_F6, VK_F7,
203 VK_F8, VK_F9,
204 VK_F10, VK_NUMLOCK,
205 VK_SCROLL, VK_HOME,
206 VK_UP, VK_PRIOR,
207 VK_SUBTRACT, VK_LEFT,
208 VK_CLEAR, VK_RIGHT,
209 VK_ADD, VK_END,
210 VK_DOWN, VK_NEXT,
211 VK_INSERT, VK_DELETE,
212 VK_SNAPSHOT, VK_NONE,
213 VK_OEM_102, VK_F11,
214 VK_F12, VK_CLEAR,
215 VK_OEM_WSCTRL, VK_DBE_KATAKANA,
216 VK_OEM_JUMP, VK_DBE_FLUSHSTRING,
217 VK_OEM_BACKTAB, VK_OEM_AUTO,
218 VK_NONE, VK_DBE_NOCODEINPUT,
219 VK_HELP, VK_NONE,
220 VK_F13, VK_F14,
221 VK_F15, VK_F16,
222 VK_F17, VK_F18,
223 VK_F19, VK_F20,
224 VK_F21, VK_F22,
225 VK_F23, VK_OEM_PA3,
226 VK_NONE, VK_OEM_RESET,
227 VK_NONE, VK_ABNT_C1,
228 VK_NONE, VK_NONE,
229 VK_F24, VK_NONE,
230 VK_NONE, VK_NONE,
231 VK_NONE, VK_OEM_PA1,
232 VK_TAB, VK_NONE,
233 VK_ABNT_C2, VK_OEM_PA2
234};
235
236static const DWORD KBD8X[256] = { // break here
237 VK_NONE,
238 VK_NONE,
239 VK_NONE,
240 VK_NONE,
241 VK_NONE,
242 VK_NONE,
243 VK_NONE,
244 VK_NONE,
245 VK_NONE,
246 VK_NONE,
247 VK_NONE,
248 VK_NONE,
249 VK_NONE,
250 VK_NONE,
251 VK_NONE,
252 VK_NONE,
253 VK_MEDIA_PREV_TRACK,
254 VK_NONE,
255 VK_NONE,
256 VK_NONE,
257 VK_NONE,
258 VK_NONE,
259 VK_NONE,
260 VK_NONE,
261 VK_NONE,
262 VK_MEDIA_NEXT_TRACK,
263 VK_NONE,
264 VK_NONE,
265 VK_RETURN,
266 VK_HANJA,
267 VK_NONE,
268 VK_NONE,
269 VK_VOLUME_MUTE,
270 VK_LAUNCH_APP2,
271 VK_MEDIA_PLAY_PAUSE,
272 VK_NONE,
273 VK_MEDIA_STOP,
274 VK_NONE,
275 VK_NONE,
276 VK_NONE,
277 VK_NONE,
278 VK_NONE,
279 VK_NONE,
280 VK_NONE,
281 VK_NONE,
282 VK_NONE,
283 VK_VOLUME_DOWN,
284 VK_NONE,
285 VK_VOLUME_UP,
286 VK_NONE,
287 VK_BROWSER_HOME,
288 VK_NONE,
289 VK_NONE,
290 VK_DIVIDE,
291 VK_NONE,
292 VK_SNAPSHOT,
293 VK_KANA,
294 VK_NONE,
295 VK_NONE,
296 VK_NONE,
297 VK_NONE,
298 VK_NONE,
299 VK_NONE,
300 VK_NONE,
301 VK_NONE,
302 VK_NONE,
303 VK_NONE,
304 VK_NONE,
305 VK_NONE,
306 VK_NONE,
307 VK_CANCEL,
308 VK_HOME,
309 VK_UP,
310 VK_PRIOR,
311 VK_NONE,
312 VK_LEFT,
313 VK_NONE,
314 VK_RIGHT,
315 VK_NONE,
316 VK_END,
317 VK_DOWN,
318 VK_NEXT,
319 VK_INSERT,
320 VK_DELETE,
321 VK_NONE,
322 VK_NONE,
323 VK_NONE,
324 VK_NONE,
325 VK_NONE,
326 VK_NONE,
327 VK_NONE,
328 VK_LWIN,
329 VK_RWIN,
330 VK_APPS,
331 VK_NONE,
332 VK_SLEEP,
333 VK_NONE,
334 VK_NONE,
335 VK_NONE,
336 VK_NONE,
337 VK_NONE,
338 VK_BROWSER_SEARCH,
339 VK_BROWSER_FAVORITES,
340 VK_BROWSER_REFRESH,
341 VK_BROWSER_STOP,
342 VK_BROWSER_FORWARD,
343 VK_BROWSER_BACK,
344 VK_LAUNCH_APP1,
345 VK_LAUNCH_MAIL,
346 VK_LAUNCH_MEDIA_SELECT,
347 VK_NONE,
348 VK_NONE,
349 VK_NONE,
350 VK_NONE,
351 VK_NONE,
352 VK_NONE,
353 VK_NONE,
354 VK_NONE,
355 VK_NONE,
356 VK_NONE,
357 VK_NONE,
358 VK_NONE,
359 VK_NONE,
360 VK_NONE,
361 VK_NONE,
362 VK_NONE,
363 VK_NONE,
364 VK_NONE,
365 VK_NONE,
366 VK_NONE,
367 VK_NONE,
368 VK_NONE,
369 VK_NONE,
370 VK_NONE,
371 VK_NONE,
372 VK_NONE,
373 VK_NONE,
374 VK_NONE,
375 VK_NONE,
376 VK_NONE,
377 VK_NONE,
378 VK_NONE,
379 VK_NONE,
380 VK_NONE,
381 VK_NONE,
382 VK_NONE,
383 VK_NONE,
384 VK_NONE,
385 VK_NONE,
386 VK_NONE,
387 VK_NONE,
388 VK_NONE,
389 VK_NONE,
390 VK_NONE,
391 VK_NONE,
392 VK_NONE,
393 VK_NONE,
394 VK_NONE,
395 VK_NONE,
396 VK_NONE,
397 VK_NONE,
398 VK_NONE,
399 VK_NONE,
400 VK_NONE,
401 VK_NONE,
402 VK_NONE,
403 VK_NONE,
404 VK_NONE,
405 VK_NONE,
406 VK_NONE,
407 VK_NONE,
408 VK_NONE,
409 VK_NONE,
410 VK_NONE,
411 VK_NONE,
412 VK_NONE,
413 VK_NONE,
414 VK_NONE,
415 VK_NONE,
416 VK_NONE,
417 VK_NONE,
418 VK_NONE,
419 VK_NONE,
420 VK_NONE,
421 VK_NONE,
422 VK_NONE,
423 VK_NONE,
424 VK_NONE,
425 VK_NONE,
426 VK_NONE,
427 VK_NONE,
428 VK_NONE,
429 VK_NONE,
430 VK_NONE,
431 VK_NONE,
432 VK_NONE,
433 VK_NONE,
434 VK_NONE,
435 VK_NONE,
436 VK_NONE,
437 VK_NONE,
438 VK_NONE,
439 VK_NONE,
440 VK_NONE,
441 VK_NONE,
442 VK_NONE,
443 VK_NONE,
444 VK_NONE,
445 VK_NONE,
446 VK_NONE,
447 VK_NONE,
448 VK_NONE,
449 VK_NONE,
450 VK_NONE,
451 VK_NONE,
452 VK_NONE,
453 VK_NONE,
454 VK_NONE,
455 VK_NONE,
456 VK_NONE,
457 VK_NONE,
458 VK_NONE,
459 VK_NONE,
460 VK_NONE,
461 VK_NONE,
462 VK_NONE,
463 VK_HANJA,
464 VK_KANA,
465 VK_NONE,
466 VK_NONE,
467 VK_NONE,
468 VK_NONE,
469 VK_NONE,
470 VK_NONE,
471 VK_NONE,
472 VK_NONE,
473 VK_NONE,
474 VK_NONE,
475 VK_NONE,
476 VK_NONE,
477 VK_NONE
478};
479
480static const DWORD KBD8X_1[128] = {
481 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
482 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
483 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_PAUSE,
484 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
485 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
486 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
487 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
488 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
489 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
490 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
491 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
492 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE,
493 VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE, VK_NONE
494};
495
496DWORD GetVirtualKeyCodeFromVirtualScanCode(DWORD scancode, DWORD dwKeyboardType)
497{
498 const DWORD codeIndex = scancode & 0xFF;
499
500 if (codeIndex > 127)
501 return VK_NONE;
502
503 switch (dwKeyboardType)
504 {
505 /* IBM and compatible */
506 case WINPR_KBD_TYPE_IBM_PC_XT:
507 case WINPR_KBD_TYPE_OLIVETTI_ICO:
508 case WINPR_KBD_TYPE_IBM_PC_AT:
509 case WINPR_KBD_TYPE_IBM_ENHANCED:
510 if (scancode & KBDMULTIVK)
511 return KBD4X_1[codeIndex];
512 if (scancode & KBDEXT)
513 return KBD4X[codeIndex];
514 return KBD4T[codeIndex];
515
516 case WINPR_KBD_TYPE_JAPANESE:
517 if (scancode & KBDMULTIVK)
518 return KBD7X_1[codeIndex];
519 if (scancode & KBDEXT)
520 return KBD7X[codeIndex];
521 return KBD7T[codeIndex];
522 case WINPR_KBD_TYPE_KOREAN:
523 if (scancode & KBDMULTIVK)
524 return KBD8X_1[codeIndex];
525 if (scancode & KBDEXT)
526 return KBD8X[codeIndex];
527 return KBD8T[codeIndex];
528 case WINPR_KBD_TYPE_NOKIA_1050:
529 case WINPR_KBD_TYPE_NOKIA_9140:
530 default:
531 WLog_ERR(TAG, "dwKeyboardType=0x%08" PRIx32 " not supported", dwKeyboardType);
532 return VK_NONE;
533 }
534}
535
536static DWORD get_scancode(DWORD vkcode, const DWORD* array, size_t arraysize, DWORD flag)
537{
538 WINPR_ASSERT(array);
539 for (size_t x = 0; x < arraysize; x++)
540 {
541 const DWORD cur = array[x];
542 if (cur == vkcode)
543 return WINPR_ASSERTING_INT_CAST(DWORD, x) | flag;
544 }
545 return VK_NONE;
546}
547
548DWORD GetVirtualScanCodeFromVirtualKeyCode(DWORD vkcode, DWORD dwKeyboardType)
549{
550 DWORD codeIndex = vkcode & 0xFF;
551
552 switch (dwKeyboardType)
553 {
554 case WINPR_KBD_TYPE_IBM_PC_XT:
555 case WINPR_KBD_TYPE_OLIVETTI_ICO:
556 case WINPR_KBD_TYPE_IBM_PC_AT:
557 case WINPR_KBD_TYPE_IBM_ENHANCED:
558 if (vkcode & KBDMULTIVK)
559 return get_scancode(codeIndex, KBD4X_1, ARRAYSIZE(KBD4X_1), KBDMULTIVK);
560 if (vkcode & KBDEXT)
561 return get_scancode(codeIndex, KBD4X, ARRAYSIZE(KBD4X), KBDEXT);
562 else
563 return get_scancode(codeIndex, KBD4T, ARRAYSIZE(KBD4T), 0);
564
565 case WINPR_KBD_TYPE_JAPANESE:
566 if (vkcode & KBDMULTIVK)
567 return get_scancode(codeIndex, KBD7X_1, ARRAYSIZE(KBD7X_1), KBDMULTIVK);
568 if (vkcode & KBDEXT)
569 return get_scancode(codeIndex, KBD7X, ARRAYSIZE(KBD7X), KBDEXT);
570 else
571 return get_scancode(codeIndex, KBD7T, ARRAYSIZE(KBD7T), 0);
572 case WINPR_KBD_TYPE_KOREAN:
573 if (vkcode & KBDMULTIVK)
574 return get_scancode(codeIndex, KBD8X_1, ARRAYSIZE(KBD8X_1), KBDMULTIVK);
575 if (vkcode & KBDEXT)
576 return get_scancode(codeIndex, KBD8X, ARRAYSIZE(KBD8X), KBDEXT);
577 else
578 return get_scancode(codeIndex, KBD8T, ARRAYSIZE(KBD8T), 0);
579 case WINPR_KBD_TYPE_NOKIA_1050:
580 case WINPR_KBD_TYPE_NOKIA_9140:
581 default:
582 WLog_ERR(TAG, "dwKeyboardType=0x%08" PRIx32 " not supported", dwKeyboardType);
583 return 0;
584 }
585}