diff options
-rw-r--r-- | common/pango.c | 18 | ||||
-rw-r--r-- | include/pango.h | 1 | ||||
-rw-r--r-- | include/sway/config.h | 13 | ||||
-rw-r--r-- | include/sway/tree/container.h | 7 | ||||
-rw-r--r-- | sway/commands/font.c | 2 | ||||
-rw-r--r-- | sway/commands/reload.c | 2 | ||||
-rw-r--r-- | sway/commands/title_format.c | 2 | ||||
-rw-r--r-- | sway/config.c | 26 | ||||
-rw-r--r-- | sway/desktop/render.c | 3 | ||||
-rw-r--r-- | sway/tree/container.c | 38 | ||||
-rw-r--r-- | sway/tree/view.c | 3 |
11 files changed, 49 insertions, 66 deletions
diff --git a/common/pango.c b/common/pango.c index dbc369dc..88932203 100644 --- a/common/pango.c +++ b/common/pango.c | |||
@@ -109,6 +109,24 @@ void get_text_size(cairo_t *cairo, const char *font, int *width, int *height, | |||
109 | free(buf); | 109 | free(buf); |
110 | } | 110 | } |
111 | 111 | ||
112 | void get_text_metrics(const char *font, int *height, int *baseline) { | ||
113 | cairo_t *cairo = cairo_create(NULL); | ||
114 | PangoContext *pango = pango_cairo_create_context(cairo); | ||
115 | PangoFontDescription *description = pango_font_description_from_string(font); | ||
116 | PangoFontMetrics *metrics; | ||
117 | |||
118 | // When passing NULL as a language, pango uses the current locale. | ||
119 | metrics = pango_context_get_metrics(pango, description, NULL); | ||
120 | |||
121 | *baseline = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE; | ||
122 | *height = *baseline + pango_font_metrics_get_descent(metrics) / PANGO_SCALE; | ||
123 | |||
124 | pango_font_metrics_unref(metrics); | ||
125 | pango_font_description_free(description); | ||
126 | g_object_unref(pango); | ||
127 | cairo_destroy(cairo); | ||
128 | } | ||
129 | |||
112 | void pango_printf(cairo_t *cairo, const char *font, | 130 | void pango_printf(cairo_t *cairo, const char *font, |
113 | double scale, bool markup, const char *fmt, ...) { | 131 | double scale, bool markup, const char *fmt, ...) { |
114 | va_list args; | 132 | va_list args; |
diff --git a/include/pango.h b/include/pango.h index 75dbba27..7f41441b 100644 --- a/include/pango.h +++ b/include/pango.h | |||
@@ -17,6 +17,7 @@ PangoLayout *get_pango_layout(cairo_t *cairo, const char *font, | |||
17 | const char *text, double scale, bool markup); | 17 | const char *text, double scale, bool markup); |
18 | void get_text_size(cairo_t *cairo, const char *font, int *width, int *height, | 18 | void get_text_size(cairo_t *cairo, const char *font, int *width, int *height, |
19 | int *baseline, double scale, bool markup, const char *fmt, ...); | 19 | int *baseline, double scale, bool markup, const char *fmt, ...); |
20 | void get_text_metrics(const char *font, int *height, int *baseline); | ||
20 | void pango_printf(cairo_t *cairo, const char *font, | 21 | void pango_printf(cairo_t *cairo, const char *font, |
21 | double scale, bool markup, const char *fmt, ...); | 22 | double scale, bool markup, const char *fmt, ...); |
22 | 23 | ||
diff --git a/include/sway/config.h b/include/sway/config.h index b8327e9c..d6c29fe6 100644 --- a/include/sway/config.h +++ b/include/sway/config.h | |||
@@ -486,8 +486,8 @@ struct sway_config { | |||
486 | enum sway_container_layout default_orientation; | 486 | enum sway_container_layout default_orientation; |
487 | enum sway_container_layout default_layout; | 487 | enum sway_container_layout default_layout; |
488 | char *font; | 488 | char *font; |
489 | size_t font_height; | 489 | int font_height; |
490 | size_t font_baseline; | 490 | int font_baseline; |
491 | bool pango_markup; | 491 | bool pango_markup; |
492 | int titlebar_border_thickness; | 492 | int titlebar_border_thickness; |
493 | int titlebar_h_padding; | 493 | int titlebar_h_padding; |
@@ -696,14 +696,13 @@ void free_bar_binding(struct bar_binding *binding); | |||
696 | void free_workspace_config(struct workspace_config *wsc); | 696 | void free_workspace_config(struct workspace_config *wsc); |
697 | 697 | ||
698 | /** | 698 | /** |
699 | * Updates the value of config->font_height based on the max title height | 699 | * Updates the value of config->font_height based on the metrics for title's |
700 | * reported by each container. If recalculate is true, the containers will | 700 | * font as reported by pango. |
701 | * recalculate their heights before reporting. | 701 | * |
702 | * | ||
703 | * If the height has changed, all containers will be rearranged to take on the | 702 | * If the height has changed, all containers will be rearranged to take on the |
704 | * new size. | 703 | * new size. |
705 | */ | 704 | */ |
706 | void config_update_font_height(bool recalculate); | 705 | void config_update_font_height(void); |
707 | 706 | ||
708 | /** | 707 | /** |
709 | * Convert bindsym into bindcode using the first configured layout. | 708 | * Convert bindsym into bindcode using the first configured layout. |
diff --git a/include/sway/tree/container.h b/include/sway/tree/container.h index 38ee68bd..97fa98c1 100644 --- a/include/sway/tree/container.h +++ b/include/sway/tree/container.h | |||
@@ -119,8 +119,6 @@ struct sway_container { | |||
119 | struct wlr_texture *title_focused_inactive; | 119 | struct wlr_texture *title_focused_inactive; |
120 | struct wlr_texture *title_unfocused; | 120 | struct wlr_texture *title_unfocused; |
121 | struct wlr_texture *title_urgent; | 121 | struct wlr_texture *title_urgent; |
122 | size_t title_height; | ||
123 | size_t title_baseline; | ||
124 | 122 | ||
125 | list_t *marks; // char * | 123 | list_t *marks; // char * |
126 | struct wlr_texture *marks_focused; | 124 | struct wlr_texture *marks_focused; |
@@ -183,11 +181,6 @@ struct sway_container *container_flatten(struct sway_container *container); | |||
183 | 181 | ||
184 | void container_update_title_textures(struct sway_container *container); | 182 | void container_update_title_textures(struct sway_container *container); |
185 | 183 | ||
186 | /** | ||
187 | * Calculate the container's title_height property. | ||
188 | */ | ||
189 | void container_calculate_title_height(struct sway_container *container); | ||
190 | |||
191 | size_t container_build_representation(enum sway_container_layout layout, | 184 | size_t container_build_representation(enum sway_container_layout layout, |
192 | list_t *children, char *buffer); | 185 | list_t *children, char *buffer); |
193 | 186 | ||
diff --git a/sway/commands/font.c b/sway/commands/font.c index c54365b5..cea720f5 100644 --- a/sway/commands/font.c +++ b/sway/commands/font.c | |||
@@ -22,6 +22,6 @@ struct cmd_results *cmd_font(int argc, char **argv) { | |||
22 | } | 22 | } |
23 | 23 | ||
24 | free(font); | 24 | free(font); |
25 | config_update_font_height(true); | 25 | config_update_font_height(); |
26 | return cmd_results_new(CMD_SUCCESS, NULL); | 26 | return cmd_results_new(CMD_SUCCESS, NULL); |
27 | } | 27 | } |
diff --git a/sway/commands/reload.c b/sway/commands/reload.c index 3c994d54..09ccd9d4 100644 --- a/sway/commands/reload.c +++ b/sway/commands/reload.c | |||
@@ -48,7 +48,7 @@ static void do_reload(void *data) { | |||
48 | } | 48 | } |
49 | list_free_items_and_destroy(bar_ids); | 49 | list_free_items_and_destroy(bar_ids); |
50 | 50 | ||
51 | config_update_font_height(true); | 51 | config_update_font_height(); |
52 | root_for_each_container(rebuild_textures_iterator, NULL); | 52 | root_for_each_container(rebuild_textures_iterator, NULL); |
53 | 53 | ||
54 | arrange_root(); | 54 | arrange_root(); |
diff --git a/sway/commands/title_format.c b/sway/commands/title_format.c index 9d312470..8d907e76 100644 --- a/sway/commands/title_format.c +++ b/sway/commands/title_format.c | |||
@@ -23,6 +23,6 @@ struct cmd_results *cmd_title_format(int argc, char **argv) { | |||
23 | } | 23 | } |
24 | view->title_format = format; | 24 | view->title_format = format; |
25 | view_update_title(view, true); | 25 | view_update_title(view, true); |
26 | config_update_font_height(true); | 26 | config_update_font_height(); |
27 | return cmd_results_new(CMD_SUCCESS, NULL); | 27 | return cmd_results_new(CMD_SUCCESS, NULL); |
28 | } | 28 | } |
diff --git a/sway/config.c b/sway/config.c index fde386c7..1ddedc7e 100644 --- a/sway/config.c +++ b/sway/config.c | |||
@@ -991,31 +991,11 @@ int workspace_output_cmp_workspace(const void *a, const void *b) { | |||
991 | return lenient_strcmp(wsa->workspace, wsb->workspace); | 991 | return lenient_strcmp(wsa->workspace, wsb->workspace); |
992 | } | 992 | } |
993 | 993 | ||
994 | static void find_font_height_iterator(struct sway_container *con, void *data) { | ||
995 | size_t amount_below_baseline = con->title_height - con->title_baseline; | ||
996 | size_t extended_height = config->font_baseline + amount_below_baseline; | ||
997 | if (extended_height > config->font_height) { | ||
998 | config->font_height = extended_height; | ||
999 | } | ||
1000 | } | ||
1001 | |||
1002 | static void find_baseline_iterator(struct sway_container *con, void *data) { | ||
1003 | bool *recalculate = data; | ||
1004 | if (*recalculate) { | ||
1005 | container_calculate_title_height(con); | ||
1006 | } | ||
1007 | if (con->title_baseline > config->font_baseline) { | ||
1008 | config->font_baseline = con->title_baseline; | ||
1009 | } | ||
1010 | } | ||
1011 | 994 | ||
1012 | void config_update_font_height(bool recalculate) { | 995 | void config_update_font_height(void) { |
1013 | size_t prev_max_height = config->font_height; | 996 | int prev_max_height = config->font_height; |
1014 | config->font_height = 0; | ||
1015 | config->font_baseline = 0; | ||
1016 | 997 | ||
1017 | root_for_each_container(find_baseline_iterator, &recalculate); | 998 | get_text_metrics(config->font, &config->font_height, &config->font_baseline); |
1018 | root_for_each_container(find_font_height_iterator, NULL); | ||
1019 | 999 | ||
1020 | if (config->font_height != prev_max_height) { | 1000 | if (config->font_height != prev_max_height) { |
1021 | arrange_root(); | 1001 | arrange_root(); |
diff --git a/sway/desktop/render.c b/sway/desktop/render.c index a5bd8a5f..d25df570 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c | |||
@@ -559,8 +559,7 @@ static void render_titlebar(struct sway_output *output, | |||
559 | 559 | ||
560 | // The title texture might be shorter than the config->font_height, | 560 | // The title texture might be shorter than the config->font_height, |
561 | // in which case we need to pad it above and below. | 561 | // in which case we need to pad it above and below. |
562 | int ob_padding_above = round((config->font_baseline - | 562 | int ob_padding_above = round((titlebar_v_padding - |
563 | con->title_baseline + titlebar_v_padding - | ||
564 | titlebar_border_thickness) * output_scale); | 563 | titlebar_border_thickness) * output_scale); |
565 | int ob_padding_below = ob_bg_height - ob_padding_above - | 564 | int ob_padding_below = ob_bg_height - ob_padding_above - |
566 | texture_box.height; | 565 | texture_box.height; |
diff --git a/sway/tree/container.c b/sway/tree/container.c index 3b661046..00c40218 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c | |||
@@ -509,7 +509,8 @@ static void update_title_texture(struct sway_container *con, | |||
509 | 509 | ||
510 | double scale = output->wlr_output->scale; | 510 | double scale = output->wlr_output->scale; |
511 | int width = 0; | 511 | int width = 0; |
512 | int height = con->title_height * scale; | 512 | int height = config->font_height * scale; |
513 | int baseline; | ||
513 | 514 | ||
514 | // We must use a non-nil cairo_t for cairo_set_font_options to work. | 515 | // We must use a non-nil cairo_t for cairo_set_font_options to work. |
515 | // Therefore, we cannot use cairo_create(NULL). | 516 | // Therefore, we cannot use cairo_create(NULL). |
@@ -527,7 +528,7 @@ static void update_title_texture(struct sway_container *con, | |||
527 | to_cairo_subpixel_order(output->wlr_output->subpixel)); | 528 | to_cairo_subpixel_order(output->wlr_output->subpixel)); |
528 | } | 529 | } |
529 | cairo_set_font_options(c, fo); | 530 | cairo_set_font_options(c, fo); |
530 | get_text_size(c, config->font, &width, NULL, NULL, scale, | 531 | get_text_size(c, config->font, &width, NULL, &baseline, scale, |
531 | config->pango_markup, "%s", con->formatted_title); | 532 | config->pango_markup, "%s", con->formatted_title); |
532 | cairo_surface_destroy(dummy_surface); | 533 | cairo_surface_destroy(dummy_surface); |
533 | cairo_destroy(c); | 534 | cairo_destroy(c); |
@@ -536,6 +537,10 @@ static void update_title_texture(struct sway_container *con, | |||
536 | return; | 537 | return; |
537 | } | 538 | } |
538 | 539 | ||
540 | if (height > config->font_height * scale) { | ||
541 | height = config->font_height * scale; | ||
542 | } | ||
543 | |||
539 | cairo_surface_t *surface = cairo_image_surface_create( | 544 | cairo_surface_t *surface = cairo_image_surface_create( |
540 | CAIRO_FORMAT_ARGB32, width, height); | 545 | CAIRO_FORMAT_ARGB32, width, height); |
541 | cairo_t *cairo = cairo_create(surface); | 546 | cairo_t *cairo = cairo_create(surface); |
@@ -548,7 +553,7 @@ static void update_title_texture(struct sway_container *con, | |||
548 | PangoContext *pango = pango_cairo_create_context(cairo); | 553 | PangoContext *pango = pango_cairo_create_context(cairo); |
549 | cairo_set_source_rgba(cairo, class->text[0], class->text[1], | 554 | cairo_set_source_rgba(cairo, class->text[0], class->text[1], |
550 | class->text[2], class->text[3]); | 555 | class->text[2], class->text[3]); |
551 | cairo_move_to(cairo, 0, 0); | 556 | cairo_move_to(cairo, 0, config->font_baseline * scale - baseline); |
552 | 557 | ||
553 | pango_printf(cairo, config->font, scale, config->pango_markup, | 558 | pango_printf(cairo, config->font, scale, config->pango_markup, |
554 | "%s", con->formatted_title); | 559 | "%s", con->formatted_title); |
@@ -577,21 +582,6 @@ void container_update_title_textures(struct sway_container *container) { | |||
577 | container_damage_whole(container); | 582 | container_damage_whole(container); |
578 | } | 583 | } |
579 | 584 | ||
580 | void container_calculate_title_height(struct sway_container *container) { | ||
581 | if (!container->formatted_title) { | ||
582 | container->title_height = 0; | ||
583 | return; | ||
584 | } | ||
585 | cairo_t *cairo = cairo_create(NULL); | ||
586 | int height; | ||
587 | int baseline; | ||
588 | get_text_size(cairo, config->font, NULL, &height, &baseline, 1, | ||
589 | config->pango_markup, "%s", container->formatted_title); | ||
590 | cairo_destroy(cairo); | ||
591 | container->title_height = height; | ||
592 | container->title_baseline = baseline; | ||
593 | } | ||
594 | |||
595 | /** | 585 | /** |
596 | * Calculate and return the length of the tree representation. | 586 | * Calculate and return the length of the tree representation. |
597 | * An example tree representation is: V[Terminal, Firefox] | 587 | * An example tree representation is: V[Terminal, Firefox] |
@@ -657,7 +647,6 @@ void container_update_representation(struct sway_container *con) { | |||
657 | } | 647 | } |
658 | container_build_representation(con->pending.layout, con->pending.children, | 648 | container_build_representation(con->pending.layout, con->pending.children, |
659 | con->formatted_title); | 649 | con->formatted_title); |
660 | container_calculate_title_height(con); | ||
661 | container_update_title_textures(con); | 650 | container_update_title_textures(con); |
662 | } | 651 | } |
663 | if (con->pending.parent) { | 652 | if (con->pending.parent) { |
@@ -1628,10 +1617,11 @@ static void update_marks_texture(struct sway_container *con, | |||
1628 | 1617 | ||
1629 | double scale = output->wlr_output->scale; | 1618 | double scale = output->wlr_output->scale; |
1630 | int width = 0; | 1619 | int width = 0; |
1631 | int height = con->title_height * scale; | 1620 | int height = config->font_height * scale; |
1621 | int baseline; | ||
1632 | 1622 | ||
1633 | cairo_t *c = cairo_create(NULL); | 1623 | cairo_t *c = cairo_create(NULL); |
1634 | get_text_size(c, config->font, &width, NULL, NULL, scale, false, | 1624 | get_text_size(c, config->font, &width, NULL, &baseline, scale, false, |
1635 | "%s", buffer); | 1625 | "%s", buffer); |
1636 | cairo_destroy(c); | 1626 | cairo_destroy(c); |
1637 | 1627 | ||
@@ -1639,6 +1629,10 @@ static void update_marks_texture(struct sway_container *con, | |||
1639 | return; | 1629 | return; |
1640 | } | 1630 | } |
1641 | 1631 | ||
1632 | if (height > config->font_height) { | ||
1633 | height = config->font_height; | ||
1634 | } | ||
1635 | |||
1642 | cairo_surface_t *surface = cairo_image_surface_create( | 1636 | cairo_surface_t *surface = cairo_image_surface_create( |
1643 | CAIRO_FORMAT_ARGB32, width, height); | 1637 | CAIRO_FORMAT_ARGB32, width, height); |
1644 | cairo_t *cairo = cairo_create(surface); | 1638 | cairo_t *cairo = cairo_create(surface); |
@@ -1649,7 +1643,7 @@ static void update_marks_texture(struct sway_container *con, | |||
1649 | cairo_set_antialias(cairo, CAIRO_ANTIALIAS_BEST); | 1643 | cairo_set_antialias(cairo, CAIRO_ANTIALIAS_BEST); |
1650 | cairo_set_source_rgba(cairo, class->text[0], class->text[1], | 1644 | cairo_set_source_rgba(cairo, class->text[0], class->text[1], |
1651 | class->text[2], class->text[3]); | 1645 | class->text[2], class->text[3]); |
1652 | cairo_move_to(cairo, 0, 0); | 1646 | cairo_move_to(cairo, 0, config->font_baseline * scale - baseline); |
1653 | 1647 | ||
1654 | pango_printf(cairo, config->font, scale, false, "%s", buffer); | 1648 | pango_printf(cairo, config->font, scale, false, "%s", buffer); |
1655 | 1649 | ||
diff --git a/sway/tree/view.c b/sway/tree/view.c index fcdd06f7..3ab971f7 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c | |||
@@ -1285,8 +1285,7 @@ void view_update_title(struct sway_view *view, bool force) { | |||
1285 | view->container->title = NULL; | 1285 | view->container->title = NULL; |
1286 | view->container->formatted_title = NULL; | 1286 | view->container->formatted_title = NULL; |
1287 | } | 1287 | } |
1288 | container_calculate_title_height(view->container); | 1288 | config_update_font_height(); |
1289 | config_update_font_height(false); | ||
1290 | 1289 | ||
1291 | // Update title after the global font height is updated | 1290 | // Update title after the global font height is updated |
1292 | container_update_title_textures(view->container); | 1291 | container_update_title_textures(view->container); |