commit 59faad0ce3f909c9f116a43eba34ead38707add3
parent 315d441695670996edbbc799c82f77547af76ed4
Author: Michael Forney <mforney@mforney.org>
Date: Sun, 9 Feb 2014 04:11:10 -0800
binding: Adjust interface to more easily support button and axis bindings
Diffstat:
4 files changed, 46 insertions(+), 29 deletions(-)
diff --git a/example/wm.c b/example/wm.c
@@ -260,7 +260,7 @@ static void new_screen(struct swc_screen * swc)
const struct swc_manager manager = { &new_window, &new_screen };
-static void spawn(uint32_t time, uint32_t value, void * data)
+static void spawn(void * data, uint32_t time, uint32_t value)
{
char * const * command = data;
@@ -286,8 +286,10 @@ int main(int argc, char * argv[])
if (!swc_initialize(display, NULL, &manager))
return EXIT_FAILURE;
- swc_add_key_binding(SWC_MOD_LOGO, XKB_KEY_Return, &spawn, terminal_command);
- swc_add_key_binding(SWC_MOD_LOGO, XKB_KEY_r, &spawn, dmenu_command);
+ swc_add_binding(SWC_BINDING_KEY, SWC_MOD_LOGO, XKB_KEY_Return,
+ &spawn, terminal_command);
+ swc_add_binding(SWC_BINDING_KEY, SWC_MOD_LOGO, XKB_KEY_r,
+ &spawn, dmenu_command);
event_loop = wl_display_get_event_loop(display);
wl_display_run(display);
diff --git a/libswc/bindings.c b/libswc/bindings.c
@@ -43,27 +43,24 @@ static struct swc_keyboard_handler binding_handler = {
.key = &handle_key,
};
-static struct
-{
- struct wl_array keys;
-} bindings;
+static struct wl_array key_bindings;
const struct swc_bindings swc_bindings = {
.keyboard_handler = &binding_handler
};
-static bool handle_keysym(xkb_keysym_t keysym,
- uint32_t modifiers, uint32_t time)
+static bool handle_binding(struct wl_array * bindings, uint32_t time,
+ uint32_t modifiers, uint32_t value)
{
struct binding * binding;
- wl_array_for_each(binding, &bindings.keys)
+ wl_array_for_each(binding, bindings)
{
- if (binding->value == keysym
+ if (binding->value == value
&& (binding->modifiers == modifiers
|| binding->modifiers == SWC_MOD_ANY))
{
- binding->handler(time, keysym, binding->data);
+ binding->handler(binding->data, time, value);
return true;
}
}
@@ -80,7 +77,7 @@ bool handle_key(struct swc_keyboard * keyboard, uint32_t time,
keysym = xkb_state_key_get_one_sym(keyboard->xkb.state, XKB_KEY(key));
- if (handle_keysym(keysym, keyboard->modifiers, time))
+ if (handle_binding(&key_bindings, time, keyboard->modifiers, keysym))
return true;
xkb_layout_index_t layout;
@@ -90,8 +87,11 @@ bool handle_key(struct swc_keyboard * keyboard, uint32_t time,
xkb_keymap_key_get_syms_by_level(keyboard->xkb.keymap.map, XKB_KEY(key),
layout, 0, &keysyms);
- if (keysyms && handle_keysym(keysyms[0], keyboard->modifiers, time))
+ if (keysyms && handle_binding(&key_bindings, time,
+ keyboard->modifiers, keysyms[0]))
+ {
return true;
+ }
}
return false;
@@ -99,23 +99,32 @@ bool handle_key(struct swc_keyboard * keyboard, uint32_t time,
bool swc_bindings_initialize()
{
- wl_array_init(&bindings.keys);
+ wl_array_init(&key_bindings);
return true;
}
void swc_bindings_finalize()
{
- wl_array_release(&bindings.keys);
+ wl_array_release(&key_bindings);
}
EXPORT
-void swc_add_key_binding(uint32_t modifiers, uint32_t value,
- swc_binding_handler_t handler, void * data)
+void swc_add_binding(enum swc_binding_type type,
+ uint32_t modifiers, uint32_t value,
+ swc_binding_handler_t handler, void * data)
{
struct binding * binding;
+ struct wl_array * bindings;
+
+ switch (type)
+ {
+ case SWC_BINDING_KEY:
+ bindings = &key_bindings;
+ break;
+ }
- binding = wl_array_add(&bindings.keys, sizeof *binding);
+ binding = wl_array_add(bindings, sizeof *binding);
binding->value = value;
binding->modifiers = modifiers;
binding->handler = handler;
diff --git a/libswc/compositor.c b/libswc/compositor.c
@@ -785,12 +785,12 @@ bool handle_motion(struct swc_pointer * pointer, uint32_t time)
return false;
}
-static void handle_terminate(uint32_t time, uint32_t value, void * data)
+static void handle_terminate(void * data, uint32_t time, uint32_t value)
{
wl_display_terminate(swc.display);
}
-static void handle_switch_vt(uint32_t time, uint32_t value, void * data)
+static void handle_switch_vt(void * data, uint32_t time, uint32_t value)
{
uint8_t vt = value - XKB_KEY_XF86Switch_VT_1 + 1;
@@ -890,15 +890,15 @@ bool swc_compositor_initialize()
wl_list_for_each(screen, &swc.screens, link)
target_new(screen);
- swc_add_key_binding(SWC_MOD_CTRL | SWC_MOD_ALT, XKB_KEY_BackSpace,
- &handle_terminate, NULL);
+ swc_add_binding(SWC_BINDING_KEY, SWC_MOD_CTRL | SWC_MOD_ALT,
+ XKB_KEY_BackSpace, &handle_terminate, NULL);
for (keysym = XKB_KEY_XF86Switch_VT_1;
keysym <= XKB_KEY_XF86Switch_VT_12;
++keysym)
{
- swc_add_key_binding(SWC_MOD_ANY, keysym,
- &handle_switch_vt, NULL);
+ swc_add_binding(SWC_BINDING_KEY, SWC_MOD_ANY, keysym,
+ &handle_switch_vt, NULL);
}
diff --git a/libswc/swc.h b/libswc/swc.h
@@ -183,11 +183,17 @@ enum
SWC_MOD_ANY = ~0
};
-typedef void (* swc_binding_handler_t)(uint32_t time, uint32_t value,
- void * data);
+enum swc_binding_type
+{
+ SWC_BINDING_KEY
+};
+
+typedef void (* swc_binding_handler_t)(void * data, uint32_t time,
+ uint32_t value);
-void swc_add_key_binding(uint32_t modifiers, uint32_t value,
- swc_binding_handler_t handler, void * data);
+void swc_add_binding(enum swc_binding_type type,
+ uint32_t modifiers, uint32_t value,
+ swc_binding_handler_t handler, void * data);
/* }}} */