From 47c1b0a2bc1e14aebab39de660521fdbb6f855f2 Mon Sep 17 00:00:00 2001 From: Dudemanguy911 Date: Fri, 11 May 2018 12:57:11 -0500 Subject: [PATCH] make tabbed layout share all border toggle/thickness settings --- sway/commands/border.c | 61 +++++++++++++++++++++++---------- sway/desktop/output.c | 76 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 119 insertions(+), 18 deletions(-) diff --git a/sway/commands/border.c b/sway/commands/border.c index 1eb06a218..f2194e2b8 100644 --- a/sway/commands/border.c +++ b/sway/commands/border.c @@ -18,26 +18,53 @@ struct cmd_results *cmd_border(int argc, char **argv) { return cmd_results_new(CMD_INVALID, "border", "Only views can have borders"); } - struct sway_view *view = container->sway_view; - if (strcmp(argv[0], "none") == 0) { - view->border = B_NONE; - } else if (strcmp(argv[0], "normal") == 0) { - view->border = B_NORMAL; - } else if (strcmp(argv[0], "pixel") == 0) { - view->border = B_PIXEL; - if (argc == 2) { - view->border_thickness = atoi(argv[1]); + if (container->parent->layout != L_TABBED) { + struct sway_view *view = container->sway_view; + if (strcmp(argv[0], "none") == 0) { + view->border = B_NONE; + } else if (strcmp(argv[0], "normal") == 0) { + view->border = B_NORMAL; + } else if (strcmp(argv[0], "pixel") == 0) { + view->border = B_PIXEL; + if (argc == 2) { + view->border_thickness = atoi(argv[1]); + } + } else if (strcmp(argv[0], "toggle") == 0) { + view->border = (view->border + 1) % 3; + } else { + return cmd_results_new(CMD_INVALID, "border", + "Expected 'border ' " + "or 'border pixel '"); } - } else if (strcmp(argv[0], "toggle") == 0) { - view->border = (view->border + 1) % 3; - } else { - return cmd_results_new(CMD_INVALID, "border", - "Expected 'border ' " - "or 'border pixel '"); - } - view_autoconfigure(view); + view_autoconfigure(view); + } else { + int depth; + int num_tabs = container->parent->children->length; + + for (depth = 0; depth < num_tabs; ++depth) { + struct sway_container *child = container->parent->children->items[depth]; + if (strcmp(argv[0], "none") == 0) { + child->sway_view->border = B_NONE; + } else if (strcmp(argv[0], "normal") == 0) { + child->sway_view->border = B_NORMAL; + } else if (strcmp(argv[0], "pixel") == 0) { + child->sway_view->border = B_PIXEL; + if (argc == 2) { + child->sway_view->border_thickness = atoi(argv[1]); + } + } else if (strcmp(argv[0], "toggle") == 0) { + child->sway_view->border = (child->sway_view->border + 1) % 3; + } else { + return cmd_results_new(CMD_INVALID, "border", + "Expected 'border ' " + "or 'border pixel '"); + } + + view_autoconfigure(child->sway_view); + } + } struct sway_seat *seat = input_manager_current_seat(input_manager); if (seat->cursor) { diff --git a/sway/desktop/output.c b/sway/desktop/output.c index ac44803dc..f28ae02d9 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -571,6 +571,60 @@ static void render_container_top_tabbed_border_normal(struct sway_output *output } } +/** + * Render decorations for a tabbed view with "border pixel". + */ +static void render_container_tabbed_border_pixel(struct sway_output *output, + pixman_region32_t *output_damage, struct sway_container *con, + struct border_colors *colors, size_t depth) { + struct wlr_box box; + float color[4]; + double num_tabs = con->parent->children->length; + double tab_width = con->width / num_tabs; + + // Child border - left edge + memcpy(&color, colors->child_border, sizeof(float) * 4); + color[3] *= con->alpha; + box.x = con->x; + box.y = con->y + (con->sway_view->y - con->y); + box.width = con->sway_view->border_thickness; + box.height = con->height; + render_rect(output->wlr_output, output_damage, &box, color); + + // Child border - right edge + if (con->parent->children->length == 1 && con->parent->layout == L_HORIZ) { + memcpy(&color, colors->indicator, sizeof(float) * 4); + } else { + memcpy(&color, colors->child_border, sizeof(float) * 4); + } + color[3] *= con->alpha; + box.x = con->x + con->width - con->sway_view->border_thickness; + box.y = con->y + (con->sway_view->y - con->y); + box.width = con->sway_view->border_thickness; + box.height = con->height; + render_rect(output->wlr_output, output_damage, &box, color); + + // Child border - top edge + box.x = con->x + depth * tab_width; + box.y = con->y; + box.width = con->width / num_tabs; + box.height = con->sway_view->border_thickness; + render_rect(output->wlr_output, output_damage, &box, color); + + // Child border - bottom edge + if (con->parent->children->length == 1 && con->parent->layout == L_VERT) { + memcpy(&color, colors->indicator, sizeof(float) * 4); + } else { + memcpy(&color, colors->child_border, sizeof(float) * 4); + } + color[3] *= con->alpha; + box.x = con->x; + box.y = con->y + con->height - con->sway_view->border_thickness; + box.width = con->width; + box.height = con->sway_view->border_thickness; + render_rect(output->wlr_output, output_damage, &box, color); +} + static void render_container(struct sway_output *output, pixman_region32_t *damage, struct sway_container *con, bool parent_focused); @@ -633,6 +687,8 @@ static void render_container_tabbed(struct sway_output *output, struct border_colors *focused_colors = &config->border_colors.focused; for (int i = 0; i < con->children->length; ++i) { struct sway_container *child = con->children->items[i]; + enum sway_container_border border_type; + int border_thickness; if (child->type == C_VIEW) { struct border_colors *colors; @@ -650,9 +706,27 @@ static void render_container_tabbed(struct sway_output *output, title_texture = child->title_unfocused; } - if (child->sway_view->border != B_NONE) { + if (i == 0) { + border_type = child->sway_view->border; + border_thickness = child->sway_view->border_thickness; + } + + if (border_type == B_NORMAL) { render_container_top_tabbed_border_normal(output, damage, child, colors, title_texture, i); + child->sway_view->border = border_type; + child->sway_view->border_thickness = border_thickness; + view_autoconfigure(child->sway_view); + } else if (border_type == B_PIXEL) { + render_container_tabbed_border_pixel(output, damage, + child, colors, i); + child->sway_view->border = border_type; + child->sway_view->border_thickness = border_thickness; + view_autoconfigure(child->sway_view); + } else { + child->sway_view->border = border_type; + child->sway_view->border_thickness = border_thickness; + view_autoconfigure(child->sway_view); } } else { render_container(output, damage, child,