wayland: Replace set_margin with set_window_geometry

This commit is contained in:
Jasper St. Pierre 2014-07-17 14:07:38 -04:00
parent 826751429b
commit 692eb4d957
3 changed files with 73 additions and 53 deletions

View File

@ -209,16 +209,40 @@ toplevel_surface_commit (MetaWaylandSurface *surface,
return; return;
} }
if (pending->frame_extents_changed)
meta_window_set_custom_frame_extents (surface->window, &pending->frame_extents);
/* We resize X based surfaces according to X events */ /* We resize X based surfaces according to X events */
if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND) if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND)
{ {
MetaRectangle geom; MetaRectangle geom;
calculate_surface_window_geometry (surface, &geom, 0, 0); if (pending->has_new_geometry)
meta_window_client_rect_to_frame_rect (window, &geom, &geom); {
/* If we have new geometry, use it. */
geom = pending->new_geometry;
surface->has_set_geometry = TRUE;
}
else if (!surface->has_set_geometry)
{
/* If the surface has never set any geometry, calculate
* a default one unioning the surface and all subsurfaces together. */
calculate_surface_window_geometry (surface, &geom, 0, 0);
}
else
{
/* Otherwise, keep the geometry the same. */
/* XXX: We don't store the geometry in any consistent place
* right now, so we can't re-fetch it. We should change
* meta_window_wayland_move_resize. */
/* XXX: This is the common case. Recognize it to prevent
* a warning. */
if (pending->dx == 0 && pending->dy == 0)
return;
g_warning ("XXX: Attach-initiated move without a new geometry. This is unimplemented right now.");
return;
}
meta_window_wayland_move_resize (window, geom, pending->dx, pending->dy); meta_window_wayland_move_resize (window, geom, pending->dx, pending->dy);
} }
} }
@ -247,7 +271,7 @@ pending_state_init (MetaWaylandPendingState *state)
state->buffer_destroy_listener.notify = surface_handle_pending_buffer_destroy; state->buffer_destroy_listener.notify = surface_handle_pending_buffer_destroy;
wl_list_init (&state->frame_callback_list); wl_list_init (&state->frame_callback_list);
state->frame_extents_changed = FALSE; state->has_new_geometry = FALSE;
} }
static void static void
@ -756,23 +780,6 @@ xdg_surface_set_parent (struct wl_client *client,
meta_window_set_transient_for (surface->window, transient_for); meta_window_set_transient_for (surface->window, transient_for);
} }
static void
xdg_surface_set_margin (struct wl_client *client,
struct wl_resource *resource,
int32_t left_margin,
int32_t right_margin,
int32_t top_margin,
int32_t bottom_margin)
{
MetaWaylandSurface *surface = wl_resource_get_user_data (resource);
surface->pending.frame_extents_changed = TRUE;
surface->pending.frame_extents.left = left_margin;
surface->pending.frame_extents.right = right_margin;
surface->pending.frame_extents.top = top_margin;
surface->pending.frame_extents.bottom = bottom_margin;
}
static void static void
xdg_surface_set_title (struct wl_client *client, xdg_surface_set_title (struct wl_client *client,
struct wl_resource *resource, struct wl_resource *resource,
@ -903,6 +910,20 @@ xdg_surface_ack_configure (struct wl_client *client,
* client gets the new state. */ * client gets the new state. */
} }
static void
xdg_surface_set_window_geometry (struct wl_client *client,
struct wl_resource *resource,
int32_t x, int32_t y, int32_t width, int32_t height)
{
MetaWaylandSurface *surface = wl_resource_get_user_data (resource);
surface->pending.has_new_geometry = TRUE;
surface->pending.new_geometry.x = x;
surface->pending.new_geometry.y = y;
surface->pending.new_geometry.width = width;
surface->pending.new_geometry.height = height;
}
static void static void
xdg_surface_set_maximized (struct wl_client *client, xdg_surface_set_maximized (struct wl_client *client,
struct wl_resource *resource) struct wl_resource *resource)
@ -947,13 +968,13 @@ xdg_surface_set_minimized (struct wl_client *client,
static const struct xdg_surface_interface meta_wayland_xdg_surface_interface = { static const struct xdg_surface_interface meta_wayland_xdg_surface_interface = {
xdg_surface_destroy, xdg_surface_destroy,
xdg_surface_set_parent, xdg_surface_set_parent,
xdg_surface_set_margin,
xdg_surface_set_title, xdg_surface_set_title,
xdg_surface_set_app_id, xdg_surface_set_app_id,
xdg_surface_show_window_menu, xdg_surface_show_window_menu,
xdg_surface_move, xdg_surface_move,
xdg_surface_resize, xdg_surface_resize,
xdg_surface_ack_configure, xdg_surface_ack_configure,
xdg_surface_set_window_geometry,
xdg_surface_set_maximized, xdg_surface_set_maximized,
xdg_surface_unset_maximized, xdg_surface_unset_maximized,
xdg_surface_set_fullscreen, xdg_surface_set_fullscreen,

View File

@ -61,8 +61,8 @@ typedef struct
/* wl_surface.frame */ /* wl_surface.frame */
struct wl_list frame_callback_list; struct wl_list frame_callback_list;
gboolean frame_extents_changed; MetaRectangle new_geometry;
GtkBorder frame_extents; gboolean has_new_geometry;
} MetaWaylandPendingState; } MetaWaylandPendingState;
typedef struct typedef struct
@ -109,6 +109,8 @@ struct _MetaWaylandSurface
GSList *pending_placement_ops; GSList *pending_placement_ops;
} sub; } sub;
gboolean has_set_geometry;
/* All the pending state that wl_surface.commit will apply. */ /* All the pending state that wl_surface.commit will apply. */
MetaWaylandPendingState pending; MetaWaylandPendingState pending;
}; };

View File

@ -146,32 +146,6 @@
<arg name="parent" type="object" interface="wl_surface" allow-null="true"/> <arg name="parent" type="object" interface="wl_surface" allow-null="true"/>
</request> </request>
<request name="set_margin">
<description summary="set the visible frame boundaries">
This tells the compositor what the visible size of the window
should be, so it can use it to determine what borders to use for
constrainment and alignment.
CSD often has invisible areas for decoration purposes, like drop
shadows. These "shadow" drawings need to be subtracted out of the
normal boundaries of the window when computing where to place
windows (e.g. to set this window so it's centered on top of another,
or to put it to the left or right of the screen.)
This value should change as little as possible at runtime, to
prevent flicker.
This value is also ignored when the window is maximized or
fullscreen, and assumed to be 0.
If never called, this value is assumed to be 0.
</description>
<arg name="left_margin" type="int"/>
<arg name="right_margin" type="int"/>
<arg name="top_margin" type="int"/>
<arg name="bottom_margin" type="int"/>
</request>
<request name="set_title"> <request name="set_title">
<description summary="set surface title"> <description summary="set surface title">
Set a short title for the surface. Set a short title for the surface.
@ -308,7 +282,7 @@
The configure event asks the client to resize its surface. The configure event asks the client to resize its surface.
The width and height arguments specify a hint to the window The width and height arguments specify a hint to the window
about how its surface should be resized in surface local about how its surface should be resized in window geometry
coordinates. The states listed in the event specify how the coordinates. The states listed in the event specify how the
width/height arguments should be interpreted. width/height arguments should be interpreted.
@ -339,6 +313,29 @@
<arg name="serial" type="uint" summary="a serial to configure for"/> <arg name="serial" type="uint" summary="a serial to configure for"/>
</request> </request>
<request name="set_window_geometry">
<description summary="set the new window geometry">
The window geometry of a window is its "visible bounds" from the
user's perspective. Client-side decorations often have invisible
portions like drop-shadows which should be ignored for the
purposes of aligning, placing and constraining windows.
The default value is the full bounds of the surface, including any
subsurfaces. Once the window geometry of the surface is set once,
it is not possible to unset it, and it will remain the same until
set_window_geometry is called again, even if a new subsurface or
buffer is attached.
If responding to a configure event, the window geometry in here
must respect the sizing negotiations specified by the states in
the configure event.
</description>
<arg name="x" type="int"/>
<arg name="y" type="int"/>
<arg name="width" type="int"/>
<arg name="height" type="int"/>
</request>
<request name="set_maximized" /> <request name="set_maximized" />
<request name="unset_maximized" /> <request name="unset_maximized" />