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