diff options
author | crondog <crondog@gmail.com> | 2016-04-02 14:49:13 +1100 |
---|---|---|
committer | crondog <crondog@gmail.com> | 2016-04-03 10:37:16 +1000 |
commit | b02be709cd92b23a78383700250df3c9907fddfe (patch) | |
tree | fdeb7546cffecab83d35cd4fdd621b1236e600aa | |
parent | Merge pull request #562 from fluxchief/border-endian (diff) | |
download | sway-b02be709cd92b23a78383700250df3c9907fddfe.tar.gz sway-b02be709cd92b23a78383700250df3c9907fddfe.tar.zst sway-b02be709cd92b23a78383700250df3c9907fddfe.zip |
Fix window borders
This fixes floating borders when moving outside of the output. Not sure what
happens with dual screen as I only have 1 monitor
-rw-r--r-- | sway/border.c | 11 | ||||
-rw-r--r-- | sway/layout.c | 44 |
2 files changed, 42 insertions, 13 deletions
diff --git a/sway/border.c b/sway/border.c index acabc8e0..00a4b1fb 100644 --- a/sway/border.c +++ b/sway/border.c | |||
@@ -139,23 +139,26 @@ static void render_borders(swayc_t *view, cairo_t *cr, struct border_colors *col | |||
139 | static void render_with_title_bar(swayc_t *view, cairo_t *cr, struct border_colors *colors) { | 139 | static void render_with_title_bar(swayc_t *view, cairo_t *cr, struct border_colors *colors) { |
140 | struct wlc_geometry *tb = &view->title_bar_geometry; | 140 | struct wlc_geometry *tb = &view->title_bar_geometry; |
141 | struct wlc_geometry *b = &view->border_geometry; | 141 | struct wlc_geometry *b = &view->border_geometry; |
142 | int title_y = MIN(view->actual_geometry.origin.y - (int)tb->size.h, 0); | ||
142 | 143 | ||
143 | // borders | 144 | // borders |
144 | render_borders(view, cr, colors); | 145 | render_borders(view, cr, colors); |
145 | 146 | ||
146 | // title bar background | 147 | // title bar background |
147 | cairo_set_source_u32(cr, colors->child_border); | 148 | cairo_set_source_u32(cr, colors->child_border); |
148 | cairo_rectangle(cr, 0, 0, tb->size.w, tb->size.h); | 149 | cairo_rectangle(cr, 0, title_y, tb->size.w, tb->size.h); |
149 | cairo_fill(cr); | 150 | cairo_fill(cr); |
150 | 151 | ||
151 | // header top line | 152 | // header top line |
152 | render_sharp_line(cr, colors->border, 0, 0, tb->size.w, 1); | 153 | render_sharp_line(cr, colors->border, 0, title_y, tb->size.w, 1); |
153 | 154 | ||
154 | // text | 155 | // text |
155 | if (view->name) { | 156 | if (view->name) { |
156 | int width, height; | 157 | int width, height; |
157 | get_text_size(cr, config->font, &width, &height, "%s", view->name); | 158 | get_text_size(cr, config->font, &width, &height, "%s", view->name); |
158 | cairo_move_to(cr, view->border_thickness, 2); | 159 | int x = MIN(view->actual_geometry.origin.x, view->border_thickness); |
160 | int y = MIN(view->actual_geometry.origin.y - height - 2, 2); | ||
161 | cairo_move_to(cr, x, y); | ||
159 | cairo_set_source_u32(cr, colors->text); | 162 | cairo_set_source_u32(cr, colors->text); |
160 | pango_printf(cr, config->font, "%s", view->name); | 163 | pango_printf(cr, config->font, "%s", view->name); |
161 | } | 164 | } |
@@ -163,7 +166,7 @@ static void render_with_title_bar(swayc_t *view, cairo_t *cr, struct border_colo | |||
163 | // header bottom line | 166 | // header bottom line |
164 | render_sharp_line(cr, colors->border, | 167 | render_sharp_line(cr, colors->border, |
165 | view->actual_geometry.origin.x - b->origin.x, | 168 | view->actual_geometry.origin.x - b->origin.x, |
166 | tb->size.h - 1, | 169 | title_y + tb->size.h - 1, |
167 | view->actual_geometry.size.w, 1); | 170 | view->actual_geometry.size.w, 1); |
168 | } | 171 | } |
169 | 172 | ||
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; |