Add grab object infrastructure

dev
Kristian Høgsberg 14 years ago
parent 4be2ed9611
commit 359d667646
  1. 13
      compositor/compositor.c
  2. 13
      compositor/compositor.h

@ -727,6 +727,7 @@ notify_motion(struct wlsc_input_device *device, uint32_t time, int x, int y)
struct wlsc_surface *es; struct wlsc_surface *es;
struct wlsc_compositor *ec = device->ec; struct wlsc_compositor *ec = device->ec;
struct wlsc_output *output; struct wlsc_output *output;
struct wl_grab_interface *interface;
int32_t sx, sy, width, height; int32_t sx, sy, width, height;
/* FIXME: We need some multi head love here. */ /* 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->x = x;
device->y = y; 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: case WLSC_DEVICE_GRAB_NONE:
es = pick_surface(device, &sx, &sy); es = pick_surface(device, &sx, &sy);
wl_input_device_set_pointer_focus(&device->input_device, 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_surface *surface;
struct wlsc_compositor *compositor = device->ec; struct wlsc_compositor *compositor = device->ec;
struct wl_grab_interface *interface;
struct wl_drag *drag = device->drag; struct wl_drag *drag = device->drag;
surface = (struct wlsc_surface *) device->input_device.pointer_focus; surface = (struct wlsc_surface *) device->input_device.pointer_focus;
@ -908,6 +913,12 @@ notify_button(struct wlsc_input_device *device,
time, button, state); time, button, state);
if (!state && if (!state &&
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 != WLSC_DEVICE_GRAB_NONE &&
device->grab_button == button) { device->grab_button == button) {
drag = device->drag; drag = device->drag;

@ -81,6 +81,18 @@ enum wlsc_pointer_type {
WLSC_POINTER_IBEAM, 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 wlsc_input_device {
struct wl_input_device input_device; struct wl_input_device input_device;
int32_t x, y; int32_t x, y;
@ -91,6 +103,7 @@ struct wlsc_input_device {
uint32_t modifier_state; uint32_t modifier_state;
struct wl_grab *grab_object;
enum wlsc_grab_type grab; enum wlsc_grab_type grab;
uint32_t grab_time; uint32_t grab_time;
int32_t grab_x, grab_y; int32_t grab_x, grab_y;

Loading…
Cancel
Save