about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/command/commands.c2
-rw-r--r--src/profanity.c2
-rw-r--r--src/ui/core.c30
-rw-r--r--src/ui/inputwin.c4
-rw-r--r--src/ui/inputwin.h4
-rw-r--r--src/ui/ui.h2
-rw-r--r--src/ui/window.c4
7 files changed, 37 insertions, 11 deletions
diff --git a/src/command/commands.c b/src/command/commands.c
index fba32b8b..5aae8fe5 100644
--- a/src/command/commands.c
+++ b/src/command/commands.c
@@ -3455,7 +3455,7 @@ cmd_inpblock(gchar **args, struct cmd_help_t help)
     if (_strtoi(value, &intval, 1, 1000) == 0) {
         cons_show("Input blocking set to %d milliseconds.", intval);
         prefs_set_inpblock(intval);
-        ui_input_nonblocking();
+        ui_input_nonblocking(FALSE);
     }
     return TRUE;
 }
diff --git a/src/profanity.c b/src/profanity.c
index 18bcc5f9..b28eae20 100644
--- a/src/profanity.c
+++ b/src/profanity.c
@@ -76,7 +76,7 @@ prof_run(const int disable_tls, char *log_level, char *account_name)
 {
     _init(disable_tls, log_level);
     log_info("Starting main event loop");
-    ui_input_nonblocking();
+    ui_input_nonblocking(TRUE);
     GTimer *timer = g_timer_new();
     gboolean cmd_result = TRUE;
     jabber_conn_status_t conn_status = jabber_get_connection_status();
diff --git a/src/ui/core.c b/src/ui/core.c
index be16dfad..3b53b4ed 100644
--- a/src/ui/core.c
+++ b/src/ui/core.c
@@ -180,7 +180,11 @@ ui_get_char(char *input, int *size, int *result)
     wint_t ch = inp_get_char(input, size, result);
     if (ch != ERR && *result != ERR) {
         ui_reset_idle_time();
+        ui_input_nonblocking(TRUE);
+    } else {
+        ui_input_nonblocking(FALSE);
     }
+
     return ch;
 }
 
@@ -197,9 +201,29 @@ ui_replace_input(char *input, const char * const new_input, int *size)
 }
 
 void
-ui_input_nonblocking(void)
+ui_input_nonblocking(gboolean reset)
 {
-    inp_non_block();
+    static gint timeout = 0;
+    static gint no_input_count = 0;
+
+    if (reset) {
+      timeout = 0;
+      no_input_count = 0;
+    }
+
+    if (timeout < prefs_get_inpblock()) {
+        no_input_count++;
+
+        if (no_input_count % 10 == 0) {
+            timeout += no_input_count;
+
+            if (timeout > prefs_get_inpblock()) {
+                timeout = prefs_get_inpblock();
+            }
+        }
+    }
+
+    inp_non_block(timeout);
 }
 
 void
@@ -2218,7 +2242,7 @@ ui_ask_password(void)
   status_bar_update_virtual();
   inp_block();
   inp_get_password(passwd);
-  inp_non_block();
+  inp_non_block(prefs_get_inpblock());
 
   return passwd;
 }
diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c
index 19318745..a6877a86 100644
--- a/src/ui/inputwin.c
+++ b/src/ui/inputwin.c
@@ -120,9 +120,9 @@ inp_win_resize(void)
 }
 
 void
-inp_non_block(void)
+inp_non_block(gint timeout)
 {
-    wtimeout(inp_win, prefs_get_inpblock());
+    wtimeout(inp_win, timeout);
 }
 
 void
diff --git a/src/ui/inputwin.h b/src/ui/inputwin.h
index eae20a51..b5a26c10 100644
--- a/src/ui/inputwin.h
+++ b/src/ui/inputwin.h
@@ -40,9 +40,9 @@ wint_t inp_get_char(char *input, int *size, int *result);
 void inp_win_reset(void);
 void inp_win_resize(void);
 void inp_put_back(void);
-void inp_non_block(void);
+void inp_non_block(gint);
 void inp_block(void);
 void inp_get_password(char *passwd);
 void inp_replace_input(char *input, const char * const new_input, int *size);
 
-#endif
\ No newline at end of file
+#endif
diff --git a/src/ui/ui.h b/src/ui/ui.h
index 32484b9e..e28914ff 100644
--- a/src/ui/ui.h
+++ b/src/ui/ui.h
@@ -232,7 +232,7 @@ void ui_statusbar_new(const int win);
 
 wint_t ui_get_char(char *input, int *size, int *result);
 void ui_input_clear(void);
-void ui_input_nonblocking(void);
+void ui_input_nonblocking(gboolean);
 void ui_replace_input(char *input, const char * const new_input, int *size);
 
 void ui_invalid_command_usage(const char * const usage, void (*setting_func)(void));
diff --git a/src/ui/window.c b/src/ui/window.c
index caef36df..3a45ab01 100644
--- a/src/ui/window.c
+++ b/src/ui/window.c
@@ -740,6 +740,8 @@ win_save_print(ProfWin *window, const char show_char, GTimeVal *tstamp,
 
     buffer_push(window->layout->buffer, show_char, time, flags, theme_item, from, message);
     _win_print(window, show_char, time, flags, theme_item, from, message);
+    // TODO: cross-reference.. this should be replaced by a real event-based system
+    ui_input_nonblocking(TRUE);
 }
 
 void
@@ -952,4 +954,4 @@ win_printline_nowrap(WINDOW *win, char *msg)
     waddnstr(win, msg, maxx);
 
     wmove(win, cury+1, 0);
-}
\ No newline at end of file
+}