diff options
author | Dmitry Podgorny <pasis.ua@gmail.com> | 2015-06-23 22:29:01 +0000 |
---|---|---|
committer | Dmitry Podgorny <pasis.ua@gmail.com> | 2015-06-25 18:17:10 +0000 |
commit | f24019ee4daa5219b12f86f32d02de5051364c0d (patch) | |
tree | 6222228298d5248f329fea8e0ea9f9e42fa43356 | |
parent | fed55b5459902acdd10e5aa481bd54f00ad4c97e (diff) | |
download | profani-tty-f24019ee4daa5219b12f86f32d02de5051364c0d.tar.gz |
ui: Ignore EINTR in inp_readline()
EINTR is usual situation during resizing of terminal window.
-rw-r--r-- | src/ui/inputwin.c | 25 |
1 files changed, 7 insertions, 18 deletions
diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c index 2c42a628..2499f20a 100644 --- a/src/ui/inputwin.c +++ b/src/ui/inputwin.c @@ -71,6 +71,7 @@ static WINDOW *inp_win; static int pad_start = 0; static struct timeval p_rl_timeout; +/* Timeout in ms. Shows how long select() may block. */ static gint inp_timeout = 0; static gint no_input_count = 0; @@ -115,14 +116,6 @@ create_input_window(void) #else ESCDELAY = 25; #endif - if (inp_timeout == 1000) { - p_rl_timeout.tv_sec = 1; - p_rl_timeout.tv_usec = 0; - } else { - p_rl_timeout.tv_sec = 0; - p_rl_timeout.tv_usec = inp_timeout * 1000; - } - rl_readline_name = "profanity"; rl_getc_function = _inp_rl_getc; rl_startup_hook = _inp_rl_startup_hook; @@ -141,13 +134,17 @@ inp_readline(void) { free(inp_line); inp_line = NULL; + p_rl_timeout.tv_sec = inp_timeout / 1000; + p_rl_timeout.tv_usec = inp_timeout % 1000 * 1000; FD_ZERO(&fds); FD_SET(fileno(rl_instream), &fds); errno = 0; r = select(FD_SETSIZE, &fds, NULL, NULL, &p_rl_timeout); if (r < 0) { - char *err_msg = strerror(errno); - log_error("Readline failed: %s", err_msg); + if (errno != EINTR) { + char *err_msg = strerror(errno); + log_error("Readline failed: %s", err_msg); + } return NULL; } @@ -169,14 +166,6 @@ inp_readline(void) prof_handle_idle(); } - if (inp_timeout == 1000) { - p_rl_timeout.tv_sec = 1; - p_rl_timeout.tv_usec = 0; - } else { - p_rl_timeout.tv_sec = 0; - p_rl_timeout.tv_usec = inp_timeout * 1000; - } - if (inp_line) { return strdup(inp_line); } else { |