From 0046eed96903c745142208c40aa5f10d0b5931cb Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 7 Jul 2018 15:49:51 +1000 Subject: [PATCH] Fix titles when container titles contain UTF-8 characters The title and marks textures would have their height set from the config's computed max font height, but the textures were not regenerated when the config's max font height changed which made a gap appear. Rather than making it regenerate the title textures every time the config font height was changed, I've changed it to just make the textures the height of the title itself and fill any gap when rendering. Also, the title_width and marks_width variables have been renamed to make it more obvious that they are in output-buffer-local coordinates. Fixes #1936. --- sway/desktop/output.c | 40 ++++++++++++++++++++++++++++++++-------- sway/tree/container.c | 2 +- sway/tree/view.c | 2 +- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/sway/desktop/output.c b/sway/desktop/output.c index e5a42db0..336163ea 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -521,7 +521,7 @@ static void render_titlebar(struct sway_output *output, size_t inner_width = width - TITLEBAR_H_PADDING * 2; // Marks - size_t marks_width = 0; + size_t marks_ob_width = 0; // output-buffer-local if (config->show_marks && marks_texture) { struct wlr_box texture_box; wlr_texture_get_size(marks_texture, @@ -540,11 +540,23 @@ static void render_titlebar(struct sway_output *output, } render_texture(output->wlr_output, output_damage, marks_texture, &texture_box, matrix, con->alpha); - marks_width = texture_box.width; + 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) { + render_rect(output->wlr_output, output_damage, &box, color); + } } // Title text - size_t title_width = 0; + size_t title_ob_width = 0; // output-buffer-local if (title_texture) { struct wlr_box texture_box; wlr_texture_get_size(title_texture, @@ -557,12 +569,24 @@ static void render_titlebar(struct sway_output *output, WL_OUTPUT_TRANSFORM_NORMAL, 0.0, output->wlr_output->transform_matrix); - if (inner_width * output_scale - marks_width < texture_box.width) { - texture_box.width = inner_width * output_scale - marks_width; + if (inner_width * output_scale - marks_ob_width < texture_box.width) { + texture_box.width = inner_width * output_scale - marks_ob_width; } render_texture(output->wlr_output, output_damage, title_texture, &texture_box, matrix, con->alpha); - title_width = texture_box.width; + 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) { + render_rect(output->wlr_output, output_damage, &box, color); + } } // Padding above title @@ -580,9 +604,9 @@ static void render_titlebar(struct sway_output *output, render_rect(output->wlr_output, output_damage, &box, color); // Filler between title and marks - box.width = inner_width * output_scale - title_width - marks_width; + box.width = inner_width * output_scale - title_ob_width - marks_ob_width; if (box.width > 0) { - box.x = (x + TITLEBAR_H_PADDING) * output_scale + title_width; + box.x = (x + TITLEBAR_H_PADDING) * output_scale + title_ob_width; box.y = (y + TITLEBAR_V_PADDING) * output_scale; box.height = config->font_height * output_scale; render_rect(output->wlr_output, output_damage, &box, color); diff --git a/sway/tree/container.c b/sway/tree/container.c index 9093feba..5fdcb6e3 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -783,7 +783,7 @@ static void update_title_texture(struct sway_container *con, double scale = output->sway_output->wlr_output->scale; int width = 0; - int height = config->font_height * scale; + int height = con->title_height * scale; cairo_t *c = cairo_create(NULL); get_text_size(c, config->font, &width, NULL, scale, config->pango_markup, diff --git a/sway/tree/view.c b/sway/tree/view.c index e46cb327..3ef79fa8 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -923,7 +923,7 @@ static void update_marks_texture(struct sway_view *view, double scale = output->sway_output->wlr_output->scale; int width = 0; - int height = config->font_height * scale; + int height = view->swayc->title_height * scale; cairo_t *c = cairo_create(NULL); get_text_size(c, config->font, &width, NULL, scale, false, "%s", buffer);