swc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/swc
Log | Files | Refs | README | LICENSE

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:
Mexample/wm.c | 8+++++---
Mlibswc/bindings.c | 41+++++++++++++++++++++++++----------------
Mlibswc/compositor.c | 12++++++------
Mlibswc/swc.h | 14++++++++++----
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); /* }}} */