summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhil Jones <philj56@gmail.com>2022-07-29 12:06:06 +0100
committerPhil Jones <philj56@gmail.com>2022-07-29 14:32:32 +0100
commit96fb966e7b89846fa8305d5dc521a113fcfab82b (patch)
tree5cddb98e0aa7fb922336e8197b6a558b5004131f /src
parentdaad1ccf92caf32becd48d295438524e35affb55 (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.c23
-rw-r--r--src/entry_backend/pango.c30
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);