You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-14 13:41:12 +00:00
Handle potential platform-specific Window mouse-enter/exit bugs gracefully
Also replace `DEV_ASSERT` by `WARN_PRINT_ONCE`.
This commit is contained in:
@@ -670,9 +670,14 @@ void Window::_propagate_window_notification(Node *p_node, int p_notification) {
|
|||||||
void Window::_event_callback(DisplayServer::WindowEvent p_event) {
|
void Window::_event_callback(DisplayServer::WindowEvent p_event) {
|
||||||
switch (p_event) {
|
switch (p_event) {
|
||||||
case DisplayServer::WINDOW_EVENT_MOUSE_ENTER: {
|
case DisplayServer::WINDOW_EVENT_MOUSE_ENTER: {
|
||||||
_propagate_window_notification(this, NOTIFICATION_WM_MOUSE_ENTER);
|
|
||||||
Window *root = get_tree()->get_root();
|
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;
|
root->gui.windowmanager_window_over = this;
|
||||||
notification(NOTIFICATION_VP_MOUSE_ENTER);
|
notification(NOTIFICATION_VP_MOUSE_ENTER);
|
||||||
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_CURSOR_SHAPE)) {
|
if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_CURSOR_SHAPE)) {
|
||||||
@@ -681,7 +686,12 @@ void Window::_event_callback(DisplayServer::WindowEvent p_event) {
|
|||||||
} break;
|
} break;
|
||||||
case DisplayServer::WINDOW_EVENT_MOUSE_EXIT: {
|
case DisplayServer::WINDOW_EVENT_MOUSE_EXIT: {
|
||||||
Window *root = get_tree()->get_root();
|
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->_mouse_leave_viewport();
|
||||||
root->gui.windowmanager_window_over = nullptr;
|
root->gui.windowmanager_window_over = nullptr;
|
||||||
_propagate_window_notification(this, NOTIFICATION_WM_MOUSE_EXIT);
|
_propagate_window_notification(this, NOTIFICATION_WM_MOUSE_EXIT);
|
||||||
|
|||||||
Reference in New Issue
Block a user