input: let the pointer motion handlers move the pointer

this allows to implement pointer barriers by using a custom handler
dev
Giulio Camuffo 11 years ago committed by Kristian Høgsberg
parent 412b024be8
commit 1959ab8d22
  1. 6
      src/compositor.h
  2. 5
      src/data-device.c
  3. 25
      src/input.c
  4. 29
      src/shell.c

@ -233,7 +233,8 @@ struct weston_output {
struct weston_pointer_grab; struct weston_pointer_grab;
struct weston_pointer_grab_interface { struct weston_pointer_grab_interface {
void (*focus)(struct weston_pointer_grab *grab); 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, void (*button)(struct weston_pointer_grab *grab,
uint32_t time, uint32_t button, uint32_t state); uint32_t time, uint32_t button, uint32_t state);
void (*cancel)(struct weston_pointer_grab *grab); void (*cancel)(struct weston_pointer_grab *grab);
@ -359,6 +360,9 @@ weston_pointer_end_grab(struct weston_pointer *pointer);
void void
weston_pointer_clamp(struct weston_pointer *pointer, weston_pointer_clamp(struct weston_pointer *pointer,
wl_fixed_t *fx, wl_fixed_t *fy); 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 * struct weston_keyboard *
weston_keyboard_create(void); weston_keyboard_create(void);

@ -278,7 +278,8 @@ drag_grab_focus(struct weston_pointer_grab *grab)
} }
static void 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 = struct weston_drag *drag =
container_of(grab, struct weston_drag, grab); 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; float fx, fy;
wl_fixed_t sx, sy; wl_fixed_t sx, sy;
weston_pointer_move(pointer, x, y);
if (drag->icon) { if (drag->icon) {
fx = wl_fixed_to_double(pointer->x) + drag->dx; fx = wl_fixed_to_double(pointer->x) + drag->dx;
fy = wl_fixed_to_double(pointer->y) + drag->dy; fy = wl_fixed_to_double(pointer->y) + drag->dy;

@ -111,13 +111,16 @@ default_grab_pointer_focus(struct weston_pointer_grab *grab)
} }
static void 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; struct weston_pointer *pointer = grab->pointer;
wl_fixed_t sx, sy; wl_fixed_t sx, sy;
struct wl_list *resource_list; struct wl_list *resource_list;
struct wl_resource *resource; struct wl_resource *resource;
weston_pointer_move(pointer, x, y);
resource_list = &pointer->focus_resource_list; resource_list = &pointer->focus_resource_list;
wl_resource_for_each(resource, resource_list) { wl_resource_for_each(resource, resource_list) {
weston_view_from_global_fixed(pointer->focus, 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 */ /* Takes absolute values */
static void WL_EXPORT void
move_pointer(struct weston_seat *seat, wl_fixed_t x, wl_fixed_t y) 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; int32_t ix, iy;
weston_pointer_clamp (pointer, &x, &y); 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); weston_view_schedule_repaint(pointer->sprite);
} }
pointer->grab->interface->focus(pointer->grab);
wl_signal_emit(&pointer->motion_signal, pointer); wl_signal_emit(&pointer->motion_signal, pointer);
} }
@ -741,11 +744,7 @@ notify_motion(struct weston_seat *seat,
struct weston_pointer *pointer = seat->pointer; struct weston_pointer *pointer = seat->pointer;
weston_compositor_wake(ec); weston_compositor_wake(ec);
pointer->grab->interface->motion(pointer->grab, time, pointer->x + dx, pointer->y + dy);
move_pointer(seat, pointer->x + dx, pointer->y + dy);
pointer->grab->interface->focus(pointer->grab);
pointer->grab->interface->motion(pointer->grab, time);
} }
WL_EXPORT void WL_EXPORT void
@ -756,11 +755,7 @@ notify_motion_absolute(struct weston_seat *seat,
struct weston_pointer *pointer = seat->pointer; struct weston_pointer *pointer = seat->pointer;
weston_compositor_wake(ec); weston_compositor_wake(ec);
pointer->grab->interface->motion(pointer->grab, time, x, y);
move_pointer(seat, x, y);
pointer->grab->interface->focus(pointer->grab);
pointer->grab->interface->motion(pointer->grab, time);
} }
WL_EXPORT void 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) wl_fixed_t x, wl_fixed_t y)
{ {
if (output) { if (output) {
move_pointer(seat, x, y); weston_pointer_move(seat->pointer, x, y);
} else { } else {
/* FIXME: We should call weston_pointer_set_focus(seat, /* FIXME: We should call weston_pointer_set_focus(seat,
* NULL) here, but somehow that breaks re-entry... */ * NULL) here, but somehow that breaks re-entry... */

@ -1217,13 +1217,17 @@ noop_grab_focus(struct weston_pointer_grab *grab)
} }
static void 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_move_grab *move = (struct weston_move_grab *) grab;
struct weston_pointer *pointer = grab->pointer; struct weston_pointer *pointer = grab->pointer;
struct shell_surface *shsurf = move->base.shsurf; struct shell_surface *shsurf = move->base.shsurf;
int dx = wl_fixed_to_int(pointer->x + move->dx); int dx, dy;
int dy = wl_fixed_to_int(pointer->y + move->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) if (!shsurf)
return; return;
@ -1327,7 +1331,8 @@ struct weston_resize_grab {
}; };
static void 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_resize_grab *resize = (struct weston_resize_grab *) grab;
struct weston_pointer *pointer = grab->pointer; 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 from_x, from_y;
wl_fixed_t to_x, to_y; wl_fixed_t to_x, to_y;
weston_pointer_move(pointer, x, y);
if (!shsurf) if (!shsurf)
return; return;
@ -1513,8 +1520,10 @@ busy_cursor_grab_focus(struct weston_pointer_grab *base)
} }
static void 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 static void
@ -2270,12 +2279,15 @@ popup_grab_focus(struct weston_pointer_grab *grab)
} }
static void 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 weston_pointer *pointer = grab->pointer;
struct wl_resource *resource; struct wl_resource *resource;
wl_fixed_t sx, sy; wl_fixed_t sx, sy;
weston_pointer_move(pointer, x, y);
wl_resource_for_each(resource, &pointer->focus_resource_list) { wl_resource_for_each(resource, &pointer->focus_resource_list) {
weston_view_from_global_fixed(pointer->focus, weston_view_from_global_fixed(pointer->focus,
pointer->x, pointer->y, pointer->x, pointer->y,
@ -3086,7 +3098,8 @@ terminate_binding(struct weston_seat *seat, uint32_t time, uint32_t key,
} }
static void 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 = struct rotate_grab *rotate =
container_of(grab, struct rotate_grab, base.grab); 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; struct shell_surface *shsurf = rotate->base.shsurf;
float cx, cy, dx, dy, cposx, cposy, dposx, dposy, r; float cx, cy, dx, dy, cposx, cposy, dposx, dposy, r;
weston_pointer_move(pointer, x, y);
if (!shsurf) if (!shsurf)
return; return;

Loading…
Cancel
Save