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