From f63f270a857b78863a5fee6aaacf8b3c4d5c3ce1 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Fri, 9 Apr 2021 12:26:46 +0100 Subject: [PATCH] elm entry - tune appending to be faster this is not perfect, but it tuned things to take less time overall but can be a bit more jerky given massive amounts of text like warandpeace, but it takes less time to finish an append cycle in the background for sure. (loading up war and peace goes from 42sec in the background spinning appending to 3sec in an entry on my overpowered box). on my oldest x86 box i have sitting here it goes from 95sec to 10sec. --- src/lib/elementary/elm_entry.c | 44 +++++++++++++++++++++++++-- src/lib/elementary/elm_widget_entry.h | 2 ++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/lib/elementary/elm_entry.c b/src/lib/elementary/elm_entry.c index 6a82bff2e1..468048b497 100644 --- a/src/lib/elementary/elm_entry.c +++ b/src/lib/elementary/elm_entry.c @@ -31,7 +31,8 @@ * FIXME: This size is arbitrary, should probably choose a better size. * Possibly also find a way to set it to a low value for weak computers, * and to a big value for better computers. */ -#define ELM_ENTRY_CHUNK_SIZE 10000 +#define ELM_ENTRY_CHUNK_SIZE 100000 +#define ELM_ENTRY_CHUNK_SIZE_MAX 1000000 #define ELM_ENTRY_DELAY_WRITE_TIME 2.0 #define ELM_PRIV_ENTRY_SIGNALS(cmd) \ @@ -2982,12 +2983,18 @@ _markup_filter_cb(void *data, } } +static void +_append_wakeup_job_cb(void *data EINA_UNUSED) +{ +} + /* This function is used to insert text by chunks in jobs */ static Eina_Bool _text_append_idler(void *data) { int start; char backup; + double t, tnow; Evas_Object *obj = (Evas_Object *)data; ELM_ENTRY_DATA_GET(obj, sd); @@ -2998,7 +3005,13 @@ _text_append_idler(void *data) sd->changed = EINA_TRUE; start = sd->append_text_position; - if ((start + ELM_ENTRY_CHUNK_SIZE) < sd->append_text_len) + if (sd->append_text_chunk <= 0) + { + sd->append_text_chunk = ELM_ENTRY_CHUNK_SIZE; + sd->append_text_last_time = ecore_time_get(); + } + t = sd->append_text_last_time; + if ((start + sd->append_text_chunk) < sd->append_text_len) { int pos = start; int tag_start, esc_start; @@ -3057,6 +3070,30 @@ _text_append_idler(void *data) evas_event_thaw_eval(evas_object_evas_get(obj)); _elm_entry_guide_update(obj, EINA_TRUE); + tnow = ecore_time_get(); + t = tnow - sd->append_text_last_time; + sd->append_text_last_time = tnow; +// for debugging/tuning +// printf("append %i in %1.5f\n", sd->append_text_chunk, t); + if (t > 0.0) + { + const double maxtime = 1.0 / 5.0; + int new_size; + + if (t > (maxtime / 1000.0)) + { + new_size = ((double)sd->append_text_chunk * maxtime) / t; + if (new_size > ELM_ENTRY_CHUNK_SIZE_MAX) + new_size = ELM_ENTRY_CHUNK_SIZE_MAX; + else if (new_size < ELM_ENTRY_CHUNK_SIZE) + new_size = ELM_ENTRY_CHUNK_SIZE; + } + else + new_size = ELM_ENTRY_CHUNK_SIZE_MAX; + + sd->append_text_chunk = new_size; + } + ecore_job_add(_append_wakeup_job_cb, NULL); /* If there's still more to go, renew the idler, else, cleanup */ if (sd->append_text_position < sd->append_text_len) @@ -3065,8 +3102,9 @@ _text_append_idler(void *data) } else { + sd->append_text_chunk = 0; edje_object_part_text_cursor_pos_set(sd->entry_edje, "elm.text", - EDJE_CURSOR_MAIN, sd->cursor_pos); + EDJE_CURSOR_MAIN, sd->cursor_pos); free(sd->append_text_left); sd->append_text_left = NULL; sd->append_text_idler = NULL; diff --git a/src/lib/elementary/elm_widget_entry.h b/src/lib/elementary/elm_widget_entry.h index db1ea7b442..8844e970d5 100644 --- a/src/lib/elementary/elm_widget_entry.h +++ b/src/lib/elementary/elm_widget_entry.h @@ -47,6 +47,8 @@ struct _Elm_Entry_Data char *prediction_hint; int append_text_position; int append_text_len; + int append_text_chunk; + double append_text_last_time; /* Only for clipboard */ const char *cut_sel; const char *text;