|
@@ -94,18 +94,22 @@ static Point2 compute_position_in_canvas(int x, int y) {
|
|
|
(int)(canvas_height / element_height * (y - canvas_y)));
|
|
|
}
|
|
|
|
|
|
-static bool cursor_inside_canvas = true;
|
|
|
-
|
|
|
-extern "C" EMSCRIPTEN_KEEPALIVE void _canvas_resize_callback() {
|
|
|
- OS_JavaScript *os = OS_JavaScript::get_singleton();
|
|
|
+bool OS_JavaScript::check_size_force_redraw() {
|
|
|
int canvas_width;
|
|
|
int canvas_height;
|
|
|
- // Update the framebuffer size.
|
|
|
- emscripten_get_canvas_element_size(os->canvas_id.utf8().get_data(), &canvas_width, &canvas_height);
|
|
|
- emscripten_set_canvas_element_size(os->canvas_id.utf8().get_data(), canvas_width, canvas_height);
|
|
|
- Main::force_redraw();
|
|
|
+ emscripten_get_canvas_element_size(canvas_id.utf8().get_data(), &canvas_width, &canvas_height);
|
|
|
+ if (last_width != canvas_width || last_height != canvas_height) {
|
|
|
+ last_width = canvas_width;
|
|
|
+ last_height = canvas_height;
|
|
|
+ // Update the framebuffer size and for redraw.
|
|
|
+ emscripten_set_canvas_element_size(canvas_id.utf8().get_data(), canvas_width, canvas_height);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
+static bool cursor_inside_canvas = true;
|
|
|
+
|
|
|
EM_BOOL OS_JavaScript::fullscreen_change_callback(int p_event_type, const EmscriptenFullscreenChangeEvent *p_event, void *p_user_data) {
|
|
|
|
|
|
OS_JavaScript *os = get_singleton();
|
|
@@ -293,7 +297,7 @@ EM_BOOL OS_JavaScript::keydown_callback(int p_event_type, const EmscriptenKeyboa
|
|
|
}
|
|
|
os->input->parse_input_event(ev);
|
|
|
// Resume audio context after input in case autoplay was denied.
|
|
|
- os->audio_driver_javascript.resume();
|
|
|
+ os->resume_audio();
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -386,7 +390,7 @@ EM_BOOL OS_JavaScript::mouse_button_callback(int p_event_type, const EmscriptenM
|
|
|
|
|
|
os->input->parse_input_event(ev);
|
|
|
// Resume audio context after input in case autoplay was denied.
|
|
|
- os->audio_driver_javascript.resume();
|
|
|
+ os->resume_audio();
|
|
|
// Prevent multi-click text selection and wheel-click scrolling anchor.
|
|
|
// Context menu is prevented through contextmenu event.
|
|
|
return true;
|
|
@@ -738,7 +742,7 @@ EM_BOOL OS_JavaScript::touch_press_callback(int p_event_type, const EmscriptenTo
|
|
|
os->input->parse_input_event(ev);
|
|
|
}
|
|
|
// Resume audio context after input in case autoplay was denied.
|
|
|
- os->audio_driver_javascript.resume();
|
|
|
+ os->resume_audio();
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -1062,12 +1066,6 @@ Error OS_JavaScript::initialize(const VideoMode &p_desired, int p_video_driver,
|
|
|
Module.listeners['drop'] = Module.drop_handler; // Defined in native/utils.js
|
|
|
canvas.addEventListener('dragover', Module.listeners['dragover'], false);
|
|
|
canvas.addEventListener('drop', Module.listeners['drop'], false);
|
|
|
- // Resize
|
|
|
- const resize_callback = cwrap('_canvas_resize_callback', null, []);
|
|
|
- Module.resize_observer = new window['ResizeObserver'](function(elements) {
|
|
|
- resize_callback();
|
|
|
- });
|
|
|
- Module.resize_observer.observe(canvas);
|
|
|
// Quit request
|
|
|
Module['request_quit'] = function() {
|
|
|
send_notification(notifications[notifications.length - 1]);
|
|
@@ -1101,6 +1099,12 @@ MainLoop *OS_JavaScript::get_main_loop() const {
|
|
|
return main_loop;
|
|
|
}
|
|
|
|
|
|
+void OS_JavaScript::resume_audio() {
|
|
|
+ if (audio_driver_javascript) {
|
|
|
+ audio_driver_javascript->resume();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
bool OS_JavaScript::main_loop_iterate() {
|
|
|
|
|
|
if (is_userfs_persistent() && sync_wait_time >= 0) {
|
|
@@ -1167,10 +1171,10 @@ void OS_JavaScript::finalize_async() {
|
|
|
}
|
|
|
});
|
|
|
Module.listeners = {};
|
|
|
- Module.resize_observer.unobserve(canvas);
|
|
|
- delete Module.resize_observer;
|
|
|
});
|
|
|
- audio_driver_javascript.finish_async();
|
|
|
+ if (audio_driver_javascript) {
|
|
|
+ audio_driver_javascript->finish_async();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void OS_JavaScript::finalize() {
|
|
@@ -1180,6 +1184,9 @@ void OS_JavaScript::finalize() {
|
|
|
emscripten_webgl_commit_frame();
|
|
|
memdelete(visual_server);
|
|
|
emscripten_webgl_destroy_context(webgl_ctx);
|
|
|
+ if (audio_driver_javascript) {
|
|
|
+ memdelete(audio_driver_javascript);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// Miscellaneous
|
|
@@ -1409,6 +1416,9 @@ OS_JavaScript::OS_JavaScript(int p_argc, char *p_argv[]) {
|
|
|
last_click_ms = 0;
|
|
|
last_click_pos = Point2(-100, -100);
|
|
|
|
|
|
+ last_width = 0;
|
|
|
+ last_height = 0;
|
|
|
+
|
|
|
window_maximized = false;
|
|
|
entering_fullscreen = false;
|
|
|
just_exited_fullscreen = false;
|
|
@@ -1416,11 +1426,15 @@ OS_JavaScript::OS_JavaScript(int p_argc, char *p_argv[]) {
|
|
|
|
|
|
main_loop = NULL;
|
|
|
visual_server = NULL;
|
|
|
+ audio_driver_javascript = NULL;
|
|
|
|
|
|
idb_available = false;
|
|
|
sync_wait_time = -1;
|
|
|
|
|
|
- AudioDriverManager::add_driver(&audio_driver_javascript);
|
|
|
+ if (AudioDriverJavaScript::is_available()) {
|
|
|
+ audio_driver_javascript = memnew(AudioDriverJavaScript);
|
|
|
+ AudioDriverManager::add_driver(audio_driver_javascript);
|
|
|
+ }
|
|
|
|
|
|
Vector<Logger *> loggers;
|
|
|
loggers.push_back(memnew(StdLogger));
|