Page MenuHome
Paste P2573

Quick patch for T92364: Prevent click-through panels and used header area
ActivePublic

Authored by Julian Eisel (Severin) on Nov 3 2021, 5:12 PM.
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 3e9bf413c9f..61d513f2510 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -3486,6 +3486,37 @@ static void wm_event_handle_xrevent(bContext *C,
}
#endif /* WITH_XR_OPENXR */
+static int doit(bContext *C, ARegion *region, wmEvent *event)
+{
+ wmWindowManager *wm = CTX_wm_manager(C);
+ int action = WM_HANDLER_CONTINUE;
+
+ CTX_wm_region_set(C, region);
+
+ /* Call even on non mouse events, since the */
+ wm_region_mouse_co(C, event);
+
+ if (!BLI_listbase_is_empty(&wm->drags)) {
+ /* Does polls for drop regions and checks #uiButs. */
+ /* Need to be here to make sure region context is true. */
+ if (ELEM(event->type, MOUSEMOVE, EVT_DROP) || ISKEYMODIFIER(event->type)) {
+ wm_drags_check_ops(C, event);
+ }
+ }
+
+ action |= wm_handlers_do(C, event, &region->handlers);
+
+#if 0
+ /* Fileread case (python), T29489. */
+ if (CTX_wm_window(C) == NULL) {
+ wm_event_free_and_remove_from_queue_if_valid(event);
+ return;
+ }
+#endif
+
+ return action;
+}
+
void wm_event_do_handlers(bContext *C)
{
wmWindowManager *wm = CTX_wm_manager(C);
@@ -3669,31 +3700,28 @@ void wm_event_do_handlers(bContext *C)
CTX_wm_area_set(C, area);
if ((action & WM_HANDLER_BREAK) == 0) {
+ bool has_inside = false;
+
LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
+ if (!region->overlap) {
+ continue;
+ }
if (wm_event_inside_region(event, region)) {
- CTX_wm_region_set(C, region);
-
- /* Call even on non mouse events, since the */
- wm_region_mouse_co(C, event);
-
- if (!BLI_listbase_is_empty(&wm->drags)) {
- /* Does polls for drop regions and checks #uiButs. */
- /* Need to be here to make sure region context is true. */
- if (ELEM(event->type, MOUSEMOVE, EVT_DROP) || ISKEYMODIFIER(event->type)) {
- wm_drags_check_ops(C, event);
- }
+ action |= doit(C, region, event);
+ has_inside = true;
+ break;
+ }
+ }
+ if (((action & WM_HANDLER_BREAK) == 0) && !has_inside) {
+ LISTBASE_FOREACH (ARegion *, region, &area->regionbase) {
+ if (region->overlap) {
+ continue;
}
- action |= wm_handlers_do(C, event, &region->handlers);
-
- /* Fileread case (python), T29489. */
- if (CTX_wm_window(C) == NULL) {
- wm_event_free_and_remove_from_queue_if_valid(event);
- return;
- }
+ if (wm_event_inside_region(event, region)) {
- if (action & WM_HANDLER_BREAK) {
+ action |= doit(C, region, event);
break;
}
}