summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthewZelriche <67518084+MatthewZelriche@users.noreply.github.com>2022-09-04 16:46:37 -0600
committerMatthewZelriche <67518084+MatthewZelriche@users.noreply.github.com>2022-09-04 16:46:37 -0600
commitef02f06b8c6153abdf42ae93dbcbdbf43faa0e4e (patch)
treee7c4a03d36c36b45d8755243549ce62a72e883fb
parent733e0be8ecc2c361f6d17139efd9d4966256afe6 (diff)
Fix XSendEvent crash & bootsplash.
Fixes a crash due to an Xlib error, as well as ensures that Godot holds the correct size of the window after window modes have been applied, before exiting the DisplayServerX11 constructor. This ensures the bootsplash will be displayed with the correct dimensions. Fixes #65320
-rw-r--r--platform/linuxbsd/display_server_x11.cpp25
1 files changed, 8 insertions, 17 deletions
diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp
index 607c583df8..c619e8eceb 100644
--- a/platform/linuxbsd/display_server_x11.cpp
+++ b/platform/linuxbsd/display_server_x11.cpp
@@ -4900,6 +4900,8 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
}
}
show_window(main_window);
+ XSync(x11_display, False);
+ _validate_mode_on_map(main_window);
#if defined(VULKAN_ENABLED)
if (rendering_driver == "vulkan") {
@@ -5046,24 +5048,13 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
}
cursor_set_shape(CURSOR_BUSY);
- Vector<XEvent> save_events;
- while (XPending(x11_display) > 0) {
- XEvent xevent{ 0 };
- XNextEvent(x11_display, &xevent);
- if (xevent.type == ConfigureNotify) {
- _window_changed(&xevent);
- } else {
- // Don't discard this event, we must resend it...
- save_events.push_back(xevent);
- }
- }
-
- // Resend events that would have been dropped by the early event queue
- // processing we just performed.
- for (XEvent &ev : save_events) {
- XSendEvent(x11_display, ev.xany.window, False, 0, &ev);
+ // Search the X11 event queue for ConfigureNotify events and process all
+ // that are currently queued early, so we can get the final window size
+ // for correctly drawing of the bootsplash.
+ XEvent config_event;
+ while (XCheckTypedEvent(x11_display, ConfigureNotify, &config_event)) {
+ _window_changed(&config_event);
}
-
events_thread.start(_poll_events_thread, this);
_update_real_mouse_position(windows[MAIN_WINDOW_ID]);