From ad042959a56bba8478499f78dfce1ae876e092c4 Mon Sep 17 00:00:00 2001 From: Jakob Kaivo Date: Sun, 23 Apr 2023 09:49:34 -0400 Subject: properly set COLUMNS and LINES --- interactive.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/interactive.c b/interactive.c index 239c001..cad6867 100644 --- a/interactive.c +++ b/interactive.c @@ -19,13 +19,57 @@ #define _XOPEN_SOURCE 700 +#include #include #include #include +#include +#include + +#ifdef SIGWINCH +#include +#endif #include "sh.h" #include "shed.h" +sig_atomic_t got_sigwinch = 0; +static char sh_columns[8] = "80"; +static char sh_lines[8] = "25"; + +#ifdef SIGWINCH +static void sh_sigwinch(int sig) +{ + got_sigwinch = 1; + signal(sig, sh_sigwinch); +} +#endif + +void sh_getwinsize(void) +{ + #ifdef TIOCGWINSZ + struct winsize ws = { 0 }; + ioctl(STDIN_FILENO, TIOCGWINSZ, &ws); + snprintf(sh_columns, sizeof(sh_columns), "%hhu", ws.ws_col); + snprintf(sh_lines, sizeof(sh_lines), "%hhu", ws.ws_row); + #else + FILE *cols = popen("tput cols", "r"); + if (cols) { + fread(cols, 1, sizeof(sh_columns), sh_columns); + fclose(cols); + } + + FILE *lines = popen("tput lines", "r"); + if (lines) { + fread(lines, 1, sizeof(sh_lines), sh_lines); + fclose(lines); + } + #endif + + setenv("COLUMNS", sh_columns, 1); + setenv("LINES", sh_lines, 1); +} + int sh_interactive(void) { struct shed ed = { @@ -33,6 +77,11 @@ int sh_interactive(void) .handle = shed_handle_non_vi, }; + sh_getwinsize(); + #ifdef SIGWINCH + signal(SIGWINCH, sh_sigwinch); + #endif + while (shed(&ed) != NULL) { if (ed.cur->nread == 1 && ed.cur->buf[0] == CTRL_D) { printf("\n"); @@ -44,6 +93,12 @@ int sh_interactive(void) } struct command *command = sh_parse(ed.cur->buf); + if (errno == SIGINT) { + if (got_sigwinch) { + sh_getwinsize(); + } + } + if (command) { sh_execute(command); sh_freecmd(command); -- cgit v1.2.1