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:
authorCampbell Barton <campbell@blender.org>2022-02-24 14:48:34 +0300
committerCampbell Barton <campbell@blender.org>2022-02-25 09:58:22 +0300
commitad0b3abf539bbb358f799d3f36649b5d46f222c8 (patch)
treed7aff552c5541880ca1ce2648595455418cafc56 /source/blender/windowmanager
parente7cae5187773f41e62830be597c6f598bff0653f (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')
-rw-r--r--source/blender/windowmanager/WM_api.h2
-rw-r--r--source/blender/windowmanager/WM_types.h9
-rw-r--r--source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c6
-rw-r--r--source/blender/windowmanager/intern/wm_event_query.c30
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c84
-rw-r--r--source/blender/windowmanager/intern/wm_operator_utils.c8
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c2
-rw-r--r--source/blender/windowmanager/intern/wm_window.c21
-rw-r--r--source/blender/windowmanager/wm_event_types.h9
9 files changed, 83 insertions, 88 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index b00d441dd5d..ef8aed4c664 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -1427,8 +1427,6 @@ bool WM_window_modal_keymap_status_draw(struct bContext *C,
*/
void WM_event_print(const struct wmEvent *event);
-int WM_event_modifier_flag(const struct wmEvent *event);
-
/**
* For modal callbacks, check configuration for how to interpret exit with tweaks.
*/
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index a95c2ee2bb2..2f431bcd208 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -635,9 +635,12 @@ typedef struct wmEvent {
*/
int prev_xy[2];
- /** Modifier states. */
- /** 'oskey' is apple or windows-key, value denotes order of pressed. */
- short shift, ctrl, alt, oskey;
+ /**
+ * Modifier states.
+ * #KM_SHIFT, #KM_CTRL, #KM_ALT & #KM_OSKEY is apple or windows-key.
+ */
+ uint8_t modifier;
+
/** Raw-key modifier (allow using any key as a modifier). */
short keymodifier;
diff --git a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
index ad902f0963e..f1ac19f4651 100644
--- a/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
+++ b/source/blender/windowmanager/gizmo/intern/wm_gizmo_map.c
@@ -819,8 +819,6 @@ wmGizmo *wm_gizmomap_highlight_find(wmGizmoMap *gzmap,
do_step[i] = WM_gizmo_context_check_drawstep(C, i);
}
- const int event_modifier = WM_event_modifier_flag(event);
-
LISTBASE_FOREACH (wmGizmoGroup *, gzgroup, &gzmap->groups) {
/* If it were important we could initialize here,
@@ -839,11 +837,11 @@ wmGizmo *wm_gizmomap_highlight_find(wmGizmoMap *gzmap,
}
if (step == WM_GIZMOMAP_DRAWSTEP_3D) {
wm_gizmogroup_intersectable_gizmos_to_list(
- wm, gzgroup, event_modifier, &visible_3d_gizmos);
+ wm, gzgroup, event->modifier, &visible_3d_gizmos);
}
else if (step == WM_GIZMOMAP_DRAWSTEP_2D) {
if ((gz = wm_gizmogroup_find_intersected_gizmo(
- wm, gzgroup, C, event_modifier, event->mval, r_part))) {
+ wm, gzgroup, C, event->modifier, event->mval, r_part))) {
break;
}
}
diff --git a/source/blender/windowmanager/intern/wm_event_query.c b/source/blender/windowmanager/intern/wm_event_query.c
index 304d7f73eb1..751dcc61fa9 100644
--- a/source/blender/windowmanager/intern/wm_event_query.c
+++ b/source/blender/windowmanager/intern/wm_event_query.c
@@ -80,10 +80,10 @@ void WM_event_print(const wmEvent *event)
prev_type_id,
event->prev_val,
prev_val_id,
- event->shift,
- event->ctrl,
- event->alt,
- event->oskey,
+ (event->modifier & KM_SHIFT) != 0,
+ (event->modifier & KM_CTRL) != 0,
+ (event->modifier & KM_ALT) != 0,
+ (event->modifier & KM_OSKEY) != 0,
event->keymodifier,
event->is_repeat,
event->xy[0],
@@ -129,24 +129,6 @@ void WM_event_print(const wmEvent *event)
/** \name Event Modifier/Type Queries
* \{ */
-int WM_event_modifier_flag(const wmEvent *event)
-{
- int flag = 0;
- if (event->ctrl) {
- flag |= KM_CTRL;
- }
- if (event->alt) {
- flag |= KM_ALT;
- }
- if (event->shift) {
- flag |= KM_SHIFT;
- }
- if (event->oskey) {
- flag |= KM_OSKEY;
- }
- return flag;
-}
-
bool WM_event_type_mask_test(const int event_type, const enum eEventType_Mask mask)
{
/* Keyboard. */
@@ -491,8 +473,8 @@ int WM_event_absolute_delta_y(const struct wmEvent *event)
*/
bool WM_event_is_ime_switch(const struct wmEvent *event)
{
- return event->val == KM_PRESS && event->type == EVT_SPACEKEY &&
- (event->ctrl || event->oskey || event->alt);
+ return (event->val == KM_PRESS) && (event->type == EVT_SPACEKEY) &&
+ (event->modifier & (KM_CTRL | KM_OSKEY | KM_ALT));
}
#endif
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};
diff --git a/source/blender/windowmanager/intern/wm_operator_utils.c b/source/blender/windowmanager/intern/wm_operator_utils.c
index 6f3f42bee53..5a817075cd5 100644
--- a/source/blender/windowmanager/intern/wm_operator_utils.c
+++ b/source/blender/windowmanager/intern/wm_operator_utils.c
@@ -115,11 +115,11 @@ static bool interactive_value_update(ValueInteraction *inter,
(((float)(mval_curr - mval_init) / inter->context_vars.region->winx) *
value_range)) *
value_scale;
- if (event->ctrl) {
+ if (event->modifier & KM_CTRL) {
const double snap = 0.1;
value_delta = (float)roundf((double)value_delta / snap) * snap;
}
- if (event->shift) {
+ if (event->modifier & KM_SHIFT) {
value_delta *= 0.1f;
}
const float value_final = inter->init.prop_value + value_delta;
@@ -133,8 +133,8 @@ static bool interactive_value_update(ValueInteraction *inter,
}
inter->prev.prop_value = value_final;
- inter->prev.is_snap = event->ctrl;
- inter->prev.is_precise = event->shift;
+ inter->prev.is_snap = (event->modifier & KM_CTRL) != 0;
+ inter->prev.is_precise = (event->modifier & KM_SHIFT) != 0;
*r_value_final = value_final;
return changed;
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index a476fb4fa13..6b8f7309d80 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -2822,7 +2822,7 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even
float numValue;
/* TODO: fix hardcoded events */
- bool snap = event->ctrl != 0;
+ bool snap = (event->modifier & KM_CTRL) != 0;
/* Modal numinput active, try to handle numeric inputs first... */
if (event->val == KM_PRESS && has_numInput && handleNumInput(C, &rc->num_input, event)) {
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index a983150b504..cdfb6a81596 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -1104,10 +1104,7 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
win->active = 0; /* XXX */
/* clear modifiers for inactive windows */
- win->eventstate->alt = 0;
- win->eventstate->ctrl = 0;
- win->eventstate->shift = 0;
- win->eventstate->oskey = 0;
+ win->eventstate->modifier = 0;
win->eventstate->keymodifier = 0;
break;
@@ -1138,7 +1135,7 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
kdata.ascii = '\0';
kdata.utf8_buf[0] = '\0';
- if (win->eventstate->shift) {
+ if (win->eventstate->modifier & KM_SHIFT) {
if ((keymodifier & KM_SHIFT) == 0) {
kdata.key = GHOST_kKeyLeftShift;
wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, &kdata);
@@ -1147,11 +1144,11 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
#ifdef USE_WIN_ACTIVATE
else {
if (keymodifier & KM_SHIFT) {
- win->eventstate->shift = KM_MOD_HELD;
+ win->eventstate->modifier |= KM_SHIFT;
}
}
#endif
- if (win->eventstate->ctrl) {
+ if (win->eventstate->modifier & KM_CTRL) {
if ((keymodifier & KM_CTRL) == 0) {
kdata.key = GHOST_kKeyLeftControl;
wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, &kdata);
@@ -1160,11 +1157,11 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
#ifdef USE_WIN_ACTIVATE
else {
if (keymodifier & KM_CTRL) {
- win->eventstate->ctrl = KM_MOD_HELD;
+ win->eventstate->modifier |= KM_CTRL;
}
}
#endif
- if (win->eventstate->alt) {
+ if (win->eventstate->modifier & KM_ALT) {
if ((keymodifier & KM_ALT) == 0) {
kdata.key = GHOST_kKeyLeftAlt;
wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, &kdata);
@@ -1173,11 +1170,11 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
#ifdef USE_WIN_ACTIVATE
else {
if (keymodifier & KM_ALT) {
- win->eventstate->alt = KM_MOD_HELD;
+ win->eventstate->modifier |= KM_ALT;
}
}
#endif
- if (win->eventstate->oskey) {
+ if (win->eventstate->modifier & KM_OSKEY) {
if ((keymodifier & KM_OSKEY) == 0) {
kdata.key = GHOST_kKeyOS;
wm_event_add_ghostevent(wm, win, GHOST_kEventKeyUp, &kdata);
@@ -1186,7 +1183,7 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_ptr
#ifdef USE_WIN_ACTIVATE
else {
if (keymodifier & KM_OSKEY) {
- win->eventstate->oskey = KM_MOD_HELD;
+ win->eventstate->modifier |= KM_OSKEY;
}
}
#endif
diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h
index 0ff181db9b1..c5764ad7a5e 100644
--- a/source/blender/windowmanager/wm_event_types.h
+++ b/source/blender/windowmanager/wm_event_types.h
@@ -408,15 +408,6 @@ enum {
((ISKEYBOARD(event_type) || ISMOUSE(event_type) || ISNDOF(event_type)) && \
(ISKEYMODIFIER(event_type) == false))
-/* Internal helpers. */
-#define _VA_IS_EVENT_MOD2(v, a) (CHECK_TYPE_INLINE(v, wmEvent *), ((v)->a))
-#define _VA_IS_EVENT_MOD3(v, a, b) (_VA_IS_EVENT_MOD2(v, a) || ((v)->b))
-#define _VA_IS_EVENT_MOD4(v, a, b, c) (_VA_IS_EVENT_MOD3(v, a, b) || ((v)->c))
-#define _VA_IS_EVENT_MOD5(v, a, b, c, d) (_VA_IS_EVENT_MOD4(v, a, b, c) || ((v)->d))
-
-/** Reusable `IS_EVENT_MOD(event, shift, ctrl, alt, oskey)` macro. */
-#define IS_EVENT_MOD(...) VA_NARGS_CALL_OVERLOAD(_VA_IS_EVENT_MOD, __VA_ARGS__)
-
enum eEventType_Mask {
/** #ISKEYMODIFIER */
EVT_TYPE_MASK_KEYBOARD_MODIFIER = (1 << 0),