Skip to content

Commit

Permalink
Merge pull request godotengine#39635 from Meriipu/master_nodrop
Browse files Browse the repository at this point in the history
do not drop mouseover on WM_MOUSE_EXIT
  • Loading branch information
akien-mga authored Nov 3, 2020
2 parents 0fc84b7 + e8804b9 commit afef8e3
Showing 1 changed file with 38 additions and 3 deletions.
41 changes: 38 additions & 3 deletions scene/main/viewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -821,7 +821,14 @@ void Viewport::_notification(int p_what) {
}

} break;
case NOTIFICATION_WM_MOUSE_EXIT:
case NOTIFICATION_WM_MOUSE_EXIT: {
_drop_physics_mouseover();

// Unlike on loss of focus (NOTIFICATION_WM_WINDOW_FOCUS_OUT), do not
// drop the gui mouseover here, as a scrollbar may be dragged while the
// mouse is outside the window (without the window having lost focus).
// See bug #39634
} break;
case NOTIFICATION_WM_WINDOW_FOCUS_OUT: {
_drop_physics_mouseover();

Expand Down Expand Up @@ -1809,6 +1816,8 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
if (mb.is_valid()) {
gui.key_event_accepted = false;

Control *over = nullptr;

Point2 mpos = mb->get_position();
if (mb->is_pressed()) {
Size2 pos = mpos;
Expand Down Expand Up @@ -1961,6 +1970,31 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
gui.drag_data=Variant(); //always clear
}*/

// In case the mouse was released after for example dragging a scrollbar,
// check whether the current control is different from the stored one. If
// it is different, rather than wait for it to be updated the next time the
// mouse is moved, notify the control so that it can e.g. drop the highlight.
// This code is duplicated from the mm.is_valid()-case further below.
if (gui.mouse_focus) {
over = gui.mouse_focus;
} else {
over = _gui_find_control(mpos);
}

if (gui.mouse_focus_mask == 0 && over != gui.mouse_over) {
if (gui.mouse_over) {
_gui_call_notification(gui.mouse_over, Control::NOTIFICATION_MOUSE_EXIT);
}

_gui_cancel_tooltip();

if (over) {
_gui_call_notification(over, Control::NOTIFICATION_MOUSE_ENTER);
}
}

gui.mouse_over = over;

set_input_as_handled();
}
}
Expand Down Expand Up @@ -2021,10 +2055,11 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
}
}

// These sections of code are reused in the mb.is_valid() case further up
// for the purpose of notifying controls about potential changes in focus
// when the mousebutton is released.
if (gui.mouse_focus) {
over = gui.mouse_focus;
//recompute focus_inv_xform again here

} else {
over = _gui_find_control(mpos);
}
Expand Down

0 comments on commit afef8e3

Please sign in to comment.