t* st + patches and config
       
   URI git clone git://git.codevoid.de/st-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 9ff63b5658193fbd8be5d78135d1c42dd6ca5866
   DIR parent 6353900e901d8e6ee4c28fb5d4d9d5418283af58
   URI Author: c0dev0id <sh+github[at]codevoid[dot]de>
       Date:   Tue,  1 Dec 2020 08:17:44 +0100
       
       Rework ST version and patchset
       
       Diffstat:
         M FAQ                                 |     109 +++++++++++++++++++++++++++----
         M LICENSE                             |       2 +-
         M Makefile                            |       5 ++---
         M config.def.h                        |      71 ++++++++++++++-----------------
         M config.h                            |     151 ++++++++++++++-----------------
         M config.mk                           |       6 +++---
         D patches/st-anysize-0.8.1.diff       |     152 -------------------------------
         D patches/st-boxdraw_v2-0.8.2.diff    |     598 -------------------------------
         D patches/st-clipboard-20180309-c5ba… |      13 -------------
         D patches/st-copyurl-20180427-70b705… |     139 ------------------------------
         D patches/st-disable-bold-italic-fon… |      70 -------------------------------
         D patches/st-openclipboard-20180525-… |      73 -------------------------------
         D patches/st-relativeborder-20171207… |      51 -------------------------------
         D patches/st-scrollback-0.8.diff      |     348 -------------------------------
         A patches/st-scrollback-20200419-72e… |     351 +++++++++++++++++++++++++++++++
         D patches/st-scrollback-mouse-0.8.di… |      71 -------------------------------
         D patches/st-vertcenter-20180320-6ac… |      51 -------------------------------
         A patches/st-w3m-0.8.3.diff           |      42 +++++++++++++++++++++++++++++++
         M st.1                                |       7 ++-----
         M st.c                                |     345 +++++++++++--------------------
         M st.h                                |      36 ++++++--------------------------
         M st.info                             |      33 +++++++++++++++++++++++--------
         M win.h                               |       2 ++
         M x.c                                 |     570 +++++++++++++++++--------------
       
       24 files changed, 1063 insertions(+), 2233 deletions(-)
       ---
   DIR diff --git a/FAQ b/FAQ
       t@@ -1,6 +1,7 @@
        ## Why does st not handle utmp entries?
        
       -Use the excellent tool of [utmp](http://git.suckless.org/utmp/) for this task.
       +Use the excellent tool of [utmp](https://git.suckless.org/utmp/) for this task.
       +
        
        ## Some _random program_ complains that st is unknown/not recognised/unsupported/whatever!
        
       t@@ -8,6 +9,7 @@ It means that st doesn’t have any terminfo entry on your system. Chances are
        you did not `make install`. If you just want to test it without installing it,
        you can manually run `tic -sx st.info`.
        
       +
        ## Nothing works, and nothing is said about an unknown terminal!
        
        * Some programs just assume they’re running in xterm i.e. they don’t rely on
       t@@ -15,19 +17,21 @@ you can manually run `tic -sx st.info`.
        * Some programs don’t complain about the lacking st description and default to
          another terminal. In that case see the question about terminfo.
        
       -## I get some weird glitches/visual bug on _random program_!
       -
       -Try launching it with a different TERM: $ TERM=xterm myapp. toe(1) will give
       -you a list of available terminals, but you’ll most likely switch between xterm,
       -st or st-256color. The default value for TERM can be changed in config.h
       -(TNAME).
        
        ## How do I scroll back up?
        
       -Using a terminal multiplexer.
       +* Using a terminal multiplexer.
       +        * `st -e tmux` using C-b [
       +        * `st -e screen` using C-a ESC
       +* Using the excellent tool of [scroll](https://git.suckless.org/scroll/).
       +* Using the scrollback [patch](https://st.suckless.org/patches/scrollback/).
       +
       +
       +## I would like to have utmp and/or scroll functionality by default
       +
       +You can add the absolute patch of both programs in your config.h
       +file. You only have to modify the value of utmp and scroll variables.
        
       -* `st -e tmux` using C-b [
       -* `st -e screen` using C-a ESC
        
        ## Why doesn't the Del key work in some programs?
        
       t@@ -84,12 +88,14 @@ If you are using zsh, then read the zsh FAQ
        
        Putting these lines into your .zshrc will fix the problems.
        
       +
        ## How can I use meta in 8bit mode?
        
        St supports meta in 8bit mode, but the default terminfo entry doesn't
        use this capability. If you want it, you have to use the 'st-meta' value
        in TERM.
        
       +
        ## I cannot compile st in OpenBSD
        
        OpenBSD lacks librt, despite it being mandatory in POSIX
       t@@ -98,13 +104,14 @@ If you want to compile st for OpenBSD you have to remove -lrt from config.mk, an
        st will compile without any loss of functionality, because all the functions are
        included in libc on this platform.
        
       +
        ## The Backspace Case
        
        St is emulating the Linux way of handling backspace being delete and delete being
        backspace.
        
        This is an issue that was discussed in suckless mailing list
       -<http://lists.suckless.org/dev/1404/20697.html>. Here is why some old grumpy
       +<https://lists.suckless.org/dev/1404/20697.html>. Here is why some old grumpy
        terminal users wants its backspace to be how he feels it:
        
                Well, I am going to comment why I want to change the behaviour
       t@@ -159,9 +166,85 @@ terminal users wants its backspace to be how he feels it:
                [1] http://www.ibb.net/~anne/keyboard.html
                [2] http://www.tldp.org/HOWTO/Keyboard-and-Console-HOWTO-5.html
        
       +
        ## But I really want the old grumpy behaviour of my terminal
        
        Apply [1].
        
       -[1] http://st.suckless.org/patches/delkey
       -
       +[1] https://st.suckless.org/patches/delkey
       +
       +
       +## Why do images not work in st using the w3m image hack?
       +
       +w3mimg uses a hack that draws an image on top of the terminal emulator Drawable
       +window. The hack relies on the terminal to use a single buffer to draw its
       +contents directly.
       +
       +st uses double-buffered drawing so the image is quickly replaced and may show a
       +short flicker effect.
       +
       +Below is a patch example to change st double-buffering to a single Drawable
       +buffer.
       +
       +diff --git a/x.c b/x.c
       +--- a/x.c
       ++++ b/x.c
       +@@ -732,10 +732,6 @@ xresize(int col, int row)
       +         win.tw = col * win.cw;
       +         win.th = row * win.ch;
       + 
       +-        XFreePixmap(xw.dpy, xw.buf);
       +-        xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
       +-                        DefaultDepth(xw.dpy, xw.scr));
       +-        XftDrawChange(xw.draw, xw.buf);
       +         xclear(0, 0, win.w, win.h);
       + 
       +         /* resize to new width */
       +@@ -1148,8 +1144,7 @@ xinit(int cols, int rows)
       +         gcvalues.graphics_exposures = False;
       +         dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures,
       +                         &gcvalues);
       +-        xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
       +-                        DefaultDepth(xw.dpy, xw.scr));
       ++        xw.buf = xw.win;
       +         XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel);
       +         XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h);
       + 
       +@@ -1632,8 +1627,6 @@ xdrawline(Line line, int x1, int y1, int x2)
       + void
       + xfinishdraw(void)
       + {
       +-        XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, win.w,
       +-                        win.h, 0, 0);
       +         XSetForeground(xw.dpy, dc.gc,
       +                         dc.col[IS_SET(MODE_REVERSE)?
       +                                 defaultfg : defaultbg].pixel);
       +
       +
       +## BadLength X error in Xft when trying to render emoji
       +
       +Xft makes st crash when rendering color emojis with the following error:
       +
       +"X Error of failed request:  BadLength (poly request too large or internal Xlib length error)"
       +  Major opcode of failed request:  139 (RENDER)
       +  Minor opcode of failed request:  20 (RenderAddGlyphs)
       +  Serial number of failed request: 1595
       +  Current serial number in output stream:  1818"
       +
       +This is a known bug in Xft (not st) which happens on some platforms and
       +combination of particular fonts and fontconfig settings.
       +
       +See also:
       +https://gitlab.freedesktop.org/xorg/lib/libxft/issues/6
       +https://bugs.freedesktop.org/show_bug.cgi?id=107534
       +https://bugzilla.redhat.com/show_bug.cgi?id=1498269
       +
       +The solution is to remove color emoji fonts or disable this in the fontconfig
       +XML configuration.  As an ugly workaround (which may work only on newer
       +fontconfig versions (FC_COLOR)), the following code can be used to mask color
       +fonts:
       +
       +        FcPatternAddBool(fcpattern, FC_COLOR, FcFalse);
       +
       +Please don't bother reporting this bug to st, but notify the upstream Xft
       +developers about fixing this bug.
   DIR diff --git a/LICENSE b/LICENSE
       t@@ -1,6 +1,6 @@
        MIT/X Consortium License
        
       -© 2014-2018 Hiltjo Posthuma <hiltjo at codemadness dot org>
       +© 2014-2020 Hiltjo Posthuma <hiltjo at codemadness dot org>
        © 2018 Devin J. Pohly <djpohly at gmail dot com>
        © 2014-2017 Quentin Rameau <quinq at fifth dot space>
        © 2009-2012 Aurélien APTEL <aurelien dot aptel at gmail dot com>
   DIR diff --git a/Makefile b/Makefile
       t@@ -4,7 +4,7 @@
        
        include config.mk
        
       -SRC = st.c x.c boxdraw.c
       +SRC = st.c x.c
        OBJ = $(SRC:.c=.o)
        
        all: options st
       t@@ -22,8 +22,7 @@ config.h:
                $(CC) $(STCFLAGS) -c $<
        
        st.o: config.h st.h win.h
       -x.o: arg.h st.h win.h
       -boxdraw.o: config.h st.h boxdraw_data.h
       +x.o: arg.h config.h st.h win.h
        
        $(OBJ): config.h config.mk
        
   DIR diff --git a/config.def.h b/config.def.h
       t@@ -11,13 +11,15 @@ 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;
       +/* scroll program: to enable use a string like "scroll" */
       +char *scroll = NULL;
        char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400";
        
        /* identification sequence returned in DA and DECID */
       t@@ -30,9 +32,9 @@ static float chscale = 1.0;
        /*
         * word delimiter string
         *
       - * More advanced example: " `'\"()[]{}"
       + * More advanced example: L" `'\"()[]{}"
         */
       -char *worddelimiters = " ";
       +wchar_t *worddelimiters = L" ";
        
        /* selection timeouts (in milliseconds) */
        static unsigned int doubleclicktimeout = 300;
       t@@ -41,9 +43,18 @@ static unsigned int tripleclicktimeout = 600;
        /* alt screens */
        int allowaltscreen = 1;
        
       -/* frames per second st should at maximum draw to the screen */
       -static unsigned int xfps = 120;
       -static unsigned int actionfps = 30;
       +/* allow certain non-interactive (insecure) window operations such as:
       +   setting the clipboard text */
       +int allowwindowops = 0;
       +
       +/*
       + * draw latency range in ms - from new content/keypress/etc until drawing.
       + * within this range, st draws when content stops arriving (idle). mostly it's
       + * near minlatency, but it waits longer for slow updates to avoid partial draw.
       + * low minlatency will tear/flicker more, as it can "detect" idle too early.
       + */
       +static double minlatency = 8;
       +static double maxlatency = 33;
        
        /*
         * blinking timeout (set to 0 to disable blinking) for the terminal blinking
       t@@ -57,18 +68,6 @@ static unsigned int blinktimeout = 800;
        static unsigned int cursorthickness = 2;
        
        /*
       - * 1: render most of the lines/blocks characters without using the font for
       - *    perfect alignment between cells (U2500 - U259F except dashes/diagonals).
       - *    Bold affects lines thickness if boxdraw_bold is not 0. Italic is ignored.
       - * 0: disable (render all U25XX glyphs normally from the font).
       - */
       -const int boxdraw = 0;
       -const int boxdraw_bold = 0;
       -
       -/* braille (U28XX):  1: render as adjacent "pixels",  0: use font */
       -const int boxdraw_braille = 0;
       -
       -/*
         * bell volume. It must be a value between -100 and 100. Use 0 for disabling
         * it
         */
       t@@ -163,19 +162,23 @@ static unsigned int mousebg = 0;
        static unsigned int defaultattr = 11;
        
        /*
       + * Force mouse select/shortcuts while mask is active (when MODE_MOUSE is set).
       + * Note that if you want to use ShiftMask with selmasks, set this to an other
       + * modifier, set to 0 to not use it.
       + */
       +static uint forcemousemod = ShiftMask;
       +
       +/*
         * Internal mouse shortcuts.
         * Beware that overloading Button1 will disable the selection.
         */
        static MouseShortcut mshortcuts[] = {
       -        /* button               mask            string */
       -        { Button4,              XK_NO_MOD,      "\031" },
       -        { Button5,              XK_NO_MOD,      "\005" },
       -};
       -
       -MouseKey mkeys[] = {
       -        /* button               mask            function        argument */
       -        { Button4,              ShiftMask,      kscrollup,      {.i =  1} },
       -        { Button5,              ShiftMask,      kscrolldown,    {.i =  1} },
       +        /* mask                 button   function        argument       release */
       +        { XK_ANY_MOD,           Button2, selpaste,       {.i = 0},      1 },
       +        { ShiftMask,            Button4, ttysend,        {.s = "\033[5;2~"} },
       +        { XK_ANY_MOD,           Button4, ttysend,        {.s = "\031"} },
       +        { ShiftMask,            Button5, ttysend,        {.s = "\033[6;2~"} },
       +        { XK_ANY_MOD,           Button5, ttysend,        {.s = "\005"} },
        };
        
        /* Internal keyboard shortcuts. */
       t@@ -194,9 +197,8 @@ static Shortcut shortcuts[] = {
                { TERMMOD,              XK_C,           clipcopy,       {.i =  0} },
                { TERMMOD,              XK_V,           clippaste,      {.i =  0} },
                { TERMMOD,              XK_Y,           selpaste,       {.i =  0} },
       +        { ShiftMask,            XK_Insert,      selpaste,       {.i =  0} },
                { TERMMOD,              XK_Num_Lock,    numlock,        {.i =  0} },
       -        { TERMMOD,              XK_I,           iso14755,       {.i =  0} },
       -        { TERMMOD,              XK_o,           opencopied,     {.v = "firefox --new-window"} },
                { ShiftMask,            XK_Page_Up,     kscrollup,      {.i = -1} },
                { ShiftMask,            XK_Page_Down,   kscrolldown,    {.i = -1} },
        };
       t@@ -216,10 +218,6 @@ static Shortcut shortcuts[] = {
         * * 0: no value
         * * > 0: cursor application mode enabled
         * * < 0: cursor application mode disabled
       - * crlf value
       - * * 0: no value
       - * * > 0: crlf mode is enabled
       - * * < 0: crlf mode is disabled
         *
         * Be careful with the order of the definitions because st searches in
         * this table sequentially, so any XK_ANY_MOD must be in the last
       t@@ -239,13 +237,6 @@ static KeySym mappedkeys[] = { -1 };
        static uint ignoremod = Mod2Mask|XK_SWITCH_MOD;
        
        /*
       - * Override mouse-select while mask is active (when MODE_MOUSE is set).
       - * Note that if you want to use ShiftMask with selmasks, set this to an other
       - * modifier, set to 0 to not use it.
       - */
       -static uint forceselmod = ShiftMask;
       -
       -/*
         * This is the huge key array which defines all compatibility to the Linux
         * world. Please decide about changes wisely.
         */
   DIR diff --git a/config.h b/config.h
       t@@ -5,41 +5,36 @@
         *
         * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
         */
       -static char *font = "AnonymiceNerdFont-11";
       +static char *font = "-monotype-cousine-medium-r-normal--30-217-100-100-m-0-iso10646-1";
        static int borderpx = 2;
       -static int borderperc = 20;
       -
       -int disablebold = 1;
       -int disableitalic = 1;
       -int disableroman = 1;
       -
       -#define histsize 2000
        
        /*
         * 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";
       +static char *shell = "/bin/ksh";
        char *utmp = NULL;
       +/* scroll program: to enable use a string like "scroll" */
       +char *scroll = NULL;
        char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400";
        
        /* identification sequence returned in DA and DECID */
        char *vtiden = "\033[?6c";
        
        /* Kerning / character bounding-box multipliers */
       -static float cwscale = 1.1;
       -static float chscale = 1.1;
       +static float cwscale = 1.0;
       +static float chscale = 1.0;
        
        /*
         * word delimiter string
         *
       - * More advanced example: " `'\"()[]{}"
       + * More advanced example: L" `'\"()[]{}"
         */
       -char *worddelimiters = " `'\"()[]{}¬<>";
       +wchar_t *worddelimiters = L" \"'`|()[]{}<>";
        
        /* selection timeouts (in milliseconds) */
        static unsigned int doubleclicktimeout = 300;
       t@@ -48,15 +43,24 @@ static unsigned int tripleclicktimeout = 600;
        /* alt screens */
        int allowaltscreen = 1;
        
       -/* frames per second st should at maximum draw to the screen */
       -static unsigned int xfps = 60;
       -static unsigned int actionfps = 30;
       +/* allow certain non-interactive (insecure) window operations such as:
       +   setting the clipboard text */
       +int allowwindowops = 0;
       +
       +/*
       + * draw latency range in ms - from new content/keypress/etc until drawing.
       + * within this range, st draws when content stops arriving (idle). mostly it's
       + * near minlatency, but it waits longer for slow updates to avoid partial draw.
       + * low minlatency will tear/flicker more, as it can "detect" idle too early.
       + */
       +static double minlatency = 1;
       +static double maxlatency = 33;
        
        /*
         * blinking timeout (set to 0 to disable blinking) for the terminal blinking
         * attribute.
         */
       -static unsigned int blinktimeout = 0;
       +static unsigned int blinktimeout = 800;
        
        /*
         * thickness of underline and bar cursors
       t@@ -64,26 +68,12 @@ static unsigned int blinktimeout = 0;
        static unsigned int cursorthickness = 2;
        
        /*
       - * 1: render most of the lines/blocks characters without using the font for
       - *    perfect alignment between cells (U2500 - U259F except dashes/diagonals).
       - *    Bold affects lines thickness if boxdraw_bold is not 0. Italic is ignored.
       - * 0: disable (render all U25XX glyphs normally from the font).
       - */
       -const int boxdraw = 1;
       -const int boxdraw_bold = 1;
       -
       -/* braille (U28XX):  1: render as adjacent "pixels",  0: use font */
       -const int boxdraw_braille = 1;
       -
       -/*
         * bell volume. It must be a value between -100 and 100. Use 0 for disabling
         * it
         */
        static int bellvolume = 0;
        
       -
        /* default TERM value */
       -// sorry, but this works perfectly compared to st-256color :(
        char *termname = "xterm-256color";
        
        /*
       t@@ -105,32 +95,32 @@ unsigned int tabspaces = 8;
        
        /* Terminal colors (16 first used in escape sequence) */
        static const char *colorname[] = {
       -        /* c0dev0id custom */
       -        "#181818",  /*  0: black    */
       -        "#dc322f",  /*  1: red      */
       -        "#859900",  /*  2: green    */
       -        "#b58900",  /*  3: yellow   */
       -        "#268bd2",  /*  4: blue     */
       -        "#d33682",  /*  5: magenta  */
       -        "#2aa198",  /*  6: cyan     */
       -        "#D6D5D3",  /*  7: white    */
       -        "#000000",  /*  8: brblack  */
       -        "#cb4b16",  /*  9: brred    */
       -        "#5B6900",  /* 10: brgreen  */
       -        "#7E6000",  /* 11: bryellow */
       -        "#045E9D",  /* 12: brblue   */
       -        "#A62E68",  /* 13: brmagenta*/
       -        "#127E76",  /* 14: brcyan   */
       -        "#eee8d5",  /* 15: brwhite  */
       +        /* 8 normal colors */
       +        "black",
       +        "red3",
       +        "green3",
       +        "yellow3",
       +        "blue2",
       +        "magenta3",
       +        "cyan3",
       +        "gray80",
       +
       +        /* 8 bright colors */
       +        "gray50",
       +        "red",
       +        "green",
       +        "yellow",
       +        "#5c5cff",
       +        "magenta",
       +        "cyan",
       +        "white",
        
                [255] = 0,
        
       -        /* more colors can be added after 255 to use with DefaultXX */
                "#990000",
       -        "#000000",
       +        "#000400",
        };
        
       -
        /*
         * Default colors (colorname index)
         * foreground, background, cursor, reverse cursor
       t@@ -170,19 +160,23 @@ static unsigned int mousebg = 0;
        static unsigned int defaultattr = 11;
        
        /*
       + * Force mouse select/shortcuts while mask is active (when MODE_MOUSE is set).
       + * Note that if you want to use ShiftMask with selmasks, set this to an other
       + * modifier, set to 0 to not use it.
       + */
       +static uint forcemousemod = ShiftMask;
       +
       +/*
         * Internal mouse shortcuts.
         * Beware that overloading Button1 will disable the selection.
         */
        static MouseShortcut mshortcuts[] = {
       -        /* button               mask            string */
       -//        { Button4,              XK_NO_MOD,      "\031" },
       -//        { Button5,              XK_NO_MOD,      "\005" },
       -};
       -
       -MouseKey mkeys[] = {
       -        /* button               mask            function        argument */
       -//        { Button4,              ShiftMask,      kscrollup,      {.i =  1} },
       -//        { Button5,              ShiftMask,      kscrolldown,    {.i =  1} },
       +        /* mask                 button   function        argument       release */
       +        { XK_ANY_MOD,           Button2, selpaste,       {.i = 0},      1 },
       +        { ShiftMask,            Button4, ttysend,        {.s = "\033[5;2~"} },
       +        { XK_ANY_MOD,           Button4, ttysend,        {.s = "\031"} },
       +        { ShiftMask,            Button5, ttysend,        {.s = "\033[6;2~"} },
       +        { XK_ANY_MOD,           Button5, ttysend,        {.s = "\005"} },
        };
        
        /* Internal keyboard shortcuts. */
       t@@ -191,22 +185,22 @@ MouseKey mkeys[] = {
        
        static Shortcut shortcuts[] = {
                /* mask                 keysym          function        argument */
       -//        { XK_ANY_MOD,           XK_Break,       sendbreak,      {.i =  0} },
       -//        { ControlMask,          XK_Print,       toggleprinter,  {.i =  0} },
       -//        { ShiftMask,            XK_Print,       printscreen,    {.i =  0} },
       -//        { XK_ANY_MOD,           XK_Print,       printsel,       {.i =  0} },
       +        { XK_ANY_MOD,           XK_Break,       sendbreak,      {.i =  0} },
       +        { ControlMask,          XK_Print,       toggleprinter,  {.i =  0} },
       +        { ShiftMask,            XK_Print,       printscreen,    {.i =  0} },
       +        { XK_ANY_MOD,           XK_Print,       printsel,       {.i =  0} },
                { TERMMOD,              XK_Prior,       zoom,           {.f = +1} },
                { TERMMOD,              XK_Next,        zoom,           {.f = -1} },
       -//        { TERMMOD,              XK_Home,        zoomreset,      {.f =  0} },
       -//        { TERMMOD,              XK_C,           clipcopy,       {.i =  0} },
       -//        { TERMMOD,              XK_V,           clippaste,      {.i =  0} },
       -//        { TERMMOD,              XK_Y,           selpaste,       {.i =  0} },
       -//        { TERMMOD,              XK_Num_Lock,    numlock,        {.i =  0} },
       -//        { TERMMOD,              XK_I,           iso14755,       {.i =  0} },
       -//        { TERMMOD,              XK_L,           copyurl,        {.i =  0} },
       -//        { TERMMOD,              XK_O,           opencopied,     {.v = "rifle"} },
       +        { TERMMOD,              XK_Home,        zoomreset,      {.f =  0} },
       +        { TERMMOD,              XK_C,           clipcopy,       {.i =  0} },
       +        { TERMMOD,              XK_V,           clippaste,      {.i =  0} },
       +        { TERMMOD,              XK_Y,           selpaste,       {.i =  0} },
       +        { ShiftMask,            XK_Insert,      selpaste,       {.i =  0} },
       +        { TERMMOD,              XK_Num_Lock,    numlock,        {.i =  0} },
                { ShiftMask,            XK_Page_Up,     kscrollup,      {.i = -1} },
                { ShiftMask,            XK_Page_Down,   kscrolldown,    {.i = -1} },
       +        { MODKEY,               XK_Page_Up,     kscrollup,      {.i = -1} },
       +        { MODKEY,               XK_Page_Down,   kscrolldown,    {.i = -1} },
        };
        
        /*
       t@@ -224,10 +218,6 @@ static Shortcut shortcuts[] = {
         * * 0: no value
         * * > 0: cursor application mode enabled
         * * < 0: cursor application mode disabled
       - * crlf value
       - * * 0: no value
       - * * > 0: crlf mode is enabled
       - * * < 0: crlf mode is disabled
         *
         * Be careful with the order of the definitions because st searches in
         * this table sequentially, so any XK_ANY_MOD must be in the last
       t@@ -247,13 +237,6 @@ static KeySym mappedkeys[] = { -1 };
        static uint ignoremod = Mod2Mask|XK_SWITCH_MOD;
        
        /*
       - * Override mouse-select while mask is active (when MODE_MOUSE is set).
       - * Note that if you want to use ShiftMask with selmasks, set this to an other
       - * modifier, set to 0 to not use it.
       - */
       -static uint forceselmod = ShiftMask;
       -
       -/*
         * This is the huge key array which defines all compatibility to the Linux
         * world. Please decide about changes wisely.
         */
   DIR diff --git a/config.mk b/config.mk
       t@@ -1,5 +1,5 @@
        # st version
       -VERSION = 0.8.2
       +VERSION = 0.8.4
        
        # Customize below to fit your system
        
       t@@ -28,8 +28,8 @@ STLDFLAGS = $(LIBS) $(LDFLAGS)
        # OpenBSD:
        CPPFLAGS = -DVERSION=\"$(VERSION)\" -D_XOPEN_SOURCE=600 -D_BSD_SOURCE
        LIBS = -L$(X11LIB) -lm -lX11 -lutil -lXft \
       -       `pkg-config --libs fontconfig` \
       -       `pkg-config --libs freetype2`
       +       `$(PKG_CONFIG) --libs fontconfig` \
       +       `$(PKG_CONFIG) --libs freetype2`
        
        # compiler and linker
        # CC = c99
   DIR diff --git a/patches/st-anysize-0.8.1.diff b/patches/st-anysize-0.8.1.diff
       t@@ -1,152 +0,0 @@
       -diff --git a/x.c b/x.c
       -index 00cb6b1..8f87c0f 100644
       ---- a/x.c
       -+++ b/x.c
       -@@ -78,6 +78,7 @@ typedef XftGlyphFontSpec GlyphFontSpec;
       - typedef struct {
       -         int tw, th; /* tty width and height */
       -         int w, h; /* window width and height */
       -+        int hborderpx, vborderpx;
       -         int ch; /* char height */
       -         int cw; /* char width  */
       -         int mode; /* window state/mode flags */
       -@@ -311,7 +312,7 @@ zoomreset(const Arg *arg)
       - int
       - evcol(XEvent *e)
       - {
       --        int x = e->xbutton.x - borderpx;
       -+        int x = e->xbutton.x - win.hborderpx;
       -         LIMIT(x, 0, win.tw - 1);
       -         return x / win.cw;
       - }
       -@@ -319,7 +320,7 @@ evcol(XEvent *e)
       - int
       - evrow(XEvent *e)
       - {
       --        int y = e->xbutton.y - borderpx;
       -+        int y = e->xbutton.y - win.vborderpx;
       -         LIMIT(y, 0, win.th - 1);
       -         return y / win.ch;
       - }
       -@@ -675,6 +676,9 @@ cresize(int width, int height)
       -         col = MAX(1, col);
       -         row = MAX(1, row);
       - 
       -+        win.hborderpx = (win.w - col * win.cw) / 2;
       -+        win.vborderpx = (win.h - row * win.ch) / 2;
       -+
       -         tresize(col, row);
       -         xresize(col, row);
       -         ttyresize(win.tw, win.th);
       -@@ -793,8 +797,8 @@ xhints(void)
       -         sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize;
       -         sizeh->height = win.h;
       -         sizeh->width = win.w;
       --        sizeh->height_inc = win.ch;
       --        sizeh->width_inc = win.cw;
       -+        sizeh->height_inc = 1;
       -+        sizeh->width_inc = 1;
       -         sizeh->base_height = 2 * borderpx;
       -         sizeh->base_width = 2 * borderpx;
       -         sizeh->min_height = win.ch + 2 * borderpx;
       -@@ -1022,8 +1026,8 @@ xinit(int cols, int rows)
       -         xloadcols();
       - 
       -         /* adjust fixed window geometry */
       --        win.w = 2 * borderpx + cols * win.cw;
       --        win.h = 2 * borderpx + rows * win.ch;
       -+        win.w = 2 * win.hborderpx + cols * win.cw;
       -+        win.h = 2 * win.vborderpx + rows * win.ch;
       -         if (xw.gm & XNegative)
       -                 xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2;
       -         if (xw.gm & YNegative)
       -@@ -1123,7 +1127,7 @@ xinit(int cols, int rows)
       - int
       - xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y)
       - {
       --        float winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, xp, yp;
       -+        float winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, xp, yp;
       -         ushort mode, prevmode = USHRT_MAX;
       -         Font *font = &dc.font;
       -         int frcflags = FRC_NORMAL;
       -@@ -1259,7 +1263,7 @@ void
       - xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y)
       - {
       -         int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1);
       --        int winx = borderpx + x * win.cw, winy = borderpx + y * win.ch,
       -+        int winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch,
       -             width = charlen * win.cw;
       -         Color *fg, *bg, *temp, revfg, revbg, truefg, truebg;
       -         XRenderColor colfg, colbg;
       -@@ -1349,17 +1353,17 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i
       - 
       -         /* Intelligent cleaning up of the borders. */
       -         if (x == 0) {
       --                xclear(0, (y == 0)? 0 : winy, borderpx,
       -+                xclear(0, (y == 0)? 0 : winy, win.vborderpx,
       -                         winy + win.ch +
       --                        ((winy + win.ch >= borderpx + win.th)? win.h : 0));
       -+                        ((winy + win.ch >= win.vborderpx + win.th)? win.h : 0));
       -         }
       --        if (winx + width >= borderpx + win.tw) {
       -+        if (winx + width >= win.hborderpx + win.tw) {
       -                 xclear(winx + width, (y == 0)? 0 : winy, win.w,
       --                        ((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch)));
       -+                        ((winy + win.ch >= win.vborderpx + win.th)? win.h : (winy + win.ch)));
       -         }
       -         if (y == 0)
       --                xclear(winx, 0, winx + width, borderpx);
       --        if (winy + win.ch >= borderpx + win.th)
       -+                xclear(winx, 0, winx + width, win.hborderpx);
       -+        if (winy + win.ch >= win.vborderpx + win.th)
       -                 xclear(winx, winy + win.ch, winx + width, win.h);
       - 
       -         /* Clean up the region we want to draw to. */
       -@@ -1452,35 +1456,35 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
       -                 case 3: /* Blinking Underline */
       -                 case 4: /* Steady Underline */
       -                         XftDrawRect(xw.draw, &drawcol,
       --                                        borderpx + cx * win.cw,
       --                                        borderpx + (cy + 1) * win.ch - \
       -+                                        win.hborderpx + cx * win.cw,
       -+                                        win.vborderpx + (cy + 1) * win.ch - \
       -                                                 cursorthickness,
       -                                         win.cw, cursorthickness);
       -                         break;
       -                 case 5: /* Blinking bar */
       -                 case 6: /* Steady bar */
       -                         XftDrawRect(xw.draw, &drawcol,
       --                                        borderpx + cx * win.cw,
       --                                        borderpx + cy * win.ch,
       -+                                        win.hborderpx + cx * win.cw,
       -+                                        win.vborderpx + cy * win.ch,
       -                                         cursorthickness, win.ch);
       -                         break;
       -                 }
       -         } else {
       -                 XftDrawRect(xw.draw, &drawcol,
       --                                borderpx + cx * win.cw,
       --                                borderpx + cy * win.ch,
       -+                                win.hborderpx + cx * win.cw,
       -+                                win.vborderpx + cy * win.ch,
       -                                 win.cw - 1, 1);
       -                 XftDrawRect(xw.draw, &drawcol,
       --                                borderpx + cx * win.cw,
       --                                borderpx + cy * win.ch,
       -+                                win.hborderpx + cx * win.cw,
       -+                                win.vborderpx + cy * win.ch,
       -                                 1, win.ch - 1);
       -                 XftDrawRect(xw.draw, &drawcol,
       --                                borderpx + (cx + 1) * win.cw - 1,
       --                                borderpx + cy * win.ch,
       -+                                win.hborderpx + (cx + 1) * win.cw - 1,
       -+                                win.vborderpx + cy * win.ch,
       -                                 1, win.ch - 1);
       -                 XftDrawRect(xw.draw, &drawcol,
       --                                borderpx + cx * win.cw,
       --                                borderpx + (cy + 1) * win.ch - 1,
       -+                                win.hborderpx + cx * win.cw,
       -+                                win.vborderpx + (cy + 1) * win.ch - 1,
       -                                 win.cw, 1);
       -         }
       - }
       [1|diff --git a/patches/st-boxdraw_v2-0.8.2.diff b/patches/st-boxdraw_v2-0.8.2.diff|/git/st-sdk/file/patches/st-boxdraw_v2-0.8.2.diff.gph|ser