diff options
-rw-r--r-- | source/blender/makesdna/DNA_windowmanager_types.h | 13 | ||||
-rw-r--r-- | source/blender/windowmanager/WM_types.h | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm.c | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 35 |
4 files changed, 32 insertions, 22 deletions
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index 33b038694cf..68d69a671ba 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -251,13 +251,14 @@ typedef struct wmWindow { struct bScreen *screen DNA_DEPRECATED; + /** Winid also in screens, is for retrieving this window after read. */ + int winid; /** Window coords. */ short posx, posy, sizex, sizey; /** Borderless, full. */ char windowstate; /** Set to 1 if an active window, for quick rejects. */ char active; - char _pad0[4]; /** Current mouse cursor type. */ short cursor; /** Previous cursor when setting modal one. */ @@ -271,8 +272,14 @@ typedef struct wmWindow { char addmousemove; char tag_cursor_refresh; - /** Winid also in screens, is for retrieving this window after read. */ - int winid; + /* Track the state of the event queue, + * these store the state that needs to be kept between handling events in the queue. */ + /** Enable when #KM_PRESS events are not handled (keyboard/mouse-buttons only). */ + char event_queue_check_click; + /** Enable when #KM_PRESS events are not handled (keyboard/mouse-buttons only). */ + char event_queue_check_drag; + + char _pad0[2]; /** Internal, lock pie creation from this event until released. */ short pie_event_type_lock; diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 863a4436e04..f12832faa45 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -612,10 +612,6 @@ typedef struct wmEvent { /** Raw-key modifier (allow using any key as a modifier). */ short keymodifier; - /** Set in case a #KM_PRESS went by unhandled. */ - char check_click; - char check_drag; - /** Tablet info, available for mouse move and button events. */ wmTabletData tablet; diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c index f9fb484c055..c5a429d7839 100644 --- a/source/blender/windowmanager/intern/wm.c +++ b/source/blender/windowmanager/intern/wm.c @@ -184,6 +184,8 @@ static void window_manager_blend_read_data(BlendDataReader *reader, ID *id) win->modalcursor = 0; win->grabcursor = 0; win->addmousemove = true; + win->event_queue_check_click = 0; + win->event_queue_check_drag = 0; BLO_read_data_address(reader, &win->stereo3d_format); /* Multi-view always fallback to anaglyph at file opening diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index d4ea7b36c9c..fe503167f8d 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -2960,8 +2960,8 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) /* Test for CLICK_DRAG events. */ if (wm_action_not_handled(action)) { - if (event->check_drag) { - wmWindow *win = CTX_wm_window(C); + wmWindow *win = CTX_wm_window(C); + if (win->event_queue_check_drag) { if (WM_event_drag_test(event, &event->prevclickx)) { int x = event->x; int y = event->y; @@ -2982,15 +2982,18 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) event->x = x; event->y = y; - win->eventstate->check_click = false; - win->eventstate->check_drag = false; + win->event_queue_check_click = false; + if (!wm_action_not_handled(action)) { + /* Only disable when handled as other handlers may use this drag event. */ + win->event_queue_check_drag = false; + } } } } else { wmWindow *win = CTX_wm_window(C); if (win) { - win->eventstate->check_drag = false; + win->event_queue_check_drag = false; } } } @@ -3006,11 +3009,13 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) if (win != NULL) { if (event->val == KM_PRESS) { - win->eventstate->check_click = true; - win->eventstate->check_drag = true; + if (event->prevval != KM_PRESS) { + win->event_queue_check_click = true; + win->event_queue_check_drag = true; + } } else if (event->val == KM_RELEASE) { - win->eventstate->check_drag = false; + win->event_queue_check_drag = false; } } @@ -3018,10 +3023,10 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) if (event->val == KM_RELEASE) { if (event->prevval == KM_PRESS) { - if (win->eventstate->check_click == true) { + if (win->event_queue_check_click == true) { if (WM_event_drag_test(event, &event->prevclickx)) { - win->eventstate->check_click = 0; - win->eventstate->check_drag = 0; + win->event_queue_check_click = false; + win->event_queue_check_drag = false; } else { /* Position is where the actual click happens, for more @@ -3059,8 +3064,8 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) else { wmWindow *win = CTX_wm_window(C); if (win) { - win->eventstate->check_click = 0; - win->eventstate->check_drag = 0; + win->event_queue_check_click = false; + win->event_queue_check_drag = false; } } } @@ -3074,7 +3079,7 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) wmWindow *win = CTX_wm_window(C); if (win) { if (ISKEYMODIFIER(event->prevtype)) { - win->eventstate->check_click = 0; + win->event_queue_check_click = false; } } } @@ -3497,7 +3502,7 @@ void wm_event_do_handlers(bContext *C) * press in tool keymap can override click in editor keymap.*/ if (ISMOUSE_BUTTON(event->type) && event->val == KM_PRESS && !wm_action_not_handled(action)) { - win->eventstate->check_click = false; + win->event_queue_check_click = false; } /* Update previous mouse position for following events to use. */ |