Handle shell.move using a grab object

dev
Kristian Høgsberg 14 years ago
parent fc9c28adc0
commit 6d65d5f4d4
  1. 78
      compositor/compositor.c
  2. 2
      compositor/compositor.h

@ -543,18 +543,70 @@ wlsc_input_device_update_grab(struct wlsc_input_device *device,
return 0; return 0;
} }
struct wlsc_move_grab {
struct wl_grab grab;
int32_t dx, dy;
};
static void
move_grab_motion(struct wl_grab *grab,
uint32_t time, int32_t x, int32_t y)
{
struct wlsc_move_grab *move = (struct wlsc_move_grab *) grab;
struct wlsc_input_device *device =
(struct wlsc_input_device *) grab->input_device;
struct wlsc_surface *es =
(struct wlsc_surface *) device->input_device.pointer_focus;
es->x = x + move->dx;
es->y = y + move->dy;
wl_client_post_event(es->surface.client,
&device->ec->shell.object,
WL_SHELL_CONFIGURE,
time, WLSC_DEVICE_GRAB_MOVE,
&es->surface, es->x, es->y,
es->width, es->height);
wlsc_surface_update_matrix(es);
}
static void
move_grab_end(struct wl_grab *grab)
{
free(grab);
}
static const struct wl_grab_interface move_grab_interface = {
move_grab_motion,
move_grab_end
};
static void static void
shell_move(struct wl_client *client, struct wl_shell *shell, shell_move(struct wl_client *client, struct wl_shell *shell,
struct wl_surface *surface, struct wl_surface *surface,
struct wl_input_device *device, uint32_t time) struct wl_input_device *device, uint32_t time)
{ {
struct wlsc_input_device *wd = (struct wlsc_input_device *) device; struct wlsc_input_device *wd = (struct wlsc_input_device *) device;
struct wlsc_surface *es = (struct wlsc_surface *) surface;
struct wlsc_move_grab *move;
move = malloc(sizeof *move);
if (!move) {
wl_client_post_no_memory(client);
return;
}
move->grab.interface = &move_grab_interface;
move->grab.input_device = device;
move->dx = es->x - wd->grab_x;
move->dy = es->y - wd->grab_y;
if (wlsc_input_device_update_grab(wd, WLSC_DEVICE_GRAB_MOVE, if (wlsc_input_device_update_grab(wd, WLSC_DEVICE_GRAB_MOVE,
surface, time) < 0) surface, time) < 0)
return; return;
wlsc_input_device_set_pointer_image(wd, WLSC_POINTER_DRAGGING); wlsc_input_device_set_pointer_image(wd, WLSC_POINTER_DRAGGING);
wd->grab_object = &move->grab;
} }
struct wlsc_resize_grab { struct wlsc_resize_grab {
@ -608,7 +660,7 @@ resize_grab_end(struct wl_grab *grab)
free(grab); free(grab);
} }
struct wl_grab_interface resize_grab_interface = { static const struct wl_grab_interface resize_grab_interface = {
resize_grab_motion, resize_grab_motion,
resize_grab_end resize_grab_end
}; };
@ -798,7 +850,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; const struct wl_grab_interface *interface;
int32_t sx, sy; int32_t sx, sy;
/* FIXME: We need some multi head love here. */ /* FIXME: We need some multi head love here. */
@ -842,21 +894,6 @@ notify_motion(struct wlsc_input_device *device, uint32_t time, int x, int y)
time, x, y, sx, sy); time, x, y, sx, sy);
break; break;
case WLSC_DEVICE_GRAB_MOVE:
es = (struct wlsc_surface *) device->input_device.pointer_focus;
es->x = x + device->grab_dx;
es->y = y + device->grab_dy;;
wl_client_post_event(es->surface.client,
&ec->shell.object,
WL_SHELL_CONFIGURE,
time, device->grab,
&es->surface, es->x, es->y,
es->width, es->height);
wlsc_surface_update_matrix(es);
break;
case WLSC_DEVICE_GRAB_DRAG: case WLSC_DEVICE_GRAB_DRAG:
es = pick_surface(device, &sx, &sy); es = pick_surface(device, &sx, &sy);
wl_drag_set_pointer_focus(device->drag, wl_drag_set_pointer_focus(device->drag,
@ -885,7 +922,7 @@ wlsc_input_device_end_grab(struct wlsc_input_device *device, uint32_t time)
{ {
struct wl_drag *drag = device->drag; struct wl_drag *drag = device->drag;
struct wlsc_surface *es; struct wlsc_surface *es;
struct wl_grab_interface *interface; const struct wl_grab_interface *interface;
int32_t sx, sy; int32_t sx, sy;
if (device->grab_object) { if (device->grab_object) {
@ -917,7 +954,6 @@ 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;
@ -960,9 +996,7 @@ notify_button(struct wlsc_input_device *device,
if (!state && if (!state &&
device->grab_object && device->grab_object &&
device->grab_button == button) { device->grab_button == button) {
interface = device->grab_object->interface; wlsc_input_device_end_grab(device, time);
interface->end(device->grab_object);
} else if (!state && } else if (!state &&
device->grab != WLSC_DEVICE_GRAB_NONE && device->grab != WLSC_DEVICE_GRAB_NONE &&
device->grab_button == button) { device->grab_button == button) {

@ -89,7 +89,7 @@ struct wl_grab_interface {
}; };
struct wl_grab { struct wl_grab {
struct wl_grab_interface *interface; const struct wl_grab_interface *interface;
struct wl_input_device *input_device; struct wl_input_device *input_device;
}; };

Loading…
Cancel
Save