Handle shell.move using a grab object
This commit is contained in:
parent
fc9c28adc0
commit
6d65d5f4d4
@ -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…
Reference in New Issue
Block a user