diff options
author | Campbell Barton <campbell@blender.org> | 2022-02-24 14:48:34 +0300 |
---|---|---|
committer | Campbell Barton <campbell@blender.org> | 2022-02-25 09:58:22 +0300 |
commit | ad0b3abf539bbb358f799d3f36649b5d46f222c8 (patch) | |
tree | d7aff552c5541880ca1ce2648595455418cafc56 /source/blender/windowmanager/intern/wm_event_system.c | |
parent | e7cae5187773f41e62830be597c6f598bff0653f (diff) |
Cleanup: use flags for wmEvent modifier keys
Using flags makes checking multiple modifiers at once more convenient
and avoids macros/functions such as IS_EVENT_MOD & WM_event_modifier_flag
which have been removed. It also simplifies checking if modifier keys
have changed.
Diffstat (limited to 'source/blender/windowmanager/intern/wm_event_system.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 84 |
1 files changed, 55 insertions, 29 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 8a19c99f59b..326b8c167b8 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -2029,29 +2029,33 @@ static bool wm_eventmatch(const wmEvent *winevent, const wmKeyMapItem *kmi) } } + const bool shift = (winevent->modifier & KM_SHIFT) != 0; + const bool ctrl = (winevent->modifier & KM_CTRL) != 0; + const bool alt = (winevent->modifier & KM_ALT) != 0; + const bool oskey = (winevent->modifier & KM_OSKEY) != 0; + /* Modifiers also check bits, so it allows modifier order. * Account for rare case of when these keys are used as the 'type' not as modifiers. */ if (kmi->shift != KM_ANY) { - if ((winevent->shift != kmi->shift) && !(winevent->shift & kmi->shift) && + if ((shift != kmi->shift) && !(shift & kmi->shift) && !ELEM(winevent->type, EVT_LEFTSHIFTKEY, EVT_RIGHTSHIFTKEY)) { return false; } } if (kmi->ctrl != KM_ANY) { - if (winevent->ctrl != kmi->ctrl && !(winevent->ctrl & kmi->ctrl) && + if (ctrl != kmi->ctrl && !(ctrl & kmi->ctrl) && !ELEM(winevent->type, EVT_LEFTCTRLKEY, EVT_RIGHTCTRLKEY)) { return false; } } if (kmi->alt != KM_ANY) { - if (winevent->alt != kmi->alt && !(winevent->alt & kmi->alt) && + if (alt != kmi->alt && !(alt & kmi->alt) && !ELEM(winevent->type, EVT_LEFTALTKEY, EVT_RIGHTALTKEY)) { return false; } } if (kmi->oskey != KM_ANY) { - if (winevent->oskey != kmi->oskey && !(winevent->oskey & kmi->oskey) && - (winevent->type != EVT_OSKEY)) { + if (oskey != kmi->oskey && !(oskey & kmi->oskey) && (winevent->type != EVT_OSKEY)) { return false; } } @@ -4487,19 +4491,18 @@ static void wm_eventemulation(wmEvent *event, bool test_only) if (U.flag & USER_TWOBUTTONMOUSE) { if (event->type == LEFTMOUSE) { - short *mod = ( + const uint8_t mod_test = ( #if !defined(WIN32) - (U.mouse_emulate_3_button_modifier == USER_EMU_MMB_MOD_OSKEY) ? &event->oskey : - &event->alt + (U.mouse_emulate_3_button_modifier == USER_EMU_MMB_MOD_OSKEY) ? KM_OSKEY : KM_ALT #else /* Disable for WIN32 for now because it accesses the start menu. */ - &event->alt + KM_ALT #endif ); if (event->val == KM_PRESS) { - if (*mod) { - *mod = 0; + if (event->modifier & mod_test) { + event->modifier &= ~mod_test; event->type = MIDDLEMOUSE; if (!test_only) { @@ -4511,7 +4514,7 @@ static void wm_eventemulation(wmEvent *event, bool test_only) /* Only send middle-mouse release if emulated. */ if (emulating_event == MIDDLEMOUSE) { event->type = MIDDLEMOUSE; - *mod = 0; + event->modifier &= ~mod_test; } if (!test_only) { @@ -4931,7 +4934,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void case GHOST_kEventKeyDown: case GHOST_kEventKeyUp: { GHOST_TEventKeyData *kd = customdata; - short keymodifier = KM_NOTHING; + bool keymodifier = 0; event.type = convert_key(kd->key); event.ascii = kd->ascii; /* Might be not NULL terminated. */ @@ -4981,29 +4984,57 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void case EVT_LEFTSHIFTKEY: case EVT_RIGHTSHIFTKEY: if (event.val == KM_PRESS) { - keymodifier = KM_MOD_HELD; + keymodifier = true; + } + if (keymodifier) { + event.modifier |= KM_SHIFT; + event_state->modifier |= KM_SHIFT; + } + else { + event.modifier &= ~KM_SHIFT; + event_state->modifier &= ~KM_SHIFT; } - event.shift = event_state->shift = keymodifier; break; case EVT_LEFTCTRLKEY: case EVT_RIGHTCTRLKEY: if (event.val == KM_PRESS) { - keymodifier = KM_MOD_HELD; + keymodifier = true; + } + if (keymodifier) { + event.modifier |= KM_CTRL; + event_state->modifier |= KM_CTRL; + } + else { + event.modifier &= ~KM_CTRL; + event_state->modifier &= ~KM_CTRL; } - event.ctrl = event_state->ctrl = keymodifier; break; case EVT_LEFTALTKEY: case EVT_RIGHTALTKEY: if (event.val == KM_PRESS) { - keymodifier = KM_MOD_HELD; + keymodifier = true; + } + if (keymodifier) { + event.modifier |= KM_ALT; + event_state->modifier |= KM_ALT; + } + else { + event.modifier &= ~KM_ALT; + event_state->modifier &= ~KM_ALT; } - event.alt = event_state->alt = keymodifier; break; case EVT_OSKEY: if (event.val == KM_PRESS) { - keymodifier = KM_MOD_HELD; + keymodifier = true; + } + if (keymodifier) { + event.modifier |= KM_OSKEY; + event_state->modifier |= KM_OSKEY; + } + else { + event.modifier &= ~KM_OSKEY; + event_state->modifier &= ~KM_OSKEY; } - event.oskey = event_state->oskey = keymodifier; break; default: if (event.val == KM_PRESS && event.keymodifier == 0) { @@ -5041,7 +5072,7 @@ void wm_event_add_ghostevent(wmWindowManager *wm, wmWindow *win, int type, void * XXX Keep global for now? */ if ((event.type == EVT_ESCKEY && event.val == KM_PRESS) && /* Check other modifiers because ms-windows uses these to bring up the task manager. */ - (event.shift == 0 && event.ctrl == 0 && event.alt == 0)) { + ((event.modifier & (KM_SHIFT | KM_CTRL | KM_ALT)) == 0)) { G.is_break = true; } @@ -5301,9 +5332,7 @@ wmKeyMapItem *WM_event_match_keymap_item_from_handlers( /** State storage to detect changes between calls to refresh the information. */ struct CursorKeymapInfo_State { - struct { - short shift, ctrl, alt, oskey; - } modifiers; + uint8_t modifier; short space_type; short region_type; /* Never use, just compare memory for changes. */ @@ -5326,10 +5355,7 @@ static void wm_event_cursor_store(struct CursorKeymapInfo_State *state, short region_type, const bToolRef *tref) { - state->modifiers.shift = event->shift; - state->modifiers.ctrl = event->ctrl; - state->modifiers.alt = event->alt; - state->modifiers.oskey = event->oskey; + state->modifier = event->modifier; state->space_type = space_type; state->region_type = region_type; state->tref = tref ? *tref : (bToolRef){0}; |