Merge pull request #39635 from Meriipu/master_nodrop
do not drop mouseover on WM_MOUSE_EXIT
This commit is contained in:
commit
afef8e30ea
1 changed files with 38 additions and 3 deletions
|
@ -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();
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue