From: Andre Noll Date: Mon, 9 Apr 2012 01:02:59 +0000 (+0200) Subject: interactive: Honor SIGWINCH. X-Git-Tag: v0.4.12~7^2~10 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=3ba7724e92b52f5933632ff7d948d0f9491440db;hp=56561c08cf6cfe28bccebc513bcec057d8bb9afa interactive: Honor SIGWINCH. For the upcoming single key mode of the i9e subsystem, we need to know the width of the terminal. This makes this information available to all functions in interactive.c via the i9e_private structure. The new num_columns variable of this structure is updated whenever i9e_signal_dispatch() is called with sig_num equal to SIGWINCH. --- diff --git a/interactive.c b/interactive.c index dda5f84e..f75e4be5 100644 --- a/interactive.c +++ b/interactive.c @@ -27,6 +27,7 @@ struct i9e_private { struct i9e_client_info *ici; FILE *stderr_stream; + int num_columns; char empty_line[1000]; struct task task; struct btr_node *stdout_btrn; @@ -339,14 +340,15 @@ static void update_winsize(void) { struct winsize w; int ret = ioctl(i9ep->ici->fds[2], TIOCGWINSZ, (char *)&w); - int num_columns = 80; if (ret >= 0) { assert(w.ws_col < sizeof(i9ep->empty_line)); - num_columns = w.ws_col; - } - memset(i9ep->empty_line, ' ', num_columns); - i9ep->empty_line[num_columns] = '\0'; + i9ep->num_columns = w.ws_col; + } else + i9ep->num_columns = 80; + + memset(i9ep->empty_line, ' ', i9ep->num_columns); + i9ep->empty_line[i9ep->num_columns] = '\0'; } /** @@ -431,6 +433,8 @@ __printf_2_3 void i9e_log(int ll, const char* fmt,...) */ void i9e_signal_dispatch(int sig_num) { + if (sig_num == SIGWINCH) + return update_winsize(); if (sig_num == SIGINT) { fprintf(i9ep->stderr_stream, "\n"); rl_replace_line ("", false /* clear_undo */);