The hackers@ mailinglist is intended for upstream patches.

Anyone can modify and push to the wiki repository.

On Sun, Feb 15, 2026 at 02:31:00PM -0300, . wrote:
> (rewritten my previous email in proper format)
> 
> Hello. The original st-externalpipe-eternal patch 
> (https://st.suckless.org/patches/externalpipe/st-externalpipe-eternal-0.8.3.diff),
>  which allows the piping of the entire terminal buffer, does not work with 
> the st-scrollback-ringbuffer patch 
> (https://st.suckless.org/patches/scrollback/st-scrollback-ringbuffer-0.9.2.diff).
>  I made a completely new patch that allows the entire screen to be piped 
> while using the scrollback ringbuffer patch. Please note that the patch uses 
> term.line and not TLINE because I expect this patch to be applied immediately 
> after the externalpipe patch (since externalpipe is useless without eternal) 
> and thus want the patching to be seamless. Please place this patch in the 
> externalpipe page (https://st.suckless.org/patches/externalpipe/). Thank you 
> very much.
> 
> 
> diff -up a/st.c b/st.c
> --- a/st.c      2026-02-12 14:56:55.248311919 -0300
> +++ b/st.c      2026-02-12 14:36:36.827197795 -0300
> @@ -2513,21 +2513,21 @@ externalpipe(const Arg *arg)
>          /* ignore sigpipe for now, in case child exists early */
>          oldsigpipe = signal(SIGPIPE, SIG_IGN);
>          newline = 0;
> -       for (n = 0; n < term.row; n++) {
> -               bp = term.line[n];
> -               lastpos = MIN(tlinelen(n) + 1, term.col) - 1;
> -                if (lastpos < 0)
> -                        break;
> -                end = &bp[lastpos + 1];
> -                for (; bp < end; ++bp)
> -                        if (xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0)
> -                                break;
> -               if ((newline = term.line[n][lastpos].mode & ATTR_WRAP))
> -                        continue;
> -                if (xwrite(to[1], "\n", 1) < 0)
> -                        break;
> -                newline = 0;
> -        }
> +       int histlen = term.screen[0].cur < term.screen[0].size
> +               ? term.screen[0].cur
> +               : term.screen[0].size;
> +       int total = histlen + term.row;
> +       for (int n = -histlen; n < term.row; n++) {
> +               Line line = TLINE(n);
> +               int len = tlinelen(n);
> +               for (int i = 0; i < len; i++) {
> +                       char buf[UTF_SIZ];
> +                       if (xwrite(to[1], buf, utf8encode(line[i].u, buf)) < 
> 0)
> +                               break;
> +               }
> +               if (len > 0 && !(line[len - 1].mode & ATTR_WRAP))
> +                       xwrite(to[1], "\n", 1);
> +       }
>          if (newline)
>                  (void)xwrite(to[1], "\n", 1);
>          close(to[1]);
> 
> 
> 

-- 
Kind regards,
Hiltjo

Reply via email to