diff --git a/.gitignore b/.gitignore index 2bfe577..c5cc104 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,2 @@ *.o -config.h -patches.h st diff --git a/Makefile b/Makefile index 2b3859a..5595b43 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,11 @@ dist: clean install: st mkdir -p $(DESTDIR)$(PREFIX)/bin cp -f st $(DESTDIR)$(PREFIX)/bin + cp -f st-copyout $(DESTDIR)$(PREFIX)/bin + cp -f st-urlhandler $(DESTDIR)$(PREFIX)/bin chmod 755 $(DESTDIR)$(PREFIX)/bin/st + chmod 755 $(DESTDIR)$(PREFIX)/bin/st-copyout + chmod 755 $(DESTDIR)$(PREFIX)/bin/st-urlhandler mkdir -p $(DESTDIR)$(MANPREFIX)/man1 sed "s/VERSION/$(VERSION)/g" < st.1 > $(DESTDIR)$(MANPREFIX)/man1/st.1 chmod 644 $(DESTDIR)$(MANPREFIX)/man1/st.1 @@ -51,6 +55,8 @@ install: st uninstall: rm -f $(DESTDIR)$(PREFIX)/bin/st + rm -f $(DESTDIR)$(PREFIX)/bin/st-copyout + rm -f $(DESTDIR)$(PREFIX)/bin/st-urlhandler rm -f $(DESTDIR)$(MANPREFIX)/man1/st.1 rm -f $(DESTDIR)$(PREFIX)/share/applications/st.desktop # desktop-entry patch diff --git a/README.md b/README.md index 67cce1e..a6f63f3 100644 --- a/README.md +++ b/README.md @@ -1,127 +1,12 @@ -Similar to [dwm-flexipatch](https://github.com/bakkeby/dwm-flexipatch) this st 0.9.2 (5dbcca4, 2024-05-01) project has a different take on st patching. It uses preprocessor directives to decide whether or not to include a patch during build time. Essentially this means that this build, for better or worse, contains both the patched _and_ the original code. The aim being that you can select which patches to include and the build will contain that code and nothing more. +

st

