diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c index aad9aaa9c..b4a36b4f4 100644 --- a/src/wayland/meta-wayland-pointer.c +++ b/src/wayland/meta-wayland-pointer.c @@ -1138,8 +1138,7 @@ meta_wayland_pointer_can_grab_surface (MetaWaylandPointer *pointer, MetaWaylandSurface *surface, uint32_t serial) { - return (pointer->button_count > 0 && - pointer->grab_serial == serial && + return (pointer->grab_serial == serial && pointer->focus_surface == surface); } diff --git a/src/wayland/meta-wayland-seat.c b/src/wayland/meta-wayland-seat.c index 9ac2cd137..367c1f1c8 100644 --- a/src/wayland/meta-wayland-seat.c +++ b/src/wayland/meta-wayland-seat.c @@ -374,10 +374,11 @@ meta_wayland_seat_set_input_focus (MetaWaylandSeat *seat, gboolean meta_wayland_seat_get_grab_info (MetaWaylandSeat *seat, - MetaWaylandSurface *surface, - uint32_t serial, - gfloat *x, - gfloat *y) + MetaWaylandSurface *surface, + uint32_t serial, + gboolean require_pressed, + gfloat *x, + gfloat *y) { ClutterEventSequence *sequence = NULL; gboolean can_grab_surface = FALSE; @@ -391,7 +392,8 @@ meta_wayland_seat_get_grab_info (MetaWaylandSeat *seat, } else { - if ((seat->capabilities & WL_SEAT_CAPABILITY_POINTER) != 0) + if ((seat->capabilities & WL_SEAT_CAPABILITY_POINTER) != 0 && + (!require_pressed || seat->pointer.button_count > 0)) can_grab_surface = meta_wayland_pointer_can_grab_surface (&seat->pointer, surface, serial); if (can_grab_surface) diff --git a/src/wayland/meta-wayland-seat.h b/src/wayland/meta-wayland-seat.h index 42d23046f..42ddb1e52 100644 --- a/src/wayland/meta-wayland-seat.h +++ b/src/wayland/meta-wayland-seat.h @@ -60,10 +60,11 @@ void meta_wayland_seat_set_input_focus (MetaWaylandSeat *seat, void meta_wayland_seat_repick (MetaWaylandSeat *seat); gboolean meta_wayland_seat_get_grab_info (MetaWaylandSeat *seat, - MetaWaylandSurface *surface, - uint32_t serial, - gfloat *x, - gfloat *y); + MetaWaylandSurface *surface, + uint32_t serial, + gboolean require_pressed, + gfloat *x, + gfloat *y); gboolean meta_wayland_seat_can_popup (MetaWaylandSeat *seat, uint32_t serial); diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c index e9599c510..4699cfd57 100644 --- a/src/wayland/meta-wayland-surface.c +++ b/src/wayland/meta-wayland-surface.c @@ -1362,7 +1362,7 @@ xdg_surface_show_window_menu (struct wl_client *client, MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource); MetaWaylandSurface *surface = wl_resource_get_user_data (resource); - if (!meta_wayland_seat_get_grab_info (seat, surface, serial, NULL, NULL)) + if (!meta_wayland_seat_get_grab_info (seat, surface, serial, FALSE, NULL, NULL)) return; meta_window_show_menu (surface->window, META_WINDOW_MENU_WM, @@ -1407,7 +1407,7 @@ xdg_surface_move (struct wl_client *client, MetaWaylandSurface *surface = wl_resource_get_user_data (resource); gfloat x, y; - if (!meta_wayland_seat_get_grab_info (seat, surface, serial, &x, &y)) + if (!meta_wayland_seat_get_grab_info (seat, surface, serial, TRUE, &x, &y)) return; begin_grab_op_on_surface (surface, seat, META_GRAB_OP_MOVING, x, y); @@ -1447,7 +1447,7 @@ xdg_surface_resize (struct wl_client *client, MetaWaylandSurface *surface = wl_resource_get_user_data (resource); gfloat x, y; - if (!meta_wayland_seat_get_grab_info (seat, surface, serial, &x, &y)) + if (!meta_wayland_seat_get_grab_info (seat, surface, serial, TRUE, &x, &y)) return; begin_grab_op_on_surface (surface, seat, grab_op_for_xdg_surface_resize_edge (edges), x, y); @@ -1790,7 +1790,7 @@ wl_shell_surface_move (struct wl_client *client, MetaWaylandSurface *surface = wl_resource_get_user_data (resource); gfloat x, y; - if (!meta_wayland_seat_get_grab_info (seat, surface, serial, &x, &y)) + if (!meta_wayland_seat_get_grab_info (seat, surface, serial, TRUE, &x, &y)) return; begin_grab_op_on_surface (surface, seat, META_GRAB_OP_MOVING, x, y); @@ -1830,7 +1830,7 @@ wl_shell_surface_resize (struct wl_client *client, MetaWaylandSurface *surface = wl_resource_get_user_data (resource); gfloat x, y; - if (!meta_wayland_seat_get_grab_info (seat, surface, serial, &x, &y)) + if (!meta_wayland_seat_get_grab_info (seat, surface, serial, TRUE, &x, &y)) return; begin_grab_op_on_surface (surface, seat, grab_op_for_wl_shell_surface_resize_edge (edges), x, y);