From 0950e6fae6800cd847d1c74e35489e46b0c48229 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sun, 18 Sep 2022 10:31:14 +1000 Subject: 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. --- intern/ghost/GHOST_Types.h | 6 ++++-- intern/ghost/intern/GHOST_EventPrinter.cpp | 7 +++++-- intern/ghost/intern/GHOST_ModifierKeys.cpp | 25 +++++++++++++++++-------- intern/ghost/intern/GHOST_ModifierKeys.h | 3 ++- intern/ghost/intern/GHOST_SystemCocoa.mm | 6 +++--- intern/ghost/intern/GHOST_SystemSDL.cpp | 7 ++++--- intern/ghost/intern/GHOST_SystemWayland.cpp | 11 ++++++----- intern/ghost/intern/GHOST_SystemWin32.cpp | 17 ++++++++--------- intern/ghost/intern/GHOST_SystemX11.cpp | 14 ++++++++------ 9 files changed, 57 insertions(+), 39 deletions(-) (limited to 'intern') 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); -- cgit v1.2.3