-For example to include the `alpha` patch then you would only need to flip this setting from 0 to 1 in [patches.h](https://github.com/bakkeby/st-flexipatch/blob/master/patches.def.h): -```c -#define ALPHA_PATCH 1 -``` +Personal build of st generated using [st-flexipatch](https://github.com/bakkeby/st-flexipatch.git) -Once you have found out what works for you and what doesn't then you should be in a better position to choose patches should you want to start patching from scratch. - -Alternatively if you have found the patches you want, but don't want the rest of the flexipatch entanglement on your plate then you may want to have a look at [flexipatch-finalizer](https://github.com/bakkeby/flexipatch-finalizer); a custom pre-processor tool that removes all the unused flexipatch code leaving you with a build that contains the patches you selected. - -Refer to [https://st.suckless.org/](https://st.suckless.org/) for details on the st terminal, how to install it and how it works. - ---- - -### Changelog: - -2024-05-31 - Added the anygeometry patch - -2024-03-13 - Added the reflow patch and upgraded the netwmicon patch - -2024-03-07 - Improved sixel support, removed VIM browse patch - -2022-10-24 - Added the fullscreen patch - -2022-08-28 - Added the use XftFontMatch patch - -2022-08-24 - Added the no window decorations patch - -2022-04-11 - Added the background image reload patch - -2022-03-10 - Added the background image patch - -2022-02-24 - Upgraded to st 0.8.5 e823e23, 2022-02-17 - removing osc_10_11_12_2 patch as no longer relevant - -2021-08-18 - Added the CSI 22 & 23 patch - -2021-07-26 - Added columns patch - -2021-07-07 - Added sixel scrollback and the openurlonclick patch - -2021-06-09 - Added the hide terminal cursor patch - -2021-05-16 - Added swapmouse patch - -2021-05-11 - Added default cursor patch - -2021-05-10 - Upgrade to 46b02f, 2021-03-28 - -2021-05-09 - Added the sync, alpha-focus-hightlight and vim browse patches - -2021-05-08 - Added blinking cursor, delkey, undercurl,universcroll, desktopentry, netwmicon and osc_10_11_12_2 patches - -2021-05-07 - Added xresources reload patch - -2021-04-21 - Added (temporary?) hack for Variable Fonts (VT) support - -2021-03-10 - Added sixel support - -2021-02-26 - Added the dynamic cursor color patch - -2021-02-15 - Added the alpha gradient patch - -2020-11-14 - Added the wide glyphs patch - -2020-10-23 - Added the monochrome patch - -2020-08-08 - Re-added the visualbell patch - -2020-06-26 - Added the single drawable buffer patch as per the FAQ in order to get w3m images to display - -2020-06-25 - Upgrade to 0.8.4 (367803, 2020-06-19) - -2020-06-14 - Added w3m patch - -2020-06-10 - Upgrade to 249ef9, 2020-06-01 - -2020-06-05 - Added the ligatures patch - -2020-05-20 - Upgrade to 222876, 2020-05-09, and removed visualbell 1, 2, 3 patches and force redraw after keypress due to incompatibility. Refer to tag [371878](https://github.com/bakkeby/st-flexipatch/tree/371878) if you want to try these out. - -2020-04-20 - Upgrade to c279f5, 2020-04-19, and added the force redraw on pselect after key is pressed patch and the externalpipein patch - -2020-03-29 - Added invert and workingdir patches - -2020-03-24 - Upgraded to latest (master) of st (commit 51e19ea11dd42eefed1ca136ee3f6be975f618b1 at the time of writing). Custom changes to make the altscreen mouse scollback patch working. - -2020-03-21 - Added font2 patch - -2020-01-07 - Added st embedder patch - -2019-10-16 - Introduced [flexipatch-finalizer](https://github.com/bakkeby/flexipatch-finalizer) - -2019-09-17 - Added relativeborder, fix-keyboard-input, iso14755, visualbell, right-click-to-plumb, boxdraw and keyboard-select patches - -2019-09-16 - Added alpha, anysize, bold-is-not-bright, clipboard, copyurl, disable-fonts, externalpipe, fixime, hidecursor, newterm, open-copied-url, vertcenter, scrollback, spoiler, themed cursor and xresources patches - -### Patches included: +### Patches applied: - [alpha](https://st.suckless.org/patches/alpha/) - adds transparency for the terminal - - [alpha-focus-highlight](https://st.suckless.org/patches/alpha_focus_highlight/) - - allows the user to specify two distinct opacity values or background colors in order to - easily differentiate between focused and unfocused terminal windows - - - [anygeometry](https://st.suckless.org/patches/anygeometry/) - - allows st to start at any pixel size using the \-G command line option (if floating) - - can be combined with the anysize patch to resize to any pixel size - - - [anysize](https://st.suckless.org/patches/anysize/) - - allows st to reize to any pixel size rather than snapping to character width / height - - - [~anysize\_nobar~](https://github.com/connor-brooks/st-anysize-nobar) - - ~a patch that aims to prevent black bars being drawn on the edges of st terminals using the - anysize patch~ - - - [background-image](https://st.suckless.org/patches/background_image/) - - draws a background image in farbfeld format in place of the defaultbg color allowing for - pseudo transparency - - - background-image-reload - - allows the background image to be reloaded similar to xresources using USR1 signals - - [blinking-cursor](https://st.suckless.org/patches/blinking_cursor/) - allows the use of a blinking cursor @@ -136,63 +21,16 @@ Refer to [https://st.suckless.org/](https://st.suckless.org/) for details on the - by default st only sets PRIMARY on selection - this patch makes st set CLIPBOARD on selection - - [columns](https://github.com/bakkeby/st-flexipatch/issues/34) - - 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 - - - [copyurl](https://st.suckless.org/patches/copyurl/) - - this patch allows you to select and copy the last URL displayed with Mod+l - - multiple invocations cycle through the available URLs - - [csi\_23\_23](https://st.suckless.org/patches/csi_22_23/) - 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) - - default-cursor - - minor change allowing escape sequences like `\e[ q` or `\e[0 q` to set the cursor back to default configuration instead of a blinking block - - while many terminals do this the behaviour is not according to the specification - - - [delkey](https://st.suckless.org/patches/delkey/) - - return BS on pressing backspace and DEL on pressing the delete key - - - [desktopentry](https://st.suckless.org/patches/desktopentry/) - - adds a desktop entry for st so that it can be displayed with an icon when using a graphical launcher - - this patch only applies to the Makefile and is enabled by default, remove if not needed - - - [disable-fonts](https://st.suckless.org/patches/disable_bold_italic_fonts/) - - this patch adds the option of disabling bold/italic/roman fonts globally - - - [dynamic-cursor-color](https://st.suckless.org/patches/dynamic-cursor-color/) - - this patch makes the cursor color the inverse of the current cell color - - [externalpipe](https://st.suckless.org/patches/externalpipe/) - this patch allows for reading and writing st's screen through a pipe, e.g. to pass info to dmenu - - [externalpipein](https://lists.suckless.org/hackers/2004/17218.html) - - this patch prevents the reset of the signal handler set on SIGCHILD, when the forked process that executes the external process exits - - 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 - - this can be used to send desired escape sequences to the terminal with a shortcut (e.g. to change colors) - - - [~fixime~](https://st.suckless.org/patches/fix_ime/) - - adds better Input Method Editor (IME) support - - (included in the base as per [35f7db](https://git.suckless.org/st/commit/e85b6b64660214121164ea97fb098eaa4935f7db.html)) - - - [fix-keyboard-input](https://st.suckless.org/patches/fix_keyboard_input/) - - allows cli applications to use all the fancy key combinations that are available to GUI applications - - [font2](https://st.suckless.org/patches/font2/) - allows you to add a spare font besides the default - - [~force-redraw-after-keypress~](https://lists.suckless.org/hackers/2004/17221.html) - - ~this patch forces the terminal to check for new data on the tty on keypress with the aim of reducing input latency~ - - - [fullscreen](https://st.suckless.org/patches/fullscreen/) - - allows the st window to go into fullscreen mode - - - [gradient](https://st.suckless.org/patches/gradient/) - - adds gradient transparency to st - - depends on the alpha patch - - [hidecursor](https://st.suckless.org/patches/hidecursor/) - hides the X cursor whenever a key is pressed and show it back when the mouse is moved in the terminal window @@ -206,87 +44,37 @@ Refer to [https://st.suckless.org/](https://st.suckless.org/) for details on the - [iso14755](https://st.suckless.org/patches/iso14755/) - 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 - - [keyboard-select](https://st.suckless.org/patches/keyboard_select/) - - allows you to select text on the terminal using keyboard shortcuts - - [ligatures](https://st.suckless.org/patches/ligatures/) - 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 - [monochrome](https://www.reddit.com/r/suckless/comments/ixbx6z/how_to_use_black_and_white_only_for_st/) - makes st ignore terminal color attributes to make for a monochrome look - - [netwmicon](https://st.suckless.org/patches/netwmicon/) - - sets the \_NET\_WM\_ICON X property with a .png file - - or alternatively sets the \_NET\_WM\_ICON X property with a farbfeld (.ff) file - - or alternatively sets the \_NET\_WM\_ICON X property with a hardcoded icon - - [newterm](https://st.suckless.org/patches/newterm/) - 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 - - [no-window-decorations](https://github.com/bakkeby/patches/wiki/no_window_decorations) - - makes st show without window decorations if the WM supports it - - - [open-copied-url](https://st.suckless.org/patches/open_copied_url/) - - open contents of the clipboard in a user-defined browser - - - [openurlonclick](https://www.reddit.com/r/suckless/comments/cc83om/st_open_url/) - - allows for URLs to be opened directly when you click on them - - - [~osc\_10\_11\_12\_2~](https://st.suckless.org/patches/osc_10_11_12_2/) - - ~this patch adds support for OSC escape sequences 10, 11, and 12 in the way they are~ - ~implemented in most other terminals (e.g libvte, kitty)~ - - ~specifically it differs from~ [~osc_10_11_12~](https://st.suckless.org/patches/osc_10_11_12/) - ~in that it treats the background and foreground colors as distinct from palette colours 01~ - ~and 07 in order to facilitate the use of theme setting scripts like~ - [~theme.sh~](https://github.com/lemnos/theme.sh) ~which expect these colours to be distinct~ - - 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 - - [relativeborder](https://st.suckless.org/patches/relativeborder/) - - allows you to specify a border that is relative in size to the width of a cell in the - terminal - - [right-click-to-plumb](https://st.suckless.org/patches/right_click_to_plumb/) - allows you to right-click on some selected text to send it to the plumbing program of choice - [scrollback](https://st.suckless.org/patches/scrollback/) - allows you scroll back through terminal output using keyboard shortcuts or mousewheel + - scrollback-mouse-altscreen + - Scroll back through terminal output using mouse wheel (when not in MODE_ALTSCREEN). This variant depends on SCROLLBACK_PATCH being enabled. + - sixel - this patch adds SIXEL graphics support - - st-embedder - - this patch allows clients to embed into the st window and can be useful if you tend to - start X applications from the terminal - - the behavior is similar to Plan 9 where applications can take over windows - - - [spoiler](https://st.suckless.org/patches/spoiler/) - - use inverted defaultbg/fg for selection when bg/fg are the same - - [swapmouse](https://st.suckless.org/patches/swapmouse/) - 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 - - [sync](https://st.suckless.org/patches/sync/) - - adds synchronized-updates/application-sync support in st - - this has 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 - - - [themed-cursor](https://st.suckless.org/patches/themed_cursor/) - - instead of a default X cursor, use the xterm cursor from your cursor theme - - - [undercurl](https://st.suckless.org/patches/undercurl/) - - adds support for special underlines, e.g. curly / wavy underlines - - - [universcroll](https://st.suckless.org/patches/universcroll/) - - allows mouse scroll without modifier keys for regardless of alt screen using the external - scroll program - - [use-XftFontMatch](https://git.suckless.org/st/commit/528241aa3835e2f1f052abeeaf891737712955a0.html) - use XftFontMatch in place of FcFontMatch to allow font to scale with Xft.dpi resource setting @@ -294,35 +82,21 @@ Refer to [https://st.suckless.org/](https://st.suckless.org/) for details on the - [vertcenter](https://st.suckless.org/patches/vertcenter/) - vertically center lines in the space available if you have set a larger chscale in config.h - - [~vim-browse~](https://st.suckless.org/patches/vim_browse/) - - ~the vim-browse patch offers the possibility to move through the terminal history-buffer,~ - ~search for strings using VIM-like motions, operations and quantifiers~ - - ~it overlays the screen with highlighted search results and displays the current operation~ - ~/ motions / search string in the bottom right corner~ - - the VIM browse patch was removed due to sheer complexity and it being incompatible with a - significant number of other patches - - if you want to try this patch out then the recommendation is to play around with the - author's own build of st where this is properly implemented with history buffer (scrollback) - - https://github.com/juliusHuelsmann/st - - - [visualbell](https://st.suckless.org/patches/visualbell/) - - adds visual indicators for the terminal bell event - - - [w3m](https://st.suckless.org/patches/w3m/) - - adds support for w3m images - - [wide-glyphs](https://www.reddit.com/r/suckless/comments/jt90ai/update_support_for_proper_glyph_rendering_in_st/) - adds proper support for wide glyphs, as opposed to rendering smaller or cut glyphs - - [wide-glyph-spacing](https://github.com/googlefonts/Inconsolata/issues/42#issuecomment-737508890) - - 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 workaround / patch / hack until (if) this is fixed in the - Xft library itself - - [workingdir](https://st.suckless.org/patches/workingdir/) - allows user to specify the initial path st should use as the working directory - [xresources](https://st.suckless.org/patches/xresources/) - adds the ability to configure st via Xresources - during startup, st will read and apply the resources named in the resources[] array in config.h + + - xresources-reload + - reload the Xresources config when a SIGUSR1 signal is received e.g. `killall -USR1 st` + +## Additions + + - Scripts that use externalpipe patch for handling urls and copying of outputs. - + - st-urlhandler + - st-copyout diff --git a/config.h b/config.h new file mode 100644 index 0000000..d53c95f --- /dev/null +++ b/config.h @@ -0,0 +1,796 @@ +/* See LICENSE file for copyright and license details. */ + +/* + * appearance + * + * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ +static char *font = "JetBrains Mono:pixelsize=12:antialias=true:autohint=true"; +#if FONT2_PATCH +/* Spare fonts */ +static char *font2[] = { + "Symbols Nerd Font:pixelsize=12:antialias=true:autohint=true", + "Unifont:pixelsize=12", + "NotoColorEmoji:pixelsize=10: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 = 10; +#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 = 2; +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 = 1; +const int boxdraw_bold = 0; + +/* braille (U28XX): 1: render as adjacent "pixels", 0: use font */ +const int boxdraw_braille = 1; +#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 = 1.0; +#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 */ + "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 = 258; +#endif // ALPHA_FOCUS_HIGHLIGHT_PATCH +unsigned int defaultfg = 259; +unsigned int defaultcs = 256; +unsigned int defaultrcs = 257; +#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 = 3; +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 ANYGEOMETRY_PATCH +/* + * Whether to use pixel geometry or cell geometry + */ + +static Geometry geometry = CellGeometry; // or PixelGeometry to use the below size +static unsigned int width = 564; +static unsigned int height = 364; +#endif // ANYGEOMETRY_PATCH + +#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, clippaste, {.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 }; + +static char *openurlcmd[] = {"/bin/sh", "-c", "st-urlhandler -o", + "externalpipe", NULL}; +static char *copyurlcmd[] = {"/bin/sh", "-c", "st-urlhandler -c", + "externalpipe", NULL}; +static char *copyoutput[] = {"/bin/sh", "-c", "st-copyout", "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_Up, zoom, {.f = +1} }, + { TERMMOD, XK_Down, zoom, {.f = -1} }, + { TERMMOD, XK_Home, zoomreset, {.f = 0} }, + { TERMMOD, XK_C, clipcopy, {.i = 0} }, + { TERMMOD, XK_V, clippaste, {.i = 0} }, + #if ALPHA_PATCH + { TERMMOD, XK_A, changealpha, {.f = +0.05} }, + { TERMMOD, XK_S, 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 }, + #endif // SCROLLBACK_PATCH + #if CLIPBOARD_PATCH + { TERMMOD, XK_Y, clippaste, {.i = 0} }, + { ShiftMask, XK_Insert, clippaste, {.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 + { MODKEY, XK_l, externalpipe, { .v = openurlcmd } }, + { MODKEY, XK_y, externalpipe, { .v = copyurlcmd } }, + { MODKEY, XK_o, externalpipe, { .v = copyoutput } }, + #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 +}; + +/* + * 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 = "dmenuhandler"; +#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 diff --git a/config.mk b/config.mk index ffcd3cb..9bef440 100644 --- a/config.mk +++ b/config.mk @@ -15,20 +15,20 @@ X11LIB = /usr/X11R6/lib PKG_CONFIG = pkg-config # Uncomment this for the alpha patch / ALPHA_PATCH -#XRENDER = `$(PKG_CONFIG) --libs xrender` +XRENDER = `$(PKG_CONFIG) --libs xrender` # Uncomment this for the themed cursor patch / THEMED_CURSOR_PATCH #XCURSOR = `$(PKG_CONFIG) --libs xcursor` # Uncomment the lines below for the ligatures patch / LIGATURES_PATCH -#LIGATURES_C = hb.c -#LIGATURES_H = hb.h -#LIGATURES_INC = `$(PKG_CONFIG) --cflags harfbuzz` -#LIGATURES_LIBS = `$(PKG_CONFIG) --libs harfbuzz` +LIGATURES_C = hb.c +LIGATURES_H = hb.h +LIGATURES_INC = `$(PKG_CONFIG) --cflags harfbuzz` +LIGATURES_LIBS = `$(PKG_CONFIG) --libs harfbuzz` # Uncomment this for the SIXEL patch / SIXEL_PATCH -#SIXEL_C = sixel.c sixel_hls.c -#SIXEL_LIBS = `$(PKG_CONFIG) --libs imlib2` +SIXEL_C = sixel.c sixel_hls.c +SIXEL_LIBS = `$(PKG_CONFIG) --libs imlib2` # Uncomment for the netwmicon patch / NETWMICON_PATCH #NETWMICON_LIBS = `$(PKG_CONFIG) --libs gdlib` diff --git a/patches.h b/patches.h new file mode 100644 index 0000000..e85b62b --- /dev/null +++ b/patches.h @@ -0,0 +1,495 @@ +/* + * 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 + +/* Allows for the initial size of the terminal to be specified as pixel width and height + * using the -G command line option. Can be combined with the anysize patch to also allow + * the window to be resized to any pixel size. + * https://st.suckless.org/patches/anygeometry/ + */ +#define ANYGEOMETRY_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 1 + +/* 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 1 + +/* This patch adds custom rendering of lines/blocks/braille characters for gapless alignment. + * https://st.suckless.org/patches/boxdraw/ + */ +#define BOXDRAW_PATCH 1 + +/* 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 0 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 + +/* 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 1 diff --git a/st-copyout b/st-copyout new file mode 100755 index 0000000..0d19e5a --- /dev/null +++ b/st-copyout @@ -0,0 +1,13 @@ +#!/bin/sh +# Using external pipe with st, give a dmenu prompt of recent commands, +# allowing the user to copy the output of one. +# xclip required for this script. +# By Jaywalker and Luke +tmpfile=$(mktemp /tmp/st-cmd-output.XXXXXX) +trap 'rm "$tmpfile"' 0 1 15 +sed -n "w $tmpfile" +sed -i 's/\x0//g' "$tmpfile" +ps1="$(grep "\S" "$tmpfile" | tail -n 1 | sed 's/^\s*//' | cut -d' ' -f1)" +chosen="$(grep -F "$ps1" "$tmpfile" | sed '$ d' | tac | dmenu -p "Copy which command's output?" -i -l 10 | sed 's/[^^]/[&]/g; s/\^/\\^/g')" +eps1="$(echo "$ps1" | sed 's/[^^]/[&]/g; s/\^/\\^/g')" +awk "/^$chosen$/{p=1;print;next} p&&/$eps1/{p=0};p" "$tmpfile" | xclip -selection clipboard diff --git a/st-urlhandler b/st-urlhandler new file mode 100755 index 0000000..fe2e9e7 --- /dev/null +++ b/st-urlhandler @@ -0,0 +1,19 @@ +#!/bin/sh + +urlregex="(((http|https|gopher|gemini|ftp|ftps|git)://|www\\.)[a-zA-Z0-9.]*[:;a-zA-Z0-9./+@$&%?$\#=_~-]*)|((magnet:\\?xt=urn:btih:)[a-zA-Z0-9]*)" + +urls="$(sed 's/.*│//g' | tr -d '\n' | # First remove linebreaks and mutt sidebars: + grep -aEo "$urlregex" | # grep only urls as defined above. + uniq | # Ignore neighboring duplicates. + sed "s/\(\.\|,\|;\|\!\\|\?\)$//; + s/^www./http:\/\/www\./")" # xdg-open will not detect url without http + +[ -z "$urls" ] && exit 1 + +while getopts "hoc" o; do case "${o}" in + h) printf "Optional arguments for custom use:\\n -c: copy\\n -o: dmenuhandler\\n -h: Show this message\\n" && exit 1 ;; + o) chosen="$(echo "$urls" | dmenu -i -p 'Use which url?' -l 10)" + setsid dmenuhandler "$chosen" >/dev/null 2>&1 & ;; + c) echo "$urls" | dmenu -i -p 'Copy which url?' -l 10 | tr -d '\n' | xclip -selection clipboard ;; + *) printf "Invalid option: -%s\\n" "$OPTARG" && exit 1 ;; +esac done