# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit 21e0d6e8b8d20903494386e7e6f43201b3761154
    parent 5703aa0390484dd7da4bd9c388c85708d8fcd339
    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:
    Mconfig.def.h | 3++-
    Mst.1 | 3++-
    Mst.c | 16++++++++++------
    Mst.h | 1+

    4 files changed, 15 insertions(+), 8 deletions(-)
    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 */
    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.

    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");
    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;