mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-11-12 13:29:55 -05:00
Move resizing to a grab object
This commit is contained in:
parent
359d667646
commit
fc9c28adc0
1 changed files with 87 additions and 42 deletions
|
|
@ -522,8 +522,6 @@ wlsc_input_device_start_grab(struct wlsc_input_device *device,
|
||||||
device->grab_y = device->y;
|
device->grab_y = device->y;
|
||||||
device->grab_dx = focus->x - device->grab_x;
|
device->grab_dx = focus->x - device->grab_x;
|
||||||
device->grab_dy = focus->y - device->grab_y;
|
device->grab_dy = focus->y - device->grab_y;
|
||||||
device->grab_width = focus->width;
|
|
||||||
device->grab_height = focus->height;
|
|
||||||
|
|
||||||
device->grab_listener.func = lose_grab_surface;
|
device->grab_listener.func = lose_grab_surface;
|
||||||
wl_list_insert(focus->surface.destroy_listener_list.prev,
|
wl_list_insert(focus->surface.destroy_listener_list.prev,
|
||||||
|
|
@ -559,13 +557,85 @@ shell_move(struct wl_client *client, struct wl_shell *shell,
|
||||||
wlsc_input_device_set_pointer_image(wd, WLSC_POINTER_DRAGGING);
|
wlsc_input_device_set_pointer_image(wd, WLSC_POINTER_DRAGGING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct wlsc_resize_grab {
|
||||||
|
struct wl_grab grab;
|
||||||
|
uint32_t edges;
|
||||||
|
int32_t dx, dy, width, height;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
resize_grab_motion(struct wl_grab *grab,
|
||||||
|
uint32_t time, int32_t x, int32_t y)
|
||||||
|
{
|
||||||
|
struct wlsc_resize_grab *resize = (struct wlsc_resize_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;
|
||||||
|
int32_t sx, sy, width, height;
|
||||||
|
|
||||||
|
if (resize->edges & WLSC_DEVICE_GRAB_RESIZE_LEFT) {
|
||||||
|
sx = x + resize->dx;
|
||||||
|
width = device->grab_x - x + resize->width;
|
||||||
|
} else if (resize->edges & WLSC_DEVICE_GRAB_RESIZE_RIGHT) {
|
||||||
|
sx = device->grab_x + resize->dx;
|
||||||
|
width = x - device->grab_x + resize->width;
|
||||||
|
} else {
|
||||||
|
sx = device->grab_x + resize->dx;
|
||||||
|
width = resize->width;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resize->edges & WLSC_DEVICE_GRAB_RESIZE_TOP) {
|
||||||
|
sy = y + resize->dy;
|
||||||
|
height = device->grab_y - y + resize->height;
|
||||||
|
} else if (resize->edges & WLSC_DEVICE_GRAB_RESIZE_BOTTOM) {
|
||||||
|
sy = device->grab_y + resize->dy;
|
||||||
|
height = y - device->grab_y + resize->height;
|
||||||
|
} else {
|
||||||
|
sy = device->grab_y + resize->dy;
|
||||||
|
height = resize->height;
|
||||||
|
}
|
||||||
|
|
||||||
|
wl_client_post_event(es->surface.client,
|
||||||
|
&device->ec->shell.object,
|
||||||
|
WL_SHELL_CONFIGURE, time, resize->edges,
|
||||||
|
&es->surface, sx, sy, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
resize_grab_end(struct wl_grab *grab)
|
||||||
|
{
|
||||||
|
free(grab);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct wl_grab_interface resize_grab_interface = {
|
||||||
|
resize_grab_motion,
|
||||||
|
resize_grab_end
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
shell_resize(struct wl_client *client, struct wl_shell *shell,
|
shell_resize(struct wl_client *client, struct wl_shell *shell,
|
||||||
struct wl_surface *surface,
|
struct wl_surface *surface,
|
||||||
struct wl_input_device *device, uint32_t time, uint32_t edges)
|
struct wl_input_device *device, uint32_t time, uint32_t edges)
|
||||||
{
|
{
|
||||||
struct wlsc_input_device *wd = (struct wlsc_input_device *) device;
|
struct wlsc_input_device *wd = (struct wlsc_input_device *) device;
|
||||||
|
struct wlsc_resize_grab *resize;
|
||||||
enum wlsc_pointer_type pointer = WLSC_POINTER_LEFT_PTR;
|
enum wlsc_pointer_type pointer = WLSC_POINTER_LEFT_PTR;
|
||||||
|
struct wlsc_surface *es = (struct wlsc_surface *) surface;
|
||||||
|
|
||||||
|
resize = malloc(sizeof *resize);
|
||||||
|
if (!resize) {
|
||||||
|
wl_client_post_no_memory(client);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
resize->grab.interface = &resize_grab_interface;
|
||||||
|
resize->grab.input_device = device;
|
||||||
|
resize->edges = edges;
|
||||||
|
resize->dx = es->x - wd->grab_x;
|
||||||
|
resize->dy = es->y - wd->grab_y;
|
||||||
|
resize->width = es->width;
|
||||||
|
resize->height = es->height;
|
||||||
|
|
||||||
if (edges == 0 || edges > 15 ||
|
if (edges == 0 || edges > 15 ||
|
||||||
(edges & 3) == 3 || (edges & 12) == 12)
|
(edges & 3) == 3 || (edges & 12) == 12)
|
||||||
|
|
@ -602,6 +672,7 @@ shell_resize(struct wl_client *client, struct wl_shell *shell,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wlsc_input_device_set_pointer_image(wd, pointer);
|
wlsc_input_device_set_pointer_image(wd, pointer);
|
||||||
|
wd->grab_object = &resize->grab;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -728,7 +799,7 @@ notify_motion(struct wlsc_input_device *device, uint32_t time, int x, int y)
|
||||||
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;
|
struct wl_grab_interface *interface;
|
||||||
int32_t sx, sy, width, height;
|
int32_t sx, sy;
|
||||||
|
|
||||||
/* FIXME: We need some multi head love here. */
|
/* FIXME: We need some multi head love here. */
|
||||||
output = container_of(ec->output_list.next, struct wlsc_output, link);
|
output = container_of(ec->output_list.next, struct wlsc_output, link);
|
||||||
|
|
@ -747,7 +818,9 @@ notify_motion(struct wlsc_input_device *device, uint32_t time, int x, int y)
|
||||||
if (device->grab_object) {
|
if (device->grab_object) {
|
||||||
interface = device->grab_object->interface;
|
interface = device->grab_object->interface;
|
||||||
interface->motion(device->grab_object, time, x, y);
|
interface->motion(device->grab_object, time, x, y);
|
||||||
} else switch (device->grab) {
|
}
|
||||||
|
|
||||||
|
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,
|
||||||
|
|
@ -784,44 +857,6 @@ notify_motion(struct wlsc_input_device *device, uint32_t time, int x, int y)
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WLSC_DEVICE_GRAB_RESIZE_TOP:
|
|
||||||
case WLSC_DEVICE_GRAB_RESIZE_BOTTOM:
|
|
||||||
case WLSC_DEVICE_GRAB_RESIZE_LEFT:
|
|
||||||
case WLSC_DEVICE_GRAB_RESIZE_TOP_LEFT:
|
|
||||||
case WLSC_DEVICE_GRAB_RESIZE_BOTTOM_LEFT:
|
|
||||||
case WLSC_DEVICE_GRAB_RESIZE_RIGHT:
|
|
||||||
case WLSC_DEVICE_GRAB_RESIZE_TOP_RIGHT:
|
|
||||||
case WLSC_DEVICE_GRAB_RESIZE_BOTTOM_RIGHT:
|
|
||||||
case WLSC_DEVICE_GRAB_RESIZE_MASK:
|
|
||||||
es = (struct wlsc_surface *) device->input_device.pointer_focus;
|
|
||||||
if (device->grab & WLSC_DEVICE_GRAB_RESIZE_LEFT) {
|
|
||||||
sx = x + device->grab_dx;
|
|
||||||
width = device->grab_x - x + device->grab_width;
|
|
||||||
} else if (device->grab & WLSC_DEVICE_GRAB_RESIZE_RIGHT) {
|
|
||||||
sx = device->grab_x + device->grab_dx;
|
|
||||||
width = x - device->grab_x + device->grab_width;
|
|
||||||
} else {
|
|
||||||
sx = device->grab_x + device->grab_dx;
|
|
||||||
width = device->grab_width;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (device->grab & WLSC_DEVICE_GRAB_RESIZE_TOP) {
|
|
||||||
sy = y + device->grab_dy;
|
|
||||||
height = device->grab_y - y + device->grab_height;
|
|
||||||
} else if (device->grab & WLSC_DEVICE_GRAB_RESIZE_BOTTOM) {
|
|
||||||
sy = device->grab_y + device->grab_dy;
|
|
||||||
height = y - device->grab_y + device->grab_height;
|
|
||||||
} else {
|
|
||||||
sy = device->grab_y + device->grab_dy;
|
|
||||||
height = device->grab_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
wl_client_post_event(es->surface.client,
|
|
||||||
&ec->shell.object,
|
|
||||||
WL_SHELL_CONFIGURE, time, device->grab,
|
|
||||||
&es->surface, sx, sy, width, height);
|
|
||||||
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,
|
||||||
|
|
@ -833,6 +868,9 @@ 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;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* Other grabs are handled as grab objects. */
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
device->sprite->x = device->x - device->hotspot_x;
|
device->sprite->x = device->x - device->hotspot_x;
|
||||||
|
|
@ -847,8 +885,15 @@ 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;
|
||||||
int32_t sx, sy;
|
int32_t sx, sy;
|
||||||
|
|
||||||
|
if (device->grab_object) {
|
||||||
|
interface = device->grab_object->interface;
|
||||||
|
interface->end(device->grab_object);
|
||||||
|
device->grab_object = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
switch (device->grab) {
|
switch (device->grab) {
|
||||||
case WLSC_DEVICE_GRAB_DRAG:
|
case WLSC_DEVICE_GRAB_DRAG:
|
||||||
wl_drag_set_pointer_focus(drag, NULL, time, 0, 0, 0, 0);
|
wl_drag_set_pointer_focus(drag, NULL, time, 0, 0, 0, 0);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue