Skip to content

Commit

Permalink
Handle potential platform-specific Window mouse-enter/exit bugs gra…
Browse files Browse the repository at this point in the history
…cefully

Also replace `DEV_ASSERT` by `WARN_PRINT_ONCE`.
  • Loading branch information
Sauermann committed Aug 8, 2023
1 parent 237bd0a commit 2f8673d
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions scene/main/window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -670,9 +670,14 @@ void Window::_propagate_window_notification(Node *p_node, int p_notification) {
void Window::_event_callback(DisplayServer::WindowEvent p_event) {
switch (p_event) {
case DisplayServer::WINDOW_EVENT_MOUSE_ENTER: {
_propagate_window_notification(this, NOTIFICATION_WM_MOUSE_ENTER);
Window *root = get_tree()->get_root();
DEV_ASSERT(!root->gui.windowmanager_window_over); // Entering a window while a window is hovered should never happen.
if (root->gui.windowmanager_window_over) {
#ifdef DEV_ENABLED
WARN_PRINT_ONCE("Entering a window while a window is hovered should never happen in DisplayServer.");
#endif // DEV_ENABLED
root->gui.windowmanager_window_over->_event_callback(DisplayServer::WINDOW_EVENT_MOUSE_EXIT);
}
_propagate_window_notification(this, NOTIFICATION_WM_MOUSE_ENTER);
root->gui.windowmanager_window_over = this;
notification(NOTIFICATION_VP_MOUSE_ENTER);
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_CURSOR_SHAPE)) {
Expand All @@ -681,7 +686,12 @@ void Window::_event_callback(DisplayServer::WindowEvent p_event) {
} break;
case DisplayServer::WINDOW_EVENT_MOUSE_EXIT: {
Window *root = get_tree()->get_root();
DEV_ASSERT(root->gui.windowmanager_window_over); // Exiting a window, while no window is hovered should never happen.
if (!root->gui.windowmanager_window_over) {
#ifdef DEV_ENABLED
WARN_PRINT_ONCE("Exiting a window while no window is hovered should never happen in DisplayServer.");
#endif // DEV_ENABLED
return;
}
root->gui.windowmanager_window_over->_mouse_leave_viewport();
root->gui.windowmanager_window_over = nullptr;
_propagate_window_notification(this, NOTIFICATION_WM_MOUSE_EXIT);
Expand Down

0 comments on commit 2f8673d

Please sign in to comment.