diff options
author | juj <jujjyl@gmail.com> | 2014-06-11 02:32:19 +0300 |
---|---|---|
committer | juj <jujjyl@gmail.com> | 2014-06-11 02:32:19 +0300 |
commit | 801199434faea49d88e92bd1891985a98453d6c4 (patch) | |
tree | 49542020e312c1145006e1cfed73d2aa53600851 /src/library_sdl.js | |
parent | e4c7ddc813f9376f62c47560bec4b1c1a8974070 (diff) | |
parent | 2126f7bdcdfe83dcfa9090f4473d7e39d0577bd6 (diff) |
Merge pull request #2417 from juj/emscripten_SDL_SetEventHandler
Emscripten sdl set event handler
Diffstat (limited to 'src/library_sdl.js')
-rw-r--r-- | src/library_sdl.js | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/src/library_sdl.js b/src/library_sdl.js index 7145a7ba..0cd1d27d 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -84,6 +84,9 @@ var LibrarySDL = { TOUCH_DEFAULT_ID: 0, // Our default deviceID for touch events (we get nothing from the browser) + eventHandler: null, + eventHandlerContext: null, + keyCodes: { // DOM code ==> SDL code. See https://developer.mozilla.org/en/Document_Object_Model_%28DOM%29/KeyboardEvent and SDL_keycode.h // For keys that don't have unicode value, we map DOM codes with the corresponding scan codes + 1024 (using "| 1 << 10") 16: 225 | 1<<10, // shift @@ -699,6 +702,9 @@ var LibrarySDL = { Module.printErr('SDL event queue full, dropping events'); SDL.events = SDL.events.slice(0, 10000); } + // If we have a handler installed, this will push the events to the app + // instead of the app polling for them. + SDL.flushEventsToHandler(); return; }, @@ -750,6 +756,30 @@ var LibrarySDL = { } }, + flushEventsToHandler: function() { + if (!SDL.eventHandler) return; + + // All SDLEvents take the same amount of memory + var sdlEventPtr = allocate({{{ C_STRUCTS.SDL_KeyboardEvent.__size__ }}}, "i8", ALLOC_STACK); + + while (SDL.pollEvent(sdlEventPtr)) { + Runtime.dynCall('iii', SDL.eventHandler, [SDL.eventHandlerContext, sdlEventPtr]); + } + }, + + pollEvent: function(ptr) { + if (SDL.initFlags & 0x200 && SDL.joystickEventState) { + // If SDL_INIT_JOYSTICK was supplied AND the joystick system is configured + // to automatically query for events, query for joystick events. + SDL.queryJoysticks(); + } + if (SDL.events.length === 0) return 0; + if (ptr) { + SDL.makeCEvent(SDL.events.shift(), ptr); + } + return 1; + }, + makeCEvent: function(event, ptr) { if (typeof event === 'number') { // This is a pointer to a native C event that was SDL_PushEvent'ed @@ -1709,16 +1739,7 @@ var LibrarySDL = { }, SDL_PollEvent: function(ptr) { - if (SDL.initFlags & 0x200 && SDL.joystickEventState) { - // If SDL_INIT_JOYSTICK was supplied AND the joystick system is configured - // to automatically query for events, query for joystick events. - SDL.queryJoysticks(); - } - if (SDL.events.length === 0) return 0; - if (ptr) { - SDL.makeCEvent(SDL.events.shift(), ptr); - } - return 1; + return SDL.pollEvent(ptr); }, SDL_PushEvent: function(ptr) { @@ -1758,6 +1779,13 @@ var LibrarySDL = { SDL.handleEvent(event); }); }, + + // An Emscripten-specific extension to SDL: Some browser APIs require that they are called from within an event handler function. + // Allow recording a callback that will be called for each received event. + emscripten_SDL_SetEventHandler: function(handler, userdata) { + SDL.eventHandler = handler; + SDL.eventHandlerContext = userdata; + }, SDL_SetColors: function(surf, colors, firstColor, nColors) { var surfData = SDL.surfaces[surf]; |