diff options
author | Campbell Barton <ideasman42@gmail.com> | 2020-05-08 11:57:32 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2020-05-08 11:57:32 +0300 |
commit | c532c6c10913540d748392b61d176ae7e65b8c38 (patch) | |
tree | ed910bcc589578532faf3c5bbded4e024225ba4e | |
parent | fc3cc2ca3a2bfb3b2e63a7e64e0b0a4fa92aad38 (diff) | |
parent | b1c4db1fbe8075e57c7c174ffd07481c3d56fee4 (diff) |
Merge branch 'blender-v2.83-release'
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 560581a56e2..75cd04b70e9 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -3110,6 +3110,25 @@ static bool wm_event_pie_filter(wmWindow *win, const wmEvent *event) } } +/** + * Account for the special case when events are being handled and a file is loaded. + * In this case event handling exits early, however when "Load UI" is disabled + * the even will still be in #wmWindow.queue. + * + * Without this it's possible to continuously handle the same event, see: T76484. + */ +static void wm_event_free_and_remove_from_queue_if_valid(wmEvent *event) +{ + LISTBASE_FOREACH (wmWindowManager *, wm, &G_MAIN->wm) { + LISTBASE_FOREACH (wmWindow *, win, &wm->windows) { + if (BLI_remlink_safe(&win->queue, event)) { + wm_event_free(event); + return; + } + } + } +} + /* called in main loop */ /* goes over entire hierarchy: events -> window -> screen -> area -> region */ void wm_event_do_handlers(bContext *C) @@ -3232,6 +3251,7 @@ void wm_event_do_handlers(bContext *C) /* fileread case */ if (CTX_wm_window(C) == NULL) { + wm_event_free_and_remove_from_queue_if_valid(event); return; } @@ -3306,6 +3326,7 @@ void wm_event_do_handlers(bContext *C) /* fileread case (python), [#29489] */ if (CTX_wm_window(C) == NULL) { + wm_event_free_and_remove_from_queue_if_valid(event); return; } @@ -3340,6 +3361,7 @@ void wm_event_do_handlers(bContext *C) /* fileread case */ if (CTX_wm_window(C) == NULL) { + wm_event_free_and_remove_from_queue_if_valid(event); return; } } |