}
static void
+window_sync_margin(struct window *window)
+{
+ int margin;
+
+ if (!window->xdg_surface)
+ return;
+
+ if (!window->frame)
+ return;
+
+ margin = frame_get_shadow_margin(window->frame->frame);
+
+ /* Shadow size is the same on every side. */
+ xdg_surface_set_margin(window->xdg_surface,
+ margin,
+ margin,
+ margin,
+ margin);
+}
+
+static void
window_flush(struct window *window)
{
struct surface *surface;
&xdg_surface_listener, window);
window_sync_transient_for(window);
+ window_sync_margin(window);
}
}
}
static void
+xdg_surface_set_margin(struct wl_client *client,
+ struct wl_resource *resource,
+ int32_t left,
+ int32_t right,
+ int32_t top,
+ int32_t bottom)
+{
+ /* Do nothing, Weston doesn't try to constrain or place
+ * surfaces in any special manner... */
+}
+
+static void
xdg_surface_set_app_id(struct wl_client *client,
struct wl_resource *resource,
const char *app_id)
static const struct xdg_surface_interface xdg_surface_implementation = {
xdg_surface_destroy,
xdg_surface_set_transient_for,
+ xdg_surface_set_margin,
xdg_surface_set_title,
xdg_surface_set_app_id,
xdg_surface_pong,
<arg name="parent" type="object" interface="wl_surface" allow-null="true"/>
</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">
<description summary="set surface title">
Set a short title for the surface.
frame_opaque_rect(struct frame *frame, int32_t *x, int32_t *y,
int32_t *width, int32_t *height);
+int
+frame_get_shadow_margin(struct frame *frame);
+
uint32_t
frame_status(struct frame *frame);
*height = frame->height - frame->opaque_margin * 2;
}
+int
+frame_get_shadow_margin(struct frame *frame)
+{
+ frame_refresh_geometry(frame);
+
+ return frame->shadow_margin;
+}
+
uint32_t
frame_status(struct frame *frame)
{