aboutsummaryrefslogtreecommitdiffstats
path: root/sway/tree/view.c
diff options
context:
space:
mode:
authorLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2019-01-28 16:00:34 +1000
committerLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-01-28 01:17:21 -0500
commit0a9ff774ad77d5c650c03c0ac3501983f3cb0d19 (patch)
tree08cb652bb05cc7003b30f93f78d62f84e965fe8f /sway/tree/view.c
parentMerge pull request #3423 from RyanDwyer/fullscreen-global (diff)
downloadsway-0a9ff774ad77d5c650c03c0ac3501983f3cb0d19.tar.gz
sway-0a9ff774ad77d5c650c03c0ac3501983f3cb0d19.tar.zst
sway-0a9ff774ad77d5c650c03c0ac3501983f3cb0d19.zip
Center surface inside container when it's too small
The goal here is to center fullscreen views when they are both too small for the output and refuse to resize to the output's dimensions. It has the side effect of also centering the view when it's too small for its container. Example clients that have this behaviour are emersion's hello-wayland and weston. It works by introducing surface_{x,y,width,height} properties to the container struct. The x and y represent layout-local coordinates where the surface will be rendered. The width and height are only used to track the surface's previous dimensions so we can detect when the client has resized it and recenter and apply damage accordingly. The new surface properties are calculated when a transaction is applied, as well as when a view resizes itself unexpectedly. The latter is done in view_update_size. This function was previously restricted to views which are floating, but can now be called for any views. For views which refuse to resize *smaller* than a particular size, such as gnome-calculator, the surface is still anchored to the top left as per the current behaviour.
Diffstat (limited to 'sway/tree/view.c')
-rw-r--r--sway/tree/view.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/sway/tree/view.c b/sway/tree/view.c
index 561c6ef1..9ccb2a31 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -673,15 +673,22 @@ void view_unmap(struct sway_view *view) {
673} 673}
674 674
675void view_update_size(struct sway_view *view, int width, int height) { 675void view_update_size(struct sway_view *view, int width, int height) {
676 if (!sway_assert(container_is_floating(view->container), 676 struct sway_container *con = view->container;
677 "Expected a floating container")) { 677
678 return; 678 if (container_is_floating(con)) {
679 con->content_width = width;
680 con->content_height = height;
681 con->current.content_width = width;
682 con->current.content_height = height;
683 container_set_geometry_from_content(con);
684 } else {
685 con->surface_x = con->content_x + (con->content_width - width) / 2;
686 con->surface_y = con->content_y + (con->content_height - height) / 2;
687 con->surface_x = fmax(con->surface_x, con->content_x);
688 con->surface_y = fmax(con->surface_y, con->content_y);
679 } 689 }
680 view->container->content_width = width; 690 con->surface_width = width;
681 view->container->content_height = height; 691 con->surface_width = height;
682 view->container->current.content_width = width;
683 view->container->current.content_height = height;
684 container_set_geometry_from_content(view->container);
685} 692}
686 693
687static const struct sway_view_child_impl subsurface_impl; 694static const struct sway_view_child_impl subsurface_impl;