[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).
This commit is contained in:
parent
490511fcfe
commit
4c6845c095
1 changed files with 21 additions and 0 deletions
|
@ -158,6 +158,10 @@ EM_BOOL DisplayServerJavaScript::keydown_callback(int p_event_type, const Emscri
|
|||
return false;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -165,6 +169,10 @@ EM_BOOL DisplayServerJavaScript::keypress_callback(int p_event_type, const Emscr
|
|||
DisplayServerJavaScript *display = get_singleton();
|
||||
display->deferred_key_event->set_unicode(p_event->charCode);
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -172,6 +180,10 @@ EM_BOOL DisplayServerJavaScript::keyup_callback(int p_event_type, const Emscript
|
|||
Ref<InputEventKey> ev = setup_key_event(p_event);
|
||||
ev->set_pressed(false);
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -245,6 +257,10 @@ EM_BOOL DisplayServerJavaScript::mouse_button_callback(int p_event_type, const E
|
|||
ev->set_button_mask(mask);
|
||||
|
||||
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.
|
||||
// Context menu is prevented through contextmenu event.
|
||||
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);
|
||||
}
|
||||
|
||||
// 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.
|
||||
return true;
|
||||
}
|
||||
|
@ -1019,6 +1039,7 @@ bool DisplayServerJavaScript::can_any_window_draw() const {
|
|||
}
|
||||
|
||||
void DisplayServerJavaScript::process_events() {
|
||||
Input::get_singleton()->flush_buffered_events();
|
||||
if (godot_js_display_gamepad_sample() == OK) {
|
||||
process_joypads();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue