Adding st-flexipatch configs
4 files changed, 1319 insertions(+), 3 deletions(-)

M README.md
A => st/README.md
A => st/config.h
A => st/patches.h
M README.md +3 -3
@@ 10,8 10,8 @@ my setup. However, there are a few thing
 
 - I run i3-gaps w/ i3blocks and i3lock-color.
 - I have my own version of [suckless terminal][st] (st) with just a few patches
-  applied. You can [see my copy here][pst]
-- The OS is currently Alpine Linux 3.18, though this shouldn't matter.
+  applied. You can [see my config here][pst]
+- The OS is currently Alpine Linux 3.20, though this shouldn't matter.
 - See `.config/apps_to_build.md` for a list of applications that I built
   manually
 - **Specifically i3-gaps and i3lock-color. Things will not work without these**

          
@@ 25,4 25,4 @@ my setup. However, there are a few thing
   preference, if you don't want that, then use the original script.
 
 [st]: https://st.suckless.org/ "Suckless Terminal"
-[pst]: https://git.code.netlandish.com/~petersanchez/st "Peter's Suckless Terminal"
+[pst]: https://hg.code.netlandish.com/~petersanchez/dotfiles/browse/st?rev=tip

          
A => st/README.md +11 -0
@@ 0,0 1,11 @@ 
+# st configuration
+
+I'm now using [st-flexipatch][fst] to manage my [st][] setup and build versus
+my [old clone][pst] that was hard to maintain, etc.
+
+This directory has my `config.h` and `patches.h` files for my setup of
+st-flexipatch.
+
+[st]: https://st.suckless.org/ "Suckless Terminal"
+[pst]: https://git.code.netlandish.com/~petersanchez/st "Peter's Suckless Terminal"
+[fst]: https://github.com/bakkeby/st-flexipatch

          
A => st/config.h +817 -0
@@ 0,0 1,817 @@ 
+/* See LICENSE file for copyright and license details. */
+
+/*
+ * appearance
+ *
+ * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
+ */
+// static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true";
+static char *font = "DejaVu Sans Mono:pixelsize=17:antialias=true:autohint=true";
+#if FONT2_PATCH
+/* Spare fonts */
+static char *font2[] = {
+/*	"Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */
+/*	"Hack Nerd Font Mono:pixelsize=11:antialias=true:autohint=true", */
+};
+#endif // FONT2_PATCH
+
+#if BACKGROUND_IMAGE_PATCH
+/*
+ * background image
+ * expects farbfeld format
+ * pseudo transparency fixes coordinates to the screen origin
+ */
+static const char *bgfile = "/path/to/image.ff";
+static const int pseudotransparency = 0;
+#endif // BACKGROUND_IMAGE_PATCH
+
+#if RELATIVEBORDER_PATCH
+/* borderperc: percentage of cell width to use as a border
+ *             0 = no border, 100 = border width is same as cell width */
+int borderperc = 20;
+#else
+static int borderpx = 2;
+#endif // RELATIVEBORDER_PATCH
+
+#if OPENURLONCLICK_PATCH
+/* modkey options: ControlMask, ShiftMask or XK_ANY_MOD */
+static uint url_opener_modkey = XK_ANY_MOD;
+static char *url_opener = "xdg-open";
+#endif // OPENURLONCLICK_PATCH
+
+/*
+ * What program is execed by st depends of these precedence rules:
+ * 1: program passed with -e
+ * 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 */
+#if SIXEL_PATCH
+char *vtiden = "\033[?62;4c"; /* VT200 family (62) with sixel (4) */
+
+/* sixel rgb byte order: LSBFirst or MSBFirst */
+int const sixelbyteorder = LSBFirst;
+#else
+char *vtiden = "\033[?6c";
+#endif
+
+/* Kerning / character bounding-box multipliers */
+static float cwscale = 1.0;
+static float chscale = 1.0;
+
+/*
+ * word delimiter string
+ *
+ * More advanced example: L" `'\"()[]{}"
+ */
+wchar_t *worddelimiters = L" ";
+
+#if KEYBOARDSELECT_PATCH && REFLOW_PATCH
+/* Word delimiters for short and long jumps in the keyboard select patch */
+wchar_t *kbds_sdelim = L"!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~ ";
+wchar_t *kbds_ldelim = L" ";
+#endif // KEYBOARDSELECT_PATCH
+
+/* selection timeouts (in milliseconds) */
+static unsigned int doubleclicktimeout = 300;
+static unsigned int tripleclicktimeout = 600;
+
+/* alt screens */
+int allowaltscreen = 1;
+
+/* 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;
+
+#if SYNC_PATCH
+/*
+ * Synchronized-Update timeout in ms
+ * https://gitlab.com/gnachman/iterm2/-/wikis/synchronized-updates-spec
+ */
+static uint su_timeout = 200;
+#endif // SYNC_PATCH
+
+/*
+ * blinking timeout (set to 0 to disable blinking) for the terminal blinking
+ * attribute.
+ */
+static unsigned int blinktimeout = 800;
+
+/*
+ * thickness of underline and bar cursors
+ */
+static unsigned int cursorthickness = 2;
+
+#if HIDECURSOR_PATCH
+/* Hide the X cursor whenever a key is pressed. 0: off, 1: on */
+int hidecursor = 1;
+#endif // HIDECURSOR_PATCH
+
+#if BOXDRAW_PATCH
+/*
+ * 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;
+#endif // BOXDRAW_PATCH
+
+/*
+ * bell volume. It must be a value between -100 and 100. Use 0 for disabling
+ * it
+ */
+static int bellvolume = 0;
+
+/* default TERM value */
+char *termname = "st-256color";
+
+/*
+ * spaces per tab
+ *
+ * When you are changing this value, don't forget to adapt the »it« value in
+ * the st.info and appropriately install the st.info in the environment where
+ * you use this st version.
+ *
+ *	it#$tabspaces,
+ *
+ * Secondly make sure your kernel is not expanding tabs. When running `stty
+ * -a` »tab0« should appear. You can tell the terminal to not expand tabs by
+ *  running following command:
+ *
+ *	stty tabs
+ */
+unsigned int tabspaces = 8;
+
+#if ALPHA_PATCH
+/* bg opacity */
+float alpha = 0.8;
+#if ALPHA_GRADIENT_PATCH
+float grad_alpha = 0.54; //alpha value that'll change
+float stat_alpha = 0.46; //constant alpha value that'll get added to grad_alpha
+#endif // ALPHA_GRADIENT_PATCH
+#if ALPHA_FOCUS_HIGHLIGHT_PATCH
+float alphaUnfocused = 0.6;
+#endif // ALPHA_FOCUS_HIGHLIGHT_PATCH
+#endif // ALPHA_PATCH
+
+/* Terminal colors (16 first used in escape sequence) */
+static const char *colorname[] = {
+        /* 8 normal colors */
+        "#073642",  /*  0: black    */
+        "#dc322f",  /*  1: red      */
+        "#859900",  /*  2: green    */
+        "#b58900",  /*  3: yellow   */
+        "#268bd2",  /*  4: blue     */
+        "#d33682",  /*  5: magenta  */
+        "#2aa198",  /*  6: cyan     */
+        "#eee8d5",  /*  7: (grey) white    */
+
+        /* 8 bright colors */
+        "#002b36",  /*  8: brblack  */
+        "#cb4b16",  /*  9: brred    */
+        "#586e75",  /* 10: brgreen  */
+        "#657b83",  /* 11: bryellow */
+        "#839496",  /* 12: brblue   */
+        "#6c71c4",  /* 13: brmagenta*/
+        "#93a1a1",  /* 14: brcyan   */
+        "#fdf6e3",  /* 15: brwhite  */
+
+        [255] = 0,
+
+        /* more colors can be added after 255 to use with DefaultXX */
+        "black",
+        "#00cc00", /* 257 -> fg */
+        "magenta",  /* 258 -> cursor */
+        "#ebdbb2", /* 259 -> fg */
+};
+/*static const char *colorname[] = {
+	// 8 normal colors
+	"black",
+	"red3",
+	"green3",
+	"yellow3",
+	"blue2",
+	"magenta3",
+	"cyan3",
+	"gray90",
+
+	// 8 bright colors
+	"gray50",
+	"red",
+	"green",
+	"yellow",
+	"#5c5cff",
+	"magenta",
+	"cyan",
+	"white",
+
+	[255] = 0,
+
+	// more colors can be added after 255 to use with DefaultXX
+	"#add8e6", // 256 -> cursor
+	"#555555", /* 257 -> rev cursor
+	"#000000", /* 258 -> bg 
+	"#e5e5e5", /* 259 -> fg
+};*/
+
+
+/*
+ * Default colors (colorname index)
+ * foreground, background, cursor, reverse cursor
+ */
+#if ALPHA_PATCH && ALPHA_FOCUS_HIGHLIGHT_PATCH
+unsigned int defaultbg = 0;
+unsigned int bg = 17, bgUnfocused = 16;
+#else
+unsigned int defaultbg = 256;
+#endif // ALPHA_FOCUS_HIGHLIGHT_PATCH
+unsigned int defaultfg = 15;
+unsigned int defaultcs = 15;
+unsigned int defaultrcs = 15;
+#if SELECTION_COLORS_PATCH
+unsigned int selectionfg = 258;
+unsigned int selectionbg = 259;
+/* If 0 use selectionfg as foreground in order to have a uniform foreground-color */
+/* Else if 1 keep original foreground-color of each cell => more colors :) */
+static int ignoreselfg = 1;
+#endif // SELECTION_COLORS_PATCH
+#if KEYBOARDSELECT_PATCH && REFLOW_PATCH
+/* Foreground and background color of search results */
+unsigned int highlightfg = 15;
+unsigned int highlightbg = 160;
+#endif // KEYBOARDSELECT_PATCH
+
+#if BLINKING_CURSOR_PATCH
+/*
+ * https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h4-Functions-using-CSI-_-ordered-by-the-final-character-lparen-s-rparen:CSI-Ps-SP-q.1D81
+ * Default style of cursor
+ * 0: Blinking block
+ * 1: Blinking block (default)
+ * 2: Steady block ("â–ˆ")
+ * 3: Blinking underline
+ * 4: Steady underline ("_")
+ * 5: Blinking bar
+ * 6: Steady bar ("|")
+ * 7: Blinking st cursor
+ * 8: Steady st cursor
+ */
+static unsigned int cursorstyle = 1;
+static Rune stcursor = 0x2603; /* snowman (U+2603) */
+#else
+/*
+ * Default shape of cursor
+ * 2: Block ("█")
+ * 4: Underline ("_")
+ * 6: Bar ("|")
+ * 7: Snowman ("☃")
+ */
+static unsigned int cursorshape = 2;
+#endif // BLINKING_CURSOR_PATCH
+
+/*
+ * Default columns and rows numbers
+ */
+
+static unsigned int cols = 80;
+static unsigned int rows = 24;
+
+#if THEMED_CURSOR_PATCH
+/*
+ * Default shape of the mouse cursor
+ */
+static char* mouseshape = "xterm";
+#else
+/*
+ * Default colour and shape of the mouse cursor
+ */
+static unsigned int mouseshape = XC_xterm;
+static unsigned int mousefg = 7;
+static unsigned int mousebg = 0;
+#endif // THEMED_CURSOR_PATCH
+
+/*
+ * Color used to display font attributes when fontconfig selected a font which
+ * doesn't match the ones requested.
+ */
+static unsigned int defaultattr = 11;
+
+#if XRESOURCES_PATCH
+/*
+ * Xresources preferences to load at startup
+ */
+ResourcePref resources[] = {
+		{ "font",         STRING,  &font },
+		{ "color0",       STRING,  &colorname[0] },
+		{ "color1",       STRING,  &colorname[1] },
+		{ "color2",       STRING,  &colorname[2] },
+		{ "color3",       STRING,  &colorname[3] },
+		{ "color4",       STRING,  &colorname[4] },
+		{ "color5",       STRING,  &colorname[5] },
+		{ "color6",       STRING,  &colorname[6] },
+		{ "color7",       STRING,  &colorname[7] },
+		{ "color8",       STRING,  &colorname[8] },
+		{ "color9",       STRING,  &colorname[9] },
+		{ "color10",      STRING,  &colorname[10] },
+		{ "color11",      STRING,  &colorname[11] },
+		{ "color12",      STRING,  &colorname[12] },
+		{ "color13",      STRING,  &colorname[13] },
+		{ "color14",      STRING,  &colorname[14] },
+		{ "color15",      STRING,  &colorname[15] },
+		{ "background",   STRING,  &colorname[258] },
+		{ "foreground",   STRING,  &colorname[259] },
+		{ "cursorColor",  STRING,  &colorname[256] },
+		{ "termname",     STRING,  &termname },
+		{ "shell",        STRING,  &shell },
+		{ "minlatency",   INTEGER, &minlatency },
+		{ "maxlatency",   INTEGER, &maxlatency },
+		{ "blinktimeout", INTEGER, &blinktimeout },
+		{ "bellvolume",   INTEGER, &bellvolume },
+		{ "tabspaces",    INTEGER, &tabspaces },
+		#if RELATIVEBORDER_PATCH
+		{ "borderperc",   INTEGER, &borderperc },
+		#else
+		{ "borderpx",     INTEGER, &borderpx },
+		#endif // RELATIVEBORDER_PATCH
+		{ "cwscale",      FLOAT,   &cwscale },
+		{ "chscale",      FLOAT,   &chscale },
+		#if ALPHA_PATCH
+		{ "alpha",        FLOAT,   &alpha },
+		#endif // ALPHA_PATCH
+		#if ALPHA_FOCUS_HIGHLIGHT_PATCH
+		{ "alphaUnfocused",FLOAT,  &alphaUnfocused },
+		#endif // ALPHA_FOCUS_HIGHLIGHT_PATCH
+		#if KEYBOARDSELECT_PATCH && REFLOW_PATCH
+		{ "highlightfg",  INTEGER, &highlightfg },
+		{ "highlightbg",  INTEGER, &highlightbg },
+		#endif // KEYBOARDSELECT_PATCH
+};
+#endif // XRESOURCES_PATCH
+
+/*
+ * 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[] = {
+	/* mask                 button   function        argument       release  screen */
+	#if CLIPBOARD_PATCH
+	{ XK_ANY_MOD,           Button2, selpaste,      {.i = 0},      1 },
+	#else
+	{ XK_ANY_MOD,           Button2, selpaste,       {.i = 0},      1 },
+	#endif // CLIPBOARD_PATCH
+	#if SCROLLBACK_MOUSE_PATCH
+	{ ShiftMask,            Button4, kscrollup,      {.i = 1},      0, S_PRI},
+	{ ShiftMask,            Button5, kscrolldown,    {.i = 1},      0, S_PRI},
+	#elif UNIVERSCROLL_PATCH
+	{ XK_ANY_MOD,           Button4, ttysend,        {.s = "\033[5;2~"}, 0, S_PRI },
+	{ XK_ANY_MOD,           Button5, ttysend,        {.s = "\033[6;2~"}, 0, S_PRI },
+	#else
+	{ ShiftMask,            Button4, ttysend,        {.s = "\033[5;2~"} },
+	{ ShiftMask,            Button5, ttysend,        {.s = "\033[6;2~"} },
+	#endif // SCROLLBACK_MOUSE_PATCH
+	#if SCROLLBACK_MOUSE_ALTSCREEN_PATCH || REFLOW_PATCH
+	{ XK_NO_MOD,            Button4, kscrollup,      {.i = 1},      0, S_PRI },
+	{ XK_NO_MOD,            Button5, kscrolldown,    {.i = 1},      0, S_PRI },
+	{ XK_ANY_MOD,           Button4, ttysend,        {.s = "\031"}, 0, S_ALT },
+	{ XK_ANY_MOD,           Button5, ttysend,        {.s = "\005"}, 0, S_ALT },
+	#else
+	{ XK_ANY_MOD,           Button4, ttysend,        {.s = "\031"} },
+	{ XK_ANY_MOD,           Button5, ttysend,        {.s = "\005"} },
+	#endif // SCROLLBACK_MOUSE_ALTSCREEN_PATCH
+};
+
+/* Internal keyboard shortcuts. */
+#define MODKEY Mod1Mask
+#define TERMMOD (ControlMask|ShiftMask)
+
+#if EXTERNALPIPE_PATCH // example command
+static char *openurlcmd[] = { "/bin/sh", "-c",
+	"xurls | dmenu -l 10 -w $WINDOWID | xargs -r open",
+	"externalpipe", NULL };
+
+#if EXTERNALPIPEIN_PATCH // example command
+static char *setbgcolorcmd[] = { "/bin/sh", "-c",
+	"printf '\033]11;#008000\007'",
+	"externalpipein", NULL };
+#endif // EXTERNALPIPEIN_PATCH
+#endif // EXTERNALPIPE_PATCH
+
+static Shortcut shortcuts[] = {
+	/* mask                 keysym          function         argument   screen */
+	{ 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} },
+	{ ControlMask,          XK_v,           clippaste,       {.i =  0} },
+	#if ALPHA_PATCH
+	{ TERMMOD,              XK_O,           changealpha,     {.f = +0.05} },
+	{ TERMMOD,              XK_P,           changealpha,     {.f = -0.05} },
+	#if ALPHA_FOCUS_HIGHLIGHT_PATCH
+	//{ TERMMOD,              XK_,           changealphaunfocused, {.f = +0.05} },
+	//{ TERMMOD,              XK_,           changealphaunfocused, {.f = -0.05} },
+	#endif // ALPHA_FOCUS_HIGHLIGHT_PATCH
+	#endif // ALPHA_PATCH
+	#if FULLSCREEN_PATCH
+	{ XK_NO_MOD,            XK_F11,         fullscreen,      {.i =  0} },
+	{ MODKEY,               XK_Return,      fullscreen,      {.i =  0} },
+	#endif // FULLSCREEN_PATCH
+	#if SCROLLBACK_PATCH
+	{ ShiftMask,            XK_Page_Up,     kscrollup,       {.i = -1}, S_PRI },
+	{ ShiftMask,            XK_Page_Down,   kscrolldown,     {.i = -1}, S_PRI },
+	{ MODKEY,               XK_Page_Up,     kscrollup,       {.i = -1} },
+        { MODKEY,               XK_Page_Down,   kscrolldown,     {.i = -1} },
+        { MODKEY,               XK_k,           kscrollup,       {.i =  1} },
+        { MODKEY,               XK_j,           kscrolldown,     {.i =  1} },
+        { MODKEY,               XK_Up,          kscrollup,       {.i =  1} },
+        { MODKEY,               XK_Down,        kscrolldown,     {.i =  1} },
+        { MODKEY,               XK_u,           kscrollup,       {.i = -1} },
+        { MODKEY,               XK_d,           kscrolldown,     {.i = -1} },
+	#endif // SCROLLBACK_PATCH
+	#if CLIPBOARD_PATCH
+	{ TERMMOD,              XK_Y,           selpaste,       {.i =  0} },
+	{ ShiftMask,            XK_Insert,      selpaste,       {.i =  0} },
+	#else
+	{ TERMMOD,              XK_Y,           selpaste,        {.i =  0} },
+	{ ShiftMask,            XK_Insert,      selpaste,        {.i =  0} },
+	#endif // CLIPBOARD_PATCH
+	{ TERMMOD,              XK_Num_Lock,    numlock,         {.i =  0} },
+	#if COPYURL_PATCH || COPYURL_HIGHLIGHT_SELECTED_URLS_PATCH
+	{ MODKEY,               XK_l,           copyurl,         {.i =  0} },
+	#endif // COPYURL_PATCH
+	#if OPENCOPIED_PATCH
+	{ MODKEY,               XK_o,           opencopied,      {.v = "xdg-open"} },
+	#endif // OPENCOPIED_PATCH
+	#if NEWTERM_PATCH
+	{ TERMMOD,              XK_Return,      newterm,         {.i =  0} },
+	#endif // NEWTERM_PATCH
+	#if EXTERNALPIPE_PATCH
+	{ TERMMOD,              XK_U,           externalpipe,    { .v = openurlcmd } },
+	#if EXTERNALPIPEIN_PATCH
+	{ TERMMOD,              XK_M,           externalpipein,  { .v = setbgcolorcmd } },
+	#endif // EXTERNALPIPEIN_PATCH
+	#endif // EXTERNALPIPE_PATCH
+	#if KEYBOARDSELECT_PATCH
+	{ TERMMOD,              XK_Escape,      keyboard_select, { 0 } },
+	#endif // KEYBOARDSELECT_PATCH
+	#if KEYBOARDSELECT_PATCH && REFLOW_PATCH
+	{ TERMMOD,              XK_F,           searchforward,   { 0 } },
+	{ TERMMOD,              XK_B,           searchbackward,  { 0 } },
+	#endif // KEYBOARDSELECT_PATCH
+	#if ISO14755_PATCH
+	{ TERMMOD,              XK_I,           iso14755,        {.i =  0} },
+	#endif // ISO14755_PATCH
+	#if INVERT_PATCH
+	{ TERMMOD,              XK_X,           invert,          { 0 } },
+	#endif // INVERT_PATCH
+
+	{ TERMMOD,              XK_K,           zoom,            {.f = +1} },
+        { TERMMOD,              XK_J,           zoom,            {.f = -1} },
+};
+
+/*
+ * Special keys (change & recompile st.info accordingly)
+ *
+ * Mask value:
+ * * Use XK_ANY_MOD to match the key no matter modifiers state
+ * * Use XK_NO_MOD to match the key alone (no modifiers)
+ * appkey value:
+ * * 0: no value
+ * * > 0: keypad application mode enabled
+ * *   = 2: term.numlock = 1
+ * * < 0: keypad application mode disabled
+ * appcursor value:
+ * * 0: no value
+ * * > 0: cursor application mode enabled
+ * * < 0: cursor application mode 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
+ * position for a key.
+ */
+
+#if !FIXKEYBOARDINPUT_PATCH
+/*
+ * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF)
+ * to be mapped below, add them to this array.
+ */
+static KeySym mappedkeys[] = { -1 };
+#endif // FIXKEYBOARDINPUT_PATCH
+
+/*
+ * State bits to ignore when matching key or button events.  By default,
+ * numlock (Mod2Mask) and keyboard layout (XK_SWITCH_MOD) are ignored.
+ */
+static uint ignoremod = Mod2Mask|XK_SWITCH_MOD;
+
+#if !FIXKEYBOARDINPUT_PATCH
+/*
+ * This is the huge key array which defines all compatibility to the Linux
+ * world. Please decide about changes wisely.
+ */
+static Key key[] = {
+	/* keysym           mask            string      appkey appcursor */
+	{ XK_KP_Home,       ShiftMask,      "\033[2J",       0,   -1},
+	{ XK_KP_Home,       ShiftMask,      "\033[1;2H",     0,   +1},
+	{ XK_KP_Home,       XK_ANY_MOD,     "\033[H",        0,   -1},
+	{ XK_KP_Home,       XK_ANY_MOD,     "\033[1~",       0,   +1},
+	{ XK_KP_Up,         XK_ANY_MOD,     "\033Ox",       +1,    0},
+	{ XK_KP_Up,         XK_ANY_MOD,     "\033[A",        0,   -1},
+	{ XK_KP_Up,         XK_ANY_MOD,     "\033OA",        0,   +1},
+	{ XK_KP_Down,       XK_ANY_MOD,     "\033Or",       +1,    0},
+	{ XK_KP_Down,       XK_ANY_MOD,     "\033[B",        0,   -1},
+	{ XK_KP_Down,       XK_ANY_MOD,     "\033OB",        0,   +1},
+	{ XK_KP_Left,       XK_ANY_MOD,     "\033Ot",       +1,    0},
+	{ XK_KP_Left,       XK_ANY_MOD,     "\033[D",        0,   -1},
+	{ XK_KP_Left,       XK_ANY_MOD,     "\033OD",        0,   +1},
+	{ XK_KP_Right,      XK_ANY_MOD,     "\033Ov",       +1,    0},
+	{ XK_KP_Right,      XK_ANY_MOD,     "\033[C",        0,   -1},
+	{ XK_KP_Right,      XK_ANY_MOD,     "\033OC",        0,   +1},
+	{ XK_KP_Prior,      ShiftMask,      "\033[5;2~",     0,    0},
+	{ XK_KP_Prior,      XK_ANY_MOD,     "\033[5~",       0,    0},
+	{ XK_KP_Begin,      XK_ANY_MOD,     "\033[E",        0,    0},
+	{ XK_KP_End,        ControlMask,    "\033[J",       -1,    0},
+	{ XK_KP_End,        ControlMask,    "\033[1;5F",    +1,    0},
+	{ XK_KP_End,        ShiftMask,      "\033[K",       -1,    0},
+	{ XK_KP_End,        ShiftMask,      "\033[1;2F",    +1,    0},
+	{ XK_KP_End,        XK_ANY_MOD,     "\033[4~",       0,    0},
+	{ XK_KP_Next,       ShiftMask,      "\033[6;2~",     0,    0},
+	{ XK_KP_Next,       XK_ANY_MOD,     "\033[6~",       0,    0},
+	{ XK_KP_Insert,     ShiftMask,      "\033[2;2~",    +1,    0},
+	{ XK_KP_Insert,     ShiftMask,      "\033[4l",      -1,    0},
+	{ XK_KP_Insert,     ControlMask,    "\033[L",       -1,    0},
+	{ XK_KP_Insert,     ControlMask,    "\033[2;5~",    +1,    0},
+	{ XK_KP_Insert,     XK_ANY_MOD,     "\033[4h",      -1,    0},
+	{ XK_KP_Insert,     XK_ANY_MOD,     "\033[2~",      +1,    0},
+	{ XK_KP_Delete,     ControlMask,    "\033[M",       -1,    0},
+	{ XK_KP_Delete,     ControlMask,    "\033[3;5~",    +1,    0},
+	{ XK_KP_Delete,     ShiftMask,      "\033[2K",      -1,    0},
+	{ XK_KP_Delete,     ShiftMask,      "\033[3;2~",    +1,    0},
+	#if DELKEY_PATCH
+	{ XK_KP_Delete,     XK_ANY_MOD,     "\033[3~",      -1,    0},
+	#else
+	{ XK_KP_Delete,     XK_ANY_MOD,     "\033[P",       -1,    0},
+	#endif // DELKEY_PATCH
+	{ XK_KP_Delete,     XK_ANY_MOD,     "\033[3~",      +1,    0},
+	{ XK_KP_Multiply,   XK_ANY_MOD,     "\033Oj",       +2,    0},
+	{ XK_KP_Add,        XK_ANY_MOD,     "\033Ok",       +2,    0},
+	{ XK_KP_Enter,      XK_ANY_MOD,     "\033OM",       +2,    0},
+	{ XK_KP_Enter,      XK_ANY_MOD,     "\r",           -1,    0},
+	{ XK_KP_Subtract,   XK_ANY_MOD,     "\033Om",       +2,    0},
+	{ XK_KP_Decimal,    XK_ANY_MOD,     "\033On",       +2,    0},
+	{ XK_KP_Divide,     XK_ANY_MOD,     "\033Oo",       +2,    0},
+	{ XK_KP_0,          XK_ANY_MOD,     "\033Op",       +2,    0},
+	{ XK_KP_1,          XK_ANY_MOD,     "\033Oq",       +2,    0},
+	{ XK_KP_2,          XK_ANY_MOD,     "\033Or",       +2,    0},
+	{ XK_KP_3,          XK_ANY_MOD,     "\033Os",       +2,    0},
+	{ XK_KP_4,          XK_ANY_MOD,     "\033Ot",       +2,    0},
+	{ XK_KP_5,          XK_ANY_MOD,     "\033Ou",       +2,    0},
+	{ XK_KP_6,          XK_ANY_MOD,     "\033Ov",       +2,    0},
+	{ XK_KP_7,          XK_ANY_MOD,     "\033Ow",       +2,    0},
+	{ XK_KP_8,          XK_ANY_MOD,     "\033Ox",       +2,    0},
+	{ XK_KP_9,          XK_ANY_MOD,     "\033Oy",       +2,    0},
+	{ XK_Up,            ShiftMask,      "\033[1;2A",     0,    0},
+	{ XK_Up,            Mod1Mask,       "\033[1;3A",     0,    0},
+	{ XK_Up,         ShiftMask|Mod1Mask,"\033[1;4A",     0,    0},
+	{ XK_Up,            ControlMask,    "\033[1;5A",     0,    0},
+	{ XK_Up,      ShiftMask|ControlMask,"\033[1;6A",     0,    0},
+	{ XK_Up,       ControlMask|Mod1Mask,"\033[1;7A",     0,    0},
+	{ XK_Up,ShiftMask|ControlMask|Mod1Mask,"\033[1;8A",  0,    0},
+	{ XK_Up,            XK_ANY_MOD,     "\033[A",        0,   -1},
+	{ XK_Up,            XK_ANY_MOD,     "\033OA",        0,   +1},
+	{ XK_Down,          ShiftMask,      "\033[1;2B",     0,    0},
+	{ XK_Down,          Mod1Mask,       "\033[1;3B",     0,    0},
+	{ XK_Down,       ShiftMask|Mod1Mask,"\033[1;4B",     0,    0},
+	{ XK_Down,          ControlMask,    "\033[1;5B",     0,    0},
+	{ XK_Down,    ShiftMask|ControlMask,"\033[1;6B",     0,    0},
+	{ XK_Down,     ControlMask|Mod1Mask,"\033[1;7B",     0,    0},
+	{ XK_Down,ShiftMask|ControlMask|Mod1Mask,"\033[1;8B",0,    0},
+	{ XK_Down,          XK_ANY_MOD,     "\033[B",        0,   -1},
+	{ XK_Down,          XK_ANY_MOD,     "\033OB",        0,   +1},
+	{ XK_Left,          ShiftMask,      "\033[1;2D",     0,    0},
+	{ XK_Left,          Mod1Mask,       "\033[1;3D",     0,    0},
+	{ XK_Left,       ShiftMask|Mod1Mask,"\033[1;4D",     0,    0},
+	{ XK_Left,          ControlMask,    "\033[1;5D",     0,    0},
+	{ XK_Left,    ShiftMask|ControlMask,"\033[1;6D",     0,    0},
+	{ XK_Left,     ControlMask|Mod1Mask,"\033[1;7D",     0,    0},
+	{ XK_Left,ShiftMask|ControlMask|Mod1Mask,"\033[1;8D",0,    0},
+	{ XK_Left,          XK_ANY_MOD,     "\033[D",        0,   -1},
+	{ XK_Left,          XK_ANY_MOD,     "\033OD",        0,   +1},
+	{ XK_Right,         ShiftMask,      "\033[1;2C",     0,    0},
+	{ XK_Right,         Mod1Mask,       "\033[1;3C",     0,    0},
+	{ XK_Right,      ShiftMask|Mod1Mask,"\033[1;4C",     0,    0},
+	{ XK_Right,         ControlMask,    "\033[1;5C",     0,    0},
+	{ XK_Right,   ShiftMask|ControlMask,"\033[1;6C",     0,    0},
+	{ XK_Right,    ControlMask|Mod1Mask,"\033[1;7C",     0,    0},
+	{ XK_Right,ShiftMask|ControlMask|Mod1Mask,"\033[1;8C",0,   0},
+	{ XK_Right,         XK_ANY_MOD,     "\033[C",        0,   -1},
+	{ XK_Right,         XK_ANY_MOD,     "\033OC",        0,   +1},
+	{ XK_ISO_Left_Tab,  ShiftMask,      "\033[Z",        0,    0},
+	{ XK_Return,        Mod1Mask,       "\033\r",        0,    0},
+	{ XK_Return,        XK_ANY_MOD,     "\r",            0,    0},
+	{ XK_Insert,        ShiftMask,      "\033[4l",      -1,    0},
+	{ XK_Insert,        ShiftMask,      "\033[2;2~",    +1,    0},
+	{ XK_Insert,        ControlMask,    "\033[L",       -1,    0},
+	{ XK_Insert,        ControlMask,    "\033[2;5~",    +1,    0},
+	{ XK_Insert,        XK_ANY_MOD,     "\033[4h",      -1,    0},
+	{ XK_Insert,        XK_ANY_MOD,     "\033[2~",      +1,    0},
+	{ XK_Delete,        ControlMask,    "\033[M",       -1,    0},
+	{ XK_Delete,        ControlMask,    "\033[3;5~",    +1,    0},
+	{ XK_Delete,        ShiftMask,      "\033[2K",      -1,    0},
+	{ XK_Delete,        ShiftMask,      "\033[3;2~",    +1,    0},
+	#if DELKEY_PATCH
+	{ XK_Delete,        XK_ANY_MOD,     "\033[3~",      -1,    0},
+	#else
+	{ XK_Delete,        XK_ANY_MOD,     "\033[P",       -1,    0},
+	#endif // DELKEY_PATCH
+	{ XK_Delete,        XK_ANY_MOD,     "\033[3~",      +1,    0},
+	{ XK_BackSpace,     XK_NO_MOD,      "\177",          0,    0},
+	{ XK_BackSpace,     Mod1Mask,       "\033\177",      0,    0},
+	{ XK_Home,          ShiftMask,      "\033[2J",       0,   -1},
+	{ XK_Home,          ShiftMask,      "\033[1;2H",     0,   +1},
+	{ XK_Home,          XK_ANY_MOD,     "\033[H",        0,   -1},
+	{ XK_Home,          XK_ANY_MOD,     "\033[1~",       0,   +1},
+	{ XK_End,           ControlMask,    "\033[J",       -1,    0},
+	{ XK_End,           ControlMask,    "\033[1;5F",    +1,    0},
+	{ XK_End,           ShiftMask,      "\033[K",       -1,    0},
+	{ XK_End,           ShiftMask,      "\033[1;2F",    +1,    0},
+	{ XK_End,           XK_ANY_MOD,     "\033[4~",       0,    0},
+	{ XK_Prior,         ControlMask,    "\033[5;5~",     0,    0},
+	{ XK_Prior,         ShiftMask,      "\033[5;2~",     0,    0},
+	{ XK_Prior,         XK_ANY_MOD,     "\033[5~",       0,    0},
+	{ XK_Next,          ControlMask,    "\033[6;5~",     0,    0},
+	{ XK_Next,          ShiftMask,      "\033[6;2~",     0,    0},
+	{ XK_Next,          XK_ANY_MOD,     "\033[6~",       0,    0},
+	{ XK_F1,            XK_NO_MOD,      "\033OP" ,       0,    0},
+	{ XK_F1, /* F13 */  ShiftMask,      "\033[1;2P",     0,    0},
+	{ XK_F1, /* F25 */  ControlMask,    "\033[1;5P",     0,    0},
+	{ XK_F1, /* F37 */  Mod4Mask,       "\033[1;6P",     0,    0},
+	{ XK_F1, /* F49 */  Mod1Mask,       "\033[1;3P",     0,    0},
+	{ XK_F1, /* F61 */  Mod3Mask,       "\033[1;4P",     0,    0},
+	{ XK_F2,            XK_NO_MOD,      "\033OQ" ,       0,    0},
+	{ XK_F2, /* F14 */  ShiftMask,      "\033[1;2Q",     0,    0},
+	{ XK_F2, /* F26 */  ControlMask,    "\033[1;5Q",     0,    0},
+	{ XK_F2, /* F38 */  Mod4Mask,       "\033[1;6Q",     0,    0},
+	{ XK_F2, /* F50 */  Mod1Mask,       "\033[1;3Q",     0,    0},
+	{ XK_F2, /* F62 */  Mod3Mask,       "\033[1;4Q",     0,    0},
+	{ XK_F3,            XK_NO_MOD,      "\033OR" ,       0,    0},
+	{ XK_F3, /* F15 */  ShiftMask,      "\033[1;2R",     0,    0},
+	{ XK_F3, /* F27 */  ControlMask,    "\033[1;5R",     0,    0},
+	{ XK_F3, /* F39 */  Mod4Mask,       "\033[1;6R",     0,    0},
+	{ XK_F3, /* F51 */  Mod1Mask,       "\033[1;3R",     0,    0},
+	{ XK_F3, /* F63 */  Mod3Mask,       "\033[1;4R",     0,    0},
+	{ XK_F4,            XK_NO_MOD,      "\033OS" ,       0,    0},
+	{ XK_F4, /* F16 */  ShiftMask,      "\033[1;2S",     0,    0},
+	{ XK_F4, /* F28 */  ControlMask,    "\033[1;5S",     0,    0},
+	{ XK_F4, /* F40 */  Mod4Mask,       "\033[1;6S",     0,    0},
+	{ XK_F4, /* F52 */  Mod1Mask,       "\033[1;3S",     0,    0},
+	{ XK_F5,            XK_NO_MOD,      "\033[15~",      0,    0},
+	{ XK_F5, /* F17 */  ShiftMask,      "\033[15;2~",    0,    0},
+	{ XK_F5, /* F29 */  ControlMask,    "\033[15;5~",    0,    0},
+	{ XK_F5, /* F41 */  Mod4Mask,       "\033[15;6~",    0,    0},
+	{ XK_F5, /* F53 */  Mod1Mask,       "\033[15;3~",    0,    0},
+	{ XK_F6,            XK_NO_MOD,      "\033[17~",      0,    0},
+	{ XK_F6, /* F18 */  ShiftMask,      "\033[17;2~",    0,    0},
+	{ XK_F6, /* F30 */  ControlMask,    "\033[17;5~",    0,    0},
+	{ XK_F6, /* F42 */  Mod4Mask,       "\033[17;6~",    0,    0},
+	{ XK_F6, /* F54 */  Mod1Mask,       "\033[17;3~",    0,    0},
+	{ XK_F7,            XK_NO_MOD,      "\033[18~",      0,    0},
+	{ XK_F7, /* F19 */  ShiftMask,      "\033[18;2~",    0,    0},
+	{ XK_F7, /* F31 */  ControlMask,    "\033[18;5~",    0,    0},
+	{ XK_F7, /* F43 */  Mod4Mask,       "\033[18;6~",    0,    0},
+	{ XK_F7, /* F55 */  Mod1Mask,       "\033[18;3~",    0,    0},
+	{ XK_F8,            XK_NO_MOD,      "\033[19~",      0,    0},
+	{ XK_F8, /* F20 */  ShiftMask,      "\033[19;2~",    0,    0},
+	{ XK_F8, /* F32 */  ControlMask,    "\033[19;5~",    0,    0},
+	{ XK_F8, /* F44 */  Mod4Mask,       "\033[19;6~",    0,    0},
+	{ XK_F8, /* F56 */  Mod1Mask,       "\033[19;3~",    0,    0},
+	{ XK_F9,            XK_NO_MOD,      "\033[20~",      0,    0},
+	{ XK_F9, /* F21 */  ShiftMask,      "\033[20;2~",    0,    0},
+	{ XK_F9, /* F33 */  ControlMask,    "\033[20;5~",    0,    0},
+	{ XK_F9, /* F45 */  Mod4Mask,       "\033[20;6~",    0,    0},
+	{ XK_F9, /* F57 */  Mod1Mask,       "\033[20;3~",    0,    0},
+	{ XK_F10,           XK_NO_MOD,      "\033[21~",      0,    0},
+	{ XK_F10, /* F22 */ ShiftMask,      "\033[21;2~",    0,    0},
+	{ XK_F10, /* F34 */ ControlMask,    "\033[21;5~",    0,    0},
+	{ XK_F10, /* F46 */ Mod4Mask,       "\033[21;6~",    0,    0},
+	{ XK_F10, /* F58 */ Mod1Mask,       "\033[21;3~",    0,    0},
+	{ XK_F11,           XK_NO_MOD,      "\033[23~",      0,    0},
+	{ XK_F11, /* F23 */ ShiftMask,      "\033[23;2~",    0,    0},
+	{ XK_F11, /* F35 */ ControlMask,    "\033[23;5~",    0,    0},
+	{ XK_F11, /* F47 */ Mod4Mask,       "\033[23;6~",    0,    0},
+	{ XK_F11, /* F59 */ Mod1Mask,       "\033[23;3~",    0,    0},
+	{ XK_F12,           XK_NO_MOD,      "\033[24~",      0,    0},
+	{ XK_F12, /* F24 */ ShiftMask,      "\033[24;2~",    0,    0},
+	{ XK_F12, /* F36 */ ControlMask,    "\033[24;5~",    0,    0},
+	{ XK_F12, /* F48 */ Mod4Mask,       "\033[24;6~",    0,    0},
+	{ XK_F12, /* F60 */ Mod1Mask,       "\033[24;3~",    0,    0},
+	{ XK_F13,           XK_NO_MOD,      "\033[1;2P",     0,    0},
+	{ XK_F14,           XK_NO_MOD,      "\033[1;2Q",     0,    0},
+	{ XK_F15,           XK_NO_MOD,      "\033[1;2R",     0,    0},
+	{ XK_F16,           XK_NO_MOD,      "\033[1;2S",     0,    0},
+	{ XK_F17,           XK_NO_MOD,      "\033[15;2~",    0,    0},
+	{ XK_F18,           XK_NO_MOD,      "\033[17;2~",    0,    0},
+	{ XK_F19,           XK_NO_MOD,      "\033[18;2~",    0,    0},
+	{ XK_F20,           XK_NO_MOD,      "\033[19;2~",    0,    0},
+	{ XK_F21,           XK_NO_MOD,      "\033[20;2~",    0,    0},
+	{ XK_F22,           XK_NO_MOD,      "\033[21;2~",    0,    0},
+	{ XK_F23,           XK_NO_MOD,      "\033[23;2~",    0,    0},
+	{ XK_F24,           XK_NO_MOD,      "\033[24;2~",    0,    0},
+	{ XK_F25,           XK_NO_MOD,      "\033[1;5P",     0,    0},
+	{ XK_F26,           XK_NO_MOD,      "\033[1;5Q",     0,    0},
+	{ XK_F27,           XK_NO_MOD,      "\033[1;5R",     0,    0},
+	{ XK_F28,           XK_NO_MOD,      "\033[1;5S",     0,    0},
+	{ XK_F29,           XK_NO_MOD,      "\033[15;5~",    0,    0},
+	{ XK_F30,           XK_NO_MOD,      "\033[17;5~",    0,    0},
+	{ XK_F31,           XK_NO_MOD,      "\033[18;5~",    0,    0},
+	{ XK_F32,           XK_NO_MOD,      "\033[19;5~",    0,    0},
+	{ XK_F33,           XK_NO_MOD,      "\033[20;5~",    0,    0},
+	{ XK_F34,           XK_NO_MOD,      "\033[21;5~",    0,    0},
+	{ XK_F35,           XK_NO_MOD,      "\033[23;5~",    0,    0},
+};
+#endif // FIXKEYBOARDINPUT_PATCH
+
+/*
+ * Selection types' masks.
+ * Use the same masks as usual.
+ * Button1Mask is always unset, to make masks match between ButtonPress.
+ * ButtonRelease and MotionNotify.
+ * If no match is found, regular selection is used.
+ */
+static uint selmasks[] = {
+	[SEL_RECTANGULAR] = Mod1Mask,
+};
+
+/*
+ * Printable characters in ASCII, used to estimate the advance width
+ * of single wide characters.
+ */
+static char ascii_printable[] =
+	" !\"#$%&'()*+,-./0123456789:;<=>?"
+	"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
+	"`abcdefghijklmnopqrstuvwxyz{|}~";
+
+#if RIGHTCLICKTOPLUMB_PATCH
+/*
+ * plumb_cmd is run on mouse button 3 click, with argument set to
+ * current selection and with cwd set to the cwd of the active shell
+ */
+static char *plumb_cmd = "plumb";
+#endif // RIGHTCLICKTOPLUMB_PATCH
+
+#if UNDERCURL_PATCH
+/**
+ * Undercurl style. Set UNDERCURL_STYLE to one of the available styles.
+ *
+ * Curly: Dunno how to draw it *shrug*
+ *  _   _   _   _
+ * ( ) ( ) ( ) ( )
+ *	 (_) (_) (_) (_)
+ *
+ * Spiky:
+ * /\  /\   /\	/\
+ *   \/  \/	  \/
+ *
+ * Capped:
+ *	_     _     _
+ * / \   / \   / \
+ *    \_/   \_/
+ */
+// Available styles
+#define UNDERCURL_CURLY 0
+#define UNDERCURL_SPIKY 1
+#define UNDERCURL_CAPPED 2
+// Active style
+#define UNDERCURL_STYLE UNDERCURL_SPIKY
+#endif // UNDERCURL_PATCH

          
A => st/patches.h +488 -0
@@ 0,0 1,488 @@ 
+/*
+ * This file contains patch control flags.
+ *
+ * In principle you should be able to mix and match any patches
+ * you may want. In cases where patches are logically incompatible
+ * one patch may take precedence over the other as noted in the
+ * relevant descriptions.
+ */
+
+/* Patches */
+
+/* The alpha patch adds transparency for the terminal.
+ * You need to uncomment the corresponding line in config.mk to use the -lXrender library
+ * when including this patch.
+ * https://st.suckless.org/patches/alpha/
+ */
+#define ALPHA_PATCH 1
+
+/* The alpha focus highlight patch allows the user to specify two distinct opacity values or
+ * background colors in order to easily differentiate between focused and unfocused terminal
+ * windows. This depends on the alpha patch.
+ * https://github.com/juliusHuelsmann/st-focus/
+ * https://st.suckless.org/patches/alpha_focus_highlight/
+ */
+#define ALPHA_FOCUS_HIGHLIGHT_PATCH 0
+
+/* Adds gradient transparency to st, depends on the alpha patch.
+ * https://st.suckless.org/patches/gradient/
+ */
+#define ALPHA_GRADIENT_PATCH 0
+
+/* This patch allows st to resize to any pixel size rather than snapping to character width/height.
+ * https://st.suckless.org/patches/anysize/
+ */
+#define ANYSIZE_PATCH 0
+
+/* A simple variant of the anysize patch that only changes the resize hints to allow the window to
+ * be resized to any size.
+ */
+#define ANYSIZE_SIMPLE_PATCH 0
+
+/* Draws a background image in farbfeld format in place of the defaultbg color allowing for pseudo
+ * transparency.
+ * https://st.suckless.org/patches/background_image/
+ */
+#define BACKGROUND_IMAGE_PATCH 0
+
+/* This patch adds the ability to reload the background image config when a SIGUSR1 signal is
+ * received, e.g.: killall -USR1 st
+ * Depends on the BACKGROUND_IMAGE_PATCH.
+ */
+#define BACKGROUND_IMAGE_RELOAD_PATCH 0
+
+/* This patch allows the use of a blinking cursor.
+ * Only cursor styles 0, 1, 3, 5, and 7 blink. Set cursorstyle accordingly.
+ * Cursor styles are defined here:
+ *    https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h4-Functions-using-CSI-_-ordered-by-the-final-character-lparen-s-rparen:CSI-Ps-SP-q.1D81
+ * https://st.suckless.org/patches/blinking_cursor/
+ */
+#define BLINKING_CURSOR_PATCH 0
+
+/* By default bold text is rendered with a bold font in the bright variant of the current color.
+ * This patch makes bold text rendered simply as bold, leaving the color unaffected.
+ * https://st.suckless.org/patches/bold-is-not-bright/
+ */
+#define BOLD_IS_NOT_BRIGHT_PATCH 0
+
+/* This patch adds custom rendering of lines/blocks/braille characters for gapless alignment.
+ * https://st.suckless.org/patches/boxdraw/
+ */
+#define BOXDRAW_PATCH 0
+
+/* By default st only sets PRIMARY on selection.
+ * This patch makes st set CLIPBOARD on selection.
+ * https://st.suckless.org/patches/clipboard/
+ */
+#define CLIPBOARD_PATCH 1
+
+/* This patch allows st to be resized without cutting off text when the terminal window is
+ * made larger again. Text does not wrap when the terminal window is made smaller, you may
+ * also want to have a look at the reflow patch.
+ *
+ * https://github.com/bakkeby/st-flexipatch/issues/34
+ */
+#define COLUMNS_PATCH 0
+
+/* Select and copy the last URL displayed with Mod+l. Multiple invocations cycle through the
+ * available URLs.
+ * https://st.suckless.org/patches/copyurl/
+ */
+#define COPYURL_PATCH 1
+
+/* Select and copy the last URL displayed with Mod+l. Multiple invocations cycle through the
+ * available URLs. This variant also highlights the selected URLs.
+ * https://st.suckless.org/patches/copyurl/
+ */
+#define COPYURL_HIGHLIGHT_SELECTED_URLS_PATCH 0
+
+/* This patch adds support for CSI escape sequences 22 and 23, which save and
+ * restores the window title (for instance nvim does this when opening and closing).
+ * https://st.suckless.org/patches/csi_22_23/
+ */
+#define CSI_22_23_PATCH 0
+
+/* According to the specification (see link in BLINKING_CURSOR_PATCH) the "Set cursor style
+ * (DECSCUSR), VT520." escape sequences define both values of 0 and 1 as a blinking block,
+ * with 1 being the default.
+ *
+ * This patch allows the default cursor to be set when value 0 is used, as opposed to
+ * setting the cursor to a blinking block.
+ *
+ * This allows a command like this to restore the cursor to what st is configured with:
+ *    $ echo -ne "\e[ q"
+ *
+ * While many terminal emulators do this it is not adhering to specification. xterm is an
+ * example terminal that sets a blinking block instead of the configured one, same as st.
+ */
+#define DEFAULT_CURSOR_PATCH 0
+
+/* Return BS on pressing backspace and DEL on pressing the delete key.
+ * https://st.suckless.org/patches/delkey/
+ */
+#define DELKEY_PATCH 0
+
+/* This patch adds the option of disabling bold fonts globally.
+ * https://st.suckless.org/patches/disable_bold_italic_fonts/
+ */
+#define DISABLE_BOLD_FONTS_PATCH 0
+
+/* This patch adds the option of disabling italic fonts globally.
+ * https://st.suckless.org/patches/disable_bold_italic_fonts/
+ */
+#define DISABLE_ITALIC_FONTS_PATCH 0
+
+/* This patch adds the option of disabling roman fonts globally.
+ * https://st.suckless.org/patches/disable_bold_italic_fonts/
+ */
+#define DISABLE_ROMAN_FONTS_PATCH 0
+
+/* This patch makes the cursor color the inverse of the current cell color.
+ * https://st.suckless.org/patches/dynamic-cursor-color/
+ */
+#define DYNAMIC_CURSOR_COLOR_PATCH 0
+
+/* Reading and writing st's screen through a pipe, e.g. pass info to dmenu.
+ * https://st.suckless.org/patches/externalpipe/
+ */
+#define EXTERNALPIPE_PATCH 0
+
+/* This patch improves and extends the externalpipe patch in two ways:
+ *    - it prevents the reset of the signal handler set on SIGCHILD, when
+ *      the forked process that executes the external process exits and
+ *    - it adds the externalpipein function to redirect the standard output
+ *      of the external command to the slave size of the pty, that is, as if
+ *      the external program had been manually executed on the terminal
+ *
+ * It can be used to send desired escape sequences to the terminal with a
+ * keyboard shortcut. The patch was created to make use of the dynamic-colors
+ * tool that uses the OSC escape sequences to change the colors of the terminal.
+ *
+ * This patch depends on EXTERNALPIPE_PATCH being enabled.
+ *
+ * https://github.com/sos4nt/dynamic-colors
+ * https://lists.suckless.org/hackers/2004/17218.html
+ */
+#define EXTERNALPIPEIN_PATCH 0
+
+/* This patch allows command line applications to use all the fancy key combinations
+ * that are available to GUI applications.
+ * https://st.suckless.org/patches/fix_keyboard_input/
+ */
+#define FIXKEYBOARDINPUT_PATCH 0
+
+/* This patch allows you to add spare font besides the default. Some glyphs can be not present in
+ * the default font. For this glyphs st uses font-config and try to find them in font cache first.
+ * This patch append fonts defined in font2 variable to the beginning of the font cache.
+ * So they will be used first for glyphs that are absent in the default font.
+ * https://st.suckless.org/patches/font2/
+ */
+#define FONT2_PATCH 0
+
+/* This patch adds the ability to toggle st into fullscreen mode.
+ * Two key bindings are defined: F11 which is typical with other applications and Alt+Enter
+ * which matches the default xterm behavior.
+ * https://st.suckless.org/patches/fullscreen/
+ */
+#define FULLSCREEN_PATCH 0
+
+/* Hide the X cursor whenever a key is pressed and show it back when the mouse is moved in
+ * the terminal window.
+ * https://st.suckless.org/patches/hidecursor/
+ */
+#define HIDECURSOR_PATCH 0
+
+/* This patch hides the terminal cursor when the window loses focus (as opposed to showing a hollow
+ * cursor).
+ * https://www.reddit.com/r/suckless/comments/nvee8h/how_to_hide_cursor_in_st_is_there_a_patch_for_it/
+ */
+#define HIDE_TERMINAL_CURSOR_PATCH 0
+
+/* This patch adds a keybinding that lets you invert the current colorscheme of st.
+ * This provides a simple way to temporarily switch to a light colorscheme if you use a dark
+ * colorscheme or visa-versa.
+ * https://st.suckless.org/patches/invert/
+ */
+#define INVERT_PATCH 0
+
+/* Pressing the default binding Ctrl+Shift-i will popup dmenu, asking you to enter a unicode
+ * codepoint that will be converted to a glyph and then pushed to st.
+ * https://st.suckless.org/patches/iso14755/
+ */
+#define ISO14755_PATCH 0
+
+/* This patch allows you to select text on the terminal using keyboard shortcuts.
+ * NB: An improved variant of this patch is enabled if combined with the reflow patch.
+ *
+ * https://st.suckless.org/patches/keyboard_select/
+ */
+#define KEYBOARDSELECT_PATCH 0
+
+/* This patch adds support for drawing ligatures using the Harfbuzz library to transform
+ * original text of a single line to a list of glyphs with ligatures included.
+ * This patch depends on the Harfbuzz library and headers to compile.
+ * You need to uncomment the corresponding lines in config.mk to use the harfbuzz library
+ * when including this patch.
+ * https://github.com/cog1to/st-ligatures
+ * https://st.suckless.org/patches/ligatures/
+ */
+#define LIGATURES_PATCH 0
+
+/* This patch makes st ignore terminal color attributes by forcing display of the default
+ * foreground and background colors only - making for a monochrome look. Idea ref.
+ * https://www.reddit.com/r/suckless/comments/ixbx6z/how_to_use_black_and_white_only_for_st/
+ */
+#define MONOCHROME_PATCH 0
+
+/* This patch sets the _NET_WM_ICON X property with an icon that is read from a .png file.
+ * This patch depends on the GD Graphics Library and headers to compile.
+ * You need to uncomment the corresponding lines in config.mk to use the gd library.
+ *
+ * The default location for the .png file is:
+ *    - /usr/local/share/pixmaps/st.png
+ *
+ * https://st.suckless.org/patches/netwmicon/
+ */
+#define NETWMICON_PATCH 0
+
+/* This patch sets the _NET_WM_ICON X property with an icon that is read from a farbfeld image.
+ * The benefit of this patch is that you do not need an additional dependency on an external
+ * library to read and convert the farbfeld image.
+ *
+ * The default location for the farbfeld image is:
+ *    - /usr/local/share/pixmaps/st.ff
+ *
+ * Remember to change the ICONNAME in config.mk from st.png to st.ff when using this patch.
+ *
+ * Example command to convert a .png to farbfeld:
+ *    $ png2ff < st.png > st.ff
+ *
+ * https://tools.suckless.org/farbfeld/
+ * https://github.com/bakkeby/patches/wiki/netwmicon/
+ */
+#define NETWMICON_FF_PATCH 0
+
+/* This patch sets the _NET_WM_ICON X property with a hardcoded icon for st. This is the
+ * original version that predates the version that reads the image from a .png file.
+ * https://st.suckless.org/patches/netwmicon/
+ */
+#define NETWMICON_LEGACY_PATCH 0
+
+/* This patch allows you to spawn a new st terminal using Ctrl-Shift-Return. It will have the
+ * same CWD (current working directory) as the original st instance.
+ * https://st.suckless.org/patches/newterm/
+ */
+#define NEWTERM_PATCH 0
+
+/* This patch will set the _MOTIF_WM_HINTS property for the st window which, if the window manager
+ * respects it, will show the st window without window decorations.
+ *
+ * In dwm, if the decoration hints patch is applied, then the st window will start out without a
+ * border. In GNOME and KDE the window should start without a window title.
+ */
+#define NO_WINDOW_DECORATIONS_PATCH 0
+
+/* Open contents of the clipboard in a user-defined browser.
+ * https://st.suckless.org/patches/open_copied_url/
+ */
+#define OPENCOPIED_PATCH 0
+
+/* This patch allows for URLs to be opened directly when you click on them. This may not work with
+ * all terminal applications.
+ *
+ * https://www.reddit.com/r/suckless/comments/cc83om/st_open_url/
+ */
+#define OPENURLONCLICK_PATCH 0
+
+/* Reflow.
+ * Allows st to be resized without cutting off text when the terminal window is made larger again.
+ * Text wraps when the terminal window is made smaller.
+ * Comes with scrollback.
+ */
+#define REFLOW_PATCH 0
+
+/* This patch allows you to specify a border that is relative in size to the width of a cell
+ * in the terminal.
+ * https://st.suckless.org/patches/relativeborder/
+ */
+#define RELATIVEBORDER_PATCH 0
+
+/* This patch allows you to right-click on some selected text to send it to the plumbing
+ * program of choice, e.g. open a file, view an image, open a URL.
+ * https://st.suckless.org/patches/right_click_to_plumb/
+ */
+#define RIGHTCLICKTOPLUMB_PATCH 0
+
+/* Scroll back through terminal output using Shift+{PageUp, PageDown}.
+ * https://st.suckless.org/patches/scrollback/
+ */
+#define SCROLLBACK_PATCH 1
+
+/* Scroll back through terminal output using Shift+MouseWheel.
+ * This variant depends on SCROLLBACK_PATCH being enabled.
+ * https://st.suckless.org/patches/scrollback/
+ */
+#define SCROLLBACK_MOUSE_PATCH 0
+
+/* Scroll back through terminal output using mouse wheel (when not in MODE_ALTSCREEN).
+ * This variant depends on SCROLLBACK_PATCH being enabled.
+ * https://st.suckless.org/patches/scrollback/
+ */
+#define SCROLLBACK_MOUSE_ALTSCREEN_PATCH 0
+
+/* This patch adds the two color-settings selectionfg and selectionbg to config.def.h.
+ * Those define the fore- and background colors which are used when text on the screen is selected
+ * with the mouse. This removes the default behaviour which would simply reverse the colors.
+ * https://st.suckless.org/patches/selectioncolors/
+ */
+#define SELECTION_COLORS_PATCH 0
+
+/* This is the single drawable buffer patch as outlined in the FAQ to get images
+ * in w3m to display. While this patch does not break the alpha patch it images
+ * are not shown in w3m if the alpha patch is applied.
+ */
+#define SINGLE_DRAWABLE_BUFFER_PATCH 0
+
+/* This patch adds SIXEL graphics support for st.
+ * Note that patch/sixel.c/sixel_hls.c come from mintty, licensed under GPL.
+ * Known issues:
+ *    - Rendering sixel graphics may cause unusual cursor placement, this is
+ *      not specific to this variant of st - the same issue is present in
+ *      the xterm implementation. This is likely an issue of sixel height
+ *      not being detected correctly.
+ *
+ * Note that you need to uncomment the corresponding lines in config.mk when including this patch.
+ * This patch is incompatible with the W3M patch.
+ *
+ * https://gist.github.com/saitoha/70e0fdf22e3e8f63ce937c7f7da71809
+ */
+#define SIXEL_PATCH 1
+
+/* This patch allows clients to embed into the st window and is useful if you tend to
+ * start X applications from the terminal. For example:
+ *
+ *   $ surf -e $WINDOWID
+ *
+ * The behavior is similar to Plan 9 where applications can take over windows.
+ * URL TBC
+ */
+#define ST_EMBEDDER_PATCH 0
+
+/* Use inverted defaultbg/fg for selection when bg/fg are the same.
+ * https://st.suckless.org/patches/spoiler/
+ */
+#define SPOILER_PATCH 0
+
+/* This patch changes the mouse shape to the global default when the running program subscribes
+ * for mouse events, for instance, in programs like ranger and fzf. It emulates the behaviour
+ * shown by vte terminals like termite.
+ * https://st.suckless.org/patches/swapmouse/
+ */
+#define SWAPMOUSE_PATCH 0
+
+/* This patch adds synchronized-updates/application-sync support in st.
+ * This will have no effect except when an application uses the synchronized-update escape
+ * sequences. With this patch nearly all cursor flicker is eliminated in tmux, and tmux detects
+ * it automatically via terminfo.
+ *
+ * Note: this patch alters st.info to promote support for extra escape sequences, which can
+ * potentially cause application misbehaviour if you do not use this patch. Try removing or
+ * commenting out the corresponding line in st.info if this is causing issues.
+ *
+ * https://st.suckless.org/patches/sync/
+ */
+#define SYNC_PATCH 0
+
+/* Instead of a default X cursor, use the xterm cursor from your cursor theme.
+ * You need to uncomment the corresponding line in config.mk to use the -lXcursor library
+ * when including this patch.
+ * https://st.suckless.org/patches/themed_cursor/
+ */
+#define THEMED_CURSOR_PATCH 0
+
+/* Adds support for special underlines.
+ *
+ * Example test command:
+ *    $ echo -e "\e[4:3m\e[58:5:10munderline\e[0m"
+ *                  ^ ^     ^ ^  ^- sets terminal color 10
+ *                  | |     |  \- indicates that terminal colors should be used
+ *                  | |      \- indicates that underline color is being set
+ *                  |  \- sets underline style to curvy
+ *                   \- set underline
+ *
+ * Note: this patch alters st.info to promote support for extra escape sequences, which can
+ * potentially cause application misbehaviour if you do not use this patch. Try removing or
+ * commenting out the corresponding line in st.info if this is causing issues.
+ *
+ * https://st.suckless.org/patches/undercurl/
+ */
+#define UNDERCURL_PATCH 0
+
+/* Allows mouse scroll without modifier keys for regardless of alt screen using the external
+ * scroll program.
+ * https://st.suckless.org/patches/universcroll/
+ */
+#define UNIVERSCROLL_PATCH 0
+
+/* Use XftFontMatch in place of FcFontMatch.
+ *
+ * XftFontMatch calls XftDefaultSubstitute which configures various match properties according
+ * to the user's configured Xft defaults (xrdb) as well as according to the current display and
+ * screen. Most importantly, the screen DPI is computed [1]. Without this, st uses a "default"
+ * DPI of 75 [2].
+ *
+ * [1]: https://cgit.freedesktop.org/xorg/lib/libXft/tree/src/xftdpy.c?id=libXft-2.3.2#n535
+ * [2]: https://cgit.freedesktop.org/fontconfig/tree/src/fcdefault.c?id=2.11.1#n255
+ *
+ * https://git.suckless.org/st/commit/528241aa3835e2f1f052abeeaf891737712955a0.html
+ */
+#define USE_XFTFONTMATCH_PATCH 0
+
+/* Vertically center lines in the space available if you have set a larger chscale in config.h
+ * https://st.suckless.org/patches/vertcenter/
+ */
+#define VERTCENTER_PATCH 0
+
+/* Briefly inverts window content on terminal bell event.
+ * https://st.suckless.org/patches/visualbell/
+ */
+#define VISUALBELL_1_PATCH 0
+
+/* Adds support for w3m images.
+ * https://st.suckless.org/patches/w3m/
+ */
+#define W3M_PATCH 0
+
+/* Adds proper glyphs rendering in st allowing wide glyphs to be drawn as-is as opposed to
+ * smaller or cut glyphs being rendered.
+ * https://github.com/Dreomite/st/commit/e3b821dcb3511d60341dec35ee05a4a0abfef7f2
+ * https://www.reddit.com/r/suckless/comments/jt90ai/update_support_for_proper_glyph_rendering_in_st/
+ */
+#define WIDE_GLYPHS_PATCH 0
+
+/* There is a known issue that Google's Variable Fonts (VF) can end up with letter spacing
+ * that is too wide in programs that use Xft, for example Inconsolata v3.000.
+ *
+ * This is intended as a temporary patch / hack until (if) this is fixed in the Xft library
+ * itself.
+ *
+ * https://github.com/googlefonts/Inconsolata/issues/42#issuecomment-737508890
+ */
+#define WIDE_GLYPH_SPACING_PATCH 0
+
+/* This patch allows user to specify the initial path st should use as the working directory.
+ * https://st.suckless.org/patches/workingdir/
+ */
+#define WORKINGDIR_PATCH 0
+
+/* This patch adds the ability to configure st via Xresources. At startup, st will read and
+ * apply the resources named in the resources[] array in config.h.
+ * https://st.suckless.org/patches/xresources/
+ */
+#define XRESOURCES_PATCH 0
+
+/* This patch adds the ability to reload the Xresources config when a SIGUSR1 signal is received
+ * e.g.: killall -USR1 st
+ * Depends on the XRESOURCES_PATCH.
+ */
+#define XRESOURCES_RELOAD_PATCH 0