From 88e713b981c8760c255b19009918ee94f60fbdc1 Mon Sep 17 00:00:00 2001 From: Phil Jones Date: Tue, 26 Jul 2022 17:51:31 +0100 Subject: Add automatic detection of number of results. Tofi will now try to autodetect how many results can be drawn if --num-results=0 is specified, which is now the default. --- src/entry_backend/harfbuzz.c | 21 ++++++++++++++++++++- src/entry_backend/pango.c | 21 ++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) (limited to 'src/entry_backend') diff --git a/src/entry_backend/harfbuzz.c b/src/entry_backend/harfbuzz.c index bb4429c..ed2a5aa 100644 --- a/src/entry_backend/harfbuzz.c +++ b/src/entry_backend/harfbuzz.c @@ -218,13 +218,32 @@ void entry_backend_harfbuzz_update(struct entry *entry) cairo_font_extents_t font_extents; cairo_font_extents(cr, &font_extents); + cairo_matrix_t mat; /* Render our results entry text */ - for (size_t i = 0; i < entry->num_results && i < entry->results.count; i++) { + for (size_t i = 0; i < entry->results.count; i++) { if (entry->horizontal) { cairo_translate(cr, width + entry->result_spacing, 0); } else { cairo_translate(cr, 0, font_extents.height + entry->result_spacing); } + if (entry->num_results == 0) { + cairo_get_matrix(cr, &mat); + if (entry->horizontal) { + if (mat.x0 > entry->clip_x + entry->clip_width) { + entry->num_results_drawn = i; + log_debug("Drew %zu results.\n", i); + break; + } + } else { + if (mat.y0 > entry->clip_y + entry->clip_height) { + entry->num_results_drawn = i; + log_debug("Drew %zu results.\n", i); + break; + } + } + } else if (i >= entry->num_results) { + break; + } hb_buffer_clear_contents(buffer); setup_hb_buffer(buffer); diff --git a/src/entry_backend/pango.c b/src/entry_backend/pango.c index 34bb05e..13e21ee 100644 --- a/src/entry_backend/pango.c +++ b/src/entry_backend/pango.c @@ -72,12 +72,31 @@ void entry_backend_pango_update(struct entry *entry) pango_layout_get_size(layout, &width, &height); width = MAX(width, (int)entry->input_width * PANGO_SCALE); - for (size_t i = 0; i < entry->num_results && i < entry->results.count; i++) { + cairo_matrix_t mat; + for (size_t i = 0; i < entry->results.count; i++) { if (entry->horizontal) { cairo_translate(cr, (int)(width / PANGO_SCALE) + entry->result_spacing, 0); } else { cairo_translate(cr, 0, (int)(height / PANGO_SCALE) + entry->result_spacing); } + if (entry->num_results == 0) { + cairo_get_matrix(cr, &mat); + if (entry->horizontal) { + if (mat.x0 > entry->clip_x + entry->clip_width) { + entry->num_results_drawn = i; + log_debug("Drew %zu results.\n", i); + break; + } + } else { + if (mat.y0 > entry->clip_y + entry->clip_height) { + entry->num_results_drawn = i; + log_debug("Drew %zu results.\n", i); + break; + } + } + } else if (i >= entry->num_results) { + break; + } const char *str; if (i < entry->results.count) { str = entry->results.buf[i].string; -- cgit v1.2.3