Browse Source

Merge pull request #65111 from MatthewZelriche/DroppedXEventFix

Fix dropped XEvents early in main window lifetime.
Rémi Verschelde 3 years ago
parent
commit
7ced3a6e37
1 changed files with 11 additions and 4 deletions
  1. 11 4
      platform/linuxbsd/display_server_x11.cpp

+ 11 - 4
platform/linuxbsd/display_server_x11.cpp

@@ -5013,17 +5013,24 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
 	}
 	}
 	cursor_set_shape(CURSOR_BUSY);
 	cursor_set_shape(CURSOR_BUSY);
 
 
-	XEvent xevent;
+	Vector<XEvent> save_events;
 	while (XPending(x11_display) > 0) {
 	while (XPending(x11_display) > 0) {
+		XEvent xevent{ 0 };
 		XNextEvent(x11_display, &xevent);
 		XNextEvent(x11_display, &xevent);
 		if (xevent.type == ConfigureNotify) {
 		if (xevent.type == ConfigureNotify) {
 			_window_changed(&xevent);
 			_window_changed(&xevent);
-		} else if (xevent.type == MapNotify) {
-			// Have we failed to set fullscreen while the window was unmapped?
-			_validate_mode_on_map(main_window);
+		} 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);
+	}
+
 	events_thread.start(_poll_events_thread, this);
 	events_thread.start(_poll_events_thread, this);
 
 
 	_update_real_mouse_position(windows[MAIN_WINDOW_ID]);
 	_update_real_mouse_position(windows[MAIN_WINDOW_ID]);