diff options
-rw-r--r-- | sway/border.c | 13 | ||||
-rw-r--r-- | sway/commands.c | 80 | ||||
-rw-r--r-- | sway/layout.c | 44 |
3 files changed, 122 insertions, 15 deletions
diff --git a/sway/border.c b/sway/border.c index acabc8e0..6343ddd0 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->background); |
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/commands.c b/sway/commands.c index c1009f85..b7c1a344 100644 --- a/sway/commands.c +++ b/sway/commands.c | |||
@@ -45,6 +45,12 @@ static sway_cmd cmd_bar; | |||
45 | static sway_cmd cmd_bindcode; | 45 | static sway_cmd cmd_bindcode; |
46 | static sway_cmd cmd_bindsym; | 46 | static sway_cmd cmd_bindsym; |
47 | static sway_cmd cmd_border; | 47 | static sway_cmd cmd_border; |
48 | static sway_cmd cmd_client_focused; | ||
49 | static sway_cmd cmd_client_focused_inactive; | ||
50 | static sway_cmd cmd_client_unfocused; | ||
51 | static sway_cmd cmd_client_urgent; | ||
52 | static sway_cmd cmd_client_placeholder; | ||
53 | static sway_cmd cmd_client_background; | ||
48 | static sway_cmd cmd_debuglog; | 54 | static sway_cmd cmd_debuglog; |
49 | static sway_cmd cmd_exec; | 55 | static sway_cmd cmd_exec; |
50 | static sway_cmd cmd_exec_always; | 56 | static sway_cmd cmd_exec_always; |
@@ -113,6 +119,8 @@ static sway_cmd bar_colors_cmd_separator; | |||
113 | static sway_cmd bar_colors_cmd_statusline; | 119 | static sway_cmd bar_colors_cmd_statusline; |
114 | static sway_cmd bar_colors_cmd_urgent_workspace; | 120 | static sway_cmd bar_colors_cmd_urgent_workspace; |
115 | 121 | ||
122 | static struct cmd_results *add_color(const char*, char*, const char*); | ||
123 | |||
116 | swayc_t *sp_view; | 124 | swayc_t *sp_view; |
117 | int sp_index = 0; | 125 | int sp_index = 0; |
118 | 126 | ||
@@ -408,6 +416,71 @@ static struct cmd_results *cmd_border(int argc, char **argv) { | |||
408 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 416 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
409 | } | 417 | } |
410 | 418 | ||
419 | static struct cmd_results *parse_border_color(struct border_colors *border_colors, const char *cmd_name, int argc, char **argv) { | ||
420 | struct cmd_results *error = NULL; | ||
421 | if (argc != 5) { | ||
422 | return cmd_results_new(CMD_INVALID, cmd_name, "Requires exact 5 color values"); | ||
423 | } | ||
424 | |||
425 | uint32_t colors[5]; | ||
426 | int i; | ||
427 | for (i = 0; i < 5; i++) { | ||
428 | char buffer[10]; | ||
429 | error = add_color(cmd_name, buffer, argv[i]); | ||
430 | if (error) { | ||
431 | return error; | ||
432 | } | ||
433 | colors[i] = strtoul(buffer+1, NULL, 16); | ||
434 | } | ||
435 | |||
436 | border_colors->border = colors[0]; | ||
437 | border_colors->background = colors[1]; | ||
438 | border_colors->text = colors[2]; | ||
439 | border_colors->indicator = colors[3]; | ||
440 | border_colors->child_border = colors[4]; | ||
441 | |||
442 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | ||
443 | } | ||
444 | |||
445 | static struct cmd_results *cmd_client_focused(int argc, char **argv) { | ||
446 | return parse_border_color(&config->border_colors.focused, "client.focused", argc, argv); | ||
447 | } | ||
448 | |||
449 | static struct cmd_results *cmd_client_focused_inactive(int argc, char **argv) { | ||
450 | return parse_border_color(&config->border_colors.focused_inactive, "client.focused_inactive", argc, argv); | ||
451 | } | ||
452 | |||
453 | static struct cmd_results *cmd_client_unfocused(int argc, char **argv) { | ||
454 | return parse_border_color(&config->border_colors.unfocused, "client.unfocused", argc, argv); | ||
455 | } | ||
456 | |||
457 | static struct cmd_results *cmd_client_urgent(int argc, char **argv) { | ||
458 | return parse_border_color(&config->border_colors.urgent, "client.urgent", argc, argv); | ||
459 | } | ||
460 | |||
461 | static struct cmd_results *cmd_client_placeholder(int argc, char **argv) { | ||
462 | return parse_border_color(&config->border_colors.placeholder, "client.placeholder", argc, argv); | ||
463 | } | ||
464 | |||
465 | static struct cmd_results *cmd_client_background(int argc, char **argv) { | ||
466 | char buffer[10]; | ||
467 | struct cmd_results *error = NULL; | ||
468 | uint32_t background; | ||
469 | |||
470 | if (argc != 1) { | ||
471 | return cmd_results_new(CMD_INVALID, "client.background", "Expect exact 1 value"); | ||
472 | } | ||
473 | |||
474 | error = add_color("client.background", buffer, argv[0]); | ||
475 | if (error) { | ||
476 | return error; | ||
477 | } | ||
478 | |||
479 | background = strtoul(buffer+1, NULL, 16); | ||
480 | config->border_colors.background = background; | ||
481 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | ||
482 | } | ||
483 | |||
411 | static struct cmd_results *cmd_exec_always(int argc, char **argv) { | 484 | static struct cmd_results *cmd_exec_always(int argc, char **argv) { |
412 | struct cmd_results *error = NULL; | 485 | struct cmd_results *error = NULL; |
413 | if (!config->active) return cmd_results_new(CMD_DEFER, NULL, NULL); | 486 | if (!config->active) return cmd_results_new(CMD_DEFER, NULL, NULL); |
@@ -2211,6 +2284,12 @@ static struct cmd_handler handlers[] = { | |||
2211 | { "bindcode", cmd_bindcode }, | 2284 | { "bindcode", cmd_bindcode }, |
2212 | { "bindsym", cmd_bindsym }, | 2285 | { "bindsym", cmd_bindsym }, |
2213 | { "border", cmd_border }, | 2286 | { "border", cmd_border }, |
2287 | { "client.background", cmd_client_background }, | ||
2288 | { "client.focused", cmd_client_focused }, | ||
2289 | { "client.focused_inactive", cmd_client_focused_inactive }, | ||
2290 | { "client.placeholder", cmd_client_placeholder }, | ||
2291 | { "client.unfocused", cmd_client_unfocused }, | ||
2292 | { "client.urgent", cmd_client_urgent }, | ||
2214 | { "debuglog", cmd_debuglog }, | 2293 | { "debuglog", cmd_debuglog }, |
2215 | { "default_orientation", cmd_orientation }, | 2294 | { "default_orientation", cmd_orientation }, |
2216 | { "exec", cmd_exec }, | 2295 | { "exec", cmd_exec }, |
@@ -2821,7 +2900,6 @@ static struct cmd_results *add_color(const char *name, char *buffer, const char | |||
2821 | buffer[7] = 'f'; | 2900 | buffer[7] = 'f'; |
2822 | buffer[8] = 'f'; | 2901 | buffer[8] = 'f'; |
2823 | } | 2902 | } |
2824 | sway_log(L_DEBUG, "Setting %s color %s for bar: %s", name, buffer, config->current_bar->id); | ||
2825 | 2903 | ||
2826 | return NULL; | 2904 | return NULL; |
2827 | } | 2905 | } |
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; |