diff options
Diffstat (limited to 'sway')
-rw-r--r-- | sway/config.c | 21 | ||||
-rw-r--r-- | sway/debug-tree.c | 2 | ||||
-rw-r--r-- | sway/desktop/render.c | 90 | ||||
-rw-r--r-- | sway/tree/container.c | 10 | ||||
-rw-r--r-- | sway/tree/view.c | 3 |
5 files changed, 92 insertions, 34 deletions
diff --git a/sway/config.c b/sway/config.c index 89701640..6ff4da03 100644 --- a/sway/config.c +++ b/sway/config.c @@ -807,22 +807,31 @@ int workspace_output_cmp_workspace(const void *a, const void *b) { return lenient_strcmp(wsa->workspace, wsb->workspace); } -static void find_font_height_iterator(struct sway_container *container, - void *data) { +static void find_font_height_iterator(struct sway_container *con, void *data) { + size_t amount_below_baseline = con->title_height - con->title_baseline; + size_t extended_height = config->font_baseline + amount_below_baseline; + if (extended_height > config->font_height) { + config->font_height = extended_height; + } +} + +static void find_baseline_iterator(struct sway_container *con, void *data) { bool *recalculate = data; if (*recalculate) { - container_calculate_title_height(container); + container_calculate_title_height(con); } - if (container->title_height > config->font_height) { - config->font_height = container->title_height; + if (con->title_baseline > config->font_baseline) { + config->font_baseline = con->title_baseline; } } void config_update_font_height(bool recalculate) { size_t prev_max_height = config->font_height; config->font_height = 0; + config->font_baseline = 0; - root_for_each_container(find_font_height_iterator, &recalculate); + root_for_each_container(find_baseline_iterator, &recalculate); + root_for_each_container(find_font_height_iterator, NULL); if (config->font_height != prev_max_height) { arrange_root(); diff --git a/sway/debug-tree.c b/sway/debug-tree.c index 973c6d88..9644f4e5 100644 --- a/sway/debug-tree.c +++ b/sway/debug-tree.c @@ -84,7 +84,7 @@ static int draw_node(cairo_t *cairo, struct sway_node *node, struct sway_node *focus, int x, int y) { int text_width, text_height; char *buffer = get_string(node); - get_text_size(cairo, "monospace", &text_width, &text_height, + get_text_size(cairo, "monospace", &text_width, &text_height, NULL, 1, false, buffer); cairo_save(cairo); cairo_rectangle(cairo, x + 2, y, text_width - 2, text_height); diff --git a/sway/desktop/render.c b/sway/desktop/render.c index d72d72bf..8a6f63aa 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c @@ -146,6 +146,8 @@ static void render_drag_icons(struct sway_output *output, render_surface_iterator, &data); } +// _box.x and .y are expected to be layout-local +// _box.width and .height are expected to be output-buffer-local static void render_rect(struct wlr_output *wlr_output, pixman_region32_t *output_damage, const struct wlr_box *_box, float color[static 4]) { @@ -404,9 +406,20 @@ static void render_titlebar(struct sway_output *output, struct wlr_box texture_box; wlr_texture_get_size(marks_texture, &texture_box.width, &texture_box.height); + marks_ob_width = texture_box.width; + + // The marks texture might be shorter than the config->font_height, in + // which case we need to pad it as evenly as possible above and below. + int ob_padding_total = config->font_height * output_scale - + texture_box.height; + int ob_padding_above = floor(ob_padding_total / 2); + int ob_padding_below = ceil(ob_padding_total / 2); + + // Render texture texture_box.x = (x - output_x + width - TITLEBAR_H_PADDING) * output_scale - texture_box.width; - texture_box.y = (y - output_y + TITLEBAR_V_PADDING) * output_scale; + texture_box.y = (y - output_y + TITLEBAR_V_PADDING) * output_scale + + ob_padding_above; float matrix[9]; wlr_matrix_project_box(matrix, &texture_box, @@ -418,17 +431,29 @@ static void render_titlebar(struct sway_output *output, } render_texture(output->wlr_output, output_damage, marks_texture, &texture_box, matrix, con->alpha); - marks_ob_width = texture_box.width; - // Gap between the marks and bottom padding, for when the marks texture - // height is smaller than the config's font height - memcpy(&color, colors->background, sizeof(float) * 4); - premultiply_alpha(color, con->alpha); - box.x = texture_box.x; - box.y = texture_box.y + texture_box.height; - box.width = texture_box.width; - box.height = config->font_height * output_scale - texture_box.height; - if (box.height > 0) { + // Padding above + if (ob_padding_above > 0) { + memcpy(&color, colors->background, sizeof(float) * 4); + premultiply_alpha(color, con->alpha); + box.x = (x + width - TITLEBAR_H_PADDING) * output_scale - + texture_box.width; + box.y = (y + TITLEBAR_V_PADDING) * output_scale; + box.width = texture_box.width; + box.height = ob_padding_above; + render_rect(output->wlr_output, output_damage, &box, color); + } + + // Padding below + if (ob_padding_below > 0) { + memcpy(&color, colors->background, sizeof(float) * 4); + premultiply_alpha(color, con->alpha); + box.x = (x + width - TITLEBAR_H_PADDING) * output_scale - + texture_box.width; + box.y = (y + TITLEBAR_V_PADDING) * output_scale + + ob_padding_above + texture_box.height; + box.width = texture_box.width; + box.height = ob_padding_below; render_rect(output->wlr_output, output_damage, &box, color); } } @@ -439,8 +464,19 @@ static void render_titlebar(struct sway_output *output, struct wlr_box texture_box; wlr_texture_get_size(title_texture, &texture_box.width, &texture_box.height); + title_ob_width = texture_box.width; + + // The title texture might be shorter than the config->font_height, + // in which case we need to pad it above and below. + int ob_padding_above = (config->font_baseline - con->title_baseline) + * output_scale; + int ob_padding_below = (config->font_height - con->title_height) + * output_scale - ob_padding_above; + + // Render texture texture_box.x = (x - output_x + TITLEBAR_H_PADDING) * output_scale; - texture_box.y = (y - output_y + TITLEBAR_V_PADDING) * output_scale; + texture_box.y = (y - output_y + TITLEBAR_V_PADDING) * output_scale + + ob_padding_above; float matrix[9]; wlr_matrix_project_box(matrix, &texture_box, @@ -452,17 +488,27 @@ static void render_titlebar(struct sway_output *output, } render_texture(output->wlr_output, output_damage, title_texture, &texture_box, matrix, con->alpha); - title_ob_width = texture_box.width; - // Gap between the title and bottom padding, for when the title texture - // height is smaller than the config's font height - memcpy(&color, colors->background, sizeof(float) * 4); - premultiply_alpha(color, con->alpha); - box.x = texture_box.x; - box.y = texture_box.y + texture_box.height; - box.width = texture_box.width; - box.height = config->font_height * output_scale - texture_box.height; - if (box.height > 0) { + // Padding above + if (ob_padding_above > 0) { + memcpy(&color, colors->background, sizeof(float) * 4); + premultiply_alpha(color, con->alpha); + box.x = (x + TITLEBAR_H_PADDING) * output_scale; + box.y = (y + TITLEBAR_V_PADDING) * output_scale; + box.width = texture_box.width; + box.height = ob_padding_above; + render_rect(output->wlr_output, output_damage, &box, color); + } + + // Padding below + if (ob_padding_below > 0) { + memcpy(&color, colors->background, sizeof(float) * 4); + premultiply_alpha(color, con->alpha); + box.x = (x + TITLEBAR_H_PADDING) * output_scale; + box.y = (y + TITLEBAR_V_PADDING) * output_scale + + ob_padding_above + texture_box.height; + box.width = texture_box.width; + box.height = ob_padding_below; render_rect(output->wlr_output, output_damage, &box, color); } } diff --git a/sway/tree/container.c b/sway/tree/container.c index cbbb1f56..ccd79f0e 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -455,8 +455,8 @@ static void update_title_texture(struct sway_container *con, int height = con->title_height * scale; cairo_t *c = cairo_create(NULL); - get_text_size(c, config->font, &width, NULL, scale, config->pango_markup, - "%s", con->formatted_title); + get_text_size(c, config->font, &width, NULL, NULL, scale, + config->pango_markup, "%s", con->formatted_title); cairo_destroy(c); cairo_surface_t *surface = cairo_image_surface_create( @@ -505,10 +505,12 @@ void container_calculate_title_height(struct sway_container *container) { } cairo_t *cairo = cairo_create(NULL); int height; - get_text_size(cairo, config->font, NULL, &height, 1, config->pango_markup, - "%s", container->formatted_title); + int baseline; + get_text_size(cairo, config->font, NULL, &height, &baseline, 1, + config->pango_markup, "%s", container->formatted_title); cairo_destroy(cairo); container->title_height = height; + container->title_baseline = baseline; } /** diff --git a/sway/tree/view.c b/sway/tree/view.c index 312c62d1..53215b40 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -935,7 +935,8 @@ static void update_marks_texture(struct sway_view *view, int height = view->container->title_height * scale; cairo_t *c = cairo_create(NULL); - get_text_size(c, config->font, &width, NULL, scale, false, "%s", buffer); + get_text_size(c, config->font, &width, NULL, NULL, scale, false, + "%s", buffer); cairo_destroy(c); cairo_surface_t *surface = cairo_image_surface_create( |