From 6a89217d6a413c4f69c1396f711908fc746083e6 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 14 Mar 2002 23:46:48 +0000 Subject: [PATCH] Get the terminal size at startup with ioctl() and use it. Fixes at least NetBSD. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@2616 dbcabf3a-b0e7-0310-adc4-f8d773084564 --- src/fe-text/term-terminfo.c | 8 ++++++- src/fe-text/term.c | 48 +++++++++++++++++++++---------------- src/fe-text/term.h | 3 +++ 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/fe-text/term-terminfo.c b/src/fe-text/term-terminfo.c index 4e9781fe..5716b36c 100644 --- a/src/fe-text/term-terminfo.c +++ b/src/fe-text/term-terminfo.c @@ -77,7 +77,8 @@ static int redraw_timeout(void) int term_init(void) { - struct sigaction act; + struct sigaction act; + int width, height; last_fg = last_bg = -1; last_attrs = 0; @@ -89,6 +90,11 @@ int term_init(void) if (current_term == NULL) return FALSE; + if (term_get_size(&width, &height)) { + current_term->width = width; + current_term->height = height; + } + /* grab CONT signal */ sigemptyset(&act.sa_mask); act.sa_flags = 0; diff --git a/src/fe-text/term.c b/src/fe-text/term.c index a50fc8a3..94d81cfd 100644 --- a/src/fe-text/term.c +++ b/src/fe-text/term.c @@ -47,12 +47,31 @@ int term_type; static int force_colors; static int resize_dirty; -/* Resize the terminal if needed */ -void term_resize_dirty(void) +int term_get_size(int *width, int *height) { #ifdef TIOCGWINSZ struct winsize ws; + + /* Get new window size */ + if (ioctl(0, TIOCGWINSZ, &ws) < 0) + return FALSE; + + *width = ws.ws_col; + *height = ws.ws_row; + + if (*width < MIN_SCREEN_WIDTH) + *width = MIN_SCREEN_WIDTH; + if (*height < 1) + *height = 1; + return TRUE; +#else + return FALSE; #endif +} + +/* Resize the terminal if needed */ +void term_resize_dirty(void) +{ int width, height; if (!resize_dirty) @@ -60,27 +79,14 @@ void term_resize_dirty(void) resize_dirty = FALSE; -#ifdef TIOCGWINSZ - /* Get new window size */ - if (ioctl(0, TIOCGWINSZ, &ws) < 0) - return; + if (!term_get_size(&width, &height)) + width = height = -1; - if (ws.ws_row == term_height && ws.ws_col == term_width) { - /* Same size, abort. */ - return; + if (height != term_height || width != term_width) { + term_resize(width, height); + mainwindows_resize(term_width, term_height); + term_resize_final(width, height); } - - if (ws.ws_col < MIN_SCREEN_WIDTH) - ws.ws_col = MIN_SCREEN_WIDTH; - - width = ws.ws_col; - height = ws.ws_row; -#else - width = height = -1; -#endif - term_resize(width, height); - mainwindows_resize(term_width, term_height); - term_resize_final(width, height); } #ifdef SIGWINCH diff --git a/src/fe-text/term.h b/src/fe-text/term.h index 3607fad5..b5103c14 100644 --- a/src/fe-text/term.h +++ b/src/fe-text/term.h @@ -30,6 +30,9 @@ extern int term_use_colors, term_type, term_detached; int term_init(void); void term_deinit(void); +/* Gets the current terminal size, returns TRUE if ok. */ +int term_get_size(int *width, int *height); + /* Resize terminal - if width or height is negative, the new size is unknown and should be figured out somehow */ void term_resize(int width, int height);