1 /*
2   Simple DirectMedia Layer
3   Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
4 
5   This software is provided 'as-is', without any express or implied
6   warranty.  In no event will the authors be held liable for any damages
7   arising from the use of this software.
8 
9   Permission is granted to anyone to use this software for any purpose,
10   including commercial applications, and to alter it and redistribute it
11   freely, subject to the following restrictions:
12 
13  1. The origin of this software must not be misrepresented; you must not
14      claim that you wrote the original software. If you use this software
15      in a product, an acknowledgment in the product documentation would be
16      appreciated but is not required.
17  2. Altered source versions must be plainly marked as such, and must not be
18      misrepresented as being the original software.
19  3. This notice may not be removed or altered from any source distribution.
20 */
21 #include "../../SDL_internal.h"
22 
23 #if SDL_VIDEO_DRIVER_NACL
24 
25 #include "SDL.h"
26 #include "../../events/SDL_sysevents.h"
27 #include "../../events/SDL_events_c.h"
28 #include "SDL_naclevents_c.h"
29 #include "SDL_naclvideo.h"
30 #include "ppapi_simple/ps_event.h"
31 
32 /* Ref: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent */
33 
34 static SDL_Scancode NACL_Keycodes[] = {
35     SDL_SCANCODE_UNKNOWN,               /* 0 */
36     SDL_SCANCODE_UNKNOWN,               /* 1 */
37     SDL_SCANCODE_UNKNOWN,               /* 2 */
38     SDL_SCANCODE_CANCEL,                /* DOM_VK_CANCEL 3 */
39     SDL_SCANCODE_UNKNOWN,               /* 4 */
40     SDL_SCANCODE_UNKNOWN,               /* 5 */
41     SDL_SCANCODE_HELP,                  /* DOM_VK_HELP 6 */
42     SDL_SCANCODE_UNKNOWN,               /* 7 */
43     SDL_SCANCODE_BACKSPACE,             /* DOM_VK_BACK_SPACE 8 */
44     SDL_SCANCODE_TAB,                   /* DOM_VK_TAB 9 */
45     SDL_SCANCODE_UNKNOWN,               /* 10 */
46     SDL_SCANCODE_UNKNOWN,               /* 11 */
47     SDL_SCANCODE_CLEAR,                 /* DOM_VK_CLEAR 12 */
48     SDL_SCANCODE_RETURN,                /* DOM_VK_RETURN 13 */
49     SDL_SCANCODE_RETURN,                /* DOM_VK_ENTER 14 */
50     SDL_SCANCODE_UNKNOWN,               /* 15 */
51     SDL_SCANCODE_LSHIFT,                /* DOM_VK_SHIFT 16 */
52     SDL_SCANCODE_LCTRL,                 /* DOM_VK_CONTROL 17 */
53     SDL_SCANCODE_LALT,                  /* DOM_VK_ALT 18 */
54     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_PAUSE 19 */
55     SDL_SCANCODE_CAPSLOCK,              /* DOM_VK_CAPS_LOCK 20 */
56     SDL_SCANCODE_LANG1,                 /* DOM_VK_KANA  DOM_VK_HANGUL 21 */
57     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_EISU 22 */
58     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_JUNJA 23 */
59     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_FINAL 24 */
60     SDL_SCANCODE_LANG2,                 /* DOM_VK_HANJA  DOM_VK_KANJI 25 */
61     SDL_SCANCODE_UNKNOWN,               /* 26 */
62     SDL_SCANCODE_ESCAPE,                /* DOM_VK_ESCAPE 27 */
63     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_CONVERT 28 */
64     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_NONCONVERT 29 */
65     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_ACCEPT 30 */
66     SDL_SCANCODE_MODE,                  /* DOM_VK_MODECHANGE 31 */
67     SDL_SCANCODE_SPACE,                 /* DOM_VK_SPACE 32 */
68     SDL_SCANCODE_PAGEUP,                /* DOM_VK_PAGE_UP 33 */
69     SDL_SCANCODE_PAGEDOWN,              /* DOM_VK_PAGE_DOWN 34 */
70     SDL_SCANCODE_END,                   /* DOM_VK_END 35 */
71     SDL_SCANCODE_HOME,                  /* DOM_VK_HOME 36 */
72     SDL_SCANCODE_LEFT,                  /* DOM_VK_LEFT 37 */
73     SDL_SCANCODE_UP,                    /* DOM_VK_UP 38 */
74     SDL_SCANCODE_RIGHT,                 /* DOM_VK_RIGHT 39 */
75     SDL_SCANCODE_DOWN,                  /* DOM_VK_DOWN 40 */
76     SDL_SCANCODE_SELECT,                /* DOM_VK_SELECT 41 */
77     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_PRINT 42 */
78     SDL_SCANCODE_EXECUTE,               /* DOM_VK_EXECUTE 43 */
79     SDL_SCANCODE_PRINTSCREEN,           /* DOM_VK_PRINTSCREEN 44 */
80     SDL_SCANCODE_INSERT,                /* DOM_VK_INSERT 45 */
81     SDL_SCANCODE_DELETE,                /* DOM_VK_DELETE 46 */
82     SDL_SCANCODE_UNKNOWN,               /* 47 */
83     SDL_SCANCODE_0,                     /* DOM_VK_0 48 */
84     SDL_SCANCODE_1,                     /* DOM_VK_1 49 */
85     SDL_SCANCODE_2,                     /* DOM_VK_2 50 */
86     SDL_SCANCODE_3,                     /* DOM_VK_3 51 */
87     SDL_SCANCODE_4,                     /* DOM_VK_4 52 */
88     SDL_SCANCODE_5,                     /* DOM_VK_5 53 */
89     SDL_SCANCODE_6,                     /* DOM_VK_6 54 */
90     SDL_SCANCODE_7,                     /* DOM_VK_7 55 */
91     SDL_SCANCODE_8,                     /* DOM_VK_8 56 */
92     SDL_SCANCODE_9,                     /* DOM_VK_9 57 */
93     SDL_SCANCODE_KP_COLON,              /* DOM_VK_COLON 58 */
94     SDL_SCANCODE_SEMICOLON,             /* DOM_VK_SEMICOLON 59 */
95     SDL_SCANCODE_KP_LESS,               /* DOM_VK_LESS_THAN 60 */
96     SDL_SCANCODE_EQUALS,                /* DOM_VK_EQUALS 61 */
97     SDL_SCANCODE_KP_GREATER,            /* DOM_VK_GREATER_THAN 62 */
98     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_QUESTION_MARK 63 */
99     SDL_SCANCODE_KP_AT,                 /* DOM_VK_AT 64 */
100     SDL_SCANCODE_A,                     /* DOM_VK_A 65 */
101     SDL_SCANCODE_B,                     /* DOM_VK_B 66 */
102     SDL_SCANCODE_C,                     /* DOM_VK_C 67 */
103     SDL_SCANCODE_D,                     /* DOM_VK_D 68 */
104     SDL_SCANCODE_E,                     /* DOM_VK_E 69 */
105     SDL_SCANCODE_F,                     /* DOM_VK_F 70 */
106     SDL_SCANCODE_G,                     /* DOM_VK_G 71 */
107     SDL_SCANCODE_H,                     /* DOM_VK_H 72 */
108     SDL_SCANCODE_I,                     /* DOM_VK_I 73 */
109     SDL_SCANCODE_J,                     /* DOM_VK_J 74 */
110     SDL_SCANCODE_K,                     /* DOM_VK_K 75 */
111     SDL_SCANCODE_L,                     /* DOM_VK_L 76 */
112     SDL_SCANCODE_M,                     /* DOM_VK_M 77 */
113     SDL_SCANCODE_N,                     /* DOM_VK_N 78 */
114     SDL_SCANCODE_O,                     /* DOM_VK_O 79 */
115     SDL_SCANCODE_P,                     /* DOM_VK_P 80 */
116     SDL_SCANCODE_Q,                     /* DOM_VK_Q 81 */
117     SDL_SCANCODE_R,                     /* DOM_VK_R 82 */
118     SDL_SCANCODE_S,                     /* DOM_VK_S 83 */
119     SDL_SCANCODE_T,                     /* DOM_VK_T 84 */
120     SDL_SCANCODE_U,                     /* DOM_VK_U 85 */
121     SDL_SCANCODE_V,                     /* DOM_VK_V 86 */
122     SDL_SCANCODE_W,                     /* DOM_VK_W 87 */
123     SDL_SCANCODE_X,                     /* DOM_VK_X 88 */
124     SDL_SCANCODE_Y,                     /* DOM_VK_Y 89 */
125     SDL_SCANCODE_Z,                     /* DOM_VK_Z 90 */
126     SDL_SCANCODE_LGUI,                  /* DOM_VK_WIN 91 */
127     SDL_SCANCODE_UNKNOWN,               /* 92 */
128     SDL_SCANCODE_APPLICATION,           /* DOM_VK_CONTEXT_MENU 93 */
129     SDL_SCANCODE_UNKNOWN,               /* 94 */
130     SDL_SCANCODE_SLEEP,                 /* DOM_VK_SLEEP 95 */
131     SDL_SCANCODE_KP_0,                  /* DOM_VK_NUMPAD0 96 */
132     SDL_SCANCODE_KP_1,                  /* DOM_VK_NUMPAD1 97 */
133     SDL_SCANCODE_KP_2,                  /* DOM_VK_NUMPAD2 98 */
134     SDL_SCANCODE_KP_3,                  /* DOM_VK_NUMPAD3 99 */
135     SDL_SCANCODE_KP_4,                  /* DOM_VK_NUMPAD4 100 */
136     SDL_SCANCODE_KP_5,                  /* DOM_VK_NUMPAD5 101 */
137     SDL_SCANCODE_KP_6,                  /* DOM_VK_NUMPAD6 102 */
138     SDL_SCANCODE_KP_7,                  /* DOM_VK_NUMPAD7 103 */
139     SDL_SCANCODE_KP_8,                  /* DOM_VK_NUMPAD8 104 */
140     SDL_SCANCODE_KP_9,                  /* DOM_VK_NUMPAD9 105 */
141     SDL_SCANCODE_KP_MULTIPLY,           /* DOM_VK_MULTIPLY 106 */
142     SDL_SCANCODE_KP_PLUS,               /* DOM_VK_ADD 107 */
143     SDL_SCANCODE_KP_COMMA,              /* DOM_VK_SEPARATOR 108 */
144     SDL_SCANCODE_KP_MINUS,              /* DOM_VK_SUBTRACT 109 */
145     SDL_SCANCODE_KP_PERIOD,             /* DOM_VK_DECIMAL 110 */
146     SDL_SCANCODE_KP_DIVIDE,             /* DOM_VK_DIVIDE 111 */
147     SDL_SCANCODE_F1,                    /* DOM_VK_F1 112 */
148     SDL_SCANCODE_F2,                    /* DOM_VK_F2 113 */
149     SDL_SCANCODE_F3,                    /* DOM_VK_F3 114 */
150     SDL_SCANCODE_F4,                    /* DOM_VK_F4 115 */
151     SDL_SCANCODE_F5,                    /* DOM_VK_F5 116 */
152     SDL_SCANCODE_F6,                    /* DOM_VK_F6 117 */
153     SDL_SCANCODE_F7,                    /* DOM_VK_F7 118 */
154     SDL_SCANCODE_F8,                    /* DOM_VK_F8 119 */
155     SDL_SCANCODE_F9,                    /* DOM_VK_F9 120 */
156     SDL_SCANCODE_F10,                   /* DOM_VK_F10 121 */
157     SDL_SCANCODE_F11,                   /* DOM_VK_F11 122 */
158     SDL_SCANCODE_F12,                   /* DOM_VK_F12 123 */
159     SDL_SCANCODE_F13,                   /* DOM_VK_F13 124 */
160     SDL_SCANCODE_F14,                   /* DOM_VK_F14 125 */
161     SDL_SCANCODE_F15,                   /* DOM_VK_F15 126 */
162     SDL_SCANCODE_F16,                   /* DOM_VK_F16 127 */
163     SDL_SCANCODE_F17,                   /* DOM_VK_F17 128 */
164     SDL_SCANCODE_F18,                   /* DOM_VK_F18 129 */
165     SDL_SCANCODE_F19,                   /* DOM_VK_F19 130 */
166     SDL_SCANCODE_F20,                   /* DOM_VK_F20 131 */
167     SDL_SCANCODE_F21,                   /* DOM_VK_F21 132 */
168     SDL_SCANCODE_F22,                   /* DOM_VK_F22 133 */
169     SDL_SCANCODE_F23,                   /* DOM_VK_F23 134 */
170     SDL_SCANCODE_F24,                   /* DOM_VK_F24 135 */
171     SDL_SCANCODE_UNKNOWN,               /* 136 */
172     SDL_SCANCODE_UNKNOWN,               /* 137 */
173     SDL_SCANCODE_UNKNOWN,               /* 138 */
174     SDL_SCANCODE_UNKNOWN,               /* 139 */
175     SDL_SCANCODE_UNKNOWN,               /* 140 */
176     SDL_SCANCODE_UNKNOWN,               /* 141 */
177     SDL_SCANCODE_UNKNOWN,               /* 142 */
178     SDL_SCANCODE_UNKNOWN,               /* 143 */
179     SDL_SCANCODE_NUMLOCKCLEAR,          /* DOM_VK_NUM_LOCK 144 */
180     SDL_SCANCODE_SCROLLLOCK,            /* DOM_VK_SCROLL_LOCK 145 */
181     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_FJ_JISHO 146 */
182     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_FJ_MASSHOU 147 */
183     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_FJ_TOUROKU 148 */
184     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_FJ_LOYA 149 */
185     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_FJ_ROYA 150 */
186     SDL_SCANCODE_UNKNOWN,               /* 151 */
187     SDL_SCANCODE_UNKNOWN,               /* 152 */
188     SDL_SCANCODE_UNKNOWN,               /* 153 */
189     SDL_SCANCODE_UNKNOWN,               /* 154 */
190     SDL_SCANCODE_UNKNOWN,               /* 155 */
191     SDL_SCANCODE_UNKNOWN,               /* 156 */
192     SDL_SCANCODE_UNKNOWN,               /* 157 */
193     SDL_SCANCODE_UNKNOWN,               /* 158 */
194     SDL_SCANCODE_UNKNOWN,               /* 159 */
195     SDL_SCANCODE_GRAVE,                 /* DOM_VK_CIRCUMFLEX 160 */
196     SDL_SCANCODE_KP_EXCLAM,             /* DOM_VK_EXCLAMATION 161 */
197     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_DOUBLE_QUOTE 162 */
198     SDL_SCANCODE_KP_HASH,               /* DOM_VK_HASH 163 */
199     SDL_SCANCODE_CURRENCYUNIT,          /* DOM_VK_DOLLAR 164 */
200     SDL_SCANCODE_KP_PERCENT,            /* DOM_VK_PERCENT 165 */
201     SDL_SCANCODE_KP_AMPERSAND,          /* DOM_VK_AMPERSAND 166 */
202     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_UNDERSCORE 167 */
203     SDL_SCANCODE_KP_LEFTPAREN,          /* DOM_VK_OPEN_PAREN 168 */
204     SDL_SCANCODE_KP_RIGHTPAREN,         /* DOM_VK_CLOSE_PAREN 169 */
205     SDL_SCANCODE_KP_MULTIPLY,           /* DOM_VK_ASTERISK 170 */
206     SDL_SCANCODE_KP_PLUS,               /* DOM_VK_PLUS 171 */
207     SDL_SCANCODE_KP_PLUS,               /* DOM_VK_PIPE 172 */
208     SDL_SCANCODE_MINUS,                 /* DOM_VK_HYPHEN_MINUS 173 */
209     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_OPEN_CURLY_BRACKET 174 */
210     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_CLOSE_CURLY_BRACKET 175 */
211     SDL_SCANCODE_NONUSBACKSLASH,        /* DOM_VK_TILDE 176 */
212     SDL_SCANCODE_UNKNOWN,               /* 177 */
213     SDL_SCANCODE_UNKNOWN,               /* 178 */
214     SDL_SCANCODE_UNKNOWN,               /* 179 */
215     SDL_SCANCODE_UNKNOWN,               /* 180 */
216     SDL_SCANCODE_MUTE,                  /* DOM_VK_VOLUME_MUTE 181 */
217     SDL_SCANCODE_VOLUMEDOWN,            /* DOM_VK_VOLUME_DOWN 182 */
218     SDL_SCANCODE_VOLUMEUP,              /* DOM_VK_VOLUME_UP 183 */
219     SDL_SCANCODE_UNKNOWN,               /* 184 */
220     SDL_SCANCODE_UNKNOWN,               /* 185 */
221     SDL_SCANCODE_UNKNOWN,               /* 186 */
222     SDL_SCANCODE_UNKNOWN,               /* 187 */
223     SDL_SCANCODE_COMMA,                 /* DOM_VK_COMMA 188 */
224     SDL_SCANCODE_UNKNOWN,               /* 189 */
225     SDL_SCANCODE_PERIOD,                /* DOM_VK_PERIOD 190 */
226     SDL_SCANCODE_SLASH,                 /* DOM_VK_SLASH 191 */
227     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_BACK_QUOTE 192 */
228     SDL_SCANCODE_UNKNOWN,               /* 193 */
229     SDL_SCANCODE_UNKNOWN,               /* 194 */
230     SDL_SCANCODE_UNKNOWN,               /* 195 */
231     SDL_SCANCODE_UNKNOWN,               /* 196 */
232     SDL_SCANCODE_UNKNOWN,               /* 197 */
233     SDL_SCANCODE_UNKNOWN,               /* 198 */
234     SDL_SCANCODE_UNKNOWN,               /* 199 */
235     SDL_SCANCODE_UNKNOWN,               /* 200 */
236     SDL_SCANCODE_UNKNOWN,               /* 201 */
237     SDL_SCANCODE_UNKNOWN,               /* 202 */
238     SDL_SCANCODE_UNKNOWN,               /* 203 */
239     SDL_SCANCODE_UNKNOWN,               /* 204 */
240     SDL_SCANCODE_UNKNOWN,               /* 205 */
241     SDL_SCANCODE_UNKNOWN,               /* 206 */
242     SDL_SCANCODE_UNKNOWN,               /* 207 */
243     SDL_SCANCODE_UNKNOWN,               /* 208 */
244     SDL_SCANCODE_UNKNOWN,               /* 209 */
245     SDL_SCANCODE_UNKNOWN,               /* 210 */
246     SDL_SCANCODE_UNKNOWN,               /* 211 */
247     SDL_SCANCODE_UNKNOWN,               /* 212 */
248     SDL_SCANCODE_UNKNOWN,               /* 213 */
249     SDL_SCANCODE_UNKNOWN,               /* 214 */
250     SDL_SCANCODE_UNKNOWN,               /* 215 */
251     SDL_SCANCODE_UNKNOWN,               /* 216 */
252     SDL_SCANCODE_UNKNOWN,               /* 217 */
253     SDL_SCANCODE_UNKNOWN,               /* 218 */
254     SDL_SCANCODE_LEFTBRACKET,           /* DOM_VK_OPEN_BRACKET 219 */
255     SDL_SCANCODE_BACKSLASH,             /* DOM_VK_BACK_SLASH 220 */
256     SDL_SCANCODE_RIGHTBRACKET,          /* DOM_VK_CLOSE_BRACKET 221 */
257     SDL_SCANCODE_APOSTROPHE,            /* DOM_VK_QUOTE 222 */
258     SDL_SCANCODE_UNKNOWN,               /* 223 */
259     SDL_SCANCODE_RGUI,                  /* DOM_VK_META 224 */
260     SDL_SCANCODE_RALT,                  /* DOM_VK_ALTGR 225 */
261     SDL_SCANCODE_UNKNOWN,               /* 226 */
262     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_ICO_HELP 227 */
263     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_ICO_00 228 */
264     SDL_SCANCODE_UNKNOWN,               /* 229 */
265     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_ICO_CLEAR 230 */
266     SDL_SCANCODE_UNKNOWN,               /* 231 */
267     SDL_SCANCODE_UNKNOWN,               /* 232 */
268     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_RESET 233 */
269     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_JUMP 234 */
270     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_PA1 235 */
271     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_PA2 236 */
272     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_PA3 237 */
273     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_WSCTRL 238 */
274     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_CUSEL 239 */
275     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_ATTN 240 */
276     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_FINISH 241 */
277     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_COPY 242 */
278     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_AUTO 243 */
279     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_ENLW 244 */
280     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_BACKTAB 245 */
281     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_ATTN 246 */
282     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_CRSEL 247 */
283     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_EXSEL 248 */
284     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_EREOF 249 */
285     SDL_SCANCODE_AUDIOPLAY,             /* DOM_VK_PLAY 250 */
286     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_ZOOM 251 */
287     SDL_SCANCODE_UNKNOWN,               /* 252 */
288     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_PA1 253 */
289     SDL_SCANCODE_UNKNOWN,               /* DOM_VK_WIN_OEM_CLEAR 254 */
290     SDL_SCANCODE_UNKNOWN,               /* 255 */
291 };
292 
SDL_NACL_translate_mouse_button(int32_t button)293 static Uint8 SDL_NACL_translate_mouse_button(int32_t button) {
294     switch (button) {
295         case PP_INPUTEVENT_MOUSEBUTTON_LEFT:
296             return SDL_BUTTON_LEFT;
297         case PP_INPUTEVENT_MOUSEBUTTON_MIDDLE:
298             return SDL_BUTTON_MIDDLE;
299         case PP_INPUTEVENT_MOUSEBUTTON_RIGHT:
300             return SDL_BUTTON_RIGHT;
301 
302         case PP_INPUTEVENT_MOUSEBUTTON_NONE:
303         default:
304             return 0;
305     }
306 }
307 
308 static SDL_Scancode
SDL_NACL_translate_keycode(int keycode)309 SDL_NACL_translate_keycode(int keycode)
310 {
311     SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN;
312 
313     if (keycode < SDL_arraysize(NACL_Keycodes)) {
314         scancode = NACL_Keycodes[keycode];
315     }
316     if (scancode == SDL_SCANCODE_UNKNOWN) {
317         SDL_Log("The key you just pressed is not recognized by SDL. To help get this fixed, please report this to the SDL mailing list <sdl@libsdl.org> NACL KeyCode %d \n", keycode);
318     }
319     return scancode;
320 }
321 
NACL_PumpEvents(_THIS)322 void NACL_PumpEvents(_THIS) {
323   PSEvent* ps_event;
324   PP_Resource event;
325   PP_InputEvent_Type type;
326   PP_InputEvent_Modifier modifiers;
327   struct PP_Rect rect;
328   struct PP_FloatPoint fp;
329   struct PP_Point location;
330   struct PP_Var var;
331   const char *str;
332   char text[64];
333   Uint32 str_len;
334   SDL_VideoData *driverdata = (SDL_VideoData *) _this->driverdata;
335   SDL_Mouse *mouse = SDL_GetMouse();
336 
337   if (driverdata->window) {
338     while ((ps_event = PSEventTryAcquire()) != NULL) {
339         event = ps_event->as_resource;
340         switch(ps_event->type) {
341             /* From DidChangeView, contains a view resource */
342             case PSE_INSTANCE_DIDCHANGEVIEW:
343                 driverdata->ppb_view->GetRect(event, &rect);
344                 NACL_SetScreenResolution(rect.size.width, rect.size.height, SDL_PIXELFORMAT_UNKNOWN);
345                 // FIXME: Rebuild context? See life.c UpdateContext
346                 break;
347 
348             /* From HandleInputEvent, contains an input resource. */
349             case PSE_INSTANCE_HANDLEINPUT:
350                 type = driverdata->ppb_input_event->GetType(event);
351                 modifiers = driverdata->ppb_input_event->GetModifiers(event);
352                 switch(type) {
353                     case PP_INPUTEVENT_TYPE_MOUSEDOWN:
354                         SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_PRESSED, SDL_NACL_translate_mouse_button(driverdata->ppb_mouse_input_event->GetButton(event)));
355                         break;
356                     case PP_INPUTEVENT_TYPE_MOUSEUP:
357                         SDL_SendMouseButton(mouse->focus, mouse->mouseID, SDL_RELEASED, SDL_NACL_translate_mouse_button(driverdata->ppb_mouse_input_event->GetButton(event)));
358                         break;
359                     case PP_INPUTEVENT_TYPE_WHEEL:
360                         /* FIXME: GetTicks provides high resolution scroll events */
361                         fp = driverdata->ppb_wheel_input_event->GetDelta(event);
362                         SDL_SendMouseWheel(mouse->focus, mouse->mouseID, (int) fp.x, (int) fp.y, SDL_MOUSEWHEEL_NORMAL);
363                         break;
364 
365                     case PP_INPUTEVENT_TYPE_MOUSEENTER:
366                     case PP_INPUTEVENT_TYPE_MOUSELEAVE:
367                         /* FIXME: Mouse Focus */
368                         break;
369 
370 
371                     case PP_INPUTEVENT_TYPE_MOUSEMOVE:
372                         location = driverdata->ppb_mouse_input_event->GetPosition(event);
373                         SDL_SendMouseMotion(mouse->focus, mouse->mouseID, SDL_FALSE, location.x, location.y);
374                         break;
375 
376                     case PP_INPUTEVENT_TYPE_TOUCHSTART:
377                     case PP_INPUTEVENT_TYPE_TOUCHMOVE:
378                     case PP_INPUTEVENT_TYPE_TOUCHEND:
379                     case PP_INPUTEVENT_TYPE_TOUCHCANCEL:
380                         /* FIXME: Touch events */
381                         break;
382 
383                     case PP_INPUTEVENT_TYPE_KEYDOWN:
384                         SDL_SendKeyboardKey(SDL_PRESSED, SDL_NACL_translate_keycode(driverdata->ppb_keyboard_input_event->GetKeyCode(event)));
385                         break;
386 
387                     case PP_INPUTEVENT_TYPE_KEYUP:
388                         SDL_SendKeyboardKey(SDL_RELEASED, SDL_NACL_translate_keycode(driverdata->ppb_keyboard_input_event->GetKeyCode(event)));
389                         break;
390 
391                     case PP_INPUTEVENT_TYPE_CHAR:
392                         var = driverdata->ppb_keyboard_input_event->GetCharacterText(event);
393                         str = driverdata->ppb_var->VarToUtf8(var, &str_len);
394                         /* str is not null terminated! */
395                         if ( str_len >= SDL_arraysize(text) ) {
396                             str_len = SDL_arraysize(text) - 1;
397                         }
398                         SDL_strlcpy(text, str, str_len );
399                         text[str_len] = '\0';
400 
401                         SDL_SendKeyboardText(text);
402                         /* FIXME: Do we have to handle ref counting? driverdata->ppb_var->Release(var);*/
403                         break;
404 
405                     default:
406                         break;
407                 }
408                 break;
409 
410 
411             /* From HandleMessage, contains a PP_Var. */
412             case PSE_INSTANCE_HANDLEMESSAGE:
413                 break;
414 
415             /* From DidChangeFocus, contains a PP_Bool with the current focus state. */
416             case PSE_INSTANCE_DIDCHANGEFOCUS:
417                 break;
418 
419             /* When the 3D context is lost, no resource. */
420             case PSE_GRAPHICS3D_GRAPHICS3DCONTEXTLOST:
421                 break;
422 
423             /* When the mouse lock is lost. */
424             case PSE_MOUSELOCK_MOUSELOCKLOST:
425                 break;
426 
427             default:
428                 break;
429         }
430 
431         PSEventRelease(ps_event);
432     }
433   }
434 }
435 
436 #endif /* SDL_VIDEO_DRIVER_NACL */
437 
438 /* vi: set ts=4 sw=4 expandtab: */
439