diff --git a/compositor/compositor.c b/compositor/compositor.c index 136dfef5..98335422 100644 --- a/compositor/compositor.c +++ b/compositor/compositor.c @@ -727,6 +727,7 @@ notify_motion(struct wlsc_input_device *device, uint32_t time, int x, int y) struct wlsc_surface *es; struct wlsc_compositor *ec = device->ec; struct wlsc_output *output; + struct wl_grab_interface *interface; int32_t sx, sy, width, height; /* FIXME: We need some multi head love here. */ @@ -743,7 +744,10 @@ notify_motion(struct wlsc_input_device *device, uint32_t time, int x, int y) device->x = x; device->y = y; - switch (device->grab) { + if (device->grab_object) { + interface = device->grab_object->interface; + interface->motion(device->grab_object, time, x, y); + } else switch (device->grab) { case WLSC_DEVICE_GRAB_NONE: es = pick_surface(device, &sx, &sy); wl_input_device_set_pointer_focus(&device->input_device, @@ -868,6 +872,7 @@ notify_button(struct wlsc_input_device *device, { struct wlsc_surface *surface; struct wlsc_compositor *compositor = device->ec; + struct wl_grab_interface *interface; struct wl_drag *drag = device->drag; surface = (struct wlsc_surface *) device->input_device.pointer_focus; @@ -908,8 +913,14 @@ notify_button(struct wlsc_input_device *device, time, button, state); if (!state && - device->grab != WLSC_DEVICE_GRAB_NONE && + device->grab_object && device->grab_button == button) { + interface = device->grab_object->interface; + interface->end(device->grab_object); + + } else if (!state && + device->grab != WLSC_DEVICE_GRAB_NONE && + device->grab_button == button) { drag = device->drag; if (drag && drag->target) wl_client_post_event(drag->target, diff --git a/compositor/compositor.h b/compositor/compositor.h index 2eef373c..27abcf96 100644 --- a/compositor/compositor.h +++ b/compositor/compositor.h @@ -81,6 +81,18 @@ enum wlsc_pointer_type { WLSC_POINTER_IBEAM, }; +struct wl_grab; +struct wl_grab_interface { + void (*motion)(struct wl_grab *grab, + uint32_t time, int32_t x, int32_t y); + void (*end)(struct wl_grab *grab); +}; + +struct wl_grab { + struct wl_grab_interface *interface; + struct wl_input_device *input_device; +}; + struct wlsc_input_device { struct wl_input_device input_device; int32_t x, y; @@ -91,6 +103,7 @@ struct wlsc_input_device { uint32_t modifier_state; + struct wl_grab *grab_object; enum wlsc_grab_type grab; uint32_t grab_time; int32_t grab_x, grab_y;