From f052fb564605a788378d361e161a3447d30814a6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 8 Mar 2022 13:48:34 +1100 Subject: Event System: add ISKEYBOARD_OR_BUTTON macro This simplifies checking for event types that support press & release. --- source/blender/windowmanager/WM_types.h | 2 +- source/blender/windowmanager/intern/wm_event_system.c | 12 +++++------- source/blender/windowmanager/wm_event_types.h | 10 ++++++++++ 3 files changed, 16 insertions(+), 8 deletions(-) (limited to 'source/blender/windowmanager') diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index d7fe34a3b4c..b2296ced923 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -635,7 +635,7 @@ typedef struct wmTabletData { * Notes: * * - The previous values are only set for mouse button and keyboard events. - * See: #ISMOUSE_BUTTON & #ISKEYBOARD macros. + * See: #ISKEYBOARD_OR_BUTTON macro. * * - Previous x/y are exceptions: #wmEvent.prev * these are set on mouse motion, see #MOUSEMOVE & track-pad events. diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 27a7042fd62..6cf7a33e06e 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -145,7 +145,7 @@ wmEvent *WM_event_add_simulate(wmWindow *win, const wmEvent *event_to_add) copy_v2_v2_int(win->eventstate->prev_xy, win->eventstate->xy); copy_v2_v2_int(event->prev_xy, win->eventstate->xy); } - else if (ISMOUSE_BUTTON(event->type) || ISKEYBOARD(event->type)) { + else if (ISKEYBOARD_OR_BUTTON(event->type)) { win->eventstate->prev_val = event->prev_val = win->eventstate->val; win->eventstate->prev_type = event->prev_type = win->eventstate->type; @@ -3205,7 +3205,7 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers) win->event_queue_check_drag = false; } } - else if (ISMOUSE_BUTTON(event->type) || ISKEYBOARD(event->type)) { + else if (ISKEYBOARD_OR_BUTTON(event->type)) { /* All events that don't set #wmEvent.prev_type must be ignored. */ /* Test for CLICK events. */ @@ -4770,7 +4770,7 @@ static wmEvent *wm_event_add_trackpad(wmWindow *win, const wmEvent *event, int d */ static void wm_event_state_update_and_click_set(wmEvent *event, wmEvent *event_state) { - BLI_assert(ISMOUSE_BUTTON(event->type) || ISKEYBOARD(event->type)); + BLI_assert(ISKEYBOARD_OR_BUTTON(event->type)); BLI_assert(ELEM(event->val, KM_PRESS, KM_RELEASE)); /* Only copy these flags into the `event_state`. */ @@ -4839,15 +4839,13 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void * while not common, avoid a false alarm. */ #ifndef NDEBUG if ((event_state->type || event_state->val) && /* Ignore cleared event state. */ - !(ISMOUSE_BUTTON(event_state->type) || ISKEYBOARD(event_state->type) || - (event_state->type == EVENT_NONE))) { + !(ISKEYBOARD_OR_BUTTON(event_state->type) || (event_state->type == EVENT_NONE))) { CLOG_WARN(WM_LOG_HANDLERS, "Non-keyboard/mouse button found in 'win->eventstate->type = %d'", event_state->type); } if ((event_state->prev_type || event_state->prev_val) && /* Ignore cleared event state. */ - !(ISMOUSE_BUTTON(event_state->prev_type) || ISKEYBOARD(event_state->prev_type) || - (event_state->type == EVENT_NONE))) { + !(ISKEYBOARD_OR_BUTTON(event_state->prev_type) || (event_state->type == EVENT_NONE))) { CLOG_WARN(WM_LOG_HANDLERS, "Non-keyboard/mouse button found in 'win->eventstate->prev_type = %d'", event_state->prev_type); diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h index 578663b6fe8..fd0760d1d1c 100644 --- a/source/blender/windowmanager/wm_event_types.h +++ b/source/blender/windowmanager/wm_event_types.h @@ -363,6 +363,16 @@ enum { (((event_type) >= _EVT_KEYBOARD_MIN && (event_type) <= _EVT_KEYBOARD_MAX) || \ ((event_type) >= EVT_F1KEY && (event_type) <= EVT_F24KEY)) +/** + * Test whether the event is a key on the keyboard + * or any other kind of button that supports press & release + * (use for click & click-drag detection). + * + * \note Mouse wheel events are excluded from this macro, while they do generate press events it + * doesn't make sense to have click & click-drag events for a mouse-wheel as it can't be held down. + */ +#define ISKEYBOARD_OR_BUTTON(event_type) (ISMOUSE_BUTTON(event_type) || ISKEYBOARD(event_type)) + /** Test whether the event is a modifier key. */ #define ISKEYMODIFIER(event_type) \ (((event_type) >= EVT_LEFTCTRLKEY && (event_type) <= EVT_LEFTSHIFTKEY) || \ -- cgit v1.2.3