diff options
author | Phil Jones <philj56@gmail.com> | 2022-07-29 12:06:06 +0100 |
---|---|---|
committer | Phil Jones <philj56@gmail.com> | 2022-07-29 14:32:32 +0100 |
commit | 96fb966e7b89846fa8305d5dc521a113fcfab82b (patch) | |
tree | 5cddb98e0aa7fb922336e8197b6a558b5004131f /src | |
parent | daad1ccf92caf32becd48d295438524e35affb55 (diff) |
Redraw prompt each frame.
This fixes some slanted fonts being cut off if they extend back towards
the prompt too far.
Diffstat (limited to 'src')
-rw-r--r-- | src/entry_backend/harfbuzz.c | 23 | ||||
-rw-r--r-- | src/entry_backend/pango.c | 30 |
2 files changed, 21 insertions, 32 deletions
diff --git a/src/entry_backend/harfbuzz.c b/src/entry_backend/harfbuzz.c index ed2a5aa..af1aad7 100644 --- a/src/entry_backend/harfbuzz.c +++ b/src/entry_backend/harfbuzz.c @@ -174,18 +174,6 @@ void entry_backend_harfbuzz_init( hb_buffer_t *buffer = hb_buffer_create(); entry->harfbuzz.hb_buffer = buffer; setup_hb_buffer(buffer); - - /* Draw the prompt now, as this only needs to be done once */ - log_debug("Drawing prompt.\n"); - hb_buffer_add_utf8(entry->harfbuzz.hb_buffer, entry->prompt_text, -1, 0, -1); - hb_shape(entry->harfbuzz.hb_font, entry->harfbuzz.hb_buffer, NULL, 0); - uint32_t prompt_width = render_hb_buffer(cr, buffer); - - /* Move and clip so we don't draw over the prompt later */ - cairo_translate(cr, prompt_width, 0); - *width -= prompt_width; - cairo_rectangle(cr, 0, 0, *width, *height); - cairo_clip(cr); } void entry_backend_harfbuzz_destroy(struct entry *entry) @@ -207,6 +195,15 @@ void entry_backend_harfbuzz_update(struct entry *entry) struct color color = entry->foreground_color; cairo_set_source_rgba(cr, color.r, color.g, color.b, color.a); + /* Render the prompt */ + hb_buffer_clear_contents(buffer); + setup_hb_buffer(buffer); + hb_buffer_add_utf8(entry->harfbuzz.hb_buffer, entry->prompt_text, -1, 0, -1); + hb_shape(entry->harfbuzz.hb_font, entry->harfbuzz.hb_buffer, NULL, 0); + width = render_hb_buffer(cr, buffer); + + cairo_translate(cr, width, 0); + /* Render the entry text */ hb_buffer_clear_contents(buffer); setup_hb_buffer(buffer); @@ -219,7 +216,7 @@ void entry_backend_harfbuzz_update(struct entry *entry) cairo_font_extents(cr, &font_extents); cairo_matrix_t mat; - /* Render our results entry text */ + /* Render our results */ for (size_t i = 0; i < entry->results.count; i++) { if (entry->horizontal) { cairo_translate(cr, width + entry->result_spacing, 0); diff --git a/src/entry_backend/pango.c b/src/entry_backend/pango.c index 13e21ee..3f424ce 100644 --- a/src/entry_backend/pango.c +++ b/src/entry_backend/pango.c @@ -26,23 +26,6 @@ void entry_backend_pango_init(struct entry *entry, uint32_t *width, uint32_t *he pango_font_description_free(font_description); entry->pango.layout = pango_layout_new(context); - log_debug("Setting Pango text.\n"); - pango_layout_set_text(entry->pango.layout, entry->prompt_text, -1); - log_debug("First Pango draw.\n"); - pango_cairo_update_layout(cr, entry->pango.layout); - - /* Draw the prompt now, as this only needs to be done once */ - struct color color = entry->foreground_color; - cairo_set_source_rgba(cr, color.r, color.g, color.b, color.a); - pango_cairo_show_layout(cr, entry->pango.layout); - - /* Move and clip so we don't draw over the prompt */ - int prompt_width; - pango_layout_get_pixel_size(entry->pango.layout, &prompt_width, NULL); - cairo_translate(cr, prompt_width, 0); - *width -= prompt_width; - cairo_rectangle(cr, 0, 0, *width, *height); - cairo_clip(cr); entry->pango.context = context; } @@ -62,17 +45,26 @@ void entry_backend_pango_update(struct entry *entry) struct color color = entry->foreground_color; cairo_set_source_rgba(cr, color.r, color.g, color.b, color.a); - - pango_layout_set_text(layout, entry->input_mb, -1); + /* Render the prompt */ + pango_layout_set_text(layout, entry->prompt_text, -1); pango_cairo_update_layout(cr, layout); pango_cairo_show_layout(cr, layout); int width; int height; + pango_layout_get_pixel_size(entry->pango.layout, &width, NULL); + cairo_translate(cr, width, 0); + + + /* Render the entry text */ + pango_layout_set_text(layout, entry->input_mb, -1); + pango_cairo_update_layout(cr, layout); + pango_cairo_show_layout(cr, layout); pango_layout_get_size(layout, &width, &height); width = MAX(width, (int)entry->input_width * PANGO_SCALE); cairo_matrix_t mat; + /* Render our results */ for (size_t i = 0; i < entry->results.count; i++) { if (entry->horizontal) { cairo_translate(cr, (int)(width / PANGO_SCALE) + entry->result_spacing, 0); |