From f53c7341152bbc4b642935953e317a2a29abc99c Mon Sep 17 00:00:00 2001 From: Leon Henrik Plickat Date: Fri, 25 Sep 2020 11:19:32 +0200 Subject: Change dimension model to ensure square center --- src/surface.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 14 deletions(-) (limited to 'src/surface.c') diff --git a/src/surface.c b/src/surface.c index 243a23d..19bd2d7 100644 --- a/src/surface.c +++ b/src/surface.c @@ -20,22 +20,28 @@ #include"buffer.h" #include"render.h" -static uint32_t min (uint32_t a, uint32_t b) -{ - return a > b ? b : a; -} - static void layer_surface_handle_configure (void *data, struct zwlr_layer_surface_v1 *layer_surface, uint32_t serial, uint32_t w, uint32_t h) { struct Wlclock_surface *surface = (struct Wlclock_surface *)data; - clocklog(surface->output->clock, 1, - "[surface] Layer surface configure request: global_name=%d w=%d h=%d serial=%d\n", + struct Wlclock *clock = surface->output->clock; + clocklog(clock, 1, "[surface] Layer surface configure request: global_name=%d w=%d h=%d serial=%d\n", surface->output->global_name, w, h, serial); zwlr_layer_surface_v1_ack_configure(layer_surface, serial); - if ( w > 0 && h > 0 ) /* Try to fit as best as possible. */ - surface->size = min(w, h); + if ( (w != (uint32_t)surface->dimensions.w || h != (uint32_t)surface->dimensions.h) + && (w > 0 && h > 0) ) + { + /* Try to fit into the space the compositor wants us to occupy + * while also keeping the center square and not changing the + * border sizes. + */ + int32_t size_a = (int32_t)w - clock->border_left - clock->border_right; + int32_t size_b = (int32_t)h - clock->border_top - clock->border_bottom; + surface->dimensions.center_size = size_a < size_b ? size_a : size_b; + if ( surface->dimensions.center_size < 10 ) + surface->dimensions.center_size = 10; + } surface->configured = true; update_surface(surface); } @@ -56,9 +62,38 @@ const struct zwlr_layer_surface_v1_listener layer_surface_listener = { static int32_t get_exclusive_zone (struct Wlclock_surface *surface) { - if ( surface->output->clock->exclusive_zone == 1 ) - return surface->size; - return surface->output->clock->exclusive_zone; + struct Wlclock *clock = surface->output->clock; + if ( clock->exclusive_zone == 1 ) switch (clock->anchor) + { + case ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM: + case ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM + | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT + | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT: + case ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP: + case ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP + | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT + | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT: + case ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT + | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT: + return surface->dimensions.h; + + case ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT: + case ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT + | ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP + | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM: + case ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT: + case ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT + | ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP + | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM: + case ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP + | ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM: + return surface->dimensions.w; + + default: + return 0; + } + else + return surface->output->clock->exclusive_zone; } static void configure_layer_surface (struct Wlclock_surface *surface) @@ -67,7 +102,7 @@ static void configure_layer_surface (struct Wlclock_surface *surface) clocklog(clock, 1, "[surface] Configuring surface: global_name=%d\n", surface->output->global_name); zwlr_layer_surface_v1_set_size(surface->layer_surface, - surface->size, surface->size); + surface->dimensions.w, surface->dimensions.h); zwlr_layer_surface_v1_set_anchor(surface->layer_surface, clock->anchor); zwlr_layer_surface_v1_set_margin(surface->layer_surface, clock->margin_top, clock->margin_right, @@ -95,7 +130,7 @@ bool create_surface (struct Wlclock_output *output) } output->surface = surface; - surface->size = clock->size; + surface->dimensions = clock->dimensions; surface->output = output; surface->surface = NULL; surface->layer_surface = NULL; -- cgit v1.2.3