From ec1b8b0ac03dce5b502d8538e88c30f99fbd1f1f Mon Sep 17 00:00:00 2001 From: ant Date: Sat, 4 Jan 2025 21:59:53 +0100 Subject: [PATCH 01/31] fontfeature patch --- hb.c | 13 +++++-------- hb.h | 4 ++++ patches.def.h | 6 +++++- x.c | 20 ++++++++++++++++++++ 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/hb.c b/hb.c index ae3dcc3..d2edd98 100644 --- a/hb.c +++ b/hb.c @@ -35,13 +35,6 @@ typedef struct { static RuneBuffer hbrunebuffer = { 0, NULL }; static hb_buffer_t *hbbuffer; -/* - * Poplulate the array with a list of font features, wrapped in FEATURE macro, - * e. g. - * FEATURE('c', 'a', 'l', 't'), FEATURE('d', 'l', 'i', 'g') - */ -hb_feature_t features[] = { }; - void hbcreatebuffer(void) { @@ -125,7 +118,11 @@ hbtransform(HbTransformData *data, XftFont *xfont, const Glyph *glyphs, int star hb_buffer_add_codepoints(buffer, hbrunebuffer.runes, length, 0, length); /* Shape the segment. */ - hb_shape(font, buffer, features, sizeof(features)/sizeof(hb_feature_t)); + #if FONTFEATURES_PATCH + hb_shape(font, buffer, data->features, data->features_count); + #else + hb_shape(font, buffer, NULL, 0); + #endif /* Get new glyph info. */ hb_glyph_info_t *info = hb_buffer_get_glyph_infos(buffer, &glyph_count); diff --git a/hb.h b/hb.h index cb7ea48..3517855 100644 --- a/hb.h +++ b/hb.h @@ -7,6 +7,10 @@ typedef struct { hb_glyph_info_t *glyphs; hb_glyph_position_t *positions; unsigned int count; +#if FONTFEATURES_PATCH + hb_feature_t *features; + int features_count; +#endif // FONTFEATURES_PATCH } HbTransformData; void hbcreatebuffer(void); diff --git a/patches.def.h b/patches.def.h index 691e45f..e2cd638 100644 --- a/patches.def.h +++ b/patches.def.h @@ -249,7 +249,11 @@ * https://github.com/cog1to/st-ligatures * https://st.suckless.org/patches/ligatures/ */ -#define LIGATURES_PATCH 0 +#define LIGATURES_PATCH 1 + +/* This patch add support for custom font features. It depends on the LIGATURES_PATCH patch + */ +#define FONTFEATURES_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. diff --git a/x.c b/x.c index e761c84..faae7a4 100644 --- a/x.c +++ b/x.c @@ -1770,6 +1770,26 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x xp = winx, yp = winy + font->ascent; #endif // VERTCENTER_PATCH cluster_xp = xp; cluster_yp = yp; + #if FONTFEATURES_PATCH + { // Get font features + shaped.features = (hb_feature_t *) malloc(sizeof(hb_feature_t) * 128); + FcChar8 *s; + int feature_idx = 0; + while (FcPatternGetString(font->pattern, FC_FONT_FEATURES, feature_idx, &s) == FcResultMatch) { + if (strlen(s) != 4) + die("Invalid font feature tag"); + if (feature_idx >= 128) + die("Too many font features"); + shaped.features[feature_idx].tag = HB_TAG(s[0], s[1], s[2], s[3]); + shaped.features[feature_idx].value = 1; + shaped.features[feature_idx].start = HB_FEATURE_GLOBAL_START; + shaped.features[feature_idx].end = HB_FEATURE_GLOBAL_END; + feature_idx++; + } + shaped.features_count = feature_idx; + } + #endif // FONTFEATURES_PATCH + /* Shape the segment. */ hbtransform(&shaped, font->match, glyphs, 0, len); #endif // LIGATURES_PATCH From b8131450b016732c1cd4199c6b9bb6a21c6e7ef0 Mon Sep 17 00:00:00 2001 From: Antoine Vaure Date: Wed, 8 Jan 2025 14:05:15 +0100 Subject: [PATCH 02/31] config: increase scroll speed --- config.def.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config.def.h b/config.def.h index 7baab30..62b69c1 100644 --- a/config.def.h +++ b/config.def.h @@ -380,8 +380,8 @@ static MouseShortcut mshortcuts[] = { { 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}, + { ShiftMask, Button4, kscrollup, {.i = 4}, 0, S_PRI}, + { ShiftMask, Button5, kscrolldown, {.i = 4}, 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 }, @@ -390,8 +390,8 @@ static MouseShortcut mshortcuts[] = { { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, #endif // SCROLLBACK_MOUSE_PATCH #if SCROLLBACK_MOUSE_ALTSCREEN_PATCH || REFLOW_PATCH - { XK_ANY_MOD, Button4, kscrollup, {.i = 1}, 0, S_PRI }, - { XK_ANY_MOD, Button5, kscrolldown, {.i = 1}, 0, S_PRI }, + { XK_ANY_MOD, Button4, kscrollup, {.i = 4}, 0, S_PRI }, + { XK_ANY_MOD, Button5, kscrolldown, {.i = 4}, 0, S_PRI }, { XK_ANY_MOD, Button4, ttysend, {.s = "\031"}, 0, S_ALT }, { XK_ANY_MOD, Button5, ttysend, {.s = "\005"}, 0, S_ALT }, #else From d44ab2a9a276193612908264b67fa5b90b148a06 Mon Sep 17 00:00:00 2001 From: ant Date: Sun, 12 Jan 2025 16:02:31 +0100 Subject: [PATCH 03/31] font default to caskadia --- config.def.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/config.def.h b/config.def.h index 62b69c1..d824981 100644 --- a/config.def.h +++ b/config.def.h @@ -5,13 +5,10 @@ * * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html */ -static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; +static char *font = "Cascadia Code NF:regular:pixelsize=16:fontfeatures=calt,ss01: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", */ -}; +static char *font2[] = { "CaskaydiaCove Nerd Font:pixelsize=16:antialias=true:autohint=true" }; #endif // FONT2_PATCH #if BACKGROUND_IMAGE_PATCH From 48defe07d25c9807bdca42569b9eb0bed0c7c907 Mon Sep 17 00:00:00 2001 From: ant Date: Sun, 12 Jan 2025 16:05:02 +0100 Subject: [PATCH 04/31] Add darkman patch a patch to choose between two color themes by executing a command --- config.def.h | 38 ++++++++++++++++++++++++++++++++++++++ patches.def.h | 3 +++ x.c | 36 +++++++++++++++++++++++++++++++++--- 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/config.def.h b/config.def.h index d824981..fcf0487 100644 --- a/config.def.h +++ b/config.def.h @@ -212,6 +212,44 @@ static const char *colorname[] = { "#e5e5e5", /* 259 -> fg */ }; +#if DARKMAN_PATCH +#define colorname_len (sizeof(colorname) / sizeof(char *)) + +enum theme { + THEME_LIGHT, + THEME_DARK, + THEME_NUM, +}; + +/* Terminal colors (16 first used in escape sequence) */ +static const char *colornames[THEME_NUM][colorname_len] = { + { }, { + "#1a1a1a", /* hard contrast: #1d2021 / soft contrast: #32302f */ + "#f4005f", + "#98e024", + "#fa8419", + "#9d65ff", + "#f4005f", + "#58d1eb", + "#c4c5b5", + "#625e4c", + "#f4005f", + "#98e024", + "#e0d561", + "#9d65ff", + "#f4005f", + "#58d1eb", + "#f6f6ef", + [255] = 0, + /* more colors can be added after 255 to use with DefaultXX */ + "#aaaaaa", /* 256 -> cursor */ + "#555555", /* 257 -> rev cursor*/ + "#000000", /* 258 -> bg */ + "#ffffff", /* 259 -> fg */ +}}; + +#endif // DARKMAN_PATCH + /* * Default colors (colorname index) diff --git a/patches.def.h b/patches.def.h index e2cd638..965d0c4 100644 --- a/patches.def.h +++ b/patches.def.h @@ -255,6 +255,9 @@ */ #define FONTFEATURES_PATCH 1 +#define DARKMAN_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/ diff --git a/x.c b/x.c index faae7a4..c80e772 100644 --- a/x.c +++ b/x.c @@ -802,10 +802,13 @@ setsel(char *str, Time t) #endif // CLIPBOARD_PATCH } -#if XRESOURCES_PATCH && XRESOURCES_RELOAD_PATCH || BACKGROUND_IMAGE_PATCH && BACKGROUND_IMAGE_RELOAD_PATCH +#if XRESOURCES_PATCH && XRESOURCES_RELOAD_PATCH || BACKGROUND_IMAGE_PATCH && BACKGROUND_IMAGE_RELOAD_PATCH || DARKMAN_PATCH void sigusr1_reload(int sig) { + #if DARKMAN_PATCH + xloadcols(); + #endif // DARKMAN_PATCH #if XRESOURCES_PATCH && XRESOURCES_RELOAD_PATCH reload_config(sig); #endif // XRESOURCES_RELOAD_PATCH @@ -988,6 +991,28 @@ xloadalpha(void) } #endif // ALPHA_FOCUS_HIGHLIGHT_PATCH +#if DARKMAN_PATCH +void +darkmanThemeChoose() { + FILE *fp; + char path[128]; + + fp = popen("darkman get", "r"); + if (fp == NULL) { + memcpy(colorname, colornames[0], sizeof(colorname)); + } else { + /* match the stdout with the theme */ + while (fgets(path, sizeof(path)-1, fp) != NULL) { + if (strcmp(path, "light\n") == 0) { + memcpy(colorname, colornames[0], sizeof(colorname)); + } else if (strcmp(path, "dark\n") == 0) { + memcpy(colorname, colornames[1], sizeof(colorname)); + } + } + } +} +#endif // DARKMAN_PATCH + #if ALPHA_PATCH && ALPHA_FOCUS_HIGHLIGHT_PATCH void xloadcols(void) @@ -1021,6 +1046,8 @@ xloadcols(void) static int loaded; Color *cp; + darkmanThemeChoose(); + if (loaded) { for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp) XftColorFree(xw.dpy, xw.vis, xw.cmap, cp); @@ -4045,9 +4072,12 @@ run: setlocale(LC_CTYPE, ""); XSetLocaleModifiers(""); - #if XRESOURCES_PATCH && XRESOURCES_RELOAD_PATCH || BACKGROUND_IMAGE_PATCH && BACKGROUND_IMAGE_RELOAD_PATCH + #if XRESOURCES_PATCH && XRESOURCES_RELOAD_PATCH || BACKGROUND_IMAGE_PATCH && BACKGROUND_IMAGE_RELOAD_PATCH || DARKMAN_PATCH signal(SIGUSR1, sigusr1_reload); - #endif // XRESOURCES_RELOAD_PATCH | BACKGROUND_IMAGE_RELOAD_PATCH + #endif // XRESOURCES_RELOAD_PATCH | BACKGROUND_IMAGE_RELOAD_PATCH | DARKMAN_PATCH + #if DARKMAN_PATCH + memcpy(colornames[0], colorname, sizeof(colorname)); + #endif // DARKMAN_PATCH #if XRESOURCES_PATCH if (!(xw.dpy = XOpenDisplay(NULL))) die("Can't open display\n"); From 84a920d545f2cc465653ab52cecc61931564b26e Mon Sep 17 00:00:00 2001 From: ant Date: Sun, 12 Jan 2025 16:07:50 +0100 Subject: [PATCH 05/31] change default colors --- config.def.h | 51 +++++++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/config.def.h b/config.def.h index fcf0487..bdaac0a 100644 --- a/config.def.h +++ b/config.def.h @@ -182,34 +182,29 @@ char *xdndescchar = " !\"#$&'()*;<>?[\\]^`{|}~"; #endif // DRAG_AND_DROP_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 */ +static char *colorname[] = { + "#011627", /* hard contrast: #1d2021 / soft contrast: #32302f */ + "#d3423e", + "#2aa298", + "#daaa01", + "#4876d6", + "#403f53", + "#08916a", + "#7a8181", + "#7a8181", + "#f76e6e", + "#49d0c5", + "#dac26b", + "#5ca7e4", + "#697098", + "#00c990", + "#989fb1", + [255] = 0, + /* more colors can be added after 255 to use with DefaultXX */ + "#403f53", /* 256 -> cursor */ + "#f2f2f2", /* 257 -> rev cursor*/ + "#ffffff", /* 258 -> bg */ + "#403f53", /* 259 -> fg */ }; #if DARKMAN_PATCH From 1ea9ec607ba124b8bf33040e956fc89166dd7ecc Mon Sep 17 00:00:00 2001 From: ant Date: Sun, 12 Jan 2025 16:09:02 +0100 Subject: [PATCH 06/31] change keys to keyboard select and zoom --- config.def.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config.def.h b/config.def.h index bdaac0a..44813c9 100644 --- a/config.def.h +++ b/config.def.h @@ -452,8 +452,8 @@ static Shortcut shortcuts[] = { { 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} }, + { MODKEY | ControlMask, XK_comma, zoom, {.f = +1} }, + { MODKEY | ControlMask, XK_semicolon, zoom, {.f = -1} }, { TERMMOD, XK_Home, zoomreset, {.f = 0} }, { TERMMOD, XK_C, clipcopy, {.i = 0} }, { TERMMOD, XK_V, clippaste, {.i = 0} }, @@ -497,7 +497,7 @@ static Shortcut shortcuts[] = { #endif // EXTERNALPIPEIN_PATCH #endif // EXTERNALPIPE_PATCH #if KEYBOARDSELECT_PATCH - { TERMMOD, XK_Escape, keyboard_select, { 0 } }, + { TERMMOD, XK_space, keyboard_select, { 0 } }, #endif // KEYBOARDSELECT_PATCH #if KEYBOARDSELECT_PATCH && REFLOW_PATCH { TERMMOD, XK_F, searchforward, { 0 } }, From d0b32e19c60ad6f72b42119000b497b65dc12ec3 Mon Sep 17 00:00:00 2001 From: ant Date: Sun, 12 Jan 2025 16:11:37 +0100 Subject: [PATCH 07/31] enable patches I want --- config.mk | 12 ++++++------ patches.def.h | 26 +++++++++++++------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/config.mk b/config.mk index a3b94cd..fc54978 100644 --- a/config.mk +++ b/config.mk @@ -21,14 +21,14 @@ PKG_CONFIG = pkg-config #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.def.h b/patches.def.h index 965d0c4..8404e4f 100644 --- a/patches.def.h +++ b/patches.def.h @@ -70,12 +70,12 @@ * 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 +#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 0 +#define BOXDRAW_PATCH 1 /* By default st only sets PRIMARY on selection. * This patch makes st set CLIPBOARD on selection. @@ -192,7 +192,7 @@ * that are available to GUI applications. * https://st.suckless.org/patches/fix_keyboard_input/ */ -#define FIXKEYBOARDINPUT_PATCH 0 +#define FIXKEYBOARDINPUT_PATCH 1 /* 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. @@ -200,7 +200,7 @@ * 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 +#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 @@ -239,7 +239,7 @@ * * https://st.suckless.org/patches/keyboard_select/ */ -#define KEYBOARDSELECT_PATCH 0 +#define KEYBOARDSELECT_PATCH 1 /* 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. @@ -302,7 +302,7 @@ * same CWD (current working directory) as the original st instance. * https://st.suckless.org/patches/newterm/ */ -#define NEWTERM_PATCH 0 +#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. @@ -327,7 +327,7 @@ * * https://www.reddit.com/r/suckless/comments/cc83om/st_open_url/ */ -#define OPENURLONCLICK_PATCH 0 +#define OPENURLONCLICK_PATCH 1 /* This patch allows st to fetch the current working directory through the OSC 7 escape * sequence emitted by shells. Must be used with newterm patch. @@ -349,7 +349,7 @@ * Text wraps when the terminal window is made smaller. * Comes with scrollback. */ -#define REFLOW_PATCH 0 +#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. @@ -366,19 +366,19 @@ /* Scroll back through terminal output using Shift+{PageUp, PageDown}. * https://st.suckless.org/patches/scrollback/ */ -#define SCROLLBACK_PATCH 0 +#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 +#define SCROLLBACK_MOUSE_PATCH 1 /* 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 +#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 @@ -412,7 +412,7 @@ * * https://gist.github.com/saitoha/70e0fdf22e3e8f63ce937c7f7da71809 */ -#define SIXEL_PATCH 0 +#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: @@ -472,7 +472,7 @@ * * https://st.suckless.org/patches/undercurl/ */ -#define UNDERCURL_PATCH 0 +#define UNDERCURL_PATCH 1 /* Allows mouse scroll without modifier keys for regardless of alt screen using the external * scroll program. From 7415d93cf2c0f7068bf72fbc5d2654b33fc60e63 Mon Sep 17 00:00:00 2001 From: ant Date: Sun, 12 Jan 2025 16:15:49 +0100 Subject: [PATCH 08/31] Add a nix flake --- default.nix | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ flake.lock | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 41 +++++++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 default.nix create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..0450b6c --- /dev/null +++ b/default.nix @@ -0,0 +1,56 @@ +{ lib +, stdenv +, pkg-config +, fontconfig +, freetype +, libX11 +, libXft +, harfbuzz +, gd +, glib +, ncurses +, writeText +, conf ? null +, patches ? [] +, extraLibs ? [] +, nixosTests +, imlib2 +}: + +stdenv.mkDerivation rec { + pname = "st"; + version = "0.8.5"; + + src = ./.; + inherit patches; + + configFile = + lib.optionalString (conf != null) (writeText "config.def.h" conf); + + postPatch = lib.optionalString (conf != null) "cp ${configFile} config.def.h" + + lib.optionalString stdenv.isDarwin '' + substituteInPlace config.mk --replace "-lrt" "" + ''; + + strictDeps = true; + + makeFlags = [ "PKG_CONFIG=${stdenv.cc.targetPrefix}pkg-config" ]; + + nativeBuildInputs = [ pkg-config ncurses fontconfig freetype ]; + buildInputs = [ libX11 libXft harfbuzz gd glib imlib2 ] ++ extraLibs; + + preInstall = '' + export TERMINFO=$out/share/terminfo + ''; + + installFlags = [ "PREFIX=$(out)" ]; + + passthru.tests.test = nixosTests.terminal-emulators.st; + + meta = with lib; { + description = "st terminal"; + license = licenses.mit; + maintainers = with maintainers; [ sioodmy ]; + platforms = platforms.unix; + }; +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..586a00c --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1736549401, + "narHash": "sha256-ibkQrMHxF/7TqAYcQE+tOnIsSEzXmMegzyBWza6uHKM=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "1dab772dd4a68a7bba5d9460685547ff8e17d899", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-24.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..a30e80d --- /dev/null +++ b/flake.nix @@ -0,0 +1,41 @@ +{ + description = "st terminal"; + + inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let pkgs = nixpkgs.legacyPackages.${system}; + in rec { + packages = flake-utils.lib.flattenTree { + st = pkgs.callPackage ./default.nix { }; + }; + defaultPackage = packages.st; + apps.st = flake-utils.lib.mkApp { + drv = packages.st; + exePath = "/bin/st"; + }; + apps.default = apps.st; + defaultApp = apps.st; + devShell = pkgs.mkShell rec { + name = "st"; + packages = with pkgs; [ + pkg-config + xorg.libX11 + xorg.libXft + fontconfig + harfbuzz.dev + imlib2 + gd + glib + # ccls + # bear + # lldb + # gdb + # valgrind + ]; + }; + + }); +} From a9d0d20213189d44902332a15807aee6f05d163f Mon Sep 17 00:00:00 2001 From: ant Date: Wed, 21 May 2025 20:49:42 +0200 Subject: [PATCH 09/31] enable boxdraw --- config.def.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config.def.h b/config.def.h index 44813c9..bf02b2d 100644 --- a/config.def.h +++ b/config.def.h @@ -127,11 +127,11 @@ int hidecursor = 1; * 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; +const int boxdraw = 1; +const int boxdraw_bold = 1; /* braille (U28XX): 1: render as adjacent "pixels", 0: use font */ -const int boxdraw_braille = 0; +const int boxdraw_braille = 1; #endif // BOXDRAW_PATCH /* From 1cc56c485645421db8202da52eb418cf577f3c49 Mon Sep 17 00:00:00 2001 From: ant Date: Wed, 21 May 2025 20:41:36 +0200 Subject: [PATCH 10/31] Enable alpha patch --- patches.def.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patches.def.h b/patches.def.h index 8404e4f..e961d95 100644 --- a/patches.def.h +++ b/patches.def.h @@ -14,7 +14,7 @@ * when including this patch. * https://st.suckless.org/patches/alpha/ */ -#define ALPHA_PATCH 0 +#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 From ae3a9baf0dba8b24e9b21032b373c8672482118a Mon Sep 17 00:00:00 2001 From: Antoine Vaure Date: Mon, 2 Jun 2025 09:17:07 +0200 Subject: [PATCH 11/31] decrease default font size --- config.def.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.def.h b/config.def.h index bf02b2d..89b6319 100644 --- a/config.def.h +++ b/config.def.h @@ -5,10 +5,10 @@ * * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html */ -static char *font = "Cascadia Code NF:regular:pixelsize=16:fontfeatures=calt,ss01:antialias=true:autohint=true"; +static char *font = "Cascadia Code NF:regular:pixelsize=13.5:fontfeatures=calt,ss01:antialias=true:autohint=true"; #if FONT2_PATCH /* Spare fonts */ -static char *font2[] = { "CaskaydiaCove Nerd Font:pixelsize=16:antialias=true:autohint=true" }; +static char *font2[] = { "CaskaydiaCove Nerd Font:pixelsize=13.5:antialias=true:autohint=true" }; #endif // FONT2_PATCH #if BACKGROUND_IMAGE_PATCH From f8b47f894b7144971b38064976b2088510088749 Mon Sep 17 00:00:00 2001 From: Antoine Vaure Date: Fri, 18 Jul 2025 00:22:52 +0200 Subject: [PATCH 12/31] add keybinnds to scroll --- config.def.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config.def.h b/config.def.h index 89b6319..6b3b9c9 100644 --- a/config.def.h +++ b/config.def.h @@ -472,6 +472,10 @@ static Shortcut shortcuts[] = { #if SCROLLBACK_PATCH || REFLOW_PATCH { ShiftMask, XK_Page_Up, kscrollup, {.i = -1}, S_PRI }, { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1}, S_PRI }, + { TERMMOD, XK_U, kscrollup, {.i = -1}, S_PRI }, + { TERMMOD, XK_D, kscrolldown, {.i = -1}, S_PRI }, + { TERMMOD, XK_K, kscrollup, {.i = 4}, S_PRI }, + { TERMMOD, XK_J, kscrolldown, {.i = 4}, S_PRI }, #endif // SCROLLBACK_PATCH || REFLOW_PATCH #if CLIPBOARD_PATCH { TERMMOD, XK_Y, clippaste, {.i = 0} }, From 33209c6746ed03bc56cea542bb0619fcb840bd8a Mon Sep 17 00:00:00 2001 From: Antoine Vaure Date: Fri, 3 Oct 2025 13:21:56 +0200 Subject: [PATCH 13/31] change colors for light theme --- config.def.h | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/config.def.h b/config.def.h index 6b3b9c9..c91e5bd 100644 --- a/config.def.h +++ b/config.def.h @@ -162,7 +162,7 @@ unsigned int tabspaces = 8; #if ALPHA_PATCH /* bg opacity */ -float alpha = 0.8; +float alpha = 0.9; #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 @@ -183,28 +183,28 @@ char *xdndescchar = " !\"#$&'()*;<>?[\\]^`{|}~"; /* Terminal colors (16 first used in escape sequence) */ static char *colorname[] = { - "#011627", /* hard contrast: #1d2021 / soft contrast: #32302f */ - "#d3423e", - "#2aa298", - "#daaa01", - "#4876d6", - "#403f53", - "#08916a", - "#7a8181", - "#7a8181", - "#f76e6e", - "#49d0c5", - "#dac26b", - "#5ca7e4", - "#697098", - "#00c990", - "#989fb1", + "#000000", + "#ff3333", + "#86b200", + "#f19618", + "#41a6d9", + "#f07078", + "#4cbe99", + "#ffffff", + "#323232", + "#ff6565", + "#b8e532", + "#ffc849", + "#73d7ff", + "#ffa3aa", + "#7ff0cb", + "#ffffff", [255] = 0, /* more colors can be added after 255 to use with DefaultXX */ "#403f53", /* 256 -> cursor */ - "#f2f2f2", /* 257 -> rev cursor*/ - "#ffffff", /* 258 -> bg */ - "#403f53", /* 259 -> fg */ + "#f0ede4", /* 257 -> rev cursor*/ + "#fafafa", /* 258 -> bg */ + "#5b6673", /* 259 -> fg */ }; #if DARKMAN_PATCH From b5498bad114f8fd3c5bc9eb54a9727ae3257f1d5 Mon Sep 17 00:00:00 2001 From: ant Date: Sun, 30 Nov 2025 15:17:14 +0100 Subject: [PATCH 14/31] Revert "change colors for light theme" This reverts commit 042af42400e57abd9d1ad50f6094ea09b2679b2d. --- config.def.h | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/config.def.h b/config.def.h index c91e5bd..6b3b9c9 100644 --- a/config.def.h +++ b/config.def.h @@ -162,7 +162,7 @@ unsigned int tabspaces = 8; #if ALPHA_PATCH /* bg opacity */ -float alpha = 0.9; +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 @@ -183,28 +183,28 @@ char *xdndescchar = " !\"#$&'()*;<>?[\\]^`{|}~"; /* Terminal colors (16 first used in escape sequence) */ static char *colorname[] = { - "#000000", - "#ff3333", - "#86b200", - "#f19618", - "#41a6d9", - "#f07078", - "#4cbe99", - "#ffffff", - "#323232", - "#ff6565", - "#b8e532", - "#ffc849", - "#73d7ff", - "#ffa3aa", - "#7ff0cb", - "#ffffff", + "#011627", /* hard contrast: #1d2021 / soft contrast: #32302f */ + "#d3423e", + "#2aa298", + "#daaa01", + "#4876d6", + "#403f53", + "#08916a", + "#7a8181", + "#7a8181", + "#f76e6e", + "#49d0c5", + "#dac26b", + "#5ca7e4", + "#697098", + "#00c990", + "#989fb1", [255] = 0, /* more colors can be added after 255 to use with DefaultXX */ "#403f53", /* 256 -> cursor */ - "#f0ede4", /* 257 -> rev cursor*/ - "#fafafa", /* 258 -> bg */ - "#5b6673", /* 259 -> fg */ + "#f2f2f2", /* 257 -> rev cursor*/ + "#ffffff", /* 258 -> bg */ + "#403f53", /* 259 -> fg */ }; #if DARKMAN_PATCH From 490d2440da7bf264d851e80c1719e3ebe0d84b57 Mon Sep 17 00:00:00 2001 From: veltza <106755522+veltza@users.noreply.github.com> Date: Thu, 15 Jan 2026 12:11:04 +0200 Subject: [PATCH 15/31] sixel: fix hls-to-rgb and color count issues (#185) This fixes the following sixel issues: - The HLS to RGB color conversion is broken. Ref. https://github.com/veltza/st-sx/commit/d4ade1fe3c094e447d9cd717127220edbb9fba30 - Not enough color registers have been allocated for 1024 colors. Ref. https://github.com/veltza/st-sx/commit/97f93e84365fc0cb1a27ccbb8dc4674459ca3be4 --- sixel.c | 7 ++++++- sixel.h | 2 +- sixel_hls.c | 36 ++++++++++++++++++------------------ 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/sixel.c b/sixel.c index 208fc4c..0f6b710 100644 --- a/sixel.c +++ b/sixel.c @@ -100,9 +100,13 @@ set_default_color(sixel_image_t *image) image->palette[n++] = SIXEL_RGB(i * 11, i * 11, i * 11); } + /* sixels rarely use more than 256 colors and if they do, they use a custom + * palette, so we don't need to initialize these colors */ + /* for (; n < DECSIXEL_PALETTE_MAX; n++) { image->palette[n] = SIXEL_RGB(255, 255, 255); } + */ return (0); } @@ -610,11 +614,12 @@ sixel_parser_parse(sixel_state_t *st, const unsigned char *p, size_t len) st->param = 0; if (st->nparams > 0) { - st->color_index = 1 + st->params[0]; /* offset 1(background color) added */ + st->color_index = st->params[0]; if (st->color_index < 0) st->color_index = 0; else if (st->color_index >= DECSIXEL_PALETTE_MAX) st->color_index = DECSIXEL_PALETTE_MAX - 1; + st->color_index++; /* offset by 1 (background) */ } if (st->nparams > 4) { diff --git a/sixel.h b/sixel.h index 7d14f8a..496973c 100644 --- a/sixel.h +++ b/sixel.h @@ -14,7 +14,7 @@ typedef struct sixel_image_buffer { sixel_color_no_t *data; int width; int height; - sixel_color_t palette[DECSIXEL_PALETTE_MAX]; + sixel_color_t palette[DECSIXEL_PALETTE_MAX + 1]; sixel_color_no_t ncolors; int palette_modified; int use_private_register; diff --git a/sixel_hls.c b/sixel_hls.c index c88241c..c7b5a02 100644 --- a/sixel_hls.c +++ b/sixel_hls.c @@ -30,20 +30,18 @@ // sale, use or other dealings in this Software without prior written // authorization. -#define SIXEL_RGB(r, g, b) ((r) + ((g) << 8) + ((b) << 16) + (255 << 24)) +#define SIXEL_RGB(r, g, b) ((255 << 24) + ((r) << 16) + ((g) << 8) + (b)) int hls_to_rgb(int hue, int lum, int sat) { - double hs = (hue + 240) % 360; - double hv = hs / 360.0; double lv = lum / 100.0; double sv = sat / 100.0; double c, x, m, c2; double r1, g1, b1; - int r, g, b; - int hpi; + int r, g, b, hs; + hue = (hue + 240) % 360; if (sat == 0) { r = g = b = lum * 255 / 100; return SIXEL_RGB(r, g, b); @@ -52,12 +50,14 @@ hls_to_rgb(int hue, int lum, int sat) if ((c2 = ((2.0 * lv) - 1.0)) < 0.0) { c2 = -c2; } + if ((hs = (hue % 120) - 60) < 0) { + hs = -hs; + } c = (1.0 - c2) * sv; - hpi = (int) (hv * 6.0); - x = (hpi & 1) ? c : 0.0; + x = ((60 - hs) / 60.0) * c; m = lv - 0.5 * c; - switch (hpi) { + switch (hue / 60) { case 0: r1 = c; g1 = x; @@ -92,24 +92,24 @@ hls_to_rgb(int hue, int lum, int sat) return SIXEL_RGB(255, 255, 255); } - r = (int) ((r1 + m) * 100.0 + 0.5); - g = (int) ((g1 + m) * 100.0 + 0.5); - b = (int) ((b1 + m) * 100.0 + 0.5); + r = (int) ((r1 + m) * 255.0 + 0.5); + g = (int) ((g1 + m) * 255.0 + 0.5); + b = (int) ((b1 + m) * 255.0 + 0.5); if (r < 0) { r = 0; - } else if (r > 100) { - r = 100; + } else if (r > 255) { + r = 255; } if (g < 0) { g = 0; - } else if (g > 100) { - g = 100; + } else if (g > 255) { + g = 255; } if (b < 0) { b = 0; - } else if (b > 100) { - b = 100; + } else if (b > 255) { + b = 255; } - return SIXEL_RGB(r * 255 / 100, g * 255 / 100, b * 255 / 100); + return SIXEL_RGB(r, g, b); } From b8056cbf24eea5121d362ea3757b10d0dfe21652 Mon Sep 17 00:00:00 2001 From: Bakkeby Date: Thu, 29 Jan 2026 21:28:16 +0100 Subject: [PATCH 16/31] xresources: destroy Xrm database after resource load st would hold on to a XrmDatabase reference for the lifetime of the program due to how in resource_load the ret.addr of the database would be referenced directly. This also meant that for every reload st would be leaking another XrmDatabase reference. This has been partially worked around by applying a strdup to make a copy of the string in order to allow for the XrmDatabase to be freed / destroyed. Consequently the char arrays / strings still leak on reload. We could pass *sdst to free beforehand, but that will only work if that reference is guaranteed to be on the heap. --- patch/xresources.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/patch/xresources.c b/patch/xresources.c index 5617b1a..acdad4d 100644 --- a/patch/xresources.c +++ b/patch/xresources.c @@ -22,7 +22,8 @@ resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) switch (rtype) { case STRING: - *sdst = ret.addr; + /* Note: this leaks memory */ + *sdst = strdup(ret.addr); break; case INTEGER: *idst = strtoul(ret.addr, NULL, 10); @@ -47,8 +48,13 @@ config_init(Display *dpy) return; db = XrmGetStringDatabase(resm); + if (!db) + return; + for (p = resources; p < resources + LEN(resources); p++) resource_load(db, p->name, p->type, p->dst); + + XrmDestroyDatabase(db); } #if XRESOURCES_RELOAD_PATCH From 9edb8d86fb5a5c3fa3141edb811bf4b444468e5e Mon Sep 17 00:00:00 2001 From: step Date: Fri, 30 Jan 2026 08:59:28 +0100 Subject: [PATCH 17/31] Add xresources-xdefaults patch (#195) * Add xresources-xdefaults patch This patch adds the ability to configure st via Xdefaults, in addition to Xresources, like the rxvt-unicode terminal. At startup, st will read and apply the system and user's local Xdefault files, the XServer's Xresources, and the screen and per-host Xdefaults. This patch depends on XRESOURCES_PATCH and is compatible with XRESOURCES_RELOAD_PATCH. I used the following script to stress test this patch. You can also use the script to demo what the patch does. To be simple, it only tests the user's .Xdefaults and .Xresources files, without throwing in the system and per-host files. The script cycles st's background through red, green and blue indefinitely. BACKUP YOUR ~/.Xdefaults and ~/.Xresources FILES BEFORE TESTING. ```sh unset pid if [ -n "$1" ]; then pid=$1 elif pid=$(pgrep -f ^valgrind) && [ -n "$pid" ]; then : else pid=$(pgrep -n ^st$) fi if [ -z "$pid" -o "x$pid" = "x-h" -o "x$pid" = "x--help" ]; then echo "usage: $0 [pid] If pid is omitted valgrind's is used falling back to st's. --------------------------------------------------------------- BACKUP YOUR ~/.Xdefaults and ~/.Xresources FILES BEFORE TESTING ---------------------------------------------------------------" exit 0 fi printf "Attaching pid=%d\n\t%s\n" "$pid" "$(ps -h -ocmd "$pid")" >&2 seconds=0.25 red='#800000' green='#008000' blue='#000080' echo "St.background: $red" >> $HOME/.Xdefaults while true; do sed -i "\$s/$red/$green/" $HOME/.Xdefaults kill -USR1 $pid sleep $seconds sed -i "\$s/$green/$red/" $HOME/.Xdefaults kill -USR1 $pid sleep $seconds echo "St.background: $blue" >> $HOME/.Xresources xrdb -load $HOME/.Xresources kill -USR1 $pid sleep $seconds sed -i '$d' $HOME/.Xresources xrdb -load $HOME/.Xresources kill -USR1 $pid sleep $seconds done ``` * Minor refactoring and freeing / destroying the Xrm database with XrmDestroyDatabase --------- Co-authored-by: Bakkeby --- README.md | 5 +++ patch/xresources.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++ patch/xresources.h | 3 ++ patches.def.h | 7 ++++ 4 files changed, 113 insertions(+) diff --git a/README.md b/README.md index f1b88b8..a3d670a 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ Refer to [https://st.suckless.org/](https://st.suckless.org/) for details on the ### Changelog: +2026-01-08 - Added the xresources-xdefaults patch + 2025-10-28 - Added the selectionbg-alpha patch 2025-02-20 - Added the drag-n-drop and open-selected-text patches @@ -340,3 +342,6 @@ Refer to [https://st.suckless.org/](https://st.suckless.org/) for details on the - [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-xdefaults + - allows .Xdefaults to be read as well in addition to the RESOURCE_MANAGER property on the root window \ No newline at end of file diff --git a/patch/xresources.c b/patch/xresources.c index acdad4d..a294795 100644 --- a/patch/xresources.c +++ b/patch/xresources.c @@ -35,6 +35,102 @@ resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) return 0; } +#if XRESOURCES_XDEFAULTS_PATCH +/* Returns an XrmDatabase that needs to be freed by the caller. */ +static XrmDatabase +get_resources(Display *dpy) +{ + /*******************************************************************/ + /* Adapted from rxvt-unicode-9.31 rxvttoolkit.C get_resources() */ + /*******************************************************************/ + char *homedir = getenv("HOME"); + char fname[1024]; + + char *displayResource, *xe; + XrmDatabase rdb1; + XrmDatabase database = XrmGetStringDatabase(""); + + /* For ordering, see for example http://www.faqs.org/faqs/Xt-FAQ/ Subject: 20 */ + + /* 6. System wide per application default file. */ + + /* Add in $XAPPLRESDIR/St only; not bothering with XUSERFILESEARCHPATH */ + if ((xe = getenv("XAPPLRESDIR")) || (xe = "/etc/X11/app-defaults")) + { + snprintf(fname, sizeof(fname), "%s/%s", xe, "St"); + + if ((rdb1 = XrmGetFileDatabase(fname))) + XrmMergeDatabases(rdb1, &database); + } + + /* 5. User's per application default file. None. */ + + /* 4. User's defaults file. */ + if (homedir) + { + snprintf(fname, sizeof(fname), "%s/.Xdefaults", homedir); + + if ((rdb1 = XrmGetFileDatabase(fname))) + XrmMergeDatabases(rdb1, &database); + } + + /* Get any Xserver Resources (xrdb). */ + displayResource = XResourceManagerString(dpy); + + if (displayResource) + { + if ((rdb1 = XrmGetStringDatabase(displayResource))) + XrmMergeDatabases(rdb1, &database); + } + + /* Get screen specific resources. */ + displayResource = XScreenResourceString(ScreenOfDisplay(dpy, DefaultScreen(dpy))); + + if (displayResource) + { + if ((rdb1 = XrmGetStringDatabase(displayResource))) + XrmMergeDatabases(rdb1, &database); + + XFree(displayResource); + } + + /* 3. User's per host defaults file. */ + /* Add in XENVIRONMENT file */ + if ((xe = getenv("XENVIRONMENT")) && (rdb1 = XrmGetFileDatabase(xe))) + XrmMergeDatabases(rdb1, &database); + else if (homedir) + { + struct utsname un; + + if (!uname(&un)) + { + snprintf(fname, sizeof(fname), "%s/.Xdefaults-%s", homedir, un.nodename); + + if ((rdb1 = XrmGetFileDatabase(fname))) + XrmMergeDatabases(rdb1, &database); + } + } + + return database; +} + +void +config_init(Display *dpy) +{ + XrmDatabase db; + ResourcePref *p; + + XrmInitialize(); + db = get_resources(dpy); + + for (p = resources; p < resources + LEN(resources); p++) + resource_load(db, p->name, p->type, p->dst); + + XrmDestroyDatabase(db); +} + +#else // !XRESOURCES_XDEFAULTS_PATCH + void config_init(Display *dpy) { @@ -43,6 +139,7 @@ config_init(Display *dpy) ResourcePref *p; XrmInitialize(); + resm = XResourceManagerString(dpy); if (!resm) return; @@ -56,6 +153,7 @@ config_init(Display *dpy) XrmDestroyDatabase(db); } +#endif // XRESOURCES_XDEFAULTS_PATCH #if XRESOURCES_RELOAD_PATCH void diff --git a/patch/xresources.h b/patch/xresources.h index c184852..91d5093 100644 --- a/patch/xresources.h +++ b/patch/xresources.h @@ -1,4 +1,7 @@ #include +#if XRESOURCES_XDEFAULTS_PATCH +#include +#endif // XRESOURCES_XDEFAULTS_PATCH /* Xresources preferences */ enum resource_type { diff --git a/patches.def.h b/patches.def.h index 691e45f..7bf33cc 100644 --- a/patches.def.h +++ b/patches.def.h @@ -535,3 +535,10 @@ * Depends on the XRESOURCES_PATCH. */ #define XRESOURCES_RELOAD_PATCH 0 + +/* This patch adds the ability to configure st via Xdefaults, in addition to Xresources, + * like the rxvt-unicode terminal. At startup, st will read and apply the system and user's + * local Xdefault files, the XServer's Xresources, and the screen and per-host Xdefaults. + * This patch depends on XRESOURCES_PATCH and is compatible with XRESOURCES_RELOAD_PATCH. + */ +#define XRESOURCES_XDEFAULTS_PATCH 0 From 1252a3d79dcc679c16477c99b4df5a8217632581 Mon Sep 17 00:00:00 2001 From: ant Date: Sat, 4 Jan 2025 21:59:53 +0100 Subject: [PATCH 18/31] fontfeature patch --- hb.c | 13 +++++-------- hb.h | 4 ++++ patches.def.h | 6 +++++- x.c | 20 ++++++++++++++++++++ 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/hb.c b/hb.c index ae3dcc3..d2edd98 100644 --- a/hb.c +++ b/hb.c @@ -35,13 +35,6 @@ typedef struct { static RuneBuffer hbrunebuffer = { 0, NULL }; static hb_buffer_t *hbbuffer; -/* - * Poplulate the array with a list of font features, wrapped in FEATURE macro, - * e. g. - * FEATURE('c', 'a', 'l', 't'), FEATURE('d', 'l', 'i', 'g') - */ -hb_feature_t features[] = { }; - void hbcreatebuffer(void) { @@ -125,7 +118,11 @@ hbtransform(HbTransformData *data, XftFont *xfont, const Glyph *glyphs, int star hb_buffer_add_codepoints(buffer, hbrunebuffer.runes, length, 0, length); /* Shape the segment. */ - hb_shape(font, buffer, features, sizeof(features)/sizeof(hb_feature_t)); + #if FONTFEATURES_PATCH + hb_shape(font, buffer, data->features, data->features_count); + #else + hb_shape(font, buffer, NULL, 0); + #endif /* Get new glyph info. */ hb_glyph_info_t *info = hb_buffer_get_glyph_infos(buffer, &glyph_count); diff --git a/hb.h b/hb.h index cb7ea48..3517855 100644 --- a/hb.h +++ b/hb.h @@ -7,6 +7,10 @@ typedef struct { hb_glyph_info_t *glyphs; hb_glyph_position_t *positions; unsigned int count; +#if FONTFEATURES_PATCH + hb_feature_t *features; + int features_count; +#endif // FONTFEATURES_PATCH } HbTransformData; void hbcreatebuffer(void); diff --git a/patches.def.h b/patches.def.h index 7bf33cc..896395f 100644 --- a/patches.def.h +++ b/patches.def.h @@ -249,7 +249,11 @@ * https://github.com/cog1to/st-ligatures * https://st.suckless.org/patches/ligatures/ */ -#define LIGATURES_PATCH 0 +#define LIGATURES_PATCH 1 + +/* This patch add support for custom font features. It depends on the LIGATURES_PATCH patch + */ +#define FONTFEATURES_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. diff --git a/x.c b/x.c index e761c84..faae7a4 100644 --- a/x.c +++ b/x.c @@ -1770,6 +1770,26 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x xp = winx, yp = winy + font->ascent; #endif // VERTCENTER_PATCH cluster_xp = xp; cluster_yp = yp; + #if FONTFEATURES_PATCH + { // Get font features + shaped.features = (hb_feature_t *) malloc(sizeof(hb_feature_t) * 128); + FcChar8 *s; + int feature_idx = 0; + while (FcPatternGetString(font->pattern, FC_FONT_FEATURES, feature_idx, &s) == FcResultMatch) { + if (strlen(s) != 4) + die("Invalid font feature tag"); + if (feature_idx >= 128) + die("Too many font features"); + shaped.features[feature_idx].tag = HB_TAG(s[0], s[1], s[2], s[3]); + shaped.features[feature_idx].value = 1; + shaped.features[feature_idx].start = HB_FEATURE_GLOBAL_START; + shaped.features[feature_idx].end = HB_FEATURE_GLOBAL_END; + feature_idx++; + } + shaped.features_count = feature_idx; + } + #endif // FONTFEATURES_PATCH + /* Shape the segment. */ hbtransform(&shaped, font->match, glyphs, 0, len); #endif // LIGATURES_PATCH From 8ced61c5e348916e27d70cc65f1ece0f20804849 Mon Sep 17 00:00:00 2001 From: Antoine Vaure Date: Wed, 8 Jan 2025 14:05:15 +0100 Subject: [PATCH 19/31] config: increase scroll speed --- config.def.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config.def.h b/config.def.h index 7baab30..62b69c1 100644 --- a/config.def.h +++ b/config.def.h @@ -380,8 +380,8 @@ static MouseShortcut mshortcuts[] = { { 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}, + { ShiftMask, Button4, kscrollup, {.i = 4}, 0, S_PRI}, + { ShiftMask, Button5, kscrolldown, {.i = 4}, 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 }, @@ -390,8 +390,8 @@ static MouseShortcut mshortcuts[] = { { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, #endif // SCROLLBACK_MOUSE_PATCH #if SCROLLBACK_MOUSE_ALTSCREEN_PATCH || REFLOW_PATCH - { XK_ANY_MOD, Button4, kscrollup, {.i = 1}, 0, S_PRI }, - { XK_ANY_MOD, Button5, kscrolldown, {.i = 1}, 0, S_PRI }, + { XK_ANY_MOD, Button4, kscrollup, {.i = 4}, 0, S_PRI }, + { XK_ANY_MOD, Button5, kscrolldown, {.i = 4}, 0, S_PRI }, { XK_ANY_MOD, Button4, ttysend, {.s = "\031"}, 0, S_ALT }, { XK_ANY_MOD, Button5, ttysend, {.s = "\005"}, 0, S_ALT }, #else From 81a9b451e9fe5141d0c6a7e5bb85c80d4176eaf3 Mon Sep 17 00:00:00 2001 From: ant Date: Sun, 12 Jan 2025 16:02:31 +0100 Subject: [PATCH 20/31] font default to caskadia --- config.def.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/config.def.h b/config.def.h index 62b69c1..d824981 100644 --- a/config.def.h +++ b/config.def.h @@ -5,13 +5,10 @@ * * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html */ -static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; +static char *font = "Cascadia Code NF:regular:pixelsize=16:fontfeatures=calt,ss01: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", */ -}; +static char *font2[] = { "CaskaydiaCove Nerd Font:pixelsize=16:antialias=true:autohint=true" }; #endif // FONT2_PATCH #if BACKGROUND_IMAGE_PATCH From d17eac914f872705b08988b69ae62f1aff070978 Mon Sep 17 00:00:00 2001 From: ant Date: Sun, 12 Jan 2025 16:05:02 +0100 Subject: [PATCH 21/31] Add darkman patch a patch to choose between two color themes by executing a command --- config.def.h | 38 ++++++++++++++++++++++++++++++++++++++ patches.def.h | 3 +++ x.c | 36 +++++++++++++++++++++++++++++++++--- 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/config.def.h b/config.def.h index d824981..fcf0487 100644 --- a/config.def.h +++ b/config.def.h @@ -212,6 +212,44 @@ static const char *colorname[] = { "#e5e5e5", /* 259 -> fg */ }; +#if DARKMAN_PATCH +#define colorname_len (sizeof(colorname) / sizeof(char *)) + +enum theme { + THEME_LIGHT, + THEME_DARK, + THEME_NUM, +}; + +/* Terminal colors (16 first used in escape sequence) */ +static const char *colornames[THEME_NUM][colorname_len] = { + { }, { + "#1a1a1a", /* hard contrast: #1d2021 / soft contrast: #32302f */ + "#f4005f", + "#98e024", + "#fa8419", + "#9d65ff", + "#f4005f", + "#58d1eb", + "#c4c5b5", + "#625e4c", + "#f4005f", + "#98e024", + "#e0d561", + "#9d65ff", + "#f4005f", + "#58d1eb", + "#f6f6ef", + [255] = 0, + /* more colors can be added after 255 to use with DefaultXX */ + "#aaaaaa", /* 256 -> cursor */ + "#555555", /* 257 -> rev cursor*/ + "#000000", /* 258 -> bg */ + "#ffffff", /* 259 -> fg */ +}}; + +#endif // DARKMAN_PATCH + /* * Default colors (colorname index) diff --git a/patches.def.h b/patches.def.h index 896395f..20bff47 100644 --- a/patches.def.h +++ b/patches.def.h @@ -255,6 +255,9 @@ */ #define FONTFEATURES_PATCH 1 +#define DARKMAN_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/ diff --git a/x.c b/x.c index faae7a4..c80e772 100644 --- a/x.c +++ b/x.c @@ -802,10 +802,13 @@ setsel(char *str, Time t) #endif // CLIPBOARD_PATCH } -#if XRESOURCES_PATCH && XRESOURCES_RELOAD_PATCH || BACKGROUND_IMAGE_PATCH && BACKGROUND_IMAGE_RELOAD_PATCH +#if XRESOURCES_PATCH && XRESOURCES_RELOAD_PATCH || BACKGROUND_IMAGE_PATCH && BACKGROUND_IMAGE_RELOAD_PATCH || DARKMAN_PATCH void sigusr1_reload(int sig) { + #if DARKMAN_PATCH + xloadcols(); + #endif // DARKMAN_PATCH #if XRESOURCES_PATCH && XRESOURCES_RELOAD_PATCH reload_config(sig); #endif // XRESOURCES_RELOAD_PATCH @@ -988,6 +991,28 @@ xloadalpha(void) } #endif // ALPHA_FOCUS_HIGHLIGHT_PATCH +#if DARKMAN_PATCH +void +darkmanThemeChoose() { + FILE *fp; + char path[128]; + + fp = popen("darkman get", "r"); + if (fp == NULL) { + memcpy(colorname, colornames[0], sizeof(colorname)); + } else { + /* match the stdout with the theme */ + while (fgets(path, sizeof(path)-1, fp) != NULL) { + if (strcmp(path, "light\n") == 0) { + memcpy(colorname, colornames[0], sizeof(colorname)); + } else if (strcmp(path, "dark\n") == 0) { + memcpy(colorname, colornames[1], sizeof(colorname)); + } + } + } +} +#endif // DARKMAN_PATCH + #if ALPHA_PATCH && ALPHA_FOCUS_HIGHLIGHT_PATCH void xloadcols(void) @@ -1021,6 +1046,8 @@ xloadcols(void) static int loaded; Color *cp; + darkmanThemeChoose(); + if (loaded) { for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp) XftColorFree(xw.dpy, xw.vis, xw.cmap, cp); @@ -4045,9 +4072,12 @@ run: setlocale(LC_CTYPE, ""); XSetLocaleModifiers(""); - #if XRESOURCES_PATCH && XRESOURCES_RELOAD_PATCH || BACKGROUND_IMAGE_PATCH && BACKGROUND_IMAGE_RELOAD_PATCH + #if XRESOURCES_PATCH && XRESOURCES_RELOAD_PATCH || BACKGROUND_IMAGE_PATCH && BACKGROUND_IMAGE_RELOAD_PATCH || DARKMAN_PATCH signal(SIGUSR1, sigusr1_reload); - #endif // XRESOURCES_RELOAD_PATCH | BACKGROUND_IMAGE_RELOAD_PATCH + #endif // XRESOURCES_RELOAD_PATCH | BACKGROUND_IMAGE_RELOAD_PATCH | DARKMAN_PATCH + #if DARKMAN_PATCH + memcpy(colornames[0], colorname, sizeof(colorname)); + #endif // DARKMAN_PATCH #if XRESOURCES_PATCH if (!(xw.dpy = XOpenDisplay(NULL))) die("Can't open display\n"); From 38dcc0e8661ecb98bee5e75ce529d3b97d2be147 Mon Sep 17 00:00:00 2001 From: ant Date: Sun, 12 Jan 2025 16:07:50 +0100 Subject: [PATCH 22/31] change default colors --- config.def.h | 51 +++++++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/config.def.h b/config.def.h index fcf0487..bdaac0a 100644 --- a/config.def.h +++ b/config.def.h @@ -182,34 +182,29 @@ char *xdndescchar = " !\"#$&'()*;<>?[\\]^`{|}~"; #endif // DRAG_AND_DROP_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 */ +static char *colorname[] = { + "#011627", /* hard contrast: #1d2021 / soft contrast: #32302f */ + "#d3423e", + "#2aa298", + "#daaa01", + "#4876d6", + "#403f53", + "#08916a", + "#7a8181", + "#7a8181", + "#f76e6e", + "#49d0c5", + "#dac26b", + "#5ca7e4", + "#697098", + "#00c990", + "#989fb1", + [255] = 0, + /* more colors can be added after 255 to use with DefaultXX */ + "#403f53", /* 256 -> cursor */ + "#f2f2f2", /* 257 -> rev cursor*/ + "#ffffff", /* 258 -> bg */ + "#403f53", /* 259 -> fg */ }; #if DARKMAN_PATCH From 4d18a5e1040cdb3166caf1b5b7f967ea139b96af Mon Sep 17 00:00:00 2001 From: ant Date: Sun, 12 Jan 2025 16:09:02 +0100 Subject: [PATCH 23/31] change keys to keyboard select and zoom --- config.def.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config.def.h b/config.def.h index bdaac0a..44813c9 100644 --- a/config.def.h +++ b/config.def.h @@ -452,8 +452,8 @@ static Shortcut shortcuts[] = { { 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} }, + { MODKEY | ControlMask, XK_comma, zoom, {.f = +1} }, + { MODKEY | ControlMask, XK_semicolon, zoom, {.f = -1} }, { TERMMOD, XK_Home, zoomreset, {.f = 0} }, { TERMMOD, XK_C, clipcopy, {.i = 0} }, { TERMMOD, XK_V, clippaste, {.i = 0} }, @@ -497,7 +497,7 @@ static Shortcut shortcuts[] = { #endif // EXTERNALPIPEIN_PATCH #endif // EXTERNALPIPE_PATCH #if KEYBOARDSELECT_PATCH - { TERMMOD, XK_Escape, keyboard_select, { 0 } }, + { TERMMOD, XK_space, keyboard_select, { 0 } }, #endif // KEYBOARDSELECT_PATCH #if KEYBOARDSELECT_PATCH && REFLOW_PATCH { TERMMOD, XK_F, searchforward, { 0 } }, From 653e567b29aa9273a4c912675bbbf516b78a6bf1 Mon Sep 17 00:00:00 2001 From: ant Date: Sun, 12 Jan 2025 16:11:37 +0100 Subject: [PATCH 24/31] enable patches I want --- config.mk | 12 ++++++------ patches.def.h | 26 +++++++++++++------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/config.mk b/config.mk index a3b94cd..fc54978 100644 --- a/config.mk +++ b/config.mk @@ -21,14 +21,14 @@ PKG_CONFIG = pkg-config #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.def.h b/patches.def.h index 20bff47..5fd71db 100644 --- a/patches.def.h +++ b/patches.def.h @@ -70,12 +70,12 @@ * 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 +#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 0 +#define BOXDRAW_PATCH 1 /* By default st only sets PRIMARY on selection. * This patch makes st set CLIPBOARD on selection. @@ -192,7 +192,7 @@ * that are available to GUI applications. * https://st.suckless.org/patches/fix_keyboard_input/ */ -#define FIXKEYBOARDINPUT_PATCH 0 +#define FIXKEYBOARDINPUT_PATCH 1 /* 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. @@ -200,7 +200,7 @@ * 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 +#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 @@ -239,7 +239,7 @@ * * https://st.suckless.org/patches/keyboard_select/ */ -#define KEYBOARDSELECT_PATCH 0 +#define KEYBOARDSELECT_PATCH 1 /* 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. @@ -302,7 +302,7 @@ * same CWD (current working directory) as the original st instance. * https://st.suckless.org/patches/newterm/ */ -#define NEWTERM_PATCH 0 +#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. @@ -327,7 +327,7 @@ * * https://www.reddit.com/r/suckless/comments/cc83om/st_open_url/ */ -#define OPENURLONCLICK_PATCH 0 +#define OPENURLONCLICK_PATCH 1 /* This patch allows st to fetch the current working directory through the OSC 7 escape * sequence emitted by shells. Must be used with newterm patch. @@ -349,7 +349,7 @@ * Text wraps when the terminal window is made smaller. * Comes with scrollback. */ -#define REFLOW_PATCH 0 +#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. @@ -366,19 +366,19 @@ /* Scroll back through terminal output using Shift+{PageUp, PageDown}. * https://st.suckless.org/patches/scrollback/ */ -#define SCROLLBACK_PATCH 0 +#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 +#define SCROLLBACK_MOUSE_PATCH 1 /* 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 +#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 @@ -412,7 +412,7 @@ * * https://gist.github.com/saitoha/70e0fdf22e3e8f63ce937c7f7da71809 */ -#define SIXEL_PATCH 0 +#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: @@ -472,7 +472,7 @@ * * https://st.suckless.org/patches/undercurl/ */ -#define UNDERCURL_PATCH 0 +#define UNDERCURL_PATCH 1 /* Allows mouse scroll without modifier keys for regardless of alt screen using the external * scroll program. From bedf74d2ad1e34a9b07cddb95846e451167a62c2 Mon Sep 17 00:00:00 2001 From: ant Date: Sun, 12 Jan 2025 16:15:49 +0100 Subject: [PATCH 25/31] Add a nix flake --- default.nix | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ flake.lock | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 41 +++++++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 default.nix create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..0450b6c --- /dev/null +++ b/default.nix @@ -0,0 +1,56 @@ +{ lib +, stdenv +, pkg-config +, fontconfig +, freetype +, libX11 +, libXft +, harfbuzz +, gd +, glib +, ncurses +, writeText +, conf ? null +, patches ? [] +, extraLibs ? [] +, nixosTests +, imlib2 +}: + +stdenv.mkDerivation rec { + pname = "st"; + version = "0.8.5"; + + src = ./.; + inherit patches; + + configFile = + lib.optionalString (conf != null) (writeText "config.def.h" conf); + + postPatch = lib.optionalString (conf != null) "cp ${configFile} config.def.h" + + lib.optionalString stdenv.isDarwin '' + substituteInPlace config.mk --replace "-lrt" "" + ''; + + strictDeps = true; + + makeFlags = [ "PKG_CONFIG=${stdenv.cc.targetPrefix}pkg-config" ]; + + nativeBuildInputs = [ pkg-config ncurses fontconfig freetype ]; + buildInputs = [ libX11 libXft harfbuzz gd glib imlib2 ] ++ extraLibs; + + preInstall = '' + export TERMINFO=$out/share/terminfo + ''; + + installFlags = [ "PREFIX=$(out)" ]; + + passthru.tests.test = nixosTests.terminal-emulators.st; + + meta = with lib; { + description = "st terminal"; + license = licenses.mit; + maintainers = with maintainers; [ sioodmy ]; + platforms = platforms.unix; + }; +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..586a00c --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1736549401, + "narHash": "sha256-ibkQrMHxF/7TqAYcQE+tOnIsSEzXmMegzyBWza6uHKM=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "1dab772dd4a68a7bba5d9460685547ff8e17d899", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-24.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..a30e80d --- /dev/null +++ b/flake.nix @@ -0,0 +1,41 @@ +{ + description = "st terminal"; + + inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; + inputs.flake-utils.url = "github:numtide/flake-utils"; + + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let pkgs = nixpkgs.legacyPackages.${system}; + in rec { + packages = flake-utils.lib.flattenTree { + st = pkgs.callPackage ./default.nix { }; + }; + defaultPackage = packages.st; + apps.st = flake-utils.lib.mkApp { + drv = packages.st; + exePath = "/bin/st"; + }; + apps.default = apps.st; + defaultApp = apps.st; + devShell = pkgs.mkShell rec { + name = "st"; + packages = with pkgs; [ + pkg-config + xorg.libX11 + xorg.libXft + fontconfig + harfbuzz.dev + imlib2 + gd + glib + # ccls + # bear + # lldb + # gdb + # valgrind + ]; + }; + + }); +} From 568f306b14040bb55f802562125e6ac83bf8d483 Mon Sep 17 00:00:00 2001 From: ant Date: Wed, 21 May 2025 20:49:42 +0200 Subject: [PATCH 26/31] enable boxdraw --- config.def.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config.def.h b/config.def.h index 44813c9..bf02b2d 100644 --- a/config.def.h +++ b/config.def.h @@ -127,11 +127,11 @@ int hidecursor = 1; * 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; +const int boxdraw = 1; +const int boxdraw_bold = 1; /* braille (U28XX): 1: render as adjacent "pixels", 0: use font */ -const int boxdraw_braille = 0; +const int boxdraw_braille = 1; #endif // BOXDRAW_PATCH /* From 4194b515ee7e7cc34d60754b105652be9d24ee23 Mon Sep 17 00:00:00 2001 From: ant Date: Wed, 21 May 2025 20:41:36 +0200 Subject: [PATCH 27/31] Enable alpha patch --- patches.def.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patches.def.h b/patches.def.h index 5fd71db..d927446 100644 --- a/patches.def.h +++ b/patches.def.h @@ -14,7 +14,7 @@ * when including this patch. * https://st.suckless.org/patches/alpha/ */ -#define ALPHA_PATCH 0 +#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 From ccaedf3fe98564fd1faa08fefa6b999d1dd2e55f Mon Sep 17 00:00:00 2001 From: Antoine Vaure Date: Mon, 2 Jun 2025 09:17:07 +0200 Subject: [PATCH 28/31] decrease default font size --- config.def.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.def.h b/config.def.h index bf02b2d..89b6319 100644 --- a/config.def.h +++ b/config.def.h @@ -5,10 +5,10 @@ * * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html */ -static char *font = "Cascadia Code NF:regular:pixelsize=16:fontfeatures=calt,ss01:antialias=true:autohint=true"; +static char *font = "Cascadia Code NF:regular:pixelsize=13.5:fontfeatures=calt,ss01:antialias=true:autohint=true"; #if FONT2_PATCH /* Spare fonts */ -static char *font2[] = { "CaskaydiaCove Nerd Font:pixelsize=16:antialias=true:autohint=true" }; +static char *font2[] = { "CaskaydiaCove Nerd Font:pixelsize=13.5:antialias=true:autohint=true" }; #endif // FONT2_PATCH #if BACKGROUND_IMAGE_PATCH From 659b803a409bb0a289d0b952b6e39cea74c54317 Mon Sep 17 00:00:00 2001 From: Antoine Vaure Date: Fri, 18 Jul 2025 00:22:52 +0200 Subject: [PATCH 29/31] add keybinnds to scroll --- config.def.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config.def.h b/config.def.h index 89b6319..6b3b9c9 100644 --- a/config.def.h +++ b/config.def.h @@ -472,6 +472,10 @@ static Shortcut shortcuts[] = { #if SCROLLBACK_PATCH || REFLOW_PATCH { ShiftMask, XK_Page_Up, kscrollup, {.i = -1}, S_PRI }, { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1}, S_PRI }, + { TERMMOD, XK_U, kscrollup, {.i = -1}, S_PRI }, + { TERMMOD, XK_D, kscrolldown, {.i = -1}, S_PRI }, + { TERMMOD, XK_K, kscrollup, {.i = 4}, S_PRI }, + { TERMMOD, XK_J, kscrolldown, {.i = 4}, S_PRI }, #endif // SCROLLBACK_PATCH || REFLOW_PATCH #if CLIPBOARD_PATCH { TERMMOD, XK_Y, clippaste, {.i = 0} }, From 87c6c244c4768d16a33513d3741c38b2b1179ae0 Mon Sep 17 00:00:00 2001 From: Antoine Vaure Date: Fri, 3 Oct 2025 13:21:56 +0200 Subject: [PATCH 30/31] change colors for light theme --- config.def.h | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/config.def.h b/config.def.h index 6b3b9c9..c91e5bd 100644 --- a/config.def.h +++ b/config.def.h @@ -162,7 +162,7 @@ unsigned int tabspaces = 8; #if ALPHA_PATCH /* bg opacity */ -float alpha = 0.8; +float alpha = 0.9; #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 @@ -183,28 +183,28 @@ char *xdndescchar = " !\"#$&'()*;<>?[\\]^`{|}~"; /* Terminal colors (16 first used in escape sequence) */ static char *colorname[] = { - "#011627", /* hard contrast: #1d2021 / soft contrast: #32302f */ - "#d3423e", - "#2aa298", - "#daaa01", - "#4876d6", - "#403f53", - "#08916a", - "#7a8181", - "#7a8181", - "#f76e6e", - "#49d0c5", - "#dac26b", - "#5ca7e4", - "#697098", - "#00c990", - "#989fb1", + "#000000", + "#ff3333", + "#86b200", + "#f19618", + "#41a6d9", + "#f07078", + "#4cbe99", + "#ffffff", + "#323232", + "#ff6565", + "#b8e532", + "#ffc849", + "#73d7ff", + "#ffa3aa", + "#7ff0cb", + "#ffffff", [255] = 0, /* more colors can be added after 255 to use with DefaultXX */ "#403f53", /* 256 -> cursor */ - "#f2f2f2", /* 257 -> rev cursor*/ - "#ffffff", /* 258 -> bg */ - "#403f53", /* 259 -> fg */ + "#f0ede4", /* 257 -> rev cursor*/ + "#fafafa", /* 258 -> bg */ + "#5b6673", /* 259 -> fg */ }; #if DARKMAN_PATCH From df11aae8c32bf17858e4bd83e0936bd91a2b560a Mon Sep 17 00:00:00 2001 From: ant Date: Sun, 30 Nov 2025 15:17:14 +0100 Subject: [PATCH 31/31] Revert "change colors for light theme" This reverts commit 042af42400e57abd9d1ad50f6094ea09b2679b2d. --- config.def.h | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/config.def.h b/config.def.h index c91e5bd..6b3b9c9 100644 --- a/config.def.h +++ b/config.def.h @@ -162,7 +162,7 @@ unsigned int tabspaces = 8; #if ALPHA_PATCH /* bg opacity */ -float alpha = 0.9; +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 @@ -183,28 +183,28 @@ char *xdndescchar = " !\"#$&'()*;<>?[\\]^`{|}~"; /* Terminal colors (16 first used in escape sequence) */ static char *colorname[] = { - "#000000", - "#ff3333", - "#86b200", - "#f19618", - "#41a6d9", - "#f07078", - "#4cbe99", - "#ffffff", - "#323232", - "#ff6565", - "#b8e532", - "#ffc849", - "#73d7ff", - "#ffa3aa", - "#7ff0cb", - "#ffffff", + "#011627", /* hard contrast: #1d2021 / soft contrast: #32302f */ + "#d3423e", + "#2aa298", + "#daaa01", + "#4876d6", + "#403f53", + "#08916a", + "#7a8181", + "#7a8181", + "#f76e6e", + "#49d0c5", + "#dac26b", + "#5ca7e4", + "#697098", + "#00c990", + "#989fb1", [255] = 0, /* more colors can be added after 255 to use with DefaultXX */ "#403f53", /* 256 -> cursor */ - "#f0ede4", /* 257 -> rev cursor*/ - "#fafafa", /* 258 -> bg */ - "#5b6673", /* 259 -> fg */ + "#f2f2f2", /* 257 -> rev cursor*/ + "#ffffff", /* 258 -> bg */ + "#403f53", /* 259 -> fg */ }; #if DARKMAN_PATCH