swc

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

commit c3e48a96d04622ddd659700e04721317d34be519
parent 59faad0ce3f909c9f116a43eba34ead38707add3
Author: Michael Forney <mforney@mforney.org>
Date:   Sun,  9 Feb 2014 04:24:44 -0800

bindings: Add state parameter

This way, bindings can respond to key/button presses, releases, or both.

Diffstat:
Mexample/wm.c | 5++++-
Mlibswc/bindings.c | 33+++++++++++++++------------------
Mlibswc/compositor.c | 12++++++++----
Mlibswc/swc.h | 2+-
4 files changed, 28 insertions(+), 24 deletions(-)

diff --git a/example/wm.c b/example/wm.c @@ -260,10 +260,13 @@ static void new_screen(struct swc_screen * swc) const struct swc_manager manager = { &new_window, &new_screen }; -static void spawn(void * data, uint32_t time, uint32_t value) +static void spawn(void * data, uint32_t time, uint32_t value, uint32_t state) { char * const * command = data; + if (state != WL_KEYBOARD_KEY_STATE_PRESSED) + return; + if (fork() == 0) { execvp(command[0], command); diff --git a/libswc/bindings.c b/libswc/bindings.c @@ -50,7 +50,7 @@ const struct swc_bindings swc_bindings = { }; static bool handle_binding(struct wl_array * bindings, uint32_t time, - uint32_t modifiers, uint32_t value) + uint32_t modifiers, uint32_t value, uint32_t state) { struct binding * binding; @@ -60,7 +60,7 @@ static bool handle_binding(struct wl_array * bindings, uint32_t time, && (binding->modifiers == modifiers || binding->modifiers == SWC_MOD_ANY)) { - binding->handler(binding->data, time, value); + binding->handler(binding->data, time, value, state); return true; } } @@ -71,27 +71,24 @@ static bool handle_binding(struct wl_array * bindings, uint32_t time, bool handle_key(struct swc_keyboard * keyboard, uint32_t time, uint32_t key, uint32_t state) { - if (state == WL_KEYBOARD_KEY_STATE_PRESSED) - { - xkb_keysym_t keysym; + xkb_keysym_t keysym; - keysym = xkb_state_key_get_one_sym(keyboard->xkb.state, XKB_KEY(key)); + keysym = xkb_state_key_get_one_sym(keyboard->xkb.state, XKB_KEY(key)); - if (handle_binding(&key_bindings, time, keyboard->modifiers, keysym)) - return true; + if (handle_binding(&key_bindings, time, keyboard->modifiers, keysym, state)) + return true; - xkb_layout_index_t layout; - const xkb_keysym_t * keysyms; + xkb_layout_index_t layout; + const xkb_keysym_t * keysyms; - layout = xkb_state_key_get_layout(keyboard->xkb.state, XKB_KEY(key)); - xkb_keymap_key_get_syms_by_level(keyboard->xkb.keymap.map, XKB_KEY(key), - layout, 0, &keysyms); + layout = xkb_state_key_get_layout(keyboard->xkb.state, XKB_KEY(key)); + xkb_keymap_key_get_syms_by_level(keyboard->xkb.keymap.map, XKB_KEY(key), + layout, 0, &keysyms); - if (keysyms && handle_binding(&key_bindings, time, - keyboard->modifiers, keysyms[0])) - { - return true; - } + if (keysyms && handle_binding(&key_bindings, time, + keyboard->modifiers, keysyms[0], state)) + { + return true; } return false; diff --git a/libswc/compositor.c b/libswc/compositor.c @@ -785,16 +785,20 @@ bool handle_motion(struct swc_pointer * pointer, uint32_t time) return false; } -static void handle_terminate(void * data, uint32_t time, uint32_t value) +static void handle_terminate(void * data, uint32_t time, + uint32_t value, uint32_t state) { - wl_display_terminate(swc.display); + if (state == WL_KEYBOARD_KEY_STATE_PRESSED) + wl_display_terminate(swc.display); } -static void handle_switch_vt(void * data, uint32_t time, uint32_t value) +static void handle_switch_vt(void * data, uint32_t time, + uint32_t value, uint32_t state) { uint8_t vt = value - XKB_KEY_XF86Switch_VT_1 + 1; - swc_launch_activate_vt(vt); + if (state == WL_KEYBOARD_KEY_STATE_PRESSED) + swc_launch_activate_vt(vt); } static void handle_launch_event(struct wl_listener * listener, void * data) diff --git a/libswc/swc.h b/libswc/swc.h @@ -189,7 +189,7 @@ enum swc_binding_type }; typedef void (* swc_binding_handler_t)(void * data, uint32_t time, - uint32_t value); + uint32_t value, uint32_t state); void swc_add_binding(enum swc_binding_type type, uint32_t modifiers, uint32_t value,