Add support for scroll(1) - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 21e0d6e8b8d20903494386e7e6f43201b3761154
 (DIR) parent 5703aa0390484dd7da4bd9c388c85708d8fcd339
 (HTM) Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
       Date:   Fri, 10 Apr 2020 22:06:32 +0200
       
       Add support for scroll(1)
       
       Scroll is a program that stores all the lines of its child and be used in st as
       a way of implementing scrollback.
       
       This solution is much better than implementing the scrollback in st itself
       because having a different program allows to use it in any other program
       without doing modifications to those programs.
       
       Diffstat:
         M config.def.h                        |       3 ++-
         M st.1                                |       3 ++-
         M st.c                                |      16 ++++++++++------
         M st.h                                |       1 +
       
       4 files changed, 15 insertions(+), 8 deletions(-)
       ---
 (DIR) diff --git a/config.def.h b/config.def.h
       @@ -11,13 +11,14 @@ static int borderpx = 2;
        /*
         * What program is execed by st depends of these precedence rules:
         * 1: program passed with -e
       - * 2: utmp option
       + * 2: scroll and/or utmp
         * 3: SHELL environment variable
         * 4: value of shell in /etc/passwd
         * 5: value of shell in config.h
         */
        static char *shell = "/bin/sh";
        char *utmp = NULL;
       +char *scroll = NULL;
        char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400";
        
        /* identification sequence returned in DA and DECID */
 (DIR) diff --git a/st.1 b/st.1
       @@ -170,7 +170,8 @@ See the LICENSE file for the terms of redistribution.
        .SH SEE ALSO
        .BR tabbed (1),
        .BR utmp (1),
       -.BR stty (1)
       +.BR stty (1),
       +.BR scroll (1)
        .SH BUGS
        See the TODO file in the distribution.
        
 (DIR) diff --git a/st.c b/st.c
       @@ -664,7 +664,7 @@ die(const char *errstr, ...)
        void
        execsh(char *cmd, char **args)
        {
       -        char *sh, *prog;
       +        char *sh, *prog, *arg;
                const struct passwd *pw;
        
                errno = 0;
       @@ -678,13 +678,17 @@ execsh(char *cmd, char **args)
                if ((sh = getenv("SHELL")) == NULL)
                        sh = (pw->pw_shell[0]) ? pw->pw_shell : cmd;
        
       -        if (args)
       +        if (args) {
                        prog = args[0];
       -        else if (utmp)
       -                prog = utmp;
       -        else
       +                arg = NULL;
       +        } else if (scroll || utmp) {
       +                prog = scroll ? scroll : utmp;
       +                arg = scroll ? utmp : NULL;
       +        } else {
                        prog = sh;
       -        DEFAULT(args, ((char *[]) {prog, NULL}));
       +                arg = NULL;
       +        }
       +        DEFAULT(args, ((char *[]) {prog, arg, NULL}));
        
                unsetenv("COLUMNS");
                unsetenv("LINES");
 (DIR) diff --git a/st.h b/st.h
       @@ -113,6 +113,7 @@ char *xstrdup(char *);
        
        /* config.h globals */
        extern char *utmp;
       +extern char *scroll;
        extern char *stty_args;
        extern char *vtiden;
        extern wchar_t *worddelimiters;