From 1959ab8d22a2efaa5f8c6249816d516687c6bc5e Mon Sep 17 00:00:00 2001 From: Giulio Camuffo Date: Thu, 14 Nov 2013 23:42:52 +0100 Subject: [PATCH] input: let the pointer motion handlers move the pointer this allows to implement pointer barriers by using a custom handler --- src/compositor.h | 6 +++++- src/data-device.c | 5 ++++- src/input.c | 25 ++++++++++--------------- src/shell.c | 29 ++++++++++++++++++++++------- 4 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/compositor.h b/src/compositor.h index 95928a4..e7ffa4f 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -233,7 +233,8 @@ struct weston_output { struct weston_pointer_grab; struct weston_pointer_grab_interface { void (*focus)(struct weston_pointer_grab *grab); - void (*motion)(struct weston_pointer_grab *grab, uint32_t time); + void (*motion)(struct weston_pointer_grab *grab, uint32_t time, + wl_fixed_t x, wl_fixed_t y); void (*button)(struct weston_pointer_grab *grab, uint32_t time, uint32_t button, uint32_t state); void (*cancel)(struct weston_pointer_grab *grab); @@ -359,6 +360,9 @@ weston_pointer_end_grab(struct weston_pointer *pointer); void weston_pointer_clamp(struct weston_pointer *pointer, wl_fixed_t *fx, wl_fixed_t *fy); +void +weston_pointer_move(struct weston_pointer *pointer, + wl_fixed_t x, wl_fixed_t y); struct weston_keyboard * weston_keyboard_create(void); diff --git a/src/data-device.c b/src/data-device.c index 888e606..313278e 100644 --- a/src/data-device.c +++ b/src/data-device.c @@ -278,7 +278,8 @@ drag_grab_focus(struct weston_pointer_grab *grab) } static void -drag_grab_motion(struct weston_pointer_grab *grab, uint32_t time) +drag_grab_motion(struct weston_pointer_grab *grab, uint32_t time, + wl_fixed_t x, wl_fixed_t y) { struct weston_drag *drag = container_of(grab, struct weston_drag, grab); @@ -286,6 +287,8 @@ drag_grab_motion(struct weston_pointer_grab *grab, uint32_t time) float fx, fy; wl_fixed_t sx, sy; + weston_pointer_move(pointer, x, y); + if (drag->icon) { fx = wl_fixed_to_double(pointer->x) + drag->dx; fy = wl_fixed_to_double(pointer->y) + drag->dy; diff --git a/src/input.c b/src/input.c index f1cf938..d7b4b13 100644 --- a/src/input.c +++ b/src/input.c @@ -111,13 +111,16 @@ default_grab_pointer_focus(struct weston_pointer_grab *grab) } static void -default_grab_pointer_motion(struct weston_pointer_grab *grab, uint32_t time) +default_grab_pointer_motion(struct weston_pointer_grab *grab, uint32_t time, + wl_fixed_t x, wl_fixed_t y) { struct weston_pointer *pointer = grab->pointer; wl_fixed_t sx, sy; struct wl_list *resource_list; struct wl_resource *resource; + weston_pointer_move(pointer, x, y); + resource_list = &pointer->focus_resource_list; wl_resource_for_each(resource, resource_list) { weston_view_from_global_fixed(pointer->focus, @@ -709,10 +712,9 @@ weston_pointer_clamp(struct weston_pointer *pointer, wl_fixed_t *fx, wl_fixed_t } /* Takes absolute values */ -static void -move_pointer(struct weston_seat *seat, wl_fixed_t x, wl_fixed_t y) +WL_EXPORT void +weston_pointer_move(struct weston_pointer *pointer, wl_fixed_t x, wl_fixed_t y) { - struct weston_pointer *pointer = seat->pointer; int32_t ix, iy; weston_pointer_clamp (pointer, &x, &y); @@ -730,6 +732,7 @@ move_pointer(struct weston_seat *seat, wl_fixed_t x, wl_fixed_t y) weston_view_schedule_repaint(pointer->sprite); } + pointer->grab->interface->focus(pointer->grab); wl_signal_emit(&pointer->motion_signal, pointer); } @@ -741,11 +744,7 @@ notify_motion(struct weston_seat *seat, struct weston_pointer *pointer = seat->pointer; weston_compositor_wake(ec); - - move_pointer(seat, pointer->x + dx, pointer->y + dy); - - pointer->grab->interface->focus(pointer->grab); - pointer->grab->interface->motion(pointer->grab, time); + pointer->grab->interface->motion(pointer->grab, time, pointer->x + dx, pointer->y + dy); } WL_EXPORT void @@ -756,11 +755,7 @@ notify_motion_absolute(struct weston_seat *seat, struct weston_pointer *pointer = seat->pointer; weston_compositor_wake(ec); - - move_pointer(seat, x, y); - - pointer->grab->interface->focus(pointer->grab); - pointer->grab->interface->motion(pointer->grab, time); + pointer->grab->interface->motion(pointer->grab, time, x, y); } WL_EXPORT void @@ -1095,7 +1090,7 @@ notify_pointer_focus(struct weston_seat *seat, struct weston_output *output, wl_fixed_t x, wl_fixed_t y) { if (output) { - move_pointer(seat, x, y); + weston_pointer_move(seat->pointer, x, y); } else { /* FIXME: We should call weston_pointer_set_focus(seat, * NULL) here, but somehow that breaks re-entry... */ diff --git a/src/shell.c b/src/shell.c index cbb741a..fe332e1 100644 --- a/src/shell.c +++ b/src/shell.c @@ -1217,13 +1217,17 @@ noop_grab_focus(struct weston_pointer_grab *grab) } static void -move_grab_motion(struct weston_pointer_grab *grab, uint32_t time) +move_grab_motion(struct weston_pointer_grab *grab, uint32_t time, + wl_fixed_t x, wl_fixed_t y) { struct weston_move_grab *move = (struct weston_move_grab *) grab; struct weston_pointer *pointer = grab->pointer; struct shell_surface *shsurf = move->base.shsurf; - int dx = wl_fixed_to_int(pointer->x + move->dx); - int dy = wl_fixed_to_int(pointer->y + move->dy); + int dx, dy; + + weston_pointer_move(pointer, x, y); + dx = wl_fixed_to_int(pointer->x + move->dx); + dy = wl_fixed_to_int(pointer->y + move->dy); if (!shsurf) return; @@ -1327,7 +1331,8 @@ struct weston_resize_grab { }; static void -resize_grab_motion(struct weston_pointer_grab *grab, uint32_t time) +resize_grab_motion(struct weston_pointer_grab *grab, uint32_t time, + wl_fixed_t x, wl_fixed_t y) { struct weston_resize_grab *resize = (struct weston_resize_grab *) grab; struct weston_pointer *pointer = grab->pointer; @@ -1336,6 +1341,8 @@ resize_grab_motion(struct weston_pointer_grab *grab, uint32_t time) wl_fixed_t from_x, from_y; wl_fixed_t to_x, to_y; + weston_pointer_move(pointer, x, y); + if (!shsurf) return; @@ -1513,8 +1520,10 @@ busy_cursor_grab_focus(struct weston_pointer_grab *base) } static void -busy_cursor_grab_motion(struct weston_pointer_grab *grab, uint32_t time) +busy_cursor_grab_motion(struct weston_pointer_grab *grab, uint32_t time, + wl_fixed_t x, wl_fixed_t y) { + weston_pointer_move(grab->pointer, x, y); } static void @@ -2270,12 +2279,15 @@ popup_grab_focus(struct weston_pointer_grab *grab) } static void -popup_grab_motion(struct weston_pointer_grab *grab, uint32_t time) +popup_grab_motion(struct weston_pointer_grab *grab, uint32_t time, + wl_fixed_t x, wl_fixed_t y) { struct weston_pointer *pointer = grab->pointer; struct wl_resource *resource; wl_fixed_t sx, sy; + weston_pointer_move(pointer, x, y); + wl_resource_for_each(resource, &pointer->focus_resource_list) { weston_view_from_global_fixed(pointer->focus, pointer->x, pointer->y, @@ -3086,7 +3098,8 @@ terminate_binding(struct weston_seat *seat, uint32_t time, uint32_t key, } static void -rotate_grab_motion(struct weston_pointer_grab *grab, uint32_t time) +rotate_grab_motion(struct weston_pointer_grab *grab, uint32_t time, + wl_fixed_t x, wl_fixed_t y) { struct rotate_grab *rotate = container_of(grab, struct rotate_grab, base.grab); @@ -3094,6 +3107,8 @@ rotate_grab_motion(struct weston_pointer_grab *grab, uint32_t time) struct shell_surface *shsurf = rotate->base.shsurf; float cx, cy, dx, dy, cposx, cposy, dposx, dposy, r; + weston_pointer_move(pointer, x, y); + if (!shsurf) return; -- 2.7.4