From 663accfc1b7feeb66176ed03b8c77d4adaa1bc21 Mon Sep 17 00:00:00 2001 From: Pierre Habouzit Date: Sat, 10 Nov 2007 14:59:48 +0100 Subject: [PATCH] Support resizing Signed-off-by: Pierre Habouzit --- demo/boxshell.c | 43 +++++++++++++++++++++++++------------ madtty/madtty.c | 57 ++++++++++++++++++++++++++++++++++++++++--------- madtty/madtty.h | 1 + 3 files changed, 77 insertions(+), 24 deletions(-) diff --git a/demo/boxshell.c b/demo/boxshell.c index 00a11a0..fa7d2ee 100644 --- a/demo/boxshell.c +++ b/demo/boxshell.c @@ -7,6 +7,7 @@ #include +#include #include #include #include @@ -17,7 +18,7 @@ #include -static unsigned char getout = 0; +static int getout = 0, sigwinch = 0; static int screen_w, screen_h; static WINDOW *term_win; @@ -28,6 +29,7 @@ void handler(int signo) getout = 1; break; case SIGWINCH: + sigwinch = 1; break; } } @@ -45,7 +47,7 @@ int main(void) /* create a window with a frame */ term_win = newwin(screen_h - 2, screen_w - 2, 1, 1); - rt = madtty_create(screen_h - 2, screen_w - 2); + rt = madtty_create(screen_h - 2, screen_w -2); { const char *path = getenv("SHELL") ?: "/bin/sh"; const char *args[] = { path, "--login", NULL}; @@ -71,19 +73,32 @@ int main(void) } } - while ((ch = getch()) != ERR) { -#if 0 - if (ch == KEY_F(1)) { - struct winsize ws = { - .ws_row = --rt->rows, - .ws_col = --rt->cols, - }; - - erase(); - ioctl(rt->pty, TIOCSWINSZ, &ws); - wresize(term_win, rt->rows, rt->cols); + if (sigwinch) { + int fd, cols = -1, rows = -1; + struct winsize w; + + if ((fd = open("/dev/tty", O_RDONLY)) != -1) { + if (ioctl(fd, TIOCGWINSZ, &w) != -1) { + rows = w.ws_row; + cols = w.ws_col; + } + close(fd); + } + if (rows <= 0) { + rows = atoi(getenv("LINES") ?: "24"); + } + if (cols <= 0) { + cols = atoi(getenv("COLUMNS") ?: "80"); } -#endif + + resizeterm(rows, cols); + madtty_resize(rt, rows - 2, cols - 2); + wresize(term_win, rows - 2, cols - 2); + sigwinch = 0; + erase(); + } + + while ((ch = getch()) != ERR) { madtty_keypress(rt, ch); /* pass the keypress for handling */ dirty = 1; } diff --git a/madtty/madtty.c b/madtty/madtty.c index 7b85f27..8a3d26f 100644 --- a/madtty/madtty.c +++ b/madtty/madtty.c @@ -30,7 +30,9 @@ #include #include #include +#include #include +#include #include #include "madtty.h" @@ -800,6 +802,51 @@ madtty_t *madtty_create(int rows, int cols) return rt; } +void madtty_resize(madtty_t *rt, int rows, int cols) +{ + struct winsize ws = { .ws_row = rows, .ws_col = cols }; + mtty_row_t *lines = rt->lines; + + if (rows <= 0 || cols <= 0) + return; + + if (rt->rows != rows) { + while (rt->rows > rows) { + free(lines[rt->rows - 1].text); + free(lines[rt->rows - 1].attr); + rt->rows--; + } + + lines = realloc(lines, sizeof(mtty_row_t) * rows); + } + + if (rt->cols != cols) { + for (int row = 0; row < rt->rows; row++) { + lines[row].text = realloc(lines[row].text, sizeof(wchar_t) * cols); + lines[row].attr = realloc(lines[row].attr, sizeof(uint16_t) * cols); + if (rt->cols < cols) + mtty_row_set(lines + row, rt->cols, cols - rt->cols, 0); + } + rt->cols = cols; + } + + while (rt->rows < rows) { + lines[rt->rows].text = (wchar_t *)calloc(sizeof(wchar_t), cols); + lines[rt->rows].attr = (uint16_t *)calloc(sizeof(uint16_t), cols); + rt->rows++; + } + + rt->curs_row += lines - rt->lines; + rt->scroll_top += lines - rt->lines; + rt->scroll_bot += lines - rt->lines; + if (rt->scroll_bot > lines + rt->rows) + rt->scroll_bot = lines + rt->rows; + rt->lines = lines; + clamp_cursor_to_bounds(rt); + ioctl(rt->pty, TIOCSWINSZ, &ws); + kill(-rt->childpid, SIGWINCH); +} + void madtty_destroy(madtty_t *rt) { int i; @@ -879,16 +926,6 @@ void madtty_keypress(madtty_t *rt, int keycode) const char *buf; int len; -#if 0 - if (keycode == KEY_F(1)) { -#define MIN(a, b) ((a < (b)) ? a : (b)) - kill(-rt->childpid, SIGWINCH); - rt->scroll_bot = MIN(rt->scroll_bot, rt->lines + rt->rows); - rt->curs_row = MIN(rt->curs_row, rt->lines + rt->rows); - printf(stderr, "%d\n", rt->rows); - return; - } -#endif if (keycode >= 0 && keycode < KEY_MAX && keytable[keycode]) { buf = keytable[keycode]; len = strlen(keytable[keycode]); diff --git a/madtty/madtty.h b/madtty/madtty.h index c7e2a82..edecde9 100644 --- a/madtty/madtty.h +++ b/madtty/madtty.h @@ -68,6 +68,7 @@ typedef struct { void madtty_initialize(void); madtty_t *madtty_create(int rows, int cols); +void madtty_resize(madtty_t *rt, int rows, int cols); void madtty_destroy(madtty_t *rt); pid_t madtty_forkpty(madtty_t *rt, const char *path, const char *argv[]); -- 2.20.1