diff options
Diffstat (limited to 'src/bindings.c')
-rw-r--r-- | src/bindings.c | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/src/bindings.c b/src/bindings.c index 7cbded92..7d30024a 100644 --- a/src/bindings.c +++ b/src/bindings.c @@ -76,6 +76,24 @@ weston_compositor_add_key_binding(struct weston_compositor *compositor, } WL_EXPORT struct weston_binding * +weston_compositor_add_modifier_binding(struct weston_compositor *compositor, + uint32_t modifier, + weston_modifier_binding_handler_t handler, + void *data) +{ + struct weston_binding *binding; + + binding = weston_compositor_add_binding(compositor, 0, 0, 0, + modifier, handler, data); + if (binding == NULL) + return NULL; + + wl_list_insert(compositor->modifier_binding_list.prev, &binding->link); + + return binding; +} + +WL_EXPORT struct weston_binding * weston_compositor_add_button_binding(struct weston_compositor *compositor, uint32_t button, uint32_t modifier, weston_button_binding_handler_t handler, @@ -248,6 +266,10 @@ weston_compositor_run_key_binding(struct weston_compositor *compositor, if (state == WL_KEYBOARD_KEY_STATE_RELEASED) return; + /* Invalidate all active modifier bindings. */ + wl_list_for_each(b, &compositor->modifier_binding_list, link) + b->key = key; + wl_list_for_each(b, &compositor->key_binding_list, link) { if (b->key == key && b->modifier == seat->modifier_state) { weston_key_binding_handler_t handler = b->handler; @@ -264,6 +286,37 @@ weston_compositor_run_key_binding(struct weston_compositor *compositor, } WL_EXPORT void +weston_compositor_run_modifier_binding(struct weston_compositor *compositor, + struct weston_seat *seat, + enum weston_keyboard_modifier modifier, + enum wl_keyboard_key_state state) +{ + struct weston_binding *b; + + if (seat->keyboard->grab != &seat->keyboard->default_grab) + return; + + wl_list_for_each(b, &compositor->modifier_binding_list, link) { + weston_modifier_binding_handler_t handler = b->handler; + + if (b->modifier != modifier) + continue; + + /* Prime the modifier binding. */ + if (state == WL_KEYBOARD_KEY_STATE_PRESSED) { + b->key = 0; + continue; + } + /* Ignore the binding if a key was pressed in between. */ + else if (b->key != 0) { + return; + } + + handler(seat, modifier, b->data); + } +} + +WL_EXPORT void weston_compositor_run_button_binding(struct weston_compositor *compositor, struct weston_seat *seat, uint32_t time, uint32_t button, @@ -274,6 +327,10 @@ weston_compositor_run_button_binding(struct weston_compositor *compositor, if (state == WL_POINTER_BUTTON_STATE_RELEASED) return; + /* Invalidate all active modifier bindings. */ + wl_list_for_each(b, &compositor->modifier_binding_list, link) + b->key = button; + wl_list_for_each(b, &compositor->button_binding_list, link) { if (b->button == button && b->modifier == seat->modifier_state) { weston_button_binding_handler_t handler = b->handler; @@ -289,7 +346,7 @@ weston_compositor_run_touch_binding(struct weston_compositor *compositor, { struct weston_binding *b; - if (seat->num_tp != 1 || touch_type != WL_TOUCH_DOWN) + if (seat->touch->num_tp != 1 || touch_type != WL_TOUCH_DOWN) return; wl_list_for_each(b, &compositor->touch_binding_list, link) { @@ -308,6 +365,10 @@ weston_compositor_run_axis_binding(struct weston_compositor *compositor, { struct weston_binding *b; + /* Invalidate all active modifier bindings. */ + wl_list_for_each(b, &compositor->modifier_binding_list, link) + b->key = axis; + wl_list_for_each(b, &compositor->axis_binding_list, link) { if (b->axis == axis && b->modifier == seat->modifier_state) { weston_axis_binding_handler_t handler = b->handler; |