From dd4046ae5602c12f832c9e84d77c6532e197eed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Fri, 21 Jan 2011 17:00:09 -0500 Subject: [PATCH] Take away pointer focus during server grabs This lets the client restore the pointer image when the grab ends. --- compositor/compositor.c | 13 ++++++------- compositor/shell.c | 36 +++++++++++++++++++++++++++++++++--- wayland/wayland-server.c | 10 ---------- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/compositor/compositor.c b/compositor/compositor.c index 72a3878c..b1767edc 100644 --- a/compositor/compositor.c +++ b/compositor/compositor.c @@ -676,10 +676,8 @@ notify_button(struct wl_input_device *device, (struct wlsc_compositor *) device->compositor; surface = (struct wlsc_surface *) device->pointer_focus; - if (!surface) - return; - if (state && device->grab == NULL) { + if (state && surface && device->grab == NULL) { wlsc_surface_raise(surface); if (wd->selection) @@ -694,19 +692,21 @@ notify_button(struct wl_input_device *device, time); } - if (state && button == BTN_LEFT && + if (state && surface && button == BTN_LEFT && (wd->modifier_state & MODIFIER_SUPER)) shell_move(NULL, (struct wl_shell *) &compositor->shell, &surface->surface, device, time); - else if (state && button == BTN_MIDDLE && + else if (state && surface && button == BTN_MIDDLE && (wd->modifier_state & MODIFIER_SUPER)) shell_resize(NULL, (struct wl_shell *) &compositor->shell, &surface->surface, device, time, WL_GRAB_RESIZE_BOTTOM_RIGHT); - device->grab->interface->button(device->grab, time, button, state); + if (device->grab) + device->grab->interface->button(device->grab, time, + button, state); if (!state && device->grab && device->grab_button == button) wl_input_device_end_grab(device, time); @@ -784,7 +784,6 @@ input_device_attach(struct wl_client *client, return; if (device->input_device.pointer_focus == NULL) return; - if (device->input_device.pointer_focus->client != client) return; diff --git a/compositor/shell.c b/compositor/shell.c index d50a3d69..4a9c9364 100644 --- a/compositor/shell.c +++ b/compositor/shell.c @@ -29,6 +29,7 @@ struct wlsc_move_grab { struct wl_grab grab; + struct wlsc_surface *surface; int32_t dx, dy; }; @@ -37,8 +38,7 @@ 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_surface *es = - (struct wlsc_surface *) grab->input_device->pointer_focus; + struct wlsc_surface *es = move->surface; es->x = x + move->dx; es->y = y + move->dy; @@ -54,6 +54,14 @@ move_grab_button(struct wl_grab *grab, static void move_grab_end(struct wl_grab *grab, uint32_t time) { + struct wlsc_surface *es; + struct wl_input_device *device = grab->input_device; + int32_t sx, sy; + + es = pick_surface(grab->input_device, &sx, &sy); + wl_input_device_set_pointer_focus(device, + &es->surface, time, + device->x, device->y, sx, sy); free(grab); } @@ -81,18 +89,21 @@ shell_move(struct wl_client *client, struct wl_shell *shell, move->grab.interface = &move_grab_interface; move->dx = es->x - wd->input_device.grab_x; move->dy = es->y - wd->input_device.grab_y; + move->surface = es; if (wl_input_device_update_grab(&wd->input_device, &move->grab, surface, time) < 0) return; wlsc_input_device_set_pointer_image(wd, WLSC_POINTER_DRAGGING); + wl_input_device_set_pointer_focus(device, NULL, time, 0, 0, 0, 0); } struct wlsc_resize_grab { struct wl_grab grab; uint32_t edges; int32_t dx, dy, width, height; + struct wlsc_surface *surface; }; static void @@ -103,7 +114,7 @@ resize_grab_motion(struct wl_grab *grab, struct wl_input_device *device = grab->input_device; struct wlsc_compositor *ec = (struct wlsc_compositor *) device->compositor; - struct wl_surface *surface = device->pointer_focus; + struct wl_surface *surface = &resize->surface->surface; int32_t width, height; if (resize->edges & WL_GRAB_RESIZE_LEFT) { @@ -136,6 +147,14 @@ resize_grab_button(struct wl_grab *grab, static void resize_grab_end(struct wl_grab *grab, uint32_t time) { + struct wlsc_surface *es; + struct wl_input_device *device = grab->input_device; + int32_t sx, sy; + + es = pick_surface(grab->input_device, &sx, &sy); + wl_input_device_set_pointer_focus(device, + &es->surface, time, + device->x, device->y, sx, sy); free(grab); } @@ -167,6 +186,7 @@ shell_resize(struct wl_client *client, struct wl_shell *shell, resize->dy = es->y - wd->input_device.grab_y; resize->width = es->width; resize->height = es->height; + resize->surface = es; if (edges == 0 || edges > 15 || (edges & 3) == 3 || (edges & 12) == 12) @@ -204,6 +224,7 @@ shell_resize(struct wl_client *client, struct wl_shell *shell, return; wlsc_input_device_set_pointer_image(wd, pointer); + wl_input_device_set_pointer_focus(device, NULL, time, 0, 0, 0, 0); } static void @@ -360,6 +381,9 @@ static void drag_grab_end(struct wl_grab *grab, uint32_t time) { struct wl_drag *drag = container_of(grab, struct wl_drag, grab); + struct wlsc_surface *es; + struct wl_input_device *device = grab->input_device; + int32_t sx, sy; if (drag->target) wl_client_post_event(drag->target, @@ -367,6 +391,11 @@ drag_grab_end(struct wl_grab *grab, uint32_t time) WL_DRAG_OFFER_DROP); wl_drag_set_pointer_focus(drag, NULL, time, 0, 0, 0, 0); + + es = pick_surface(grab->input_device, &sx, &sy); + wl_input_device_set_pointer_focus(device, + &es->surface, time, + device->x, device->y, sx, sy); } static const struct wl_grab_interface drag_grab_interface = { @@ -400,6 +429,7 @@ drag_activate(struct wl_client *client, wl_display_add_object(display, &drag->drag_offer.object); target = pick_surface(device, &sx, &sy); + wl_input_device_set_pointer_focus(device, NULL, time, 0, 0, 0, 0); wl_drag_set_pointer_focus(drag, &target->surface, time, device->x, device->y, sx, sy); } diff --git a/wayland/wayland-server.c b/wayland/wayland-server.c index e60f2ae6..b494d11b 100644 --- a/wayland/wayland-server.c +++ b/wayland/wayland-server.c @@ -412,16 +412,6 @@ wl_input_device_end_grab(struct wl_input_device *device, uint32_t time) device->grab = NULL; wl_list_remove(&device->grab_listener.link); - -#if 0 - struct wlsc_surface *es; - int32_t sx, sy; - - es = pick_surface(device, &sx, &sy); - wl_input_device_set_pointer_focus(device, - &es->surface, time, - device->x, device->y, sx, sy); -#endif } static void