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:
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,