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.
This commit is contained in:
@@ -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. */
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user