diff options
-rw-r--r-- | src/library_browser.js | 78 | ||||
-rw-r--r-- | src/library_sdl.js | 14 | ||||
-rw-r--r-- | src/shell.html | 8 |
3 files changed, 86 insertions, 14 deletions
diff --git a/src/library_browser.js b/src/library_browser.js index 5b19a360..d5ff4017 100644 --- a/src/library_browser.js +++ b/src/library_browser.js @@ -3,7 +3,7 @@ // Utilities for browser environments mergeInto(LibraryManager.library, { - $Browser__postset: 'Module["requestFullScreen"] = function() { Browser.requestFullScreen() };\n' + // exports + $Browser__postset: 'Module["requestFullScreen"] = function(doLockPointer, doResizeCanvas) { Browser.requestFullScreen(doLockPointer, doResizeCanvas) };\n' + // exports 'Module["requestAnimationFrame"] = function(func) { Browser.requestAnimationFrame(func) };\n' + 'Module["pauseMainLoop"] = function() { Browser.mainLoop.pause() };\n' + 'Module["resumeMainLoop"] = function() { Browser.mainLoop.resume() };\n', @@ -273,8 +273,15 @@ mergeInto(LibraryManager.library, { } return ctx; }, + destroyContext: function(canvas, useWebGL, setInModule) {}, - requestFullScreen: function() { + + storedFullScreenHandler: null, + storedPointerLockHandler: null, + requestFullScreen: function(doLockPointer, doResizeCanvas) { + if(typeof(doLockPointer)==='undefined') doLockPointer = true; + if(typeof(doResizeCanvas)==='undefined') doResizeCanvas = false; + var canvas = Module['canvas']; function fullScreenChange() { var isFullScreen = false; @@ -284,25 +291,51 @@ mergeInto(LibraryManager.library, { canvas.requestPointerLock = canvas['requestPointerLock'] || canvas['mozRequestPointerLock'] || canvas['webkitRequestPointerLock']; - canvas.requestPointerLock(); + canvas.exitPointerLock = document['exitPointerLock'] || + document['mozExitPointerLock'] || + document['webkitExitPointerLock']; + canvas.exitPointerLock = canvas.exitPointerLock.bind( document ); + canvas.cancelFullScreen = document['cancelFullScreen'] || + document['mozCancelFullScreen'] || + document['webkitCancelFullScreen']; + canvas.cancelFullScreen = canvas.cancelFullScreen.bind( document ); + if (doLockPointer) canvas.requestPointerLock(); isFullScreen = true; + if(doResizeCanvas) Browser.setFullScreenCanvasSize(); + } else if(doResizeCanvas){ + Browser.setWindowedCanvasSize(); } if (Module['onFullScreen']) Module['onFullScreen'](isFullScreen); } - document.addEventListener('fullscreenchange', fullScreenChange, false); - document.addEventListener('mozfullscreenchange', fullScreenChange, false); - document.addEventListener('webkitfullscreenchange', fullScreenChange, false); - function pointerLockChange() { Browser.pointerLock = document['pointerLockElement'] === canvas || document['mozPointerLockElement'] === canvas || document['webkitPointerLockElement'] === canvas; } + + if( !(this.storedFullScreenHandler == null) ){ + document.removeEventListener('fullscreenchange', this.storedFullScreenHandler, false); + document.removeEventListener('mozfullscreenchange', this.storedFullScreenHandler, false); + document.removeEventListener('webkitfullscreenchange', this.storedFullScreenHandler, false); + this.storedFullScreenHandler = null; + } + if( !(this.storedPointerLockHandler == null) ){ + document.addEventListener('pointerlockchange', this.storedPointerLockHandler, false); + document.addEventListener('mozpointerlockchange', this.storedPointerLockHandler, false); + document.addEventListener('webkitpointerlockchange', this.storedPointerLockHandler, false); + this.storedPointerLockHandler = null; + } + + this.storedFullScreenHandler = fullScreenChange; + document.addEventListener('fullscreenchange', this.storedFullScreenHandler, false); + document.addEventListener('mozfullscreenchange', this.storedFullScreenHandler, false); + document.addEventListener('webkitfullscreenchange', this.storedFullScreenHandler, false); - document.addEventListener('pointerlockchange', pointerLockChange, false); - document.addEventListener('mozpointerlockchange', pointerLockChange, false); - document.addEventListener('webkitpointerlockchange', pointerLockChange, false); + this.storedPointerLockHandler = pointerLockChange; + document.addEventListener('pointerlockchange', this.storedPointerLockHandler, false); + document.addEventListener('mozpointerlockchange', this.storedPointerLockHandler, false); + document.addEventListener('webkitpointerlockchange', this.storedPointerLockHandler, false); canvas.requestFullScreen = canvas['requestFullScreen'] || canvas['mozRequestFullScreen'] || @@ -380,7 +413,32 @@ mergeInto(LibraryManager.library, { canvas.width = width; canvas.height = height; if (!noUpdates) Browser.updateResizeListeners(); + }, + + windowedWidth: 0, + windowedHeight: 0, + setFullScreenCanvasSize: function() { + var canvas = Module['canvas']; + this.windowedWidth = canvas.width; + this.windowedHeight = canvas.height; + canvas.width = screen.width; + canvas.height = screen.height; + var flags = {{{ makeGetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'i32', 0, 1) }}}; + flags = flags | 0x00800000; + {{{ makeSetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'flags', 'i32') }}} + Browser.updateResizeListeners(); + }, + + setWindowedCanvasSize: function() { + var canvas = Module['canvas']; + canvas.width = this.windowedWidth; + canvas.height = this.windowedHeight; + var flags = {{{ makeGetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'i32', 0, 1) }}}; + flags = flags & ~0x00800000; + {{{ makeSetValue('SDL.screen+Runtime.QUANTUM_SIZE*0', '0', 'flags', 'i32') }}} + Browser.updateResizeListeners(); } + }, emscripten_async_wget: function(url, file, onload, onerror) { diff --git a/src/library_sdl.js b/src/library_sdl.js index d707a8bf..ec3c5455 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -661,8 +661,8 @@ var LibrarySDL = { {{{ makeSetValue('ret+Runtime.QUANTUM_SIZE*0', '0', '0', 'i32') }}} // TODO {{{ makeSetValue('ret+Runtime.QUANTUM_SIZE*1', '0', '0', 'i32') }}} // TODO {{{ makeSetValue('ret+Runtime.QUANTUM_SIZE*2', '0', '0', 'void*') }}} - {{{ makeSetValue('ret+Runtime.QUANTUM_SIZE*3', '0', 'SDL.defaults.width', 'i32') }}} - {{{ makeSetValue('ret+Runtime.QUANTUM_SIZE*4', '0', 'SDL.defaults.height', 'i32') }}} + {{{ makeSetValue('ret+Runtime.QUANTUM_SIZE*3', '0', 'Module[\'canvas\'].width', 'i32') }}} + {{{ makeSetValue('ret+Runtime.QUANTUM_SIZE*4', '0', 'Module[\'canvas\'].height', 'i32') }}} return ret; }, @@ -919,7 +919,11 @@ var LibrarySDL = { }, SDL_ShowCursor: function(toggle) { - // TODO + if(toggle){ + Module['canvas'].exitPointerLock(); + } else { + Module['canvas'].requestPointerLock(); + } }, SDL_GetError: function() { @@ -1075,6 +1079,10 @@ var LibrarySDL = { }, SDL_WM_GrabInput: function() {}, + + SDL_WM_ToggleFullScreen: function(surf) { + Module['canvas'].cancelFullScreen(); + }, // SDL_Image diff --git a/src/shell.html b/src/shell.html index 4f39b26a..3341e2b9 100644 --- a/src/shell.html +++ b/src/shell.html @@ -19,7 +19,13 @@ </div> <canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()"></canvas> <hr/> - <div class="emscripten"><input type="button" value="fullscreen" onclick="Module.requestFullScreen()"></div> + <div class="emscripten"> + <input type="button" value="only fullscreen" onclick="Module.requestFullScreen(false, false)"> + <input type="button" value="fullscreen + resize" onclick="Module.requestFullScreen(false, true)"> + <input type="button" value="fullscreen + pointerLock" onclick="Module.requestFullScreen()"> <!--default--> + <input type="button" value="fullscreen + pointerLock + resize" onclick="Module.requestFullScreen( true, true)"> + </div> + <hr/> <textarea class="emscripten" id="output" rows="8"></textarea> <hr> |