1 Commits

Author SHA1 Message Date
shawn c5b6b05801 Fix keyboard input: use OS.move_to_foreground() for window focus
get_window().grab_focus() was insufficient on Windows GUI exports.
Replaced with OS.move_to_foreground() + Input.set_mouse_mode(CAPTURED)
+ deferred retries to ensure the game window holds keyboard focus
after the connection UI is dismissed.
2026-07-03 22:34:50 -04:00
+14 -4
View File
@@ -72,24 +72,34 @@ func join():
print("Client started")
connect_ui.hide()
# Ensure game window has keyboard focus for input
get_window().grab_focus()
# Force window focus for keyboard input (Windows GUI apps need this)
_ensure_input_focus()
# Only start manually if NetworkEvents is not handling it (e.g. multiplayer-simple)
if not NetworkEvents.enabled:
NetworkTime.start()
func _ensure_input_focus() -> void:
## Force the game window to have keyboard focus and captured mouse.
## On Windows GUI exports, the window may not hold keyboard focus after
## the connection UI is dismissed, causing Input.get_axis() to return 0.
OS.move_to_foreground()
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
# Deferred retry after window settles
get_window().call_deferred("grab_focus")
Input.call_deferred("set_mouse_mode", Input.MOUSE_MODE_CAPTURED)
func _enter_tree():
# Hide and show UI as appropriate
# These handlers are necessary, since the game could have started via
# autoconnect, or any other method
NetworkEvents.on_client_start.connect(func(__):
connect_ui.hide()
get_window().grab_focus()
_ensure_input_focus()
)
NetworkEvents.on_server_start.connect(func():
connect_ui.hide()
get_window().grab_focus()
_ensure_input_focus()
)
NetworkEvents.on_client_stop.connect(func(): connect_ui.show())
NetworkEvents.on_server_stop.connect(func(): connect_ui.show())