when a mouse is moved the binding handler is called, passing it the mouse position and the timestamp. a shell plugin can use this to activate an effect when the mouse hits an output corner. --- src/bindings.c | 36 ++++++++++++++++++++++++++++++++++++ src/compositor.c | 8 ++++++++ src/compositor.h | 16 ++++++++++++++++ 3 files changed, 60 insertions(+)
diff --git a/src/bindings.c b/src/bindings.c index 322736d..64f39e9 100644 --- a/src/bindings.c +++ b/src/bindings.c @@ -110,6 +110,24 @@ weston_compositor_add_axis_binding(struct weston_compositor *compositor, } WL_EXPORT struct weston_binding * +weston_compositor_add_motion_binding(struct weston_compositor *compositor, + enum weston_keyboard_modifier modifier, + weston_motion_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->motion_binding_list.prev, &binding->link); + + return binding; +} + +WL_EXPORT struct weston_binding * weston_compositor_add_debug_binding(struct weston_compositor *compositor, uint32_t key, weston_key_binding_handler_t handler, @@ -270,6 +288,24 @@ weston_compositor_run_axis_binding(struct weston_compositor *compositor, } WL_EXPORT int +weston_compositor_run_motion_binding(struct weston_compositor *compositor, + struct weston_seat *seat, + uint32_t time, + wl_fixed_t x, wl_fixed_t y) +{ + struct weston_binding *b; + + wl_list_for_each(b, &compositor->motion_binding_list, link) { + if (b->modifier == seat->modifier_state) { + weston_motion_binding_handler_t handler = b->handler; + handler(&seat->seat, time, x, y, b->data); + } + } + + return 0; +} + +WL_EXPORT int weston_compositor_run_debug_binding(struct weston_compositor *compositor, struct weston_seat *seat, uint32_t time, uint32_t key, diff --git a/src/compositor.c b/src/compositor.c index e7c22db..e43fba4 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -1845,6 +1845,9 @@ notify_motion(struct weston_seat *seat, weston_compositor_wake(ec); + weston_compositor_run_motion_binding(ec, seat, + time, pointer->x + dx, pointer->y + dy); + move_pointer(seat, pointer->x + dx, pointer->y + dy); interface = pointer->grab->interface; @@ -1862,6 +1865,9 @@ notify_motion_absolute(struct weston_seat *seat, weston_compositor_wake(ec); + weston_compositor_run_motion_binding(ec, seat, + time, x, y); + move_pointer(seat, x, y); interface = pointer->grab->interface; @@ -3167,6 +3173,7 @@ weston_compositor_init(struct weston_compositor *ec, wl_list_init(&ec->key_binding_list); wl_list_init(&ec->button_binding_list); wl_list_init(&ec->axis_binding_list); + wl_list_init(&ec->motion_binding_list); wl_list_init(&ec->debug_binding_list); weston_plane_init(&ec->primary_plane, 0, 0); @@ -3215,6 +3222,7 @@ weston_compositor_shutdown(struct weston_compositor *ec) weston_binding_list_destroy_all(&ec->key_binding_list); weston_binding_list_destroy_all(&ec->button_binding_list); weston_binding_list_destroy_all(&ec->axis_binding_list); + weston_binding_list_destroy_all(&ec->motion_binding_list); weston_binding_list_destroy_all(&ec->debug_binding_list); weston_plane_release(&ec->primary_plane); diff --git a/src/compositor.h b/src/compositor.h index 7d1d68e..18dcd7a 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -326,6 +326,7 @@ struct weston_compositor { struct wl_list key_binding_list; struct wl_list button_binding_list; struct wl_list axis_binding_list; + struct wl_list motion_binding_list; struct wl_list debug_binding_list; uint32_t state; @@ -660,6 +661,17 @@ weston_compositor_add_axis_binding(struct weston_compositor *compositor, enum weston_keyboard_modifier modifier, weston_axis_binding_handler_t binding, void *data); + +typedef void (*weston_motion_binding_handler_t)(struct wl_seat *seat, + uint32_t time, + wl_fixed_t x, wl_fixed_t y, + void *data); +struct weston_binding * +weston_compositor_add_motion_binding(struct weston_compositor *compositor, + enum weston_keyboard_modifier modifier, + weston_motion_binding_handler_t binding, + void *data); + struct weston_binding * weston_compositor_add_debug_binding(struct weston_compositor *compositor, uint32_t key, @@ -686,6 +698,10 @@ weston_compositor_run_axis_binding(struct weston_compositor *compositor, struct weston_seat *seat, uint32_t time, uint32_t axis, int32_t value); int +weston_compositor_run_motion_binding(struct weston_compositor *compositor, + struct weston_seat *seat, uint32_t time, + wl_fixed_t x, wl_fixed_t y); +int weston_compositor_run_debug_binding(struct weston_compositor *compositor, struct weston_seat *seat, uint32_t time, uint32_t key, -- 1.8.2 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel