diff --git a/src/library_browser.js b/src/library_browser.js index ccd7de3310b7b..b7b1901be3130 100644 --- a/src/library_browser.js +++ b/src/library_browser.js @@ -22,6 +22,7 @@ var LibraryBrowser = { arg: 0, // The argument that will be passed to the main loop. (of type void*) timingMode: 0, timingValue: 0, + timingInitialized: 0, currentFrameNumber: 0, queue: [], pause: function() { @@ -1037,6 +1038,9 @@ var LibraryBrowser = { // Runs natively in pthread, no __proxy needed. emscripten_set_main_loop_timing: function(mode, value) { + if (Browser.mainLoop.timingInitialized) { + return 1; + } Browser.mainLoop.timingMode = mode; Browser.mainLoop.timingValue = value; @@ -1086,6 +1090,7 @@ var LibraryBrowser = { }; Browser.mainLoop.method = 'immediate'; } + Browser.mainLoop.timingInitialized = 1; return 0; }, diff --git a/src/library_html5.js b/src/library_html5.js index 9509a7280e42c..ba897614bcd27 100644 --- a/src/library_html5.js +++ b/src/library_html5.js @@ -47,6 +47,7 @@ var LibraryJSEvents = { JSEvents.numGamepadsConnected = firstState.length; } } + Module['processWindowSelectorChange'] = JSEvents.processWindowSelectorChange; }, registerRemoveEventListeners: function() { @@ -145,6 +146,7 @@ var LibraryJSEvents = { // Stores objects representing each currently registered JS event handler. eventHandlers: [], + windowSelectorChangeHandler: 0, isInternetExplorer: function() { return navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0; }, @@ -710,6 +712,15 @@ var LibraryJSEvents = { return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; }, + processWindowSelectorChange: function() { + if (JSEvents.windowSelectorChangeHandler) { + Module.dynCall_v(JSEvents.windowSelectorChangeHandler); + } + if (GLctx) { + GLctx["clear"](GLctx["COLOR_BUFFER_BIT"] | GLctx["DEPTH_BUFFER_BIT"] | GLctx["STENCIL_BUFFER_BIT"]); + } + }, + fillPointerlockChangeEventData: function(eventStruct, e) { var pointerLockElement = document.pointerLockElement || document.mozPointerLockElement || document.webkitPointerLockElement || document.msPointerLockElement; var isPointerlocked = !!pointerLockElement; @@ -1945,6 +1956,100 @@ var LibraryJSEvents = { return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; }, + _emscripten_get_window_index_by_data: function(selector, data) { + for (var i = 0; i < selector.options.length; ++i) { + if (selector.options[i].value == data) { + return i; + } + } + return -1; + }, + + emscripten_add_window__deps: ['_emscripten_get_window_index_by_data', '$JSEvents'], + emscripten_add_window: function(title, data) { + var selector = JSEvents.findEventTarget('windowSelector'); + if (!selector) { + return {{{ cDefine('EMSCRIPTEN_RESULT_NOT_SUPPORTED') }}}; + } + if (__emscripten_get_window_index_by_data(selector, data) != -1) { + return {{{ cDefine('EMSCRIPTEN_RESULT_INVALID_PARAM') }}}; + } + var newWindowOption = document.createElement('option'); + newWindowOption.value = data; + newWindowOption.text = UTF8ToString(title); + selector.add(newWindowOption); + if (selector.options.length == 1) { + selector.selectedIndex = 0; + } + if (selector.options.length > 1) { + selector.hidden = false; + } + Module.processWindowSelectorChange(); + return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; + }, + + _emscripten_modify_window__deps: ['_emscripten_get_window_index_by_data', '$JSEvents'], + _emscripten_modify_window: function(data, func) { + var selector = JSEvents.findEventTarget('windowSelector'); + if (!selector) { + return {{{ cDefine('EMSCRIPTEN_RESULT_NOT_SUPPORTED') }}}; + } + var ind = __emscripten_get_window_index_by_data(selector, data); + if (ind != -1) { + return func(selector, ind); + } else { + return {{{ cDefine('EMSCRIPTEN_RESULT_NO_DATA') }}}; + } + }, + + emscripten_set_window_title__deps: ['_emscripten_modify_window'], + emscripten_set_window_title: function(title, data) { + __emscripten_modify_window(data, function(selector, ind) { + if (title) { + selector.options[ind].text = UTF8ToString(title); + return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; + } else { + return {{{ cDefine('EMSCRIPTEN_RESULT_INVALID_PARAM') }}}; + } + }); + }, + + emscripten_remove_window__deps: ['_emscripten_modify_window'], + emscripten_remove_window: function(data) { + __emscripten_modify_window(data, function(selector, ind) { + selector.remove(ind); + Module.processWindowSelectorChange(); + return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; + }); + }, + + emscripten_get_current_window_data__deps: ['$JSEvents'], + emscripten_get_current_window_data: function() { + var selector = JSEvents.findEventTarget('windowSelector'); + if (!selector) { + return 0; + } + var ind = selector.selectedIndex; + if (ind < 0) { + return 0; + } + return selector.options[ind].value | 0; + }, + + emscripten_set_current_window__deps: ['_emscripten_modify_window'], + emscripten_set_current_window: function(data) { + __emscripten_modify_window(data, function(selector, ind) { + selector.selectedIndex = ind; + Module.processWindowSelectorChange(); + return {{{ cDefine('EMSCRIPTEN_RESULT_SUCCESS') }}}; + }); + }, + + emscripten_set_selected_window_change_callback__deps: ['$JSEvents'], + emscripten_set_selected_window_change_callback: function(func) { + JSEvents.windowSelectorChangeHandler = func; + }, + emscripten_set_element_css_size: function(target, width, height) { if (!target) { target = Module['canvas']; diff --git a/src/shell.html b/src/shell.html index 7b494f1a7f034..1c7e2452cc4fe 100644 --- a/src/shell.html +++ b/src/shell.html @@ -1199,6 +1199,7 @@