diff options
Diffstat (limited to 'source/blender/windowmanager/intern/wm_event_system.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 195 |
1 files changed, 99 insertions, 96 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 411ecb1cac8..fe503167f8d 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -126,12 +126,12 @@ wmEvent *wm_event_add_ex(wmWindow *win, *event = *event_to_add; if (event_to_add_after == NULL) { - BLI_addtail(&win->queue, event); + BLI_addtail(&win->event_queue, event); } else { /* Note: strictly speaking this breaks const-correctness, * however we're only changing 'next' member. */ - BLI_insertlinkafter(&win->queue, (void *)event_to_add_after, event); + BLI_insertlinkafter(&win->event_queue, (void *)event_to_add_after, event); } return event; } @@ -205,7 +205,7 @@ void wm_event_free(wmEvent *event) static void wm_event_free_last(wmWindow *win) { - wmEvent *event = BLI_poptail(&win->queue); + wmEvent *event = BLI_poptail(&win->event_queue); if (event != NULL) { wm_event_free(event); } @@ -214,7 +214,7 @@ static void wm_event_free_last(wmWindow *win) void wm_event_free_all(wmWindow *win) { wmEvent *event; - while ((event = BLI_pophead(&win->queue))) { + while ((event = BLI_pophead(&win->event_queue))) { wm_event_free(event); } } @@ -232,7 +232,7 @@ void wm_event_init_from_window(wmWindow *win, wmEvent *event) static bool wm_test_duplicate_notifier(const wmWindowManager *wm, uint type, void *reference) { - LISTBASE_FOREACH (wmNotifier *, note, &wm->queue) { + LISTBASE_FOREACH (wmNotifier *, note, &wm->notifier_queue) { if ((note->category | note->data | note->subtype | note->action) == type && note->reference == reference) { return true; @@ -250,7 +250,7 @@ void WM_event_add_notifier_ex(wmWindowManager *wm, const wmWindow *win, uint typ wmNotifier *note = MEM_callocN(sizeof(wmNotifier), "notifier"); - BLI_addtail(&wm->queue, note); + BLI_addtail(&wm->notifier_queue, note); note->window = win; @@ -279,7 +279,7 @@ void WM_main_add_notifier(unsigned int type, void *reference) wmNotifier *note = MEM_callocN(sizeof(wmNotifier), "notifier"); - BLI_addtail(&wm->queue, note); + BLI_addtail(&wm->notifier_queue, note); note->category = type & NOTE_CATEGORY; note->data = type & NOTE_DATA; @@ -298,7 +298,7 @@ void WM_main_remove_notifier_reference(const void *reference) wmWindowManager *wm = bmain->wm.first; if (wm) { - LISTBASE_FOREACH_MUTABLE (wmNotifier *, note, &wm->queue) { + LISTBASE_FOREACH_MUTABLE (wmNotifier *, note, &wm->notifier_queue) { if (note->reference == reference) { /* Don't remove because this causes problems for #wm_event_do_notifiers * which may be looping on the data (deleting screens). */ @@ -450,7 +450,7 @@ void wm_event_do_notifiers(bContext *C) CTX_wm_window_set(C, win); - LISTBASE_FOREACH_MUTABLE (wmNotifier *, note, &wm->queue) { + LISTBASE_FOREACH_MUTABLE (wmNotifier *, note, &wm->notifier_queue) { if (note->category == NC_WM) { if (ELEM(note->data, ND_FILEREAD, ND_FILESAVE)) { wm->file_saved = 1; @@ -539,7 +539,7 @@ void wm_event_do_notifiers(bContext *C) /* The notifiers are sent without context, to keep it clean. */ wmNotifier *note; - while ((note = BLI_pophead(&wm->queue))) { + while ((note = BLI_pophead(&wm->notifier_queue))) { LISTBASE_FOREACH (wmWindow *, win, &wm->windows) { Scene *scene = WM_window_get_active_scene(win); bScreen *screen = WM_window_get_active_screen(win); @@ -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; } } } @@ -3221,9 +3226,9 @@ static void wm_event_drag_and_drop_test(wmWindowManager *wm, wmWindow *win, wmEv /* 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, const wmEvent *event) { - if (win->lock_pie_event && win->lock_pie_event == event->type) { + if (win->pie_event_type_lock && win->pie_event_type_lock == event->type) { if (event->val == KM_RELEASE) { - win->lock_pie_event = EVENT_NONE; + win->pie_event_type_lock = EVENT_NONE; return false; } return true; @@ -3234,7 +3239,7 @@ 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. + * the even will still be in #wmWindow.event_queue. * * Without this it's possible to continuously handle the same event, see: T76484. */ @@ -3242,7 +3247,7 @@ 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)) { + if (BLI_remlink_safe(&win->event_queue, event)) { wm_event_free(event); return; } @@ -3331,7 +3336,7 @@ void wm_event_do_handlers(bContext *C) } wmEvent *event; - while ((event = win->queue.first)) { + while ((event = win->event_queue.first)) { int action = WM_HANDLER_CONTINUE; /* Active screen might change during handlers, update pointer. */ @@ -3348,7 +3353,7 @@ void wm_event_do_handlers(bContext *C) if (!ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE)) { CLOG_INFO(WM_LOG_HANDLERS, 1, "event filtered due to pie button pressed"); } - BLI_remlink(&win->queue, event); + BLI_remlink(&win->event_queue, event); wm_event_free(event); continue; } @@ -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. */ @@ -3505,11 +3510,11 @@ void wm_event_do_handlers(bContext *C) win->eventstate->prevy = event->y; /* Unlink and free here, blender-quit then frees all. */ - BLI_remlink(&win->queue, event); + BLI_remlink(&win->event_queue, event); wm_event_free(event); } - /* Only add mousemove when queue was read entirely. */ + /* Only add mouse-move when the event queue was read entirely. */ if (win->addmousemove && win->eventstate) { wmEvent tevent = *(win->eventstate); // printf("adding MOUSEMOVE %d %d\n", tevent.x, tevent.y); @@ -4350,11 +4355,11 @@ static wmWindow *wm_event_cursor_other_windows(wmWindowManager *wm, wmWindow *wi } } - wmWindow *owin; - if (WM_window_find_under_cursor(wm, win, win, mval, &owin, mval)) { + wmWindow *win_other; + if (WM_window_find_under_cursor(wm, win, win, mval, &win_other, mval)) { event->x = mval[0]; event->y = mval[1]; - return owin; + return win_other; } } return NULL; @@ -4395,7 +4400,7 @@ static void wm_event_prev_click_set(wmEvent *event, wmEvent *event_state) static wmEvent *wm_event_add_mousemove(wmWindow *win, const wmEvent *event) { - wmEvent *event_last = win->queue.last; + wmEvent *event_last = win->event_queue.last; /* Some painting operators want accurate mouse events, they can * handle in between mouse move moves, others can happily ignore @@ -4417,7 +4422,7 @@ static wmEvent *wm_event_add_trackpad(wmWindow *win, const wmEvent *event, int d { /* Ignore in between trackpad events for performance, we only need high accuracy * for painting with mouse moves, for navigation using the accumulated value is ok. */ - wmEvent *event_last = win->queue.last; + wmEvent *event_last = win->event_queue.last; if (event_last && event_last->type == event->type) { deltax += event_last->x - event_last->prevx; deltay += event_last->y - event_last->prevy; @@ -4434,7 +4439,7 @@ static wmEvent *wm_event_add_trackpad(wmWindow *win, const wmEvent *event, int d } /** - * Windows store own event queues #wmWindow.queue (no #bContext here). + * Windows store own event queues #wmWindow.event_queue (no #bContext here). */ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void *customdata) { @@ -4443,19 +4448,19 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void } /** - * Having both, \a event and \a evt, can be highly confusing to work with, + * Having both, \a event and \a event_state, can be highly confusing to work with, * but is necessary for our current event system, so let's clear things up a bit: * * - Data added to event only will be handled immediately, * but will not be copied to the next event. - * - Data added to \a evt only stays, + * - Data added to \a event_state only stays, * but is handled with the next event -> execution delay. - * - Data added to event and \a evt stays and is handled immediately. + * - Data added to event and \a event_state stays and is handled immediately. */ - wmEvent event, *evt = win->eventstate; + wmEvent event, *event_state = win->eventstate; /* Initialize and copy state (only mouse x y and modifiers). */ - event = *evt; + event = *event_state; event.is_repeat = false; /** @@ -4473,17 +4478,17 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void /* Ensure the event state is correct, any deviation from this may cause bugs. */ #ifndef NDEBUG - if ((evt->type || evt->val) && /* Ignore cleared event state. */ - !(ISMOUSE_BUTTON(evt->type) || ISKEYBOARD(evt->type))) { + if ((event_state->type || event_state->val) && /* Ignore cleared event state. */ + !(ISMOUSE_BUTTON(event_state->type) || ISKEYBOARD(event_state->type))) { CLOG_WARN(WM_LOG_HANDLERS, "Non-keyboard/mouse button found in 'win->eventstate->type = %d'", - evt->type); + event_state->type); } - if ((evt->prevtype || evt->prevval) && /* Ignore cleared event state. */ - !(ISMOUSE_BUTTON(evt->prevtype) || ISKEYBOARD(evt->prevtype))) { + if ((event_state->prevtype || event_state->prevval) && /* Ignore cleared event state. */ + !(ISMOUSE_BUTTON(event_state->prevtype) || ISKEYBOARD(event_state->prevtype))) { CLOG_WARN(WM_LOG_HANDLERS, "Non-keyboard/mouse button found in 'win->eventstate->prevtype = %d'", - evt->prevtype); + event_state->prevtype); } #endif @@ -4499,28 +4504,26 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void event.type = MOUSEMOVE; { wmEvent *event_new = wm_event_add_mousemove(win, &event); - copy_v2_v2_int(&evt->x, &event_new->x); - evt->tablet.is_motion_absolute = event_new->tablet.is_motion_absolute; + copy_v2_v2_int(&event_state->x, &event_new->x); + event_state->tablet.is_motion_absolute = event_new->tablet.is_motion_absolute; } /* Also add to other window if event is there, this makes overdraws disappear nicely. */ /* It remaps mousecoord to other window in event. */ - wmWindow *owin = wm_event_cursor_other_windows(wm, win, &event); - if (owin) { - wmEvent oevent, *oevt = owin->eventstate; - - oevent = *oevt; + wmWindow *win_other = wm_event_cursor_other_windows(wm, win, &event); + if (win_other) { + wmEvent event_other = *win_other->eventstate; /* See comment for this operation on `event` for details. */ - oevent.prevtype = oevent.type; - oevent.prevval = oevent.val; + event_other.prevtype = event_other.type; + event_other.prevval = event_other.val; - copy_v2_v2_int(&oevent.x, &event.x); - oevent.type = MOUSEMOVE; + copy_v2_v2_int(&event_other.x, &event.x); + event_other.type = MOUSEMOVE; { - wmEvent *event_new = wm_event_add_mousemove(owin, &oevent); - copy_v2_v2_int(&oevt->x, &event_new->x); - oevt->tablet.is_motion_absolute = event_new->tablet.is_motion_absolute; + wmEvent *event_new = wm_event_add_mousemove(win_other, &event_other); + copy_v2_v2_int(&win_other->eventstate->x, &event_new->x); + win_other->eventstate->tablet.is_motion_absolute = event_new->tablet.is_motion_absolute; } } @@ -4546,8 +4549,8 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void break; } - event.x = evt->x = pd->x; - event.y = evt->y = pd->y; + event.x = event_state->x = pd->x; + event.y = event_state->y = pd->y; event.val = KM_NOTHING; /* The direction is inverted from the device due to system preferences. */ @@ -4590,11 +4593,11 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void wm_tablet_data_from_ghost(&bd->tablet, &event.tablet); wm_eventemulation(&event, false); - wm_event_prev_values_set(&event, evt); + wm_event_prev_values_set(&event, event_state); /* Copy to event state. */ - evt->val = event.val; - evt->type = event.type; + event_state->val = event.val; + event_state->type = event.type; /* Double click test. */ if (wm_event_is_double_click(&event)) { @@ -4602,25 +4605,25 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void event.val = KM_DBL_CLICK; } if (event.val == KM_PRESS) { - wm_event_prev_click_set(&event, evt); + wm_event_prev_click_set(&event, event_state); } /* Add to other window if event is there (not to both!). */ - wmWindow *owin = wm_event_cursor_other_windows(wm, win, &event); - if (owin) { - wmEvent oevent = *(owin->eventstate); + wmWindow *win_other = wm_event_cursor_other_windows(wm, win, &event); + if (win_other) { + wmEvent event_other = *win_other->eventstate; /* See comment for this operation on `event` for details. */ - oevent.prevtype = oevent.type; - oevent.prevval = oevent.val; + event_other.prevtype = event_other.type; + event_other.prevval = event_other.val; - copy_v2_v2_int(&oevent.x, &event.x); + copy_v2_v2_int(&event_other.x, &event.x); - oevent.type = event.type; - oevent.val = event.val; - oevent.tablet = event.tablet; + event_other.type = event.type; + event_other.val = event.val; + event_other.tablet = event.tablet; - wm_event_add(owin, &oevent); + wm_event_add(win_other, &event_other); } else { wm_event_add(win, &event); @@ -4641,12 +4644,12 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void event.val = (type == GHOST_kEventKeyDown) ? KM_PRESS : KM_RELEASE; wm_eventemulation(&event, false); - wm_event_prev_values_set(&event, evt); + wm_event_prev_values_set(&event, event_state); /* Copy to event state. */ - evt->val = event.val; - evt->type = event.type; - evt->is_repeat = event.is_repeat; + event_state->val = event.val; + event_state->type = event.type; + event_state->is_repeat = event.is_repeat; /* Exclude arrow keys, esc, etc from text input. */ if (type == GHOST_kEventKeyUp) { @@ -4682,57 +4685,57 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void case EVT_LEFTSHIFTKEY: case EVT_RIGHTSHIFTKEY: if (event.val == KM_PRESS) { - if (evt->ctrl || evt->alt || evt->oskey) { + if (event_state->ctrl || event_state->alt || event_state->oskey) { keymodifier = (KM_MOD_FIRST | KM_MOD_SECOND); } else { keymodifier = KM_MOD_FIRST; } } - event.shift = evt->shift = keymodifier; + event.shift = event_state->shift = keymodifier; break; case EVT_LEFTCTRLKEY: case EVT_RIGHTCTRLKEY: if (event.val == KM_PRESS) { - if (evt->shift || evt->alt || evt->oskey) { + if (event_state->shift || event_state->alt || event_state->oskey) { keymodifier = (KM_MOD_FIRST | KM_MOD_SECOND); } else { keymodifier = KM_MOD_FIRST; } } - event.ctrl = evt->ctrl = keymodifier; + event.ctrl = event_state->ctrl = keymodifier; break; case EVT_LEFTALTKEY: case EVT_RIGHTALTKEY: if (event.val == KM_PRESS) { - if (evt->ctrl || evt->shift || evt->oskey) { + if (event_state->ctrl || event_state->shift || event_state->oskey) { keymodifier = (KM_MOD_FIRST | KM_MOD_SECOND); } else { keymodifier = KM_MOD_FIRST; } } - event.alt = evt->alt = keymodifier; + event.alt = event_state->alt = keymodifier; break; case EVT_OSKEY: if (event.val == KM_PRESS) { - if (evt->ctrl || evt->alt || evt->shift) { + if (event_state->ctrl || event_state->alt || event_state->shift) { keymodifier = (KM_MOD_FIRST | KM_MOD_SECOND); } else { keymodifier = KM_MOD_FIRST; } } - event.oskey = evt->oskey = keymodifier; + event.oskey = event_state->oskey = keymodifier; break; default: if (event.val == KM_PRESS && event.keymodifier == 0) { /* Only set in eventstate, for next event. */ - evt->keymodifier = event.type; + event_state->keymodifier = event.type; } else if (event.val == KM_RELEASE && event.keymodifier == event.type) { - event.keymodifier = evt->keymodifier = 0; + event.keymodifier = event_state->keymodifier = 0; } break; } @@ -4755,7 +4758,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void * Since it's impossible to map a key modifier to an unknown key, * it shouldn't harm to clear it. */ if (event.keymodifier == EVT_UNKNOWNKEY) { - evt->keymodifier = event.keymodifier = 0; + event_state->keymodifier = event.keymodifier = 0; } /* If test_break set, it catches this. Do not set with modifier presses. @@ -4770,7 +4773,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void if (event.val == KM_PRESS) { /* Don't reset timer & location when holding the key generates repeat events. */ if (event.is_repeat == false) { - wm_event_prev_click_set(&event, evt); + wm_event_prev_click_set(&event, event_state); } } |