commit 59faad0

Michael Forney  ·  2014-02-09 12:11:10 +0000 UTC
parent 315d441
binding: Adjust interface to more easily support button and axis bindings
4 files changed,  +46, -29
+5, -3
 1@@ -260,7 +260,7 @@ static void new_screen(struct swc_screen * swc)
 2 
 3 const struct swc_manager manager = { &new_window, &new_screen };
 4 
 5-static void spawn(uint32_t time, uint32_t value, void * data)
 6+static void spawn(void * data, uint32_t time, uint32_t value)
 7 {
 8     char * const * command = data;
 9 
10@@ -286,8 +286,10 @@ int main(int argc, char * argv[])
11     if (!swc_initialize(display, NULL, &manager))
12         return EXIT_FAILURE;
13 
14-    swc_add_key_binding(SWC_MOD_LOGO, XKB_KEY_Return, &spawn, terminal_command);
15-    swc_add_key_binding(SWC_MOD_LOGO, XKB_KEY_r, &spawn, dmenu_command);
16+    swc_add_binding(SWC_BINDING_KEY, SWC_MOD_LOGO, XKB_KEY_Return,
17+                    &spawn, terminal_command);
18+    swc_add_binding(SWC_BINDING_KEY, SWC_MOD_LOGO, XKB_KEY_r,
19+                    &spawn, dmenu_command);
20 
21     event_loop = wl_display_get_event_loop(display);
22     wl_display_run(display);
+25, -16
 1@@ -43,27 +43,24 @@ static struct swc_keyboard_handler binding_handler = {
 2     .key = &handle_key,
 3 };
 4 
 5-static struct
 6-{
 7-    struct wl_array keys;
 8-} bindings;
 9+static struct wl_array key_bindings;
10 
11 const struct swc_bindings swc_bindings = {
12     .keyboard_handler = &binding_handler
13 };
14 
15-static bool handle_keysym(xkb_keysym_t keysym,
16-                          uint32_t modifiers, uint32_t time)
17+static bool handle_binding(struct wl_array * bindings, uint32_t time,
18+                           uint32_t modifiers, uint32_t value)
19 {
20     struct binding * binding;
21 
22-    wl_array_for_each(binding, &bindings.keys)
23+    wl_array_for_each(binding, bindings)
24     {
25-        if (binding->value == keysym
26+        if (binding->value == value
27             && (binding->modifiers == modifiers
28                 || binding->modifiers == SWC_MOD_ANY))
29         {
30-            binding->handler(time, keysym, binding->data);
31+            binding->handler(binding->data, time, value);
32             return true;
33         }
34     }
35@@ -80,7 +77,7 @@ bool handle_key(struct swc_keyboard * keyboard, uint32_t time,
36 
37         keysym = xkb_state_key_get_one_sym(keyboard->xkb.state, XKB_KEY(key));
38 
39-        if (handle_keysym(keysym, keyboard->modifiers, time))
40+        if (handle_binding(&key_bindings, time, keyboard->modifiers, keysym))
41             return true;
42 
43         xkb_layout_index_t layout;
44@@ -90,8 +87,11 @@ bool handle_key(struct swc_keyboard * keyboard, uint32_t time,
45         xkb_keymap_key_get_syms_by_level(keyboard->xkb.keymap.map, XKB_KEY(key),
46                                          layout, 0, &keysyms);
47 
48-        if (keysyms && handle_keysym(keysyms[0], keyboard->modifiers, time))
49+        if (keysyms && handle_binding(&key_bindings, time,
50+                                      keyboard->modifiers, keysyms[0]))
51+        {
52             return true;
53+        }
54     }
55 
56     return false;
57@@ -99,23 +99,32 @@ bool handle_key(struct swc_keyboard * keyboard, uint32_t time,
58 
59 bool swc_bindings_initialize()
60 {
61-    wl_array_init(&bindings.keys);
62+    wl_array_init(&key_bindings);
63 
64     return true;
65 }
66 
67 void swc_bindings_finalize()
68 {
69-    wl_array_release(&bindings.keys);
70+    wl_array_release(&key_bindings);
71 }
72 
73 EXPORT
74-void swc_add_key_binding(uint32_t modifiers, uint32_t value,
75-                         swc_binding_handler_t handler, void * data)
76+void swc_add_binding(enum swc_binding_type type,
77+                     uint32_t modifiers, uint32_t value,
78+                     swc_binding_handler_t handler, void * data)
79 {
80     struct binding * binding;
81+    struct wl_array * bindings;
82+
83+    switch (type)
84+    {
85+        case SWC_BINDING_KEY:
86+            bindings = &key_bindings;
87+            break;
88+    }
89 
90-    binding = wl_array_add(&bindings.keys, sizeof *binding);
91+    binding = wl_array_add(bindings, sizeof *binding);
92     binding->value = value;
93     binding->modifiers = modifiers;
94     binding->handler = handler;
+6, -6
 1@@ -785,12 +785,12 @@ bool handle_motion(struct swc_pointer * pointer, uint32_t time)
 2     return false;
 3 }
 4 
 5-static void handle_terminate(uint32_t time, uint32_t value, void * data)
 6+static void handle_terminate(void * data, uint32_t time, uint32_t value)
 7 {
 8     wl_display_terminate(swc.display);
 9 }
10 
11-static void handle_switch_vt(uint32_t time, uint32_t value, void * data)
12+static void handle_switch_vt(void * data, uint32_t time, uint32_t value)
13 {
14     uint8_t vt = value - XKB_KEY_XF86Switch_VT_1 + 1;
15 
16@@ -890,15 +890,15 @@ bool swc_compositor_initialize()
17     wl_list_for_each(screen, &swc.screens, link)
18         target_new(screen);
19 
20-    swc_add_key_binding(SWC_MOD_CTRL | SWC_MOD_ALT, XKB_KEY_BackSpace,
21-                        &handle_terminate, NULL);
22+    swc_add_binding(SWC_BINDING_KEY, SWC_MOD_CTRL | SWC_MOD_ALT,
23+                    XKB_KEY_BackSpace, &handle_terminate, NULL);
24 
25     for (keysym = XKB_KEY_XF86Switch_VT_1;
26          keysym <= XKB_KEY_XF86Switch_VT_12;
27          ++keysym)
28     {
29-        swc_add_key_binding(SWC_MOD_ANY, keysym,
30-                            &handle_switch_vt, NULL);
31+        swc_add_binding(SWC_BINDING_KEY, SWC_MOD_ANY, keysym,
32+                        &handle_switch_vt, NULL);
33     }
34 
35 
+10, -4
 1@@ -183,11 +183,17 @@ enum
 2     SWC_MOD_ANY     = ~0
 3 };
 4 
 5-typedef void (* swc_binding_handler_t)(uint32_t time, uint32_t value,
 6-                                       void * data);
 7+enum swc_binding_type
 8+{
 9+    SWC_BINDING_KEY
10+};
11+
12+typedef void (* swc_binding_handler_t)(void * data, uint32_t time,
13+                                       uint32_t value);
14 
15-void swc_add_key_binding(uint32_t modifiers, uint32_t value,
16-                         swc_binding_handler_t handler, void * data);
17+void swc_add_binding(enum swc_binding_type type,
18+                     uint32_t modifiers, uint32_t value,
19+                     swc_binding_handler_t handler, void * data);
20 
21 /* }}} */
22