URI: 
       tHandle terminal resizing - sacc - sacc(omys), simple console gopher client (mirror)
  HTML git clone https://git.parazyd.org/sacc
   DIR Log
   DIR Files
   DIR Refs
   DIR LICENSE
       ---
   DIR commit ba3bd1d88313cb8b876bc5d05de3d7449c03f38b
   DIR parent 19ce7fd296bf5b5358b2d84a071466106ecf9204
  HTML Author: Quentin Rameau <quinq@fifth.space>
       Date:   Sat, 27 Jan 2018 18:03:17 +0100
       
       Handle terminal resizing
       
       Diffstat:
         M common.h                            |       1 +
         M sacc.c                              |       9 ++++++++-
         M ui_ti.c                             |      12 ++++++++++++
         M ui_txt.c                            |      33 +++++++++++++++++++++----------
       
       4 files changed, 44 insertions(+), 11 deletions(-)
       ---
   DIR diff --git a/common.h b/common.h
       t@@ -30,3 +30,4 @@ void uistatus(char *fmt, ...);
        void uicleanup(void);
        char *uiprompt(char *fmt, ...);
        void uisetup(void);
       +void uisigwinch(int signal);
   DIR diff --git a/sacc.c b/sacc.c
       t@@ -3,6 +3,7 @@
        #include <fcntl.h>
        #include <netdb.h>
        #include <netinet/in.h>
       +#include <signal.h>
        #include <stdarg.h>
        #include <stdio.h>
        #include <stdlib.h>
       t@@ -779,6 +780,7 @@ cleanup(void)
        static void
        setup(void)
        {
       +        struct sigaction sa;
                int fd;
        
                setenv("PAGER", "more", 0);
       t@@ -793,8 +795,13 @@ setup(void)
                        die("open: /dev/null: %s", strerror(errno));
                if (mkdir(tmpdir, S_IRWXU) < 0 && errno != EEXIST)
                        die("mkdir: %s: %s", tmpdir, strerror(errno));
       -        if(interactive = isatty(1))
       +        if(interactive = isatty(1)) {
                        uisetup();
       +                sigemptyset(&sa.sa_mask);
       +                sa.sa_handler = uisigwinch;
       +                sa.sa_flags = SA_RESTART;
       +                sigaction(SIGWINCH, &sa, NULL);
       +        }
        }
        
        int
   DIR diff --git a/ui_ti.c b/ui_ti.c
       t@@ -16,6 +16,7 @@
        static char bufout[256];
        static struct termios tsave;
        static struct termios tsacc;
       +static Item *curentry;
        #if defined(__NetBSD__)
        #undef tparm
        #define tparm tiparm
       t@@ -244,6 +245,8 @@ uidisplay(Item *entry)
                    !(entry->type == '1' || entry->type == '+' || entry->type == '7'))
                        return;
        
       +        curentry = entry;
       +
                putp(tparm(clear_screen));
                displaystatus(entry);
        
       t@@ -536,3 +539,12 @@ uiselectitem(Item *entry)
                        }
                }
        }
       +
       +void
       +uisigwinch(int signal)
       +{
       +        setupterm(NULL, 1, NULL);
       +        putp(tparm(change_scroll_region, 0, lines-2));
       +
       +        uidisplay(curentry);
       +}
   DIR diff --git a/ui_txt.c b/ui_txt.c
       t@@ -11,6 +11,8 @@
        #include "common.h"
        
        static char bufout[256];
       +static Item *curentry;
       +static char cmd;
        int lines, columns;
        
        static void
       t@@ -148,6 +150,8 @@ uidisplay(Item *entry)
                    !(dir = entry->dat))
                        return;
        
       +        curentry = entry;
       +
                items = dir->items;
                nitems = dir->nitems;
                nlines = dir->printoff + lines;
       t@@ -218,7 +222,6 @@ Item *
        uiselectitem(Item *entry)
        {
                Dir *dir;
       -        static char c;
                char buf[BUFSIZ], *sstr, nl;
                int item, nitems;
        
       t@@ -228,9 +231,9 @@ uiselectitem(Item *entry)
                nitems = dir ? dir->nitems : 0;
        
                for (;;) {
       -                if (!c)
       -                        c = 'h';
       -                printstatus(entry, c);
       +                if (!cmd)
       +                        cmd = 'h';
       +                printstatus(entry, cmd);
                        fflush(stdout);
        
                        if (!fgets(buf, sizeof(buf), stdin)) {
       t@@ -238,28 +241,28 @@ uiselectitem(Item *entry)
                                return NULL;
                        }
                        if (isdigit(*buf)) {
       -                        c = '\0';
       +                        cmd = '\0';
                                nl = '\0';
                                if (sscanf(buf, "%d%c", &item, &nl) != 2 || nl != '\n')
                                        item = -1;
                        } else if (!strcmp(buf+1, "\n")) {
                                item = -1;
       -                        c = *buf;
       +                        cmd = *buf;
                        } else if (*buf == '/') {
                                for (sstr = buf+1; *sstr && *sstr != '\n'; ++sstr)
                                     ;
                                *sstr = '\0';
                                sstr = buf+1;
       -                        c = *buf;
       +                        cmd = *buf;
                        } else if (isdigit(*(buf+1))) {
                                nl = '\0';
                                if (sscanf(buf+1, "%d%c", &item, &nl) != 2 || nl != '\n')
                                        item = -1;
                                else
       -                                c = *buf;
       +                                cmd = *buf;
                        }
        
       -                switch (c) {
       +                switch (cmd) {
                        case '\0':
                                break;
                        case 'q':
       t@@ -301,7 +304,7 @@ uiselectitem(Item *entry)
                                help();
                                continue;
                        default:
       -                        c = 'h';
       +                        cmd = 'h';
                                continue;
                        }
        
       t@@ -314,3 +317,13 @@ uiselectitem(Item *entry)
        
                return entry->entry;
        }
       +
       +void
       +uisigwinch(int signal)
       +{
       +        uisetup();
       +        putchar('\n');
       +        uidisplay(curentry);
       +        printstatus(curentry, cmd);
       +        fflush(stdout);
       +}