commit 2160a71345cd33d95a2281db8972e361fdbc0a6c
Author: Max Schillinger <[email protected]>
Date:   Thu Jun 23 22:42:57 2022 +0200

    [st][patch][colorschemes] Add colorschemes patch

diff --git a/st.suckless.org/patches/colorschemes/index.md 
b/st.suckless.org/patches/colorschemes/index.md
new file mode 100644
index 00000000..532ba8c2
--- /dev/null
+++ 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 - <[email protected]>
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
new file mode 100644
index 00000000..28037d9c
--- /dev/null
+++ 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 <[email protected]>
+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 ...]
", 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
+


Reply via email to