commit 493a5c1

Michael Forney  ·  2013-12-06 08:32:24 +0000 UTC
parent caabeb3
Introduce modifier state struct
2 files changed,  +47, -36
+36, -29
 1@@ -75,6 +75,7 @@ bool swc_keyboard_initialize(struct swc_keyboard * keyboard)
 2         goto error1;
 3 
 4     wl_array_init(&keyboard->keys);
 5+    keyboard->modifier_state = (struct swc_keyboard_modifier_state) { 0 };
 6     keyboard->modifiers = 0;
 7     keyboard->focus_handler.enter = &enter;
 8     keyboard->focus_handler.leave = &leave;
 9@@ -133,7 +134,7 @@ void swc_keyboard_handle_key(struct swc_keyboard * keyboard, uint32_t time,
10                              uint32_t key, uint32_t state)
11 {
12     uint32_t * pressed_key;
13-    uint32_t mods_depressed, mods_latched, mods_locked, mods_active, group;
14+    struct swc_keyboard_modifier_state modifier_state;
15     struct wl_display * display;
16     uint32_t serial;
17     enum xkb_key_direction direction;
18@@ -184,39 +185,45 @@ void swc_keyboard_handle_key(struct swc_keyboard * keyboard, uint32_t time,
19                                                        : XKB_KEY_UP;
20     xkb_state_update_key(xkb->state, XKB_KEY(key), direction);
21 
22-    mods_depressed = xkb_state_serialize_mods(xkb->state, XKB_STATE_DEPRESSED);
23-    mods_latched = xkb_state_serialize_mods(xkb->state, XKB_STATE_LATCHED);
24-    mods_locked = xkb_state_serialize_mods(xkb->state, XKB_STATE_LOCKED);
25-    mods_active = mods_depressed | mods_latched;
26-    group = xkb_state_serialize_layout(xkb->state, XKB_STATE_LAYOUT_EFFECTIVE);
27-
28-    if (mods_depressed != keyboard->mods_depressed
29-        || mods_latched != keyboard->mods_latched
30-        || mods_locked != keyboard->mods_locked
31-        || group != keyboard->group)
32+    modifier_state.depressed
33+        = xkb_state_serialize_mods(xkb->state, XKB_STATE_DEPRESSED);
34+    modifier_state.latched
35+        = xkb_state_serialize_mods(xkb->state, XKB_STATE_LATCHED);
36+    modifier_state.locked
37+        = xkb_state_serialize_mods(xkb->state, XKB_STATE_LOCKED);
38+    modifier_state.group
39+        = xkb_state_serialize_layout(xkb->state, XKB_STATE_LAYOUT_EFFECTIVE);
40+
41+    if (modifier_state.depressed != keyboard->modifier_state.depressed
42+        || modifier_state.latched != keyboard->modifier_state.latched
43+        || modifier_state.locked != keyboard->modifier_state.locked
44+        || modifier_state.group != keyboard->modifier_state.group)
45     {
46+        uint32_t mods_active = modifier_state.depressed
47+                             | modifier_state.latched;
48+
49+        /* Update keyboard modifier state. */
50+        keyboard->modifier_state = modifier_state;
51+
52         if (keyboard->focus.resource)
53         {
54             serial = wl_display_next_serial(display);
55-            wl_keyboard_send_modifiers(keyboard->focus.resource,
56-                                       serial, mods_depressed, mods_latched,
57-                                       mods_locked, group);
58+            wl_keyboard_send_modifiers
59+                (keyboard->focus.resource, serial, modifier_state.depressed,
60+                 modifier_state.latched, modifier_state.locked,
61+                 modifier_state.group);
62         }
63-    }
64 
65-    keyboard->modifiers = 0;
66-    if (mods_active & (1 << keyboard->xkb.indices.ctrl))
67-        keyboard->modifiers |= SWC_MOD_CTRL;
68-    if (mods_active & (1 << keyboard->xkb.indices.alt))
69-        keyboard->modifiers |= SWC_MOD_ALT;
70-    if (mods_active & (1 << keyboard->xkb.indices.super))
71-        keyboard->modifiers |= SWC_MOD_LOGO;
72-    if (mods_active & (1 << keyboard->xkb.indices.shift))
73-        keyboard->modifiers |= SWC_MOD_SHIFT;
74-
75-    keyboard->mods_depressed = mods_depressed;
76-    keyboard->mods_latched = mods_latched;
77-    keyboard->mods_locked = mods_locked;
78-    keyboard->group = group;
79+
80+        keyboard->modifiers = 0;
81+        if (mods_active & (1 << keyboard->xkb.indices.ctrl))
82+            keyboard->modifiers |= SWC_MOD_CTRL;
83+        if (mods_active & (1 << keyboard->xkb.indices.alt))
84+            keyboard->modifiers |= SWC_MOD_ALT;
85+        if (mods_active & (1 << keyboard->xkb.indices.super))
86+            keyboard->modifiers |= SWC_MOD_LOGO;
87+        if (mods_active & (1 << keyboard->xkb.indices.shift))
88+            keyboard->modifiers |= SWC_MOD_SHIFT;
89+    }
90 }
91 
+11, -7
 1@@ -33,13 +33,20 @@
 2 struct swc_keyboard;
 3 struct wl_client;
 4 
 5+struct swc_keyboard_modifier_state
 6+{
 7+    uint32_t depressed;
 8+    uint32_t latched;
 9+    uint32_t locked;
10+    uint32_t group;
11+};
12+
13 struct swc_keyboard_handler
14 {
15     bool (* key)(struct swc_keyboard * keyboard, uint32_t time,
16                  uint32_t key, uint32_t state);
17-    bool (* modifiers)(struct swc_keyboard * keyboard, uint32_t serial,
18-                       uint32_t mods_depressed, uint32_t mods_latched,
19-                       uint32_t mods_locked, uint32_t group);
20+    bool (* modifiers)(struct swc_keyboard * keyboard,
21+                       const struct swc_keyboard_modifier_state * state);
22 };
23 
24 struct swc_keyboard
25@@ -52,10 +59,7 @@ struct swc_keyboard
26     struct swc_xkb xkb;
27 
28     struct wl_array keys;
29-    uint32_t mods_depressed;
30-    uint32_t mods_latched;
31-    uint32_t mods_locked;
32-    uint32_t group;
33+    struct swc_keyboard_modifier_state modifier_state;
34 
35     uint32_t modifiers;
36 };