[Bf-blender-cvs] [0950e6fae68] master: GHOST: support left/right OS-key

Campbell Barton noreply at git.blender.org
Sun Sep 18 03:17:41 CEST 2022


Commit: 0950e6fae6800cd847d1c74e35489e46b0c48229
Author: Campbell Barton
Date:   Sun Sep 18 10:31:14 2022 +1000
Branches: master
https://developer.blender.org/rB0950e6fae6800cd847d1c74e35489e46b0c48229

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.

===================================================================

M	intern/ghost/GHOST_Types.h
M	intern/ghost/intern/GHOST_EventPrinter.cpp
M	intern/ghost/intern/GHOST_ModifierKeys.cpp
M	intern/ghost/intern/GHOST_ModifierKeys.h
M	intern/ghost/intern/GHOST_SystemCocoa.mm
M	intern/ghost/intern/GHOST_SystemSDL.cpp
M	intern/ghost/intern/GHOST_SystemWayland.cpp
M	intern/ghost/intern/GHOST_SystemWin32.cpp
M	intern/ghost/intern/GHOST_SystemX11.cpp
M	source/blender/windowmanager/intern/wm_event_system.cc
M	source/blender/windowmanager/intern/wm_window.c

===================================================================

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;
       ca

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list