input: Make pointer grab motion callbacks take an event struct

Instead of only passing absolute pointer coordinates, effectively
loosing motion event data, pass a struct that can potentially contain
different types of motion events, currently being absolute and relative.

A helper function to get resulting absolute coordinates was added for
when previous callbacks simply used the (x, y) coordinates.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Derek Foreman <derekf@osg.samsung.com>
This commit is contained in:
Jonas Ådahl
2014-10-05 21:39:14 +02:00
parent 870fadced3
commit d2510105a6
9 changed files with 116 additions and 40 deletions
+8 -1
View File
@@ -1126,6 +1126,7 @@ x11_backend_deliver_motion_event(struct x11_backend *b,
{
struct x11_output *output;
wl_fixed_t x, y;
struct weston_pointer_motion_event motion_event = { 0 };
xcb_motion_notify_event_t *motion_notify =
(xcb_motion_notify_event_t *) event;
@@ -1140,8 +1141,14 @@ x11_backend_deliver_motion_event(struct x11_backend *b,
wl_fixed_from_int(motion_notify->event_y),
&x, &y);
motion_event = (struct weston_pointer_motion_event) {
.mask = WESTON_POINTER_MOTION_REL,
.dx = wl_fixed_to_double(x - b->prev_x),
.dy = wl_fixed_to_double(y - b->prev_y)
};
notify_motion(&b->core_seat, weston_compositor_get_time(),
x - b->prev_x, y - b->prev_y);
&motion_event);
b->prev_x = x;
b->prev_y = y;
+21 -3
View File
@@ -240,11 +240,24 @@ struct weston_output {
struct weston_timeline_object timeline;
};
enum weston_pointer_motion_mask {
WESTON_POINTER_MOTION_ABS = 1 << 0,
WESTON_POINTER_MOTION_REL = 1 << 1,
};
struct weston_pointer_motion_event {
uint32_t mask;
double x;
double y;
double dx;
double dy;
};
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,
wl_fixed_t x, wl_fixed_t y);
struct weston_pointer_motion_event *event);
void (*button)(struct weston_pointer_grab *grab,
uint32_t time, uint32_t button, uint32_t state);
void (*axis)(struct weston_pointer_grab *grab,
@@ -366,6 +379,11 @@ struct weston_touch {
uint32_t grab_time;
};
void
weston_pointer_motion_to_abs(struct weston_pointer *pointer,
struct weston_pointer_motion_event *event,
wl_fixed_t *x, wl_fixed_t *y);
struct weston_pointer *
weston_pointer_create(struct weston_seat *seat);
void
@@ -389,7 +407,7 @@ 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_pointer_motion_event *event);
void
weston_pointer_set_default_grab(struct weston_pointer *pointer,
const struct weston_pointer_grab_interface *interface);
@@ -1102,7 +1120,7 @@ weston_surface_activate(struct weston_surface *surface,
struct weston_seat *seat);
void
notify_motion(struct weston_seat *seat, uint32_t time,
wl_fixed_t dx, wl_fixed_t dy);
struct weston_pointer_motion_event *event);
void
notify_motion_absolute(struct weston_seat *seat, uint32_t time,
wl_fixed_t x, wl_fixed_t y);
+2 -2
View File
@@ -334,7 +334,7 @@ drag_grab_focus(struct weston_pointer_grab *grab)
static void
drag_grab_motion(struct weston_pointer_grab *grab, uint32_t time,
wl_fixed_t x, wl_fixed_t y)
struct weston_pointer_motion_event *event)
{
struct weston_pointer_drag *drag =
container_of(grab, struct weston_pointer_drag, grab);
@@ -342,7 +342,7 @@ 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);
weston_pointer_move(pointer, event);
if (drag->base.icon) {
fx = wl_fixed_to_double(pointer->x) + drag->base.dx;
+50 -11
View File
@@ -167,17 +167,20 @@ default_grab_pointer_focus(struct weston_pointer_grab *grab)
static void
default_grab_pointer_motion(struct weston_pointer_grab *grab, uint32_t time,
wl_fixed_t x, wl_fixed_t y)
struct weston_pointer_motion_event *event)
{
struct weston_pointer *pointer = grab->pointer;
struct wl_list *resource_list;
struct wl_resource *resource;
wl_fixed_t x, y;
if (pointer->focus)
if (pointer->focus) {
weston_pointer_motion_to_abs(pointer, event, &x, &y);
weston_view_from_global_fixed(pointer->focus, x, y,
&pointer->sx, &pointer->sy);
}
weston_pointer_move(pointer, x, y);
weston_pointer_move(pointer, event);
resource_list = &pointer->focus_resource_list;
wl_resource_for_each(resource, resource_list) {
@@ -936,9 +939,9 @@ weston_pointer_clamp(struct weston_pointer *pointer, wl_fixed_t *fx, wl_fixed_t
weston_pointer_clamp_for_output(pointer, prev, fx, fy);
}
/* Takes absolute values */
WL_EXPORT void
weston_pointer_move(struct weston_pointer *pointer, wl_fixed_t x, wl_fixed_t y)
static void
weston_pointer_move_to(struct weston_pointer *pointer,
wl_fixed_t x, wl_fixed_t y)
{
int32_t ix, iy;
@@ -961,6 +964,33 @@ weston_pointer_move(struct weston_pointer *pointer, wl_fixed_t x, wl_fixed_t y)
wl_signal_emit(&pointer->motion_signal, pointer);
}
WL_EXPORT void
weston_pointer_motion_to_abs(struct weston_pointer *pointer,
struct weston_pointer_motion_event *event,
wl_fixed_t *x, wl_fixed_t *y)
{
if (event->mask & WESTON_POINTER_MOTION_ABS) {
*x = wl_fixed_from_double(event->x);
*y = wl_fixed_from_double(event->y);
} else if (event->mask & WESTON_POINTER_MOTION_REL) {
*x = pointer->x + wl_fixed_from_double(event->dx);
*y = pointer->y + wl_fixed_from_double(event->dy);
} else {
assert(!"invalid motion event");
*x = *y = 0;
}
}
WL_EXPORT void
weston_pointer_move(struct weston_pointer *pointer,
struct weston_pointer_motion_event *event)
{
wl_fixed_t x, y;
weston_pointer_motion_to_abs(pointer, event, &x, &y);
weston_pointer_move_to(pointer, x, y);
}
/** Verify if the pointer is in a valid position and move it if it isn't.
*/
static void
@@ -1002,18 +1032,19 @@ weston_pointer_handle_output_destroy(struct wl_listener *listener, void *data)
fy = pointer->y;
weston_pointer_clamp_for_output(pointer, closest, &fx, &fy);
weston_pointer_move(pointer, fx, fy);
weston_pointer_move_to(pointer, fx, fy);
}
WL_EXPORT void
notify_motion(struct weston_seat *seat,
uint32_t time, wl_fixed_t dx, wl_fixed_t dy)
uint32_t time,
struct weston_pointer_motion_event *event)
{
struct weston_compositor *ec = seat->compositor;
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
weston_compositor_wake(ec);
pointer->grab->interface->motion(pointer->grab, time, pointer->x + dx, pointer->y + dy);
pointer->grab->interface->motion(pointer->grab, time, event);
}
static void
@@ -1058,9 +1089,17 @@ notify_motion_absolute(struct weston_seat *seat,
{
struct weston_compositor *ec = seat->compositor;
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
struct weston_pointer_motion_event event = { 0 };
weston_compositor_wake(ec);
pointer->grab->interface->motion(pointer->grab, time, x, y);
event = (struct weston_pointer_motion_event) {
.mask = WESTON_POINTER_MOTION_ABS,
.x = wl_fixed_to_double(x),
.y = wl_fixed_to_double(y),
};
pointer->grab->interface->motion(pointer->grab, time, &event);
}
WL_EXPORT void
@@ -1439,7 +1478,7 @@ notify_pointer_focus(struct weston_seat *seat, struct weston_output *output,
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
if (output) {
weston_pointer_move(pointer, x, y);
weston_pointer_move_to(pointer, x, y);
} else {
/* FIXME: We should call weston_pointer_set_focus(seat,
* NULL) here, but somehow that breaks re-entry... */
+8 -5
View File
@@ -86,14 +86,17 @@ handle_pointer_motion(struct libinput_device *libinput_device,
{
struct evdev_device *device =
libinput_device_get_user_data(libinput_device);
wl_fixed_t dx, dy;
struct weston_pointer_motion_event event = { 0 };
event = (struct weston_pointer_motion_event) {
.mask = WESTON_POINTER_MOTION_REL,
.dx = libinput_event_pointer_get_dx(pointer_event),
.dy = libinput_event_pointer_get_dy(pointer_event),
};
dx = wl_fixed_from_double(libinput_event_pointer_get_dx(pointer_event));
dy = wl_fixed_from_double(libinput_event_pointer_get_dy(pointer_event));
notify_motion(device->seat,
libinput_event_pointer_get_time(pointer_event),
dx,
dy);
&event);
}
static void