aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
Diffstat (limited to 'sway')
-rw-r--r--sway/config.c21
-rw-r--r--sway/debug-tree.c2
-rw-r--r--sway/desktop/render.c90
-rw-r--r--sway/tree/container.c10
-rw-r--r--sway/tree/view.c3
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(