Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntony Riakiotakis <kalast@gmail.com>2014-10-13 22:08:55 +0400
committerAntony Riakiotakis <kalast@gmail.com>2014-10-13 22:09:37 +0400
commitd665095e0d5b45db8595bc72205be46640d54898 (patch)
treefb58d6ee981c057dc1325ee8894e0c9c988c0a9c /source/blender/windowmanager
parentf9cbb908a3fbd73970920def8356993b9e016d1d (diff)
Filter out pie spawn button events.
The reason being, with the current system of quick selection, it's possible to spawn an operator after confirmation, especially for cases with modifier buttons.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 0218513c03f..793908ec44b 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -2188,10 +2188,21 @@ static void wm_event_drag_test(wmWindowManager *wm, wmWindow *win, wmEvent *even
}
-static void wm_event_pie_filter(wmWindow *win, wmEvent *event)
+/* filter out all events of the pie that spawned the last pie unless it's a release event */
+static bool wm_event_pie_filter(wmWindow *win, wmEvent *event)
{
- if (win->lock_pie_event == event->type && event->val == KM_RELEASE)
- win->lock_pie_event = EVENT_NONE;
+ if (win->lock_pie_event && win->lock_pie_event == event->type) {
+ if (event->val == KM_RELEASE) {
+ win->lock_pie_event = EVENT_NONE;
+ return false;
+ }
+ else {
+ return true;
+ }
+ }
+ else {
+ return false;
+ }
}
/* called in main loop */
@@ -2257,9 +2268,21 @@ void wm_event_do_handlers(bContext *C)
WM_event_print(event);
}
#endif
-
+
+ /* take care of pie event filter */
+ if (wm_event_pie_filter(win, event)) {
+#ifndef NDEBUG
+ if (G.debug & (G_DEBUG_HANDLERS | G_DEBUG_EVENTS) && !ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE)) {
+ printf("\n%s: event filtered due to pie button pressed\n", __func__);
+ }
+#endif
+ BLI_remlink(&win->queue, event);
+ wm_event_free(event);
+ continue;
+ }
+
CTX_wm_window_set(C, win);
-
+
/* we let modal handlers get active area/region, also wm_paintcursor_test needs it */
CTX_wm_area_set(C, area_event_inside(C, &event->x));
CTX_wm_region_set(C, region_event_inside(C, &event->x));
@@ -2269,8 +2292,6 @@ void wm_event_do_handlers(bContext *C)
wm_region_mouse_co(C, event);
- /* take care of pie event filter */
- wm_event_pie_filter(win, event);
/* first we do priority handlers, modal + some limited keymaps */
action |= wm_handlers_do(C, event, &win->modalhandlers);