From 54f1426e430dd18c85ab1fcda45478acb1e315ea Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Wed, 18 Jan 2023 21:31:31 +0100 Subject: [PATCH] [status] Introduced print_screen_status_delayed. For cases when status is updated often. For example uploads or downloads. --- src/dialogs/status.c | 18 +++++++++++++++++- src/dialogs/status.h | 1 + src/session/session.cpp | 4 +++- src/session/session.h | 1 + src/session/task.c | 2 +- 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/dialogs/status.c b/src/dialogs/status.c index d218aca1..3683cf54 100644 --- a/src/dialogs/status.c +++ b/src/dialogs/status.c @@ -17,6 +17,7 @@ #include "document/renderer.h" #include "document/view.h" #include "intl/libintl.h" +#include "main/timer.h" #include "network/connection.h" #include "network/progress.h" #include "network/state.h" @@ -40,7 +41,6 @@ #include "viewer/text/link.h" #include "viewer/text/view.h" - char * get_download_msg(struct download *download, struct terminal *term, int wide, int full, const char *separator) @@ -576,3 +576,19 @@ print_screen_status(struct session *ses) redraw_windows(REDRAW_IN_FRONT_OF_WINDOW, ses->tab); } + +static void +print_screen_status_clear_timer(struct session *ses) +{ + ses->status_redraw_timer = TIMER_ID_UNDEF; + print_screen_status(ses); +} + +void +print_screen_status_delayed(struct session *ses) +{ + /* Redraw after 100ms. */ + if (ses->status_redraw_timer == TIMER_ID_UNDEF) { + install_timer(&ses->status_redraw_timer, 100, print_screen_status_clear_timer, ses); + } +} diff --git a/src/dialogs/status.h b/src/dialogs/status.h index 326576a3..234edb85 100644 --- a/src/dialogs/status.h +++ b/src/dialogs/status.h @@ -10,6 +10,7 @@ struct session; struct terminal; void print_screen_status(struct session *); +void print_screen_status_delayed(struct session *); void update_status(void); diff --git a/src/session/session.cpp b/src/session/session.cpp index 86289972..da06dcc9 100644 --- a/src/session/session.cpp +++ b/src/session/session.cpp @@ -771,7 +771,7 @@ doc_loading_callback(struct download *download, struct session *ses) } check_questions_queue(ses); - print_screen_status(ses); + print_screen_status_delayed(ses); #ifdef CONFIG_GLOBHIST if (download->pri != PRI_CSS) { @@ -1049,6 +1049,7 @@ init_session(struct session *base_session, struct terminal *term, init_list(ses->type_queries); ses->task.type = TASK_NONE; ses->display_timer = TIMER_ID_UNDEF; + ses->status_redraw_timer = TIMER_ID_UNDEF; #ifdef CONFIG_LEDS init_led_panel(&ses->status.leds); @@ -1378,6 +1379,7 @@ destroy_session(struct session *ses) if (ses->loading_uri) done_uri(ses->loading_uri); kill_timer(&ses->display_timer); + kill_timer(&ses->status_redraw_timer); while (!list_empty(ses->type_queries)) done_type_query((struct type_query *)ses->type_queries.next); diff --git a/src/session/session.h b/src/session/session.h index fe223995..9574f1ce 100644 --- a/src/session/session.h +++ b/src/session/session.h @@ -234,6 +234,7 @@ struct session { struct kbdprefix kbdprefix; int exit_query; timer_id_T display_timer; + timer_id_T status_redraw_timer; /** The text input form insert mode. It is a tristate controlled by the * boolean document.browse.forms.insert_mode option. When disabled we diff --git a/src/session/task.c b/src/session/task.c index fd359a82..3eb99eb6 100644 --- a/src/session/task.c +++ b/src/session/task.c @@ -577,7 +577,7 @@ loading_callback(struct download *download, struct session *ses) end: check_questions_queue(ses); - print_screen_status(ses); + print_screen_status_delayed(ses); }