Stop color picker tooltip from stealing input events
Input events go to the tooltip because it's added to `popup_list` in DisplayServer `popup_open`. I think there's no harm in tooltips being omitted from the list, so this commit blocks non-popup windows from being added if they have `FLAG_NO_FOCUS` and `FLAG_MOUSE_PASSTHROUGH`. I'm not happy with this way of detecting tooltips. It'll also catch other windows where this behavior may or may not be wanted. I thought about adding `FLAG_TOOLTIP`, but went with the smaller change for now. Fixes #79500.
This commit is contained in:
parent
e96ad5af98
commit
ae1e2182ec
|
@ -4190,8 +4190,11 @@ void DisplayServerX11::popup_open(WindowID p_window) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Detect tooltips and other similar popups that shouldn't block input to their parent.
|
||||||
|
bool ignores_input = window_get_flag(WINDOW_FLAG_NO_FOCUS, p_window) && window_get_flag(WINDOW_FLAG_MOUSE_PASSTHROUGH, p_window);
|
||||||
|
|
||||||
WindowData &wd = windows[p_window];
|
WindowData &wd = windows[p_window];
|
||||||
if (wd.is_popup || has_popup_ancestor) {
|
if (wd.is_popup || (has_popup_ancestor && !ignores_input)) {
|
||||||
// Find current popup parent, or root popup if new window is not transient.
|
// Find current popup parent, or root popup if new window is not transient.
|
||||||
List<WindowID>::Element *C = nullptr;
|
List<WindowID>::Element *C = nullptr;
|
||||||
List<WindowID>::Element *E = popup_list.back();
|
List<WindowID>::Element *E = popup_list.back();
|
||||||
|
|
|
@ -3430,8 +3430,11 @@ void DisplayServerMacOS::popup_open(WindowID p_window) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Detect tooltips and other similar popups that shouldn't block input to their parent.
|
||||||
|
bool ignores_input = window_get_flag(WINDOW_FLAG_NO_FOCUS, p_window) && window_get_flag(WINDOW_FLAG_MOUSE_PASSTHROUGH, p_window);
|
||||||
|
|
||||||
WindowData &wd = windows[p_window];
|
WindowData &wd = windows[p_window];
|
||||||
if (wd.is_popup || has_popup_ancestor) {
|
if (wd.is_popup || (has_popup_ancestor && !ignores_input)) {
|
||||||
bool was_empty = popup_list.is_empty();
|
bool was_empty = popup_list.is_empty();
|
||||||
// Find current popup parent, or root popup if new window is not transient.
|
// Find current popup parent, or root popup if new window is not transient.
|
||||||
List<WindowID>::Element *C = nullptr;
|
List<WindowID>::Element *C = nullptr;
|
||||||
|
|
|
@ -3574,8 +3574,11 @@ void DisplayServerWindows::popup_open(WindowID p_window) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Detect tooltips and other similar popups that shouldn't block input to their parent.
|
||||||
|
bool ignores_input = window_get_flag(WINDOW_FLAG_NO_FOCUS, p_window) && window_get_flag(WINDOW_FLAG_MOUSE_PASSTHROUGH, p_window);
|
||||||
|
|
||||||
WindowData &wd = windows[p_window];
|
WindowData &wd = windows[p_window];
|
||||||
if (wd.is_popup || has_popup_ancestor) {
|
if (wd.is_popup || (has_popup_ancestor && !ignores_input)) {
|
||||||
// Find current popup parent, or root popup if new window is not transient.
|
// Find current popup parent, or root popup if new window is not transient.
|
||||||
List<WindowID>::Element *C = nullptr;
|
List<WindowID>::Element *C = nullptr;
|
||||||
List<WindowID>::Element *E = popup_list.back();
|
List<WindowID>::Element *E = popup_list.back();
|
||||||
|
|
Loading…
Reference in New Issue