Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/library_browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -1086,6 +1090,7 @@ var LibraryBrowser = {
};
Browser.mainLoop.method = 'immediate';
}
Browser.mainLoop.timingInitialized = 1;
return 0;
},

Expand Down
105 changes: 105 additions & 0 deletions src/library_html5.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ var LibraryJSEvents = {
JSEvents.numGamepadsConnected = firstState.length;
}
}
Module['processWindowSelectorChange'] = JSEvents.processWindowSelectorChange;
},

registerRemoveEventListeners: function() {
Expand Down Expand Up @@ -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; },

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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'];
Expand Down
1 change: 1 addition & 0 deletions src/shell.html
Original file line number Diff line number Diff line change
Expand Up @@ -1199,6 +1199,7 @@
<div class="emscripten" id="status">Downloading...</div>

<span id='controls'>
<span><select id="windowSelector" hidden="true" onchange="Module.processWindowSelectorChange()"/></span>
<span><input type="checkbox" id="resize">Resize canvas</span>
<span><input type="checkbox" id="pointerLock" checked>Lock/hide mouse pointer &nbsp;&nbsp;&nbsp;</span>
<span><input type="button" value="Fullscreen" onclick="Module.requestFullscreen(document.getElementById('pointerLock').checked,
Expand Down
8 changes: 8 additions & 0 deletions system/include/emscripten/html5.h
Original file line number Diff line number Diff line change
Expand Up @@ -441,6 +441,14 @@ extern EMSCRIPTEN_RESULT emscripten_webgl_commit_frame();
extern EMSCRIPTEN_RESULT emscripten_set_canvas_element_size(const char *target, int width, int height);
extern EMSCRIPTEN_RESULT emscripten_get_canvas_element_size(const char *target, int *width, int *height);

#define EMSCRIPTEN_HAS_WINDOW_SELECTOR
extern EMSCRIPTEN_RESULT emscripten_add_window(const char *title, void *data);
extern EMSCRIPTEN_RESULT emscripten_set_window_title(const char *title, void *data);
extern EMSCRIPTEN_RESULT emscripten_remove_window(void *data);
extern void *emscripten_get_current_window_data(void);
extern EMSCRIPTEN_RESULT emscripten_set_current_window(void *data);
extern EMSCRIPTEN_RESULT emscripten_set_selected_window_change_callback(void (*func)(void));

extern EMSCRIPTEN_RESULT emscripten_set_element_css_size(const char *target, double width, double height);
extern EMSCRIPTEN_RESULT emscripten_get_element_css_size(const char *target, double *width, double *height);

Expand Down