diff options
-rw-r--r-- | src/library_browser.js | 14 | ||||
-rw-r--r-- | src/library_sdl.js | 36 | ||||
-rwxr-xr-x | tests/runner.py | 3 | ||||
-rw-r--r-- | tests/sdl_resize.c | 45 |
4 files changed, 94 insertions, 4 deletions
diff --git a/src/library_browser.js b/src/library_browser.js index fc8cb84c..673f1ff4 100644 --- a/src/library_browser.js +++ b/src/library_browser.js @@ -347,11 +347,21 @@ mergeInto(LibraryManager.library, { }); addRunDependency('al ' + url); }, - - setCanvasSize: function(width, height) { + + resizeListeners: [], + + updateResizeListeners: function() { + var canvas = Module['canvas']; + Browser.resizeListeners.forEach(function(listener) { + listener(canvas.width, canvas.height); + }); + }, + + setCanvasSize: function(width, height, noUpdates) { var canvas = Module['canvas']; canvas.width = width; canvas.height = height; + if (!noUpdates) Browser.updateResizeListeners(); } }, diff --git a/src/library_sdl.js b/src/library_sdl.js index a04d3462..a77a4668 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -3,6 +3,12 @@ // See browser tests for examples (tests/runner.py, search for sdl_). Run with // python tests/runner.py browser +// Notes: +// SDL_VIDEORESIZE: This is sent when the canvas is resized. Note that the user +// cannot manually do so, so this is only sent when the +// program manually resizes it (emscripten_set_canvas_size +// or otherwise). + var LibrarySDL = { $SDL__deps: ['$FS', '$Browser'], $SDL: { @@ -189,6 +195,11 @@ var LibrarySDL = { ['i32', 'x'], ['i32', 'y'] ]), + ResizeEvent: Runtime.generateStructInfo([ + ['i32', 'type'], + ['i32', 'w'], + ['i32', 'h'] + ]), AudioSpec: Runtime.generateStructInfo([ ['i32', 'freq'], ['i16', 'format'], @@ -411,6 +422,9 @@ var LibrarySDL = { // Force-run a main event loop, since otherwise this event will never be caught! Browser.mainLoop.runner(); return true; + case 'resize': + SDL.events.push(event); + break; } return false; }, @@ -515,6 +529,12 @@ var LibrarySDL = { {{{ makeSetValue('ptr', 'SDL.structs.KeyboardEvent.type', 'SDL.DOMEventToSDLEvent[event.type]', 'i32') }}}; break; } + case 'resize': { + {{{ makeSetValue('ptr', 'SDL.structs.KeyboardEvent.type', 'SDL.DOMEventToSDLEvent[event.type]', 'i32') }}}; + {{{ makeSetValue('ptr', 'SDL.structs.ResizeEvent.w', 'event.w', 'i32') }}}; + {{{ makeSetValue('ptr', 'SDL.structs.ResizeEvent.h', 'event.h', 'i32') }}}; + break; + } default: throw 'Unhandled SDL event: ' + event.type; } }, @@ -598,6 +618,7 @@ var LibrarySDL = { SDL.DOMEventToSDLEvent['mouseup'] = 0x402 /* SDL_MOUSEBUTTONUP */; SDL.DOMEventToSDLEvent['mousemove'] = 0x400 /* SDL_MOUSEMOTION */; SDL.DOMEventToSDLEvent['unload'] = 0x100 /* SDL_QUIT */; + SDL.DOMEventToSDLEvent['resize'] = 0x7001 /* SDL_VIDEORESIZE/SDL_EVENT_COMPAT2 */; return 0; // success }, @@ -659,8 +680,19 @@ var LibrarySDL = { ['mousedown', 'mouseup', 'mousemove', 'DOMMouseScroll', 'mousewheel', 'mouseout'].forEach(function(event) { Module['canvas'].addEventListener(event, SDL.receiveEvent, true); }); - Browser.setCanvasSize(width, height); - return SDL.screen = SDL.makeSurface(width, height, flags, true, 'screen'); + Browser.setCanvasSize(width, height, true); + SDL.screen = SDL.makeSurface(width, height, flags, true, 'screen'); + if (!SDL.addedResizeListener) { + SDL.addedResizeListener = true; + Browser.resizeListeners.push(function(w, h) { + SDL.receiveEvent({ + type: 'resize', + w: w, + h: h + }); + }); + } + return SDL.screen; }, SDL_GetVideoSurface: function() { diff --git a/tests/runner.py b/tests/runner.py index db566c3f..d965e3e7 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -8850,6 +8850,9 @@ elif 'browser' in str(sys.argv): def test_sdl_quit(self): self.btest('sdl_quit.c', '1') + def test_sdl_resize(self): + self.btest('sdl_resize.c', '1') + def test_gc(self): self.btest('browser_gc.cpp', '1') diff --git a/tests/sdl_resize.c b/tests/sdl_resize.c new file mode 100644 index 00000000..dc3b374e --- /dev/null +++ b/tests/sdl_resize.c @@ -0,0 +1,45 @@ +#include <stdio.h> +#include <SDL/SDL.h> +#include <SDL/SDL_ttf.h> +#include <assert.h> +#include <emscripten.h> + +int stage = 0; + +void loop() { + SDL_Event event; + while (SDL_PollEvent(&event)) { + switch(event.type) { + case SDL_VIDEORESIZE: { + SDL_ResizeEvent *r = (SDL_ResizeEvent*)&event; + printf("resize event! %d:%d\n", r->w, r->h); + switch (stage) { + case 0: + assert(r->w == 100); + assert(r->h == 200); + emscripten_set_canvas_size(123, 246); + stage++; + break; + case 1: + assert(r->w == 123); + assert(r->h == 246); + int result = 1; + REPORT_RESULT(); + break; + } + } + } + } +} + +void main_2(); + +int main() { + SDL_Init(SDL_INIT_VIDEO); + SDL_Surface *screen = SDL_SetVideoMode(600, 450, 32, SDL_HWSURFACE); + + emscripten_set_canvas_size(100, 200); + + emscripten_set_main_loop(loop, 0, 0); +} + |