xdg-shell: Add set_margin request
This is used to figure out the size of "invisible" decorations, which we'll use to better know the visible extents of the surface, which we can use for constraining, titlebars, and more.
This commit is contained in:
parent
2097fe12d4
commit
7407345446
@ -3937,6 +3937,27 @@ window_sync_transient_for(struct window *window)
|
||||
xdg_surface_set_transient_for(window->xdg_surface, parent_surface);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@ -3953,6 +3974,7 @@ window_flush(struct window *window)
|
||||
&xdg_surface_listener, window);
|
||||
|
||||
window_sync_transient_for(window);
|
||||
window_sync_margin(window);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3171,6 +3171,18 @@ xdg_surface_pong(struct wl_client *client,
|
||||
surface_pong(shsurf, serial);
|
||||
}
|
||||
|
||||
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,
|
||||
@ -3309,6 +3321,7 @@ xdg_surface_unset_maximized(struct wl_client *client,
|
||||
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,
|
||||
|
@ -124,6 +124,32 @@
|
||||
<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.
|
||||
|
@ -165,6 +165,9 @@ void
|
||||
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);
|
||||
|
||||
|
@ -578,6 +578,14 @@ frame_opaque_rect(struct frame *frame, int32_t *x, int32_t *y,
|
||||
*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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user