[Bf-blender-cvs] [1c716cbeb78] master: Cleanup: access modifier keys by index under Wayland

Campbell Barton noreply at git.blender.org
Thu Aug 11 08:49:27 CEST 2022


Commit: 1c716cbeb78367bf8df7d73d20ab4f7e8439ac1d
Author: Campbell Barton
Date:   Thu Aug 11 16:03:35 2022 +1000
Branches: master
https://developer.blender.org/rB1c716cbeb78367bf8df7d73d20ab4f7e8439ac1d

Cleanup: access modifier keys by index under Wayland

This simplifies accessing modifiers as there is no need to perform
a string lookup each time (which may fail).

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

M	intern/ghost/intern/GHOST_SystemWayland.cpp

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

diff --git a/intern/ghost/intern/GHOST_SystemWayland.cpp b/intern/ghost/intern/GHOST_SystemWayland.cpp
index 954e7167279..482ecf2ba39 100644
--- a/intern/ghost/intern/GHOST_SystemWayland.cpp
+++ b/intern/ghost/intern/GHOST_SystemWayland.cpp
@@ -83,6 +83,10 @@ static void output_handle_done(void *data, struct wl_output *wl_output);
 static bool use_gnome_confine_hack = false;
 #endif
 
+#define XKB_STATE_MODS_ALL \
+  (enum xkb_state_component)(XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED | \
+                             XKB_STATE_MODS_LOCKED | XKB_STATE_MODS_EFFECTIVE)
+
 /* -------------------------------------------------------------------- */
 /** \name Inline Event Codes
  *
@@ -307,6 +311,20 @@ struct input_t {
    */
   struct xkb_state *xkb_state_empty_with_numlock = nullptr;
 
+  /**
+   * Cache result of `xkb_keymap_mod_get_index`
+   * so every time a modifier is accessed a string lookup isn't required.
+   * Be sure to check for #XKB_MOD_INVALID before using.
+   */
+  struct {
+    xkb_mod_index_t shift; /* #XKB_MOD_NAME_SHIFT */
+    xkb_mod_index_t caps;  /* #XKB_MOD_NAME_CAPS */
+    xkb_mod_index_t ctrl;  /* #XKB_MOD_NAME_CTRL */
+    xkb_mod_index_t alt;   /* #XKB_MOD_NAME_ALT */
+    xkb_mod_index_t num;   /* #XKB_MOD_NAME_NUM */
+    xkb_mod_index_t logo;  /* #XKB_MOD_NAME_LOGO */
+  } xkb_keymap_mod_index;
+
   struct {
     /** Key repetition in character per second. */
     int32_t rate = 0;
@@ -2102,6 +2120,13 @@ static void keyboard_handle_keymap(void *data,
     }
   }
 
+  input->xkb_keymap_mod_index.shift = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_SHIFT);
+  input->xkb_keymap_mod_index.caps = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CAPS);
+  input->xkb_keymap_mod_index.ctrl = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CTRL);
+  input->xkb_keymap_mod_index.alt = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_ALT);
+  input->xkb_keymap_mod_index.num = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_NUM);
+  input->xkb_keymap_mod_index.logo = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_LOGO);
+
   xkb_keymap_unref(keymap);
 }
 
@@ -2939,32 +2964,36 @@ GHOST_TSuccess GHOST_SystemWayland::getModifierKeys(GHOST_ModifierKeys &keys) co
     return GHOST_kFailure;
   }
 
-  static const xkb_state_component mods_all = xkb_state_component(
-      XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED | XKB_STATE_MODS_LOCKED |
-      XKB_STATE_MODS_EFFECTIVE);
+  input_t *input = d->inputs[0];
 
   bool val;
 
-  /* NOTE: XKB doesn't seem to differentiate between left/right modifiers. */
+  /* NOTE: XKB doesn't differentiate between left/right modifiers
+   * for it's internal modifier state storage. */
+  const xkb_mod_mask_t state = xkb_state_serialize_mods(input->xkb_state, XKB_STATE_MODS_ALL);
 
-  val = xkb_state_mod_name_is_active(d->inputs[0]->xkb_state, XKB_MOD_NAME_SHIFT, mods_all) == 1;
+#define MOD_TEST(state, mod) ((mod != XKB_MOD_INVALID) && (state & (1 << mod)))
+
+  val = MOD_TEST(state, input->xkb_keymap_mod_index.shift);
   keys.set(GHOST_kModifierKeyLeftShift, val);
   keys.set(GHOST_kModifierKeyRightShift, val);
 
-  val = xkb_state_mod_name_is_active(d->inputs[0]->xkb_state, XKB_MOD_NAME_ALT, mods_all) == 1;
+  val = MOD_TEST(state, input->xkb_keymap_mod_index.alt);
   keys.set(GHOST_kModifierKeyLeftAlt, val);
   keys.set(GHOST_kModifierKeyRightAlt, val);
 
-  val = xkb_state_mod_name_is_active(d->inputs[0]->xkb_state, XKB_MOD_NAME_CTRL, mods_all) == 1;
+  val = MOD_TEST(state, input->xkb_keymap_mod_index.ctrl);
   keys.set(GHOST_kModifierKeyLeftControl, val);
   keys.set(GHOST_kModifierKeyRightControl, val);
 
-  val = xkb_state_mod_name_is_active(d->inputs[0]->xkb_state, XKB_MOD_NAME_LOGO, mods_all) == 1;
+  val = MOD_TEST(state, input->xkb_keymap_mod_index.logo);
   keys.set(GHOST_kModifierKeyOS, val);
 
-  val = xkb_state_mod_name_is_active(d->inputs[0]->xkb_state, XKB_MOD_NAME_NUM, mods_all) == 1;
+  val = MOD_TEST(state, input->xkb_keymap_mod_index.num);
   keys.set(GHOST_kModifierKeyNum, val);
 
+#undef MOD_TEST
+
   return GHOST_kSuccess;
 }



More information about the Bf-blender-cvs mailing list