[HTML5] Refactor JS library listeners to OS.
This commit is contained in:
parent
c494e442bc
commit
68616edcbc
|
@ -15,7 +15,7 @@ module.exports = {
|
||||||
"IDBFS": true,
|
"IDBFS": true,
|
||||||
"GodotOS": true,
|
"GodotOS": true,
|
||||||
"GodotConfig": true,
|
"GodotConfig": true,
|
||||||
"GodotDisplayListeners": true,
|
"GodotEventListeners": true,
|
||||||
"GodotRuntime": true,
|
"GodotRuntime": true,
|
||||||
"GodotFS": true,
|
"GodotFS": true,
|
||||||
"IDHandler": true,
|
"IDHandler": true,
|
||||||
|
|
|
@ -28,49 +28,9 @@
|
||||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* Display Server listeners.
|
|
||||||
* Keeps track of registered event listeners so it can remove them on shutdown.
|
|
||||||
*/
|
|
||||||
const GodotDisplayListeners = {
|
|
||||||
$GodotDisplayListeners__deps: ['$GodotOS'],
|
|
||||||
$GodotDisplayListeners__postset: 'GodotOS.atexit(function(resolve, reject) { GodotDisplayListeners.clear(); resolve(); });',
|
|
||||||
$GodotDisplayListeners: {
|
|
||||||
handlers: [],
|
|
||||||
|
|
||||||
has: function (target, event, method, capture) {
|
|
||||||
return GodotDisplayListeners.handlers.findIndex(function (e) {
|
|
||||||
return e.target === target && e.event === event && e.method === method && e.capture === capture;
|
|
||||||
}) !== -1;
|
|
||||||
},
|
|
||||||
|
|
||||||
add: function (target, event, method, capture) {
|
|
||||||
if (GodotDisplayListeners.has(target, event, method, capture)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
function Handler(p_target, p_event, p_method, p_capture) {
|
|
||||||
this.target = p_target;
|
|
||||||
this.event = p_event;
|
|
||||||
this.method = p_method;
|
|
||||||
this.capture = p_capture;
|
|
||||||
}
|
|
||||||
GodotDisplayListeners.handlers.push(new Handler(target, event, method, capture));
|
|
||||||
target.addEventListener(event, method, capture);
|
|
||||||
},
|
|
||||||
|
|
||||||
clear: function () {
|
|
||||||
GodotDisplayListeners.handlers.forEach(function (h) {
|
|
||||||
h.target.removeEventListener(h.event, h.method, h.capture);
|
|
||||||
});
|
|
||||||
GodotDisplayListeners.handlers.length = 0;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
mergeInto(LibraryManager.library, GodotDisplayListeners);
|
|
||||||
|
|
||||||
const GodotDisplayVK = {
|
const GodotDisplayVK = {
|
||||||
|
|
||||||
$GodotDisplayVK__deps: ['$GodotRuntime', '$GodotConfig', '$GodotDisplayListeners'],
|
$GodotDisplayVK__deps: ['$GodotRuntime', '$GodotConfig', '$GodotEventListeners'],
|
||||||
$GodotDisplayVK__postset: 'GodotOS.atexit(function(resolve, reject) { GodotDisplayVK.clear(); resolve(); });',
|
$GodotDisplayVK__postset: 'GodotOS.atexit(function(resolve, reject) { GodotDisplayVK.clear(); resolve(); });',
|
||||||
$GodotDisplayVK: {
|
$GodotDisplayVK: {
|
||||||
textinput: null,
|
textinput: null,
|
||||||
|
@ -96,12 +56,12 @@ const GodotDisplayVK = {
|
||||||
elem.style.outline = 'none';
|
elem.style.outline = 'none';
|
||||||
elem.readonly = true;
|
elem.readonly = true;
|
||||||
elem.disabled = true;
|
elem.disabled = true;
|
||||||
GodotDisplayListeners.add(elem, 'input', function (evt) {
|
GodotEventListeners.add(elem, 'input', function (evt) {
|
||||||
const c_str = GodotRuntime.allocString(elem.value);
|
const c_str = GodotRuntime.allocString(elem.value);
|
||||||
input_cb(c_str, elem.selectionEnd);
|
input_cb(c_str, elem.selectionEnd);
|
||||||
GodotRuntime.free(c_str);
|
GodotRuntime.free(c_str);
|
||||||
}, false);
|
}, false);
|
||||||
GodotDisplayListeners.add(elem, 'blur', function (evt) {
|
GodotEventListeners.add(elem, 'blur', function (evt) {
|
||||||
elem.style.display = 'none';
|
elem.style.display = 'none';
|
||||||
elem.readonly = true;
|
elem.readonly = true;
|
||||||
elem.disabled = true;
|
elem.disabled = true;
|
||||||
|
@ -334,7 +294,7 @@ mergeInto(LibraryManager.library, GodotDisplayScreen);
|
||||||
* Exposes all the functions needed by DisplayServer implementation.
|
* Exposes all the functions needed by DisplayServer implementation.
|
||||||
*/
|
*/
|
||||||
const GodotDisplay = {
|
const GodotDisplay = {
|
||||||
$GodotDisplay__deps: ['$GodotConfig', '$GodotRuntime', '$GodotDisplayCursor', '$GodotDisplayListeners', '$GodotDisplayScreen', '$GodotDisplayVK'],
|
$GodotDisplay__deps: ['$GodotConfig', '$GodotRuntime', '$GodotDisplayCursor', '$GodotEventListeners', '$GodotDisplayScreen', '$GodotDisplayVK'],
|
||||||
$GodotDisplay: {
|
$GodotDisplay: {
|
||||||
window_icon: '',
|
window_icon: '',
|
||||||
findDPI: function () {
|
findDPI: function () {
|
||||||
|
@ -588,15 +548,15 @@ const GodotDisplay = {
|
||||||
func(GodotDisplayScreen.isFullscreen());
|
func(GodotDisplayScreen.isFullscreen());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GodotDisplayListeners.add(document, 'fullscreenchange', change_cb, false);
|
GodotEventListeners.add(document, 'fullscreenchange', change_cb, false);
|
||||||
GodotDisplayListeners.add(document, 'mozfullscreenchange', change_cb, false);
|
GodotEventListeners.add(document, 'mozfullscreenchange', change_cb, false);
|
||||||
GodotDisplayListeners.add(document, 'webkitfullscreenchange', change_cb, false);
|
GodotEventListeners.add(document, 'webkitfullscreenchange', change_cb, false);
|
||||||
},
|
},
|
||||||
|
|
||||||
godot_js_display_window_blur_cb__sig: 'vi',
|
godot_js_display_window_blur_cb__sig: 'vi',
|
||||||
godot_js_display_window_blur_cb: function (callback) {
|
godot_js_display_window_blur_cb: function (callback) {
|
||||||
const func = GodotRuntime.get_func(callback);
|
const func = GodotRuntime.get_func(callback);
|
||||||
GodotDisplayListeners.add(window, 'blur', function () {
|
GodotEventListeners.add(window, 'blur', function () {
|
||||||
func();
|
func();
|
||||||
}, false);
|
}, false);
|
||||||
},
|
},
|
||||||
|
@ -607,7 +567,7 @@ const GodotDisplay = {
|
||||||
const func = GodotRuntime.get_func(callback);
|
const func = GodotRuntime.get_func(callback);
|
||||||
const notif = [p_enter, p_exit, p_in, p_out];
|
const notif = [p_enter, p_exit, p_in, p_out];
|
||||||
['mouseover', 'mouseleave', 'focus', 'blur'].forEach(function (evt_name, idx) {
|
['mouseover', 'mouseleave', 'focus', 'blur'].forEach(function (evt_name, idx) {
|
||||||
GodotDisplayListeners.add(canvas, evt_name, function () {
|
GodotEventListeners.add(canvas, evt_name, function () {
|
||||||
func(notif[idx]);
|
func(notif[idx]);
|
||||||
}, true);
|
}, true);
|
||||||
});
|
});
|
||||||
|
@ -616,10 +576,10 @@ const GodotDisplay = {
|
||||||
godot_js_display_setup_canvas__sig: 'viiii',
|
godot_js_display_setup_canvas__sig: 'viiii',
|
||||||
godot_js_display_setup_canvas: function (p_width, p_height, p_fullscreen, p_hidpi) {
|
godot_js_display_setup_canvas: function (p_width, p_height, p_fullscreen, p_hidpi) {
|
||||||
const canvas = GodotConfig.canvas;
|
const canvas = GodotConfig.canvas;
|
||||||
GodotDisplayListeners.add(canvas, 'contextmenu', function (ev) {
|
GodotEventListeners.add(canvas, 'contextmenu', function (ev) {
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
}, false);
|
}, false);
|
||||||
GodotDisplayListeners.add(canvas, 'webglcontextlost', function (ev) {
|
GodotEventListeners.add(canvas, 'webglcontextlost', function (ev) {
|
||||||
alert('WebGL context lost, please reload the page'); // eslint-disable-line no-alert
|
alert('WebGL context lost, please reload the page'); // eslint-disable-line no-alert
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
}, false);
|
}, false);
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
* Gamepad API helper.
|
* Gamepad API helper.
|
||||||
*/
|
*/
|
||||||
const GodotInputGamepads = {
|
const GodotInputGamepads = {
|
||||||
$GodotInputGamepads__deps: ['$GodotRuntime', '$GodotDisplayListeners'],
|
$GodotInputGamepads__deps: ['$GodotRuntime', '$GodotEventListeners'],
|
||||||
$GodotInputGamepads: {
|
$GodotInputGamepads: {
|
||||||
samples: [],
|
samples: [],
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ const GodotInputGamepads = {
|
||||||
},
|
},
|
||||||
|
|
||||||
init: function (onchange) {
|
init: function (onchange) {
|
||||||
GodotDisplayListeners.samples = [];
|
GodotEventListeners.samples = [];
|
||||||
function add(pad) {
|
function add(pad) {
|
||||||
const guid = GodotInputGamepads.get_guid(pad);
|
const guid = GodotInputGamepads.get_guid(pad);
|
||||||
const c_id = GodotRuntime.allocString(pad.id);
|
const c_id = GodotRuntime.allocString(pad.id);
|
||||||
|
@ -103,10 +103,10 @@ const GodotInputGamepads = {
|
||||||
add(pads[i]);
|
add(pads[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GodotDisplayListeners.add(window, 'gamepadconnected', function (evt) {
|
GodotEventListeners.add(window, 'gamepadconnected', function (evt) {
|
||||||
add(evt.gamepad);
|
add(evt.gamepad);
|
||||||
}, false);
|
}, false);
|
||||||
GodotDisplayListeners.add(window, 'gamepaddisconnected', function (evt) {
|
GodotEventListeners.add(window, 'gamepaddisconnected', function (evt) {
|
||||||
onchange(evt.gamepad.index, 0);
|
onchange(evt.gamepad.index, 0);
|
||||||
}, false);
|
}, false);
|
||||||
},
|
},
|
||||||
|
@ -334,7 +334,7 @@ mergeInto(LibraryManager.library, GodotInputDragDrop);
|
||||||
* Godot exposed input functions.
|
* Godot exposed input functions.
|
||||||
*/
|
*/
|
||||||
const GodotInput = {
|
const GodotInput = {
|
||||||
$GodotInput__deps: ['$GodotRuntime', '$GodotConfig', '$GodotDisplayListeners', '$GodotInputGamepads', '$GodotInputDragDrop'],
|
$GodotInput__deps: ['$GodotRuntime', '$GodotConfig', '$GodotEventListeners', '$GodotInputGamepads', '$GodotInputDragDrop'],
|
||||||
$GodotInput: {
|
$GodotInput: {
|
||||||
getModifiers: function (evt) {
|
getModifiers: function (evt) {
|
||||||
return (evt.shiftKey + 0) + ((evt.altKey + 0) << 1) + ((evt.ctrlKey + 0) << 2) + ((evt.metaKey + 0) << 3);
|
return (evt.shiftKey + 0) + ((evt.altKey + 0) << 1) + ((evt.ctrlKey + 0) << 2) + ((evt.metaKey + 0) << 3);
|
||||||
|
@ -367,7 +367,7 @@ const GodotInput = {
|
||||||
const modifiers = GodotInput.getModifiers(evt);
|
const modifiers = GodotInput.getModifiers(evt);
|
||||||
func(pos[0], pos[1], rel_pos_x, rel_pos_y, modifiers);
|
func(pos[0], pos[1], rel_pos_x, rel_pos_y, modifiers);
|
||||||
}
|
}
|
||||||
GodotDisplayListeners.add(window, 'mousemove', move_cb, false);
|
GodotEventListeners.add(window, 'mousemove', move_cb, false);
|
||||||
},
|
},
|
||||||
|
|
||||||
godot_js_input_mouse_wheel_cb__sig: 'vi',
|
godot_js_input_mouse_wheel_cb__sig: 'vi',
|
||||||
|
@ -378,7 +378,7 @@ const GodotInput = {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GodotDisplayListeners.add(GodotConfig.canvas, 'wheel', wheel_cb, false);
|
GodotEventListeners.add(GodotConfig.canvas, 'wheel', wheel_cb, false);
|
||||||
},
|
},
|
||||||
|
|
||||||
godot_js_input_mouse_button_cb__sig: 'vi',
|
godot_js_input_mouse_button_cb__sig: 'vi',
|
||||||
|
@ -393,8 +393,8 @@ const GodotInput = {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GodotDisplayListeners.add(canvas, 'mousedown', button_cb.bind(null, 1), false);
|
GodotEventListeners.add(canvas, 'mousedown', button_cb.bind(null, 1), false);
|
||||||
GodotDisplayListeners.add(window, 'mouseup', button_cb.bind(null, 0), false);
|
GodotEventListeners.add(window, 'mouseup', button_cb.bind(null, 0), false);
|
||||||
},
|
},
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -419,10 +419,10 @@ const GodotInput = {
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GodotDisplayListeners.add(canvas, 'touchstart', touch_cb.bind(null, 0), false);
|
GodotEventListeners.add(canvas, 'touchstart', touch_cb.bind(null, 0), false);
|
||||||
GodotDisplayListeners.add(canvas, 'touchend', touch_cb.bind(null, 1), false);
|
GodotEventListeners.add(canvas, 'touchend', touch_cb.bind(null, 1), false);
|
||||||
GodotDisplayListeners.add(canvas, 'touchcancel', touch_cb.bind(null, 1), false);
|
GodotEventListeners.add(canvas, 'touchcancel', touch_cb.bind(null, 1), false);
|
||||||
GodotDisplayListeners.add(canvas, 'touchmove', touch_cb.bind(null, 2), false);
|
GodotEventListeners.add(canvas, 'touchmove', touch_cb.bind(null, 2), false);
|
||||||
},
|
},
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -438,8 +438,8 @@ const GodotInput = {
|
||||||
func(pressed, evt.repeat, modifiers);
|
func(pressed, evt.repeat, modifiers);
|
||||||
evt.preventDefault();
|
evt.preventDefault();
|
||||||
}
|
}
|
||||||
GodotDisplayListeners.add(GodotConfig.canvas, 'keydown', key_cb.bind(null, 1), false);
|
GodotEventListeners.add(GodotConfig.canvas, 'keydown', key_cb.bind(null, 1), false);
|
||||||
GodotDisplayListeners.add(GodotConfig.canvas, 'keyup', key_cb.bind(null, 0), false);
|
GodotEventListeners.add(GodotConfig.canvas, 'keyup', key_cb.bind(null, 0), false);
|
||||||
},
|
},
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -502,18 +502,18 @@ const GodotInput = {
|
||||||
GodotRuntime.freeStringArray(argv, argc);
|
GodotRuntime.freeStringArray(argv, argc);
|
||||||
};
|
};
|
||||||
const canvas = GodotConfig.canvas;
|
const canvas = GodotConfig.canvas;
|
||||||
GodotDisplayListeners.add(canvas, 'dragover', function (ev) {
|
GodotEventListeners.add(canvas, 'dragover', function (ev) {
|
||||||
// Prevent default behavior (which would try to open the file(s))
|
// Prevent default behavior (which would try to open the file(s))
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
}, false);
|
}, false);
|
||||||
GodotDisplayListeners.add(canvas, 'drop', GodotInputDragDrop.handler(dropFiles));
|
GodotEventListeners.add(canvas, 'drop', GodotInputDragDrop.handler(dropFiles));
|
||||||
},
|
},
|
||||||
|
|
||||||
/* Paste API */
|
/* Paste API */
|
||||||
godot_js_input_paste_cb__sig: 'vi',
|
godot_js_input_paste_cb__sig: 'vi',
|
||||||
godot_js_input_paste_cb: function (callback) {
|
godot_js_input_paste_cb: function (callback) {
|
||||||
const func = GodotRuntime.get_func(callback);
|
const func = GodotRuntime.get_func(callback);
|
||||||
GodotDisplayListeners.add(window, 'paste', function (evt) {
|
GodotEventListeners.add(window, 'paste', function (evt) {
|
||||||
const text = evt.clipboardData.getData('text');
|
const text = evt.clipboardData.getData('text');
|
||||||
const ptr = GodotRuntime.allocString(text);
|
const ptr = GodotRuntime.allocString(text);
|
||||||
func(ptr);
|
func(ptr);
|
||||||
|
|
|
@ -328,3 +328,43 @@ const GodotOS = {
|
||||||
|
|
||||||
autoAddDeps(GodotOS, '$GodotOS');
|
autoAddDeps(GodotOS, '$GodotOS');
|
||||||
mergeInto(LibraryManager.library, GodotOS);
|
mergeInto(LibraryManager.library, GodotOS);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Godot event listeners.
|
||||||
|
* Keeps track of registered event listeners so it can remove them on shutdown.
|
||||||
|
*/
|
||||||
|
const GodotEventListeners = {
|
||||||
|
$GodotEventListeners__deps: ['$GodotOS'],
|
||||||
|
$GodotEventListeners__postset: 'GodotOS.atexit(function(resolve, reject) { GodotEventListeners.clear(); resolve(); });',
|
||||||
|
$GodotEventListeners: {
|
||||||
|
handlers: [],
|
||||||
|
|
||||||
|
has: function (target, event, method, capture) {
|
||||||
|
return GodotEventListeners.handlers.findIndex(function (e) {
|
||||||
|
return e.target === target && e.event === event && e.method === method && e.capture === capture;
|
||||||
|
}) !== -1;
|
||||||
|
},
|
||||||
|
|
||||||
|
add: function (target, event, method, capture) {
|
||||||
|
if (GodotEventListeners.has(target, event, method, capture)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
function Handler(p_target, p_event, p_method, p_capture) {
|
||||||
|
this.target = p_target;
|
||||||
|
this.event = p_event;
|
||||||
|
this.method = p_method;
|
||||||
|
this.capture = p_capture;
|
||||||
|
}
|
||||||
|
GodotEventListeners.handlers.push(new Handler(target, event, method, capture));
|
||||||
|
target.addEventListener(event, method, capture);
|
||||||
|
},
|
||||||
|
|
||||||
|
clear: function () {
|
||||||
|
GodotEventListeners.handlers.forEach(function (h) {
|
||||||
|
h.target.removeEventListener(h.event, h.method, h.capture);
|
||||||
|
});
|
||||||
|
GodotEventListeners.handlers.length = 0;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
mergeInto(LibraryManager.library, GodotEventListeners);
|
||||||
|
|
Loading…
Reference in New Issue