Skip to content

Commit

Permalink
[X11] Partial Fix Godot Editor and Project Manager steals focus on a …
Browse files Browse the repository at this point in the history
…window manager on Linux

This is a workaround for the most critical portion of the WM focus bug
described in godotengine#68305. On some specific X11 WM configurations, the
editor's main window and any popups it creates will fight for focus,
which causes a total system lockup due to mouse and keyboard input being
stolen as well. Getting out of this infinite loop requires force
restarting the system.

It can be tested with the following shell script:

```bash
	!#/bin/sh

	godot4 &
	sleep 30
	pkill -x godot4
```

The workaround identified in godotengine#68305 is to remove the call to
XSetInputFocus in the ConfigureNotify event handler, so I have removed
the conditional block that calls this as well as the setup code above it
since there is no need to allocate the memory for the variables if they
won't be used in that call anymore.

This is just a hack and is not a complete fix for godotengine#68305. Multiple
developers are collaborating on a proper fix in the discussion in that
issue, but time is a valuable resource that no one has enough of, so I
am committing this workaround as a stop-gap to prevent the most critical
problem while we work on a full solution for the underlying cause.
  • Loading branch information
GrammAcc authored and sambler committed Apr 6, 2024
1 parent 245df88 commit e77a458
Showing 1 changed file with 0 additions and 13 deletions.
13 changes: 0 additions & 13 deletions platform/linuxbsd/x11/display_server_x11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4706,19 +4706,6 @@ void DisplayServerX11::process_events() {
break;
}

const WindowData &wd = windows[window_id];

XWindowAttributes xwa;
XSync(x11_display, False);
XGetWindowAttributes(x11_display, wd.x11_window, &xwa);

// Set focus when menu window is re-used.
// RevertToPointerRoot is used to make sure we don't lose all focus in case
// a subwindow and its parent are both destroyed.
if ((xwa.map_state == IsViewable) && !wd.no_focus && !wd.is_popup && _window_focus_check()) {
_set_input_focus(wd.x11_window, RevertToPointerRoot);
}

_window_changed(&event);
} break;

Expand Down

0 comments on commit e77a458

Please sign in to comment.