aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library_browser.js14
-rw-r--r--src/library_sdl.js36
-rwxr-xr-xtests/runner.py3
-rw-r--r--tests/sdl_resize.c45
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);
+}
+