diff options
-rw-r--r-- | src/library_sdl.js | 46 | ||||
-rw-r--r-- | system/include/SDL/SDL_events.h | 7 |
2 files changed, 43 insertions, 10 deletions
diff --git a/src/library_sdl.js b/src/library_sdl.js index 7145a7ba..53adf8eb 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; }, @@ -749,6 +755,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') { @@ -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,11 @@ var LibrarySDL = { SDL.handleEvent(event); }); }, + + SDL_SetEventHandler: function(_handler, _userdata){ + SDL.eventHandler = _handler; + SDL.eventHandlerContext = _userdata; + }, SDL_SetColors: function(surf, colors, firstColor, nColors) { var surfData = SDL.surfaces[surf]; diff --git a/system/include/SDL/SDL_events.h b/system/include/SDL/SDL_events.h index 183ea4b2..971282db 100644 --- a/system/include/SDL/SDL_events.h +++ b/system/include/SDL/SDL_events.h @@ -615,6 +615,13 @@ extern DECLSPEC void SDLCALL SDL_DelEventWatch(SDL_EventFilter filter, extern DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter, void *userdata); +/** + * Use instead of SDL_PollEvent. Your application will be called whenever there + * are events available. + */ +extern DECLSPEC void SDLCALL SDL_SetEventHandler(SDL_EventFilter handler, + void *userdata); + /*@{*/ #define SDL_QUERY -1 #define SDL_IGNORE 0 |