[mutter/wayland] wayland-surface: Support xdg_surface_resize as well
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wayland] wayland-surface: Support xdg_surface_resize as well
- Date: Fri, 15 Nov 2013 04:26:47 +0000 (UTC)
commit b72315e27a8432037c430aa3052e06e80d26de75
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Thu Nov 14 21:45:34 2013 -0500
wayland-surface: Support xdg_surface_resize as well
src/wayland/meta-wayland-surface.c | 86 +++++++++++++++++++++++++++--------
1 files changed, 66 insertions(+), 20 deletions(-)
---
diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
index 67583ee..198b169 100644
--- a/src/wayland/meta-wayland-surface.c
+++ b/src/wayland/meta-wayland-surface.c
@@ -570,6 +570,32 @@ xdg_surface_pong (struct wl_client *client,
{
}
+static gboolean
+begin_grab_op_on_surface (MetaWaylandSurface *surface,
+ MetaWaylandSeat *seat,
+ MetaGrabOp grab_op)
+{
+ MetaWindow *window = surface->window;
+
+ if (!window)
+ return FALSE;
+
+ if (grab_op == META_GRAB_OP_NONE)
+ return FALSE;
+
+ return meta_display_begin_grab_op (window->display,
+ window->screen,
+ window,
+ grab_op,
+ TRUE, /* pointer_already_grabbed */
+ FALSE, /* frame_action */
+ 1, /* button. XXX? */
+ 0, /* modmask */
+ meta_display_get_current_time_roundtrip (window->display),
+ wl_fixed_to_int (seat->pointer.grab_x),
+ wl_fixed_to_int (seat->pointer.grab_y));
+}
+
static void
xdg_surface_move (struct wl_client *client,
struct wl_resource *resource,
@@ -578,38 +604,58 @@ xdg_surface_move (struct wl_client *client,
{
MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
MetaWaylandSurfaceExtension *xdg_surface = wl_resource_get_user_data (resource);
- MetaWindow *window;
if (seat->pointer.button_count == 0 ||
seat->pointer.grab_serial != serial ||
seat->pointer.focus != xdg_surface->surface)
return;
- window = xdg_surface->surface->window;
- if (!window)
- return;
+ begin_grab_op_on_surface (xdg_surface->surface, seat, META_GRAB_OP_MOVING);
+}
- meta_display_begin_grab_op (window->display,
- window->screen,
- window,
- META_GRAB_OP_MOVING,
- TRUE, /* pointer_already_grabbed */
- FALSE, /* frame_action */
- 1, /* button. XXX? */
- 0, /* modmask */
- meta_display_get_current_time_roundtrip (window->display),
- wl_fixed_to_int (seat->pointer.grab_x),
- wl_fixed_to_int (seat->pointer.grab_y));
+static MetaGrabOp
+grab_op_for_edge (int edge)
+{
+ switch (edge)
+ {
+ case XDG_SURFACE_RESIZE_EDGE_TOP_LEFT:
+ return META_GRAB_OP_RESIZING_NW;
+ case XDG_SURFACE_RESIZE_EDGE_TOP:
+ return META_GRAB_OP_RESIZING_N;
+ case XDG_SURFACE_RESIZE_EDGE_TOP_RIGHT:
+ return META_GRAB_OP_RESIZING_NE;
+ case XDG_SURFACE_RESIZE_EDGE_RIGHT:
+ return META_GRAB_OP_RESIZING_E;
+ case XDG_SURFACE_RESIZE_EDGE_BOTTOM_RIGHT:
+ return META_GRAB_OP_RESIZING_SE;
+ case XDG_SURFACE_RESIZE_EDGE_BOTTOM:
+ return META_GRAB_OP_RESIZING_S;
+ case XDG_SURFACE_RESIZE_EDGE_BOTTOM_LEFT:
+ return META_GRAB_OP_RESIZING_SW;
+ case XDG_SURFACE_RESIZE_EDGE_LEFT:
+ return META_GRAB_OP_RESIZING_W;
+ default:
+ g_warning ("invalid edge: %d", edge);
+ return META_GRAB_OP_NONE;
+ }
}
static void
xdg_surface_resize (struct wl_client *client,
- struct wl_resource *resource,
- struct wl_resource *seat,
- guint32 serial,
- guint32 edges)
+ struct wl_resource *resource,
+ struct wl_resource *seat_resource,
+ guint32 serial,
+ guint32 edges)
{
- g_warning ("TODO: support xdg_surface.resize");
+ MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource);
+ MetaWaylandSurfaceExtension *xdg_surface = wl_resource_get_user_data (resource);
+
+ if (seat->pointer.button_count == 0 ||
+ seat->pointer.grab_serial != serial ||
+ seat->pointer.focus != xdg_surface->surface)
+ return;
+
+ begin_grab_op_on_surface (xdg_surface->surface, seat, grab_op_for_edge (edges));
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]