commit 2160a71345cd33d95a2281db8972e361fdbc0a6c
parent ac307d3b896d105272d523c8c5ee8b810080ceee
Author: Max Schillinger <maxschillinger@web.de>
Date: Thu, 23 Jun 2022 22:42:57 +0200
[st][patch][colorschemes] Add colorschemes patch
Diffstat:
2 files changed, 344 insertions(+), 0 deletions(-)
diff --git a/st.suckless.org/patches/colorschemes/index.md b/st.suckless.org/patches/colorschemes/index.md
@@ -0,0 +1,38 @@
+colorschemes
+============
+
+Description
+-----------
+This patch adds multiple color schemes and lets you change them without having
+to restart st.
+
+Predefined color schemes:
+
+- the default (dark) st color scheme
+- the default (dark) alacritty color scheme
+- One Half (dark & light)
+- Solarized (dark & light)
+- Gruvbox (dark & light)
+
+It's similar to the [palettes](../palettes/) patch but it has additional
+features:
+
+- Support for the colors 17 to 256 (_palettes_ returns random colors here).
+- Allow different background and foreground color indices for different
+ color schemes.
+- Add a key binding for switching through color schemes.
+
+Key bindings
+------------
+
+- Select the first..eighth color scheme with Alt+1..8.
+- Select the next color scheme with Alt+0.
+- Select the previous one with Ctrl+Alt+0.
+
+Download
+--------
+* [st-colorschemes-0.8.5.diff](st-colorschemes-0.8.5.diff)
+
+Authors
+-------
+* Max Schillinger - <maxschillinger@web.de>
diff --git a/st.suckless.org/patches/colorschemes/st-colorschemes-0.8.5.diff b/st.suckless.org/patches/colorschemes/st-colorschemes-0.8.5.diff
@@ -0,0 +1,306 @@
+From 9bfbafa1e98c13c039bea4790941e51b3a8054b4 Mon Sep 17 00:00:00 2001
+From: Max Schillinger <maxschillinger@web.de>
+Date: Thu, 23 Jun 2022 21:58:37 +0200
+Subject: [PATCH] Add multiple color schemes and key bindings to change them
+
+This commits adds these color schemes:
+
+- the default (dark) st color scheme
+- the default (dark) alacritty color scheme
+- One Half (dark & light)
+- Solarized (dark & light)
+- Gruvbox (dark & light)
+
+Select one with Alt+1..8.
+Select the next one with Alt+0.
+Select the previous one with Ctrl+Alt+0.
+---
+ config.def.h | 118 +++++++++++++++++++++++++++++++++++++--------------
+ st.c | 22 ++++++++++
+ st.h | 2 +
+ x.c | 52 ++++++++++++++++++++++-
+ 4 files changed, 160 insertions(+), 34 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 91ab8ca..38777fe 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -93,46 +93,87 @@ char *termname = "st-256color";
+ */
+ unsigned int tabspaces = 8;
+
+-/* 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 */
+- "#cccccc",
+- "#555555",
+- "gray90", /* default foreground colour */
+- "black", /* default background colour */
++typedef struct {
++ const char* const colors[258]; /* terminal colors */
++ unsigned int fg; /* foreground */
++ unsigned int bg; /* background */
++ unsigned int cs; /* cursor */
++ unsigned int rcs; /* reverse cursor */
++} ColorScheme;
++/*
++ * Terminal colors (16 first used in escape sequence,
++ * 2 last for custom cursor color),
++ * foreground, background, cursor, reverse cursor
++ */
++static const ColorScheme schemes[] = {
++ // st (dark)
++ {{"black", "red3", "green3", "yellow3",
++ "blue2", "magenta3", "cyan3", "gray90",
++ "gray50", "red", "green", "yellow",
++ "#5c5cff", "magenta", "cyan", "white",
++ [256]="#cccccc", "#555555"}, 7, 0, 256, 257},
++
++ // Alacritty (dark)
++ {{"#1d1f21", "#cc6666", "#b5bd68", "#f0c674",
++ "#81a2be", "#b294bb", "#8abeb7", "#c5c8c6",
++ "#666666", "#d54e53", "#b9ca4a", "#e7c547",
++ "#7aa6da", "#c397d8", "#70c0b1", "#eaeaea",
++ [256]="#cccccc", "#555555"}, 7, 0, 256, 257},
++
++ // One Half dark
++ {{"#282c34", "#e06c75", "#98c379", "#e5c07b",
++ "#61afef", "#c678dd", "#56b6c2", "#dcdfe4",
++ "#282c34", "#e06c75", "#98c379", "#e5c07b",
++ "#61afef", "#c678dd", "#56b6c2", "#dcdfe4",
++ [256]="#cccccc", "#555555"}, 7, 0, 256, 257},
++
++ // One Half light
++ {{"#fafafa", "#e45649", "#50a14f", "#c18401",
++ "#0184bc", "#a626a4", "#0997b3", "#383a42",
++ "#fafafa", "#e45649", "#50a14f", "#c18401",
++ "#0184bc", "#a626a4", "#0997b3", "#383a42",
++ [256]="#cccccc", "#555555"}, 7, 0, 256, 257},
++
++ // Solarized dark
++ {{"#073642", "#dc322f", "#859900", "#b58900",
++ "#268bd2", "#d33682", "#2aa198", "#eee8d5",
++ "#002b36", "#cb4b16", "#586e75", "#657b83",
++ "#839496", "#6c71c4", "#93a1a1", "#fdf6e3",
++ [256]="#93a1a1", "#fdf6e3"}, 12, 8, 256, 257},
++
++ // Solarized light
++ {{"#eee8d5", "#dc322f", "#859900", "#b58900",
++ "#268bd2", "#d33682", "#2aa198", "#073642",
++ "#fdf6e3", "#cb4b16", "#93a1a1", "#839496",
++ "#657b83", "#6c71c4", "#586e75", "#002b36",
++ [256]="#586e75", "#002b36"}, 12, 8, 256, 257},
++
++ // Gruvbox dark
++ {{"#282828", "#cc241d", "#98971a", "#d79921",
++ "#458588", "#b16286", "#689d6a", "#a89984",
++ "#928374", "#fb4934", "#b8bb26", "#fabd2f",
++ "#83a598", "#d3869b", "#8ec07c", "#ebdbb2",
++ [256]="#ebdbb2", "#555555"}, 15, 0, 256, 257},
++
++ // Gruvbox light
++ {{"#fbf1c7", "#cc241d", "#98971a", "#d79921",
++ "#458588", "#b16286", "#689d6a", "#7c6f64",
++ "#928374", "#9d0006", "#79740e", "#b57614",
++ "#076678", "#8f3f71", "#427b58", "#3c3836",
++ [256]="#3c3836", "#555555"}, 15, 0, 256, 257},
+ };
+
++static const char * const * colorname;
++int colorscheme = 0;
+
+ /*
+ * Default colors (colorname index)
+ * foreground, background, cursor, reverse cursor
+ */
+-unsigned int defaultfg = 258;
+-unsigned int defaultbg = 259;
+-unsigned int defaultcs = 256;
+-static unsigned int defaultrcs = 257;
++unsigned int defaultfg;
++unsigned int defaultbg;
++unsigned int defaultcs;
++static unsigned int defaultrcs;
+
+ /*
+ * Default shape of cursor
+@@ -201,6 +242,17 @@ static Shortcut shortcuts[] = {
+ { TERMMOD, XK_Y, selpaste, {.i = 0} },
+ { ShiftMask, XK_Insert, selpaste, {.i = 0} },
+ { TERMMOD, XK_Num_Lock, numlock, {.i = 0} },
++ { MODKEY, XK_1, selectscheme, {.i = 0} },
++ { MODKEY, XK_2, selectscheme, {.i = 1} },
++ { MODKEY, XK_3, selectscheme, {.i = 2} },
++ { MODKEY, XK_4, selectscheme, {.i = 3} },
++ { MODKEY, XK_5, selectscheme, {.i = 4} },
++ { MODKEY, XK_6, selectscheme, {.i = 5} },
++ { MODKEY, XK_7, selectscheme, {.i = 6} },
++ { MODKEY, XK_8, selectscheme, {.i = 7} },
++ { MODKEY, XK_9, selectscheme, {.i = 8} },
++ { MODKEY, XK_0, nextscheme, {.i = +1} },
++ { MODKEY|ControlMask, XK_0, nextscheme, {.i = -1} },
+ };
+
+ /*
+diff --git a/st.c b/st.c
+index 51049ba..3ffe333 100644
+--- a/st.c
++++ b/st.c
+@@ -2196,6 +2196,28 @@ tstrsequence(uchar c)
+ term.esc |= ESC_STR;
+ }
+
++void
++tupdatebgcolor(int oldbg, int newbg)
++{
++ for (int y = 0; y < term.row; y++) {
++ for (int x = 0; x < term.col; x++) {
++ if (term.line[y][x].bg == oldbg)
++ term.line[y][x].bg = newbg;
++ }
++ }
++}
++
++void
++tupdatefgcolor(int oldfg, int newfg)
++{
++ for (int y = 0; y < term.row; y++) {
++ for (int x = 0; x < term.col; x++) {
++ if (term.line[y][x].fg == oldfg)
++ term.line[y][x].fg = newfg;
++ }
++ }
++}
++
+ void
+ tcontrolcode(uchar ascii)
+ {
+diff --git a/st.h b/st.h
+index 519b9bd..2700de5 100644
+--- a/st.h
++++ b/st.h
+@@ -90,6 +90,8 @@ int tattrset(int);
+ void tnew(int, int);
+ void tresize(int, int);
+ void tsetdirtattr(int);
++void tupdatebgcolor(int, int);
++void tupdatefgcolor(int, int);
+ void ttyhangup(void);
+ int ttynew(const char *, char *, const char *, char **);
+ size_t ttyread(void);
+diff --git a/x.c b/x.c
+index 8a16faa..bc0a48c 100644
+--- a/x.c
++++ b/x.c
+@@ -59,6 +59,8 @@ static void zoom(const Arg *);
+ static void zoomabs(const Arg *);
+ static void zoomreset(const Arg *);
+ static void ttysend(const Arg *);
++static void nextscheme(const Arg *);
++static void selectscheme(const Arg *);
+
+ /* config.h for applying patches and the configuration. */
+ #include "config.h"
+@@ -185,6 +187,7 @@ static void mousesel(XEvent *, int);
+ static void mousereport(XEvent *);
+ static char *kmap(KeySym, uint);
+ static int match(uint, uint);
++static void updatescheme(void);
+
+ static void run(void);
+ static void usage(void);
+@@ -785,7 +788,7 @@ xloadcols(void)
+ for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp)
+ XftColorFree(xw.dpy, xw.vis, xw.cmap, cp);
+ } else {
+- dc.collen = MAX(LEN(colorname), 256);
++ dc.collen = 258;
+ dc.col = xmalloc(dc.collen * sizeof(Color));
+ }
+
+@@ -2008,6 +2011,47 @@ usage(void)
+ " [stty_args ...]\n", argv0, argv0);
+ }
+
++void
++nextscheme(const Arg *arg)
++{
++ colorscheme += arg->i;
++ if (colorscheme >= (int)LEN(schemes))
++ colorscheme = 0;
++ else if (colorscheme < 0)
++ colorscheme = LEN(schemes) - 1;
++ updatescheme();
++}
++
++void
++selectscheme(const Arg *arg)
++{
++ if (BETWEEN(arg->i, 0, LEN(schemes)-1)) {
++ colorscheme = arg->i;
++ updatescheme();
++ }
++}
++
++void
++updatescheme(void)
++{
++ int oldbg, oldfg;
++
++ oldbg = defaultbg;
++ oldfg = defaultfg;
++ colorname = schemes[colorscheme].colors;
++ defaultbg = schemes[colorscheme].bg;
++ defaultfg = schemes[colorscheme].fg;
++ defaultcs = schemes[colorscheme].cs;
++ defaultrcs = schemes[colorscheme].rcs;
++ xloadcols();
++ if (defaultbg != oldbg)
++ tupdatebgcolor(oldbg, defaultbg);
++ if (defaultfg != oldfg)
++ tupdatefgcolor(oldfg, defaultfg);
++ cresize(win.w, win.h);
++ redraw();
++}
++
+ int
+ main(int argc, char *argv[])
+ {
+@@ -2060,6 +2104,12 @@ main(int argc, char *argv[])
+ } ARGEND;
+
+ run:
++ colorname = schemes[colorscheme].colors;
++ defaultbg = schemes[colorscheme].bg;
++ defaultfg = schemes[colorscheme].fg;
++ defaultcs = schemes[colorscheme].cs;
++ defaultrcs = schemes[colorscheme].rcs;
++
+ if (argc > 0) /* eat all remaining arguments */
+ opt_cmd = argv;
+
+--
+2.36.1
+