wayland-surface: Use begin_grab_op for move grabs
This commit is contained in:
parent
1946c548bf
commit
3c7cd1f38c
@ -1566,6 +1566,10 @@ meta_window_grab_all_keys (MetaWindow *window,
|
|||||||
Window grabwindow;
|
Window grabwindow;
|
||||||
gboolean retval;
|
gboolean retval;
|
||||||
|
|
||||||
|
/* We don't need to grab Wayland clients */
|
||||||
|
if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
if (window->all_keys_grabbed)
|
if (window->all_keys_grabbed)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -570,75 +570,6 @@ xdg_surface_pong (struct wl_client *client,
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
MetaWaylandPointerGrab generic;
|
|
||||||
MetaWaylandSurface *surface;
|
|
||||||
struct wl_listener surface_destroy_listener;
|
|
||||||
wl_fixed_t dx, dy;
|
|
||||||
} MetaWaylandMoveGrab;
|
|
||||||
|
|
||||||
static void
|
|
||||||
end_move_grab (MetaWaylandMoveGrab *move_grab)
|
|
||||||
{
|
|
||||||
if (move_grab->surface)
|
|
||||||
{
|
|
||||||
move_grab->surface = NULL;
|
|
||||||
wl_list_remove (&move_grab->surface_destroy_listener.link);
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_wayland_pointer_end_grab (move_grab->generic.pointer);
|
|
||||||
g_slice_free (MetaWaylandMoveGrab, move_grab);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
move_grab_lose_surface (struct wl_listener *listener, void *data)
|
|
||||||
{
|
|
||||||
MetaWaylandMoveGrab *move_grab =
|
|
||||||
wl_container_of (listener, move_grab, surface_destroy_listener);
|
|
||||||
|
|
||||||
move_grab->surface = NULL;
|
|
||||||
end_move_grab (move_grab);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
move_grab_focus (MetaWaylandPointerGrab *grab,
|
|
||||||
MetaWaylandSurface *surface,
|
|
||||||
const ClutterEvent *event)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
move_grab_motion (MetaWaylandPointerGrab *grab,
|
|
||||||
const ClutterEvent *event)
|
|
||||||
{
|
|
||||||
MetaWaylandMoveGrab *move_grab = (MetaWaylandMoveGrab *)grab;
|
|
||||||
MetaWaylandPointer *pointer = grab->pointer;
|
|
||||||
|
|
||||||
meta_window_move (move_grab->surface->window,
|
|
||||||
TRUE,
|
|
||||||
wl_fixed_to_int (pointer->x + move_grab->dx),
|
|
||||||
wl_fixed_to_int (pointer->y + move_grab->dy));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
move_grab_button (MetaWaylandPointerGrab *grab,
|
|
||||||
const ClutterEvent *event)
|
|
||||||
{
|
|
||||||
MetaWaylandMoveGrab *move_grab = (MetaWaylandMoveGrab *)grab;
|
|
||||||
MetaWaylandPointer *pointer = grab->pointer;
|
|
||||||
|
|
||||||
if (pointer->button_count == 0 &&
|
|
||||||
clutter_event_type (event) == CLUTTER_BUTTON_RELEASE)
|
|
||||||
end_move_grab (move_grab);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const MetaWaylandPointerGrabInterface move_grab_interface = {
|
|
||||||
move_grab_focus,
|
|
||||||
move_grab_motion,
|
|
||||||
move_grab_button,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xdg_surface_move (struct wl_client *client,
|
xdg_surface_move (struct wl_client *client,
|
||||||
struct wl_resource *resource,
|
struct wl_resource *resource,
|
||||||
@ -648,8 +579,6 @@ xdg_surface_move (struct wl_client *client,
|
|||||||
MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
|
MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
|
||||||
MetaWaylandSurfaceExtension *xdg_surface = wl_resource_get_user_data (resource);
|
MetaWaylandSurfaceExtension *xdg_surface = wl_resource_get_user_data (resource);
|
||||||
MetaWindow *window;
|
MetaWindow *window;
|
||||||
MetaWaylandMoveGrab *move_grab;
|
|
||||||
MetaRectangle rect;
|
|
||||||
|
|
||||||
if (seat->pointer.button_count == 0 ||
|
if (seat->pointer.button_count == 0 ||
|
||||||
seat->pointer.grab_serial != serial ||
|
seat->pointer.grab_serial != serial ||
|
||||||
@ -660,41 +589,17 @@ xdg_surface_move (struct wl_client *client,
|
|||||||
if (!window)
|
if (!window)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* small hack, this should be handled by window->shaken_loose when we
|
meta_display_begin_grab_op (window->display,
|
||||||
move everything to display.c */
|
window->screen,
|
||||||
if (window->fullscreen)
|
window,
|
||||||
meta_window_unmake_fullscreen (window);
|
META_GRAB_OP_MOVING,
|
||||||
|
TRUE, /* pointer_already_grabbed */
|
||||||
move_grab = g_slice_new (MetaWaylandMoveGrab);
|
FALSE, /* frame_action */
|
||||||
|
1, /* button. XXX? */
|
||||||
meta_window_get_input_rect (xdg_surface->surface->window,
|
0, /* modmask */
|
||||||
&rect);
|
meta_display_get_current_time_roundtrip (window->display),
|
||||||
|
wl_fixed_to_int (seat->pointer.grab_x),
|
||||||
move_grab->generic.interface = &move_grab_interface;
|
wl_fixed_to_int (seat->pointer.grab_y));
|
||||||
move_grab->generic.pointer = &seat->pointer;
|
|
||||||
|
|
||||||
move_grab->surface = xdg_surface->surface;
|
|
||||||
move_grab->surface_destroy_listener.notify = move_grab_lose_surface;
|
|
||||||
wl_resource_add_destroy_listener (xdg_surface->surface->resource,
|
|
||||||
&move_grab->surface_destroy_listener);
|
|
||||||
|
|
||||||
move_grab->dx = wl_fixed_from_int (rect.x) - seat->pointer.grab_x;
|
|
||||||
move_grab->dy = wl_fixed_from_int (rect.y) - seat->pointer.grab_y;
|
|
||||||
|
|
||||||
meta_wayland_pointer_start_grab (&seat->pointer, (MetaWaylandPointerGrab*)move_grab);
|
|
||||||
|
|
||||||
/* TODO: send_grab_cursor (cursor); */
|
|
||||||
|
|
||||||
/* XXX: In Weston there is a desktop shell protocol which has
|
|
||||||
* a set_grab_surface request that's used to specify the surface
|
|
||||||
* that's focused here.
|
|
||||||
*
|
|
||||||
* TODO: understand why.
|
|
||||||
*
|
|
||||||
* XXX: For now we just focus the surface directly associated with
|
|
||||||
* the grab.
|
|
||||||
*/
|
|
||||||
meta_wayland_pointer_set_focus (&seat->pointer, xdg_surface->surface);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user