diff options
author | Campbell Barton <campbell@blender.org> | 2022-09-18 03:31:14 +0300 |
---|---|---|
committer | Campbell Barton <campbell@blender.org> | 2022-09-18 03:31:14 +0300 |
commit | 0950e6fae6800cd847d1c74e35489e46b0c48229 (patch) | |
tree | 5aa7e69b072c80c953b8edd7011ec65241694454 | |
parent | 8934f00ac5701ea349f2bcccab32e252c79aa730 (diff) |
GHOST: support left/right OS-key
Handling the OS key now match other modifiers in GHOST which detect
each key separately, making the behavior simpler to reason about since
mapping a single key to a modifier state is simpler, avoiding handling
that only applied to the OS-Key.
This means simulating key up/down events can use the correct modifier.
In the window-manager this is still only accessed accessed via KM_OSKEY.
-rw-r--r-- | intern/ghost/GHOST_Types.h | 6 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_EventPrinter.cpp | 7 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_ModifierKeys.cpp | 25 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_ModifierKeys.h | 3 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_SystemCocoa.mm | 6 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_SystemSDL.cpp | 7 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_SystemWayland.cpp | 11 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_SystemWin32.cpp | 17 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_SystemX11.cpp | 14 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.cc | 3 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_window.c | 4 |
11 files changed, 62 insertions, 41 deletions
diff --git a/intern/ghost/GHOST_Types.h b/intern/ghost/GHOST_Types.h index adc45285f94..909417e0f50 100644 --- a/intern/ghost/GHOST_Types.h +++ b/intern/ghost/GHOST_Types.h @@ -121,7 +121,8 @@ typedef enum { GHOST_kModifierKeyRightAlt, GHOST_kModifierKeyLeftControl, GHOST_kModifierKeyRightControl, - GHOST_kModifierKeyOS, + GHOST_kModifierKeyLeftOS, + GHOST_kModifierKeyRightOS, GHOST_kModifierKeyNum } GHOST_TModifierKey; @@ -326,7 +327,8 @@ typedef enum { GHOST_kKeyRightControl, GHOST_kKeyLeftAlt, GHOST_kKeyRightAlt, - GHOST_kKeyOS, /* Command key on Apple, Windows key(s) on Windows. */ + GHOST_kKeyLeftOS, /* Command key on Apple, Windows key(s) on Windows. */ + GHOST_kKeyRightOS, GHOST_kKeyGrLess, /* German PC only! */ GHOST_kKeyApp, /* Also known as menu key. */ diff --git a/intern/ghost/intern/GHOST_EventPrinter.cpp b/intern/ghost/intern/GHOST_EventPrinter.cpp index 2620bcc075d..7c20cd701b0 100644 --- a/intern/ghost/intern/GHOST_EventPrinter.cpp +++ b/intern/ghost/intern/GHOST_EventPrinter.cpp @@ -220,8 +220,11 @@ void GHOST_EventPrinter::getKeyString(GHOST_TKey key, char str[32]) const case GHOST_kKeyRightAlt: tstr = "RightAlt"; break; - case GHOST_kKeyOS: - tstr = "OS"; + case GHOST_kKeyLeftOS: + tstr = "LeftOS"; + break; + case GHOST_kKeyRightOS: + tstr = "RightOS"; break; case GHOST_kKeyApp: tstr = "App"; diff --git a/intern/ghost/intern/GHOST_ModifierKeys.cpp b/intern/ghost/intern/GHOST_ModifierKeys.cpp index d31dc8f0770..10f2e8019a7 100644 --- a/intern/ghost/intern/GHOST_ModifierKeys.cpp +++ b/intern/ghost/intern/GHOST_ModifierKeys.cpp @@ -42,8 +42,11 @@ GHOST_TKey GHOST_ModifierKeys::getModifierKeyCode(GHOST_TModifierKey mask) case GHOST_kModifierKeyRightControl: key = GHOST_kKeyRightControl; break; - case GHOST_kModifierKeyOS: - key = GHOST_kKeyOS; + case GHOST_kModifierKeyLeftOS: + key = GHOST_kKeyLeftOS; + break; + case GHOST_kModifierKeyRightOS: + key = GHOST_kKeyRightOS; break; default: // Should not happen @@ -68,8 +71,10 @@ bool GHOST_ModifierKeys::get(GHOST_TModifierKey mask) const return m_LeftControl; case GHOST_kModifierKeyRightControl: return m_RightControl; - case GHOST_kModifierKeyOS: - return m_OS; + case GHOST_kModifierKeyLeftOS: + return m_LeftOS; + case GHOST_kModifierKeyRightOS: + return m_RightOS; default: return false; } @@ -96,8 +101,11 @@ void GHOST_ModifierKeys::set(GHOST_TModifierKey mask, bool down) case GHOST_kModifierKeyRightControl: m_RightControl = down; break; - case GHOST_kModifierKeyOS: - m_OS = down; + case GHOST_kModifierKeyLeftOS: + m_LeftOS = down; + break; + case GHOST_kModifierKeyRightOS: + m_RightOS = down; break; default: break; @@ -112,7 +120,8 @@ void GHOST_ModifierKeys::clear() m_RightAlt = false; m_LeftControl = false; m_RightControl = false; - m_OS = false; + m_LeftOS = false; + m_RightOS = false; } bool GHOST_ModifierKeys::equals(const GHOST_ModifierKeys &keys) const @@ -120,5 +129,5 @@ bool GHOST_ModifierKeys::equals(const GHOST_ModifierKeys &keys) const return (m_LeftShift == keys.m_LeftShift) && (m_RightShift == keys.m_RightShift) && (m_LeftAlt == keys.m_LeftAlt) && (m_RightAlt == keys.m_RightAlt) && (m_LeftControl == keys.m_LeftControl) && (m_RightControl == keys.m_RightControl) && - (m_OS == keys.m_OS); + (m_LeftOS == keys.m_LeftOS) && (m_RightOS == keys.m_RightOS); } diff --git a/intern/ghost/intern/GHOST_ModifierKeys.h b/intern/ghost/intern/GHOST_ModifierKeys.h index ce1bf3df2ae..f83e861f8b6 100644 --- a/intern/ghost/intern/GHOST_ModifierKeys.h +++ b/intern/ghost/intern/GHOST_ModifierKeys.h @@ -68,5 +68,6 @@ struct GHOST_ModifierKeys { /** Bitfield that stores the appropriate key state. */ uint8_t m_RightControl : 1; /** Bitfield that stores the appropriate key state. */ - uint8_t m_OS : 1; + uint8_t m_LeftOS : 1; + uint8_t m_RightOS : 1; }; diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm index 5562db7d67f..fe5992343ab 100644 --- a/intern/ghost/intern/GHOST_SystemCocoa.mm +++ b/intern/ghost/intern/GHOST_SystemCocoa.mm @@ -856,7 +856,7 @@ GHOST_TSuccess GHOST_SystemCocoa::setMouseCursorPosition(int32_t x, int32_t y) GHOST_TSuccess GHOST_SystemCocoa::getModifierKeys(GHOST_ModifierKeys &keys) const { - keys.set(GHOST_kModifierKeyOS, (m_modifierMask & NSEventModifierFlagCommand) ? true : false); + keys.set(GHOST_kModifierKeyLeftOS, (m_modifierMask & NSEventModifierFlagCommand) ? true : false); keys.set(GHOST_kModifierKeyLeftAlt, (m_modifierMask & NSEventModifierFlagOption) ? true : false); keys.set(GHOST_kModifierKeyLeftShift, (m_modifierMask & NSEventModifierFlagShift) ? true : false); @@ -1020,7 +1020,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleApplicationBecomeActiveEvent() (modifiers & NSEventModifierFlagCommand) ? GHOST_kEventKeyDown : GHOST_kEventKeyUp, window, - GHOST_kKeyOS, + GHOST_kKeyLeftOS, false)); } @@ -1901,7 +1901,7 @@ GHOST_TSuccess GHOST_SystemCocoa::handleKeyEvent(void *eventPtr) [event timestamp] * 1000, (modifiers & NSEventModifierFlagCommand) ? GHOST_kEventKeyDown : GHOST_kEventKeyUp, window, - GHOST_kKeyOS, + GHOST_kKeyLeftOS, false)); } diff --git a/intern/ghost/intern/GHOST_SystemSDL.cpp b/intern/ghost/intern/GHOST_SystemSDL.cpp index 6d0b2b8aa55..76770e735fa 100644 --- a/intern/ghost/intern/GHOST_SystemSDL.cpp +++ b/intern/ghost/intern/GHOST_SystemSDL.cpp @@ -161,7 +161,8 @@ GHOST_TSuccess GHOST_SystemSDL::getModifierKeys(GHOST_ModifierKeys &keys) const keys.set(GHOST_kModifierKeyRightControl, (mod & KMOD_RCTRL) != 0); keys.set(GHOST_kModifierKeyLeftAlt, (mod & KMOD_LALT) != 0); keys.set(GHOST_kModifierKeyRightAlt, (mod & KMOD_RALT) != 0); - keys.set(GHOST_kModifierKeyOS, (mod & (KMOD_LGUI | KMOD_RGUI)) != 0); + keys.set(GHOST_kModifierKeyLeftOS, (mod & KMOD_LGUI) != 0); + keys.set(GHOST_kModifierKeyRightOS, (mod & KMOD_RGUI) != 0); return GHOST_kSuccess; } @@ -219,8 +220,8 @@ static GHOST_TKey convertSDLKey(SDL_Scancode key) GXMAP(type, SDL_SCANCODE_RCTRL, GHOST_kKeyRightControl); GXMAP(type, SDL_SCANCODE_LALT, GHOST_kKeyLeftAlt); GXMAP(type, SDL_SCANCODE_RALT, GHOST_kKeyRightAlt); - GXMAP(type, SDL_SCANCODE_LGUI, GHOST_kKeyOS); - GXMAP(type, SDL_SCANCODE_RGUI, GHOST_kKeyOS); + GXMAP(type, SDL_SCANCODE_LGUI, GHOST_kKeyLeftOS); + GXMAP(type, SDL_SCANCODE_RGUI, GHOST_kKeyRightOS); GXMAP(type, SDL_SCANCODE_APPLICATION, GHOST_kKeyApp); GXMAP(type, SDL_SCANCODE_INSERT, GHOST_kKeyInsert); diff --git a/intern/ghost/intern/GHOST_SystemWayland.cpp b/intern/ghost/intern/GHOST_SystemWayland.cpp index 4c663e98824..0971245fc68 100644 --- a/intern/ghost/intern/GHOST_SystemWayland.cpp +++ b/intern/ghost/intern/GHOST_SystemWayland.cpp @@ -613,8 +613,8 @@ static GHOST_TKey xkb_map_gkey(const xkb_keysym_t sym) GXMAP(gkey, XKB_KEY_Control_R, GHOST_kKeyRightControl); GXMAP(gkey, XKB_KEY_Alt_L, GHOST_kKeyLeftAlt); GXMAP(gkey, XKB_KEY_Alt_R, GHOST_kKeyRightAlt); - GXMAP(gkey, XKB_KEY_Super_L, GHOST_kKeyOS); - GXMAP(gkey, XKB_KEY_Super_R, GHOST_kKeyOS); + GXMAP(gkey, XKB_KEY_Super_L, GHOST_kKeyLeftOS); + GXMAP(gkey, XKB_KEY_Super_R, GHOST_kKeyRightOS); GXMAP(gkey, XKB_KEY_Menu, GHOST_kKeyApp); GXMAP(gkey, XKB_KEY_Caps_Lock, GHOST_kKeyCapsLock); @@ -2185,8 +2185,8 @@ static void keyboard_handle_enter(void *data, MOD_TEST_CASE(XKB_KEY_Control_R, GHOST_kKeyRightControl, ctrl); MOD_TEST_CASE(XKB_KEY_Alt_L, GHOST_kKeyLeftAlt, alt); MOD_TEST_CASE(XKB_KEY_Alt_R, GHOST_kKeyRightAlt, alt); - MOD_TEST_CASE(XKB_KEY_Super_L, GHOST_kKeyOS, logo); - MOD_TEST_CASE(XKB_KEY_Super_R, GHOST_kKeyOS, logo); + MOD_TEST_CASE(XKB_KEY_Super_L, GHOST_kKeyLeftOS, logo); + MOD_TEST_CASE(XKB_KEY_Super_R, GHOST_kKeyRightOS, logo); } #undef MOD_TEST @@ -3069,7 +3069,8 @@ GHOST_TSuccess GHOST_SystemWayland::getModifierKeys(GHOST_ModifierKeys &keys) co keys.set(GHOST_kModifierKeyRightControl, val); val = MOD_TEST(state, seat->xkb_keymap_mod_index.logo); - keys.set(GHOST_kModifierKeyOS, val); + keys.set(GHOST_kModifierKeyLeftOS, val); + keys.set(GHOST_kModifierKeyRightOS, val); val = MOD_TEST(state, seat->xkb_keymap_mod_index.num); keys.set(GHOST_kModifierKeyNum, val); diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index 6cb36337b55..ce622aa0751 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -456,14 +456,11 @@ GHOST_TSuccess GHOST_SystemWin32::getModifierKeys(GHOST_ModifierKeys &keys) cons down = HIBYTE(::GetKeyState(VK_RCONTROL)) != 0; keys.set(GHOST_kModifierKeyRightControl, down); - bool lwindown = HIBYTE(::GetKeyState(VK_LWIN)) != 0; - bool rwindown = HIBYTE(::GetKeyState(VK_RWIN)) != 0; - if (lwindown || rwindown) { - keys.set(GHOST_kModifierKeyOS, true); - } - else { - keys.set(GHOST_kModifierKeyOS, false); - } + down = HIBYTE(::GetKeyState(VK_LWIN)) != 0; + keys.set(GHOST_kModifierKeyLeftOS, down); + down = HIBYTE(::GetKeyState(VK_RWIN)) != 0; + keys.set(GHOST_kModifierKeyRightOS, down); + return GHOST_kSuccess; } @@ -751,8 +748,10 @@ GHOST_TKey GHOST_SystemWin32::convertKey(short vKey, short scanCode, short exten key = (extend) ? GHOST_kKeyRightAlt : GHOST_kKeyLeftAlt; break; case VK_LWIN: + key = GHOST_kKeyLeftOS; + break; case VK_RWIN: - key = GHOST_kKeyOS; + key = GHOST_kKeyRightOS; break; case VK_APPS: key = GHOST_kKeyApp; diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp index bb98c0de19b..08ac0edb7ec 100644 --- a/intern/ghost/intern/GHOST_SystemX11.cpp +++ b/intern/ghost/intern/GHOST_SystemX11.cpp @@ -1065,7 +1065,8 @@ void GHOST_SystemX11::processEvent(XEvent *xe) case GHOST_kKeyLeftShift: case GHOST_kKeyRightControl: case GHOST_kKeyLeftControl: - case GHOST_kKeyOS: + case GHOST_kKeyLeftOS: + case GHOST_kKeyRightOS: case GHOST_kKey0: case GHOST_kKey1: case GHOST_kKey2: @@ -1600,9 +1601,10 @@ GHOST_TSuccess GHOST_SystemX11::getModifierKeys(GHOST_ModifierKeys &keys) const keys.set(GHOST_kModifierKeyLeftAlt, ((m_keyboard_vector[alt_l >> 3] >> (alt_l & 7)) & 1) != 0); keys.set(GHOST_kModifierKeyRightAlt, ((m_keyboard_vector[alt_r >> 3] >> (alt_r & 7)) & 1) != 0); /* super (windows) - only one GHOST-kModifierKeyOS, so mapping to either */ - keys.set(GHOST_kModifierKeyOS, - (((m_keyboard_vector[super_l >> 3] >> (super_l & 7)) & 1) || - ((m_keyboard_vector[super_r >> 3] >> (super_r & 7)) & 1)) != 0); + keys.set(GHOST_kModifierKeyLeftOS, + ((m_keyboard_vector[super_l >> 3] >> (super_l & 7)) & 1) != 0); + keys.set(GHOST_kModifierKeyRightOS, + ((m_keyboard_vector[super_r >> 3] >> (super_r & 7)) & 1) != 0); return GHOST_kSuccess; } @@ -1818,8 +1820,8 @@ static GHOST_TKey ghost_key_from_keysym(const KeySym key) GXMAP(type, XK_Control_R, GHOST_kKeyRightControl); GXMAP(type, XK_Alt_L, GHOST_kKeyLeftAlt); GXMAP(type, XK_Alt_R, GHOST_kKeyRightAlt); - GXMAP(type, XK_Super_L, GHOST_kKeyOS); - GXMAP(type, XK_Super_R, GHOST_kKeyOS); + GXMAP(type, XK_Super_L, GHOST_kKeyLeftOS); + GXMAP(type, XK_Super_R, GHOST_kKeyRightOS); GXMAP(type, XK_Insert, GHOST_kKeyInsert); GXMAP(type, XK_Delete, GHOST_kKeyDelete); diff --git a/source/blender/windowmanager/intern/wm_event_system.cc b/source/blender/windowmanager/intern/wm_event_system.cc index 4209e1e5e00..841df253dab 100644 --- a/source/blender/windowmanager/intern/wm_event_system.cc +++ b/source/blender/windowmanager/intern/wm_event_system.cc @@ -4733,7 +4733,8 @@ static int convert_key(GHOST_TKey key) return EVT_LEFTCTRLKEY; case GHOST_kKeyRightControl: return EVT_RIGHTCTRLKEY; - case GHOST_kKeyOS: + case GHOST_kKeyLeftOS: + case GHOST_kKeyRightOS: return EVT_OSKEY; case GHOST_kKeyLeftAlt: return EVT_LEFTALTKEY; diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index 9180c53aeb5..b61ebdd11be 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -137,7 +137,9 @@ static const struct { {KM_ALT, {GHOST_kKeyLeftAlt, GHOST_kKeyRightAlt}, {GHOST_kModifierKeyLeftAlt, GHOST_kModifierKeyRightAlt}}, - {KM_OSKEY, {GHOST_kKeyOS, GHOST_kKeyOS}, {GHOST_kModifierKeyOS, GHOST_kModifierKeyOS}}, + {KM_OSKEY, + {GHOST_kKeyLeftOS, GHOST_kKeyRightOS}, + {GHOST_kModifierKeyLeftOS, GHOST_kModifierKeyRightOS}}, }; enum ModSide { |