diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-04-17 21:18:17 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-04-17 21:18:17 -0700 |
commit | 327b6f859e95be71e5613f24cc1c9d4f4b97c15f (patch) | |
tree | 2e20c2261892aa04cdcc7b8a901d9cc020621ba7 | |
parent | 735637e9a10049f69525d57d3e50f4ad0b90850e (diff) |
some support for SDL_PeepEvents
-rw-r--r-- | src/library_sdl.js | 36 | ||||
-rw-r--r-- | tests/sdl_mouse.c | 4 |
2 files changed, 35 insertions, 5 deletions
diff --git a/src/library_sdl.js b/src/library_sdl.js index ccc2c590..f71527af 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -96,6 +96,14 @@ var LibrarySDL = { mouseX: 0, mouseY: 0, + DOMEventToSDLEvent: { + 'keydown': 0x300, + 'keyup': 0x301, + 'mousedown': 0x401, + 'mouseup': 0x402, + 'mousemove': 0x400 + }, + keyCodes: { // DOM code ==> SDL code 38: 1106, // up arrow 40: 1105, // down arrow @@ -334,7 +342,7 @@ var LibrarySDL = { makeCEvent: function(event, ptr) { if (typeof event === 'number') { // This is a pointer to a native C event that was SDL_PushEvent'ed - _memcpy(ptr, event, SDL.structs.KeyboardEvent.__size__); + _memcpy(ptr, event, SDL.structs.KeyboardEvent.__size__); // XXX return; } @@ -347,7 +355,7 @@ var LibrarySDL = { key = String.fromCharCode(key).toLowerCase().charCodeAt(0); } var scan = SDL.scanCodes[key] || key; - {{{ makeSetValue('ptr', 'SDL.structs.KeyboardEvent.type', 'down ? 0x300 : 0x301', 'i32') }}} + {{{ makeSetValue('ptr', 'SDL.structs.KeyboardEvent.type', 'SDL.DOMEventToSDLEvent[event.type]', 'i32') }}} //{{{ makeSetValue('ptr', 'SDL.structs.KeyboardEvent.which', '1', 'i32') }}} {{{ makeSetValue('ptr', 'SDL.structs.KeyboardEvent.state', 'down ? 1 : 0', 'i8') }}} {{{ makeSetValue('ptr', 'SDL.structs.KeyboardEvent.repeat', '0', 'i8') }}} // TODO @@ -366,13 +374,13 @@ var LibrarySDL = { var y = event.pageY - Module['canvas'].offsetTop; if (event.type != 'mousemove') { var down = event.type === 'mousedown'; - {{{ makeSetValue('ptr', 'SDL.structs.MouseButtonEvent.type', 'down ? 0x401 : 0x402', 'i32') }}}; + {{{ makeSetValue('ptr', 'SDL.structs.MouseButtonEvent.type', 'SDL.DOMEventToSDLEvent[event.type]', 'i32') }}}; {{{ makeSetValue('ptr', 'SDL.structs.MouseButtonEvent.button', 'event.button+1', 'i8') }}}; // DOM buttons are 0-2, SDL 1-3 {{{ makeSetValue('ptr', 'SDL.structs.MouseButtonEvent.state', 'down ? 1 : 0', 'i8') }}}; {{{ makeSetValue('ptr', 'SDL.structs.MouseButtonEvent.x', 'x', 'i32') }}}; {{{ makeSetValue('ptr', 'SDL.structs.MouseButtonEvent.y', 'y', 'i32') }}}; } else { - {{{ makeSetValue('ptr', 'SDL.structs.MouseMotionEvent.type', '0x400', 'i32') }}}; + {{{ makeSetValue('ptr', 'SDL.structs.MouseMotionEvent.type', 'SDL.DOMEventToSDLEvent[event.type]', 'i32') }}}; {{{ makeSetValue('ptr', 'SDL.structs.MouseMotionEvent.button', 'event.button', 'i8') }}}; {{{ makeSetValue('ptr', 'SDL.structs.MouseMotionEvent.state', 'down ? 1 : 0', 'i8') }}}; {{{ makeSetValue('ptr', 'SDL.structs.MouseMotionEvent.x', 'x', 'i32') }}}; @@ -684,10 +692,28 @@ var LibrarySDL = { SDL_PushEvent: function(ptr) { SDL.events.push(ptr); // XXX Should we copy it? Not clear from API - return 0; }, + SDL_PeepEvents: function(events, numEvents, action, from, to) { + switch(action) { + case 2: { // SDL_GETEVENT + assert(numEvents == 1); + var got = 0; + while (SDL.events.length > 0 && numEvents > 0) { + var type = SDL.DOMEventToSDLEvent[SDL.events[0].type]; + if (type < from || type > to) break; + SDL.makeCEvent(SDL.events.shift(), events); + got++; + numEvents--; + // events += sizeof(..) + } + return got; + } + default: throw 'SDL_PeepEvents does not yet support that action: ' + action; + } + }, + SDL_PumpEvents: function(){}, SDL_SetColors: function(surf, colors, firstColor, nColors) { diff --git a/tests/sdl_mouse.c b/tests/sdl_mouse.c index dae3f636..7fc14638 100644 --- a/tests/sdl_mouse.c +++ b/tests/sdl_mouse.c @@ -33,6 +33,9 @@ void one() { SDL_MouseButtonEvent *m = (SDL_MouseButtonEvent*)&event; printf("button up: %d,%d %d,%d\n", m->button, m->state, m->x, m->y); result += 5 * (m->button + m->state + m->x + m->y); + // Remove another click we want to ignore + assert(SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONDOWN) == 1); + assert(SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_MOUSEBUTTONUP, SDL_MOUSEBUTTONUP) == 1); break; } } @@ -48,6 +51,7 @@ int main() { emscripten_run_script("simulateMouseEvent(10, 20, -1)"); // move from 0,0 to 10,20 emscripten_run_script("simulateMouseEvent(10, 20, 0)"); // click + emscripten_run_script("simulateMouseEvent(10, 20, 0)"); // click some more, but this one should be ignored through PeepEvent emscripten_run_script("simulateMouseEvent(30, 77, -1)"); // move some more emscripten_run_script("simulateMouseEvent(30, 77, 1)"); // trigger the end |