Răsfoiți Sursa

[HTML5] Fix input not working when buffered.

After input buffering was reworked, input accumulation is now handled
outside of OS, and the JavaScript plaform never implemented that.
Additionally, the JavaScript platform is quite obnoxious about calling
specific APIs outside specific user triggered events.

This commit adds event flushing during the main iteration, and forces it
during keydown/keyup/mousedown/mouseup/touchstart/touchend/touchcanel
events (effectively only accumulating only "move" events).
Fabio Alessandrelli 3 ani în urmă
părinte
comite
4c6845c095
1 a modificat fișierele cu 21 adăugiri și 0 ștergeri
  1. 21 0
      platform/javascript/display_server_javascript.cpp

+ 21 - 0
platform/javascript/display_server_javascript.cpp

@@ -158,6 +158,10 @@ EM_BOOL DisplayServerJavaScript::keydown_callback(int p_event_type, const Emscri
 		return false;
 		return false;
 	}
 	}
 	Input::get_singleton()->parse_input_event(ev);
 	Input::get_singleton()->parse_input_event(ev);
+
+	// Make sure to flush all events so we can call restricted APIs inside the event.
+	Input::get_singleton()->flush_buffered_events();
+
 	return true;
 	return true;
 }
 }
 
 
@@ -165,6 +169,10 @@ EM_BOOL DisplayServerJavaScript::keypress_callback(int p_event_type, const Emscr
 	DisplayServerJavaScript *display = get_singleton();
 	DisplayServerJavaScript *display = get_singleton();
 	display->deferred_key_event->set_unicode(p_event->charCode);
 	display->deferred_key_event->set_unicode(p_event->charCode);
 	Input::get_singleton()->parse_input_event(display->deferred_key_event);
 	Input::get_singleton()->parse_input_event(display->deferred_key_event);
+
+	// Make sure to flush all events so we can call restricted APIs inside the event.
+	Input::get_singleton()->flush_buffered_events();
+
 	return true;
 	return true;
 }
 }
 
 
@@ -172,6 +180,10 @@ EM_BOOL DisplayServerJavaScript::keyup_callback(int p_event_type, const Emscript
 	Ref<InputEventKey> ev = setup_key_event(p_event);
 	Ref<InputEventKey> ev = setup_key_event(p_event);
 	ev->set_pressed(false);
 	ev->set_pressed(false);
 	Input::get_singleton()->parse_input_event(ev);
 	Input::get_singleton()->parse_input_event(ev);
+
+	// Make sure to flush all events so we can call restricted APIs inside the event.
+	Input::get_singleton()->flush_buffered_events();
+
 	return ev->get_keycode() != KEY_UNKNOWN && ev->get_keycode() != (Key)0;
 	return ev->get_keycode() != KEY_UNKNOWN && ev->get_keycode() != (Key)0;
 }
 }
 
 
@@ -245,6 +257,10 @@ EM_BOOL DisplayServerJavaScript::mouse_button_callback(int p_event_type, const E
 	ev->set_button_mask(mask);
 	ev->set_button_mask(mask);
 
 
 	input->parse_input_event(ev);
 	input->parse_input_event(ev);
+
+	// Make sure to flush all events so we can call restricted APIs inside the event.
+	Input::get_singleton()->flush_buffered_events();
+
 	// Prevent multi-click text selection and wheel-click scrolling anchor.
 	// Prevent multi-click text selection and wheel-click scrolling anchor.
 	// Context menu is prevented through contextmenu event.
 	// Context menu is prevented through contextmenu event.
 	return true;
 	return true;
@@ -507,6 +523,10 @@ EM_BOOL DisplayServerJavaScript::touch_press_callback(int p_event_type, const Em
 
 
 		Input::get_singleton()->parse_input_event(ev);
 		Input::get_singleton()->parse_input_event(ev);
 	}
 	}
+
+	// Make sure to flush all events so we can call restricted APIs inside the event.
+	Input::get_singleton()->flush_buffered_events();
+
 	// Resume audio context after input in case autoplay was denied.
 	// Resume audio context after input in case autoplay was denied.
 	return true;
 	return true;
 }
 }
@@ -1019,6 +1039,7 @@ bool DisplayServerJavaScript::can_any_window_draw() const {
 }
 }
 
 
 void DisplayServerJavaScript::process_events() {
 void DisplayServerJavaScript::process_events() {
+	Input::get_singleton()->flush_buffered_events();
 	if (godot_js_display_gamepad_sample() == OK) {
 	if (godot_js_display_gamepad_sample() == OK) {
 		process_joypads();
 		process_joypads();
 	}
 	}