diff options
Diffstat (limited to 'sway/layout.c')
-rw-r--r-- | sway/layout.c | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/sway/layout.c b/sway/layout.c index b1139b1b..344ca647 100644 --- a/sway/layout.c +++ b/sway/layout.c | |||
@@ -374,25 +374,50 @@ void move_workspace_to(swayc_t* workspace, swayc_t* destination) { | |||
374 | update_visibility(src_op); | 374 | update_visibility(src_op); |
375 | } | 375 | } |
376 | 376 | ||
377 | static void adjust_border_geometry(swayc_t *c, struct wlc_geometry *g, | ||
378 | const struct wlc_size *res, int left, int right, int top, int bottom) { | ||
379 | |||
380 | g->size.w += left + right; | ||
381 | if (g->origin.x - left < 0) { | ||
382 | g->size.w += g->origin.x - left; | ||
383 | } | ||
384 | else if (g->origin.x + g->size.w - right > res->w) { | ||
385 | g->size.w = res->w - g->origin.x + right; | ||
386 | } | ||
387 | |||
388 | g->size.h += top + bottom; | ||
389 | if (g->origin.y - top < 0) { | ||
390 | g->size.h += g->origin.y - top; | ||
391 | } | ||
392 | else if (g->origin.y + g->size.h - top > res->h) { | ||
393 | g->size.h = res->h - g->origin.y + top; | ||
394 | } | ||
395 | |||
396 | g->origin.x = MIN(MAX( g->origin.x - left, 0), res->w); | ||
397 | g->origin.y = MIN(MAX( g->origin.y - top, 0), res->h); | ||
398 | |||
399 | } | ||
400 | |||
377 | static void update_border_geometry_floating(swayc_t *c, struct wlc_geometry *geometry) { | 401 | static void update_border_geometry_floating(swayc_t *c, struct wlc_geometry *geometry) { |
378 | struct wlc_geometry g = *geometry; | 402 | struct wlc_geometry g = *geometry; |
379 | c->actual_geometry = g; | 403 | c->actual_geometry = g; |
404 | |||
405 | swayc_t *output = swayc_parent_by_type(c, C_OUTPUT); | ||
406 | const struct wlc_size *res = wlc_output_get_resolution(output->handle); | ||
380 | 407 | ||
381 | switch (c->border_type) { | 408 | switch (c->border_type) { |
382 | case B_NONE: | 409 | case B_NONE: |
383 | break; | 410 | break; |
384 | case B_PIXEL: | 411 | case B_PIXEL: |
385 | g.origin.x -= c->border_thickness; | 412 | adjust_border_geometry(c, &g, res, c->border_thickness, |
386 | g.origin.y -= c->border_thickness; | 413 | c->border_thickness, c->border_thickness, c->border_thickness); |
387 | g.size.w += (c->border_thickness * 2); | ||
388 | g.size.h += (c->border_thickness * 2); | ||
389 | break; | 414 | break; |
390 | case B_NORMAL: | 415 | case B_NORMAL: |
391 | g.origin.x -= c->border_thickness; | 416 | { |
392 | uint32_t title_bar_height = config->font_height + 4; // borders + padding | 417 | int title_bar_height = config->font_height + 4; // borders + padding |
393 | g.origin.y -= title_bar_height; | 418 | |
394 | g.size.w += (c->border_thickness * 2); | 419 | adjust_border_geometry(c, &g, res, c->border_thickness, |
395 | g.size.h += (c->border_thickness + title_bar_height); | 420 | c->border_thickness, title_bar_height, c->border_thickness); |
396 | 421 | ||
397 | struct wlc_geometry title_bar = { | 422 | struct wlc_geometry title_bar = { |
398 | .origin = { | 423 | .origin = { |
@@ -407,6 +432,7 @@ static void update_border_geometry_floating(swayc_t *c, struct wlc_geometry *geo | |||
407 | c->title_bar_geometry = title_bar; | 432 | c->title_bar_geometry = title_bar; |
408 | break; | 433 | break; |
409 | } | 434 | } |
435 | } | ||
410 | 436 | ||
411 | c->border_geometry = g; | 437 | c->border_geometry = g; |
412 | *geometry = c->actual_geometry; | 438 | *geometry = c->actual_geometry; |