st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
patches/st-colorschemes-0.8.5.diff (8700B)
   1 From 9bfbafa1e98c13c039bea4790941e51b3a8054b4 Mon Sep 17 00:00:00 2001
   2 From: Max Schillinger <maxschillinger@web.de>
   3 Date: Thu, 23 Jun 2022 21:58:37 +0200
   4 Subject: [PATCH] Add multiple color schemes and key bindings to change them
   5 
   6 This commits adds these color schemes:
   7 
   8 - the default (dark) st color scheme
   9 - the default (dark) alacritty color scheme
  10 - One Half (dark & light)
  11 - Solarized (dark & light)
  12 - Gruvbox (dark & light)
  13 
  14 Select one with Alt+1..8.
  15 Select the next one with Alt+0.
  16 Select the previous one with Ctrl+Alt+0.
  17 ---
  18  config.def.h | 118 +++++++++++++++++++++++++++++++++++++--------------
  19  st.c         |  22 ++++++++++
  20  st.h         |   2 +
  21  x.c          |  52 ++++++++++++++++++++++-
  22  4 files changed, 160 insertions(+), 34 deletions(-)
  23 
  24 diff --git a/config.def.h b/config.def.h
  25 index 91ab8ca..38777fe 100644
  26 --- a/config.def.h
  27 +++ b/config.def.h
  28 @@ -93,46 +93,87 @@ char *termname = "st-256color";
  29   */
  30  unsigned int tabspaces = 8;
  31  
  32 -/* Terminal colors (16 first used in escape sequence) */
  33 -static const char *colorname[] = {
  34 -    /* 8 normal colors */
  35 -    "black",
  36 -    "red3",
  37 -    "green3",
  38 -    "yellow3",
  39 -    "blue2",
  40 -    "magenta3",
  41 -    "cyan3",
  42 -    "gray90",
  43 -
  44 -    /* 8 bright colors */
  45 -    "gray50",
  46 -    "red",
  47 -    "green",
  48 -    "yellow",
  49 -    "#5c5cff",
  50 -    "magenta",
  51 -    "cyan",
  52 -    "white",
  53 -
  54 -    [255] = 0,
  55 -
  56 -    /* more colors can be added after 255 to use with DefaultXX */
  57 -    "#cccccc",
  58 -    "#555555",
  59 -    "gray90", /* default foreground colour */
  60 -    "black", /* default background colour */
  61 +typedef struct {
  62 +    const char* const colors[258]; /* terminal colors */
  63 +    unsigned int fg;               /* foreground */
  64 +    unsigned int bg;               /* background */
  65 +    unsigned int cs;               /* cursor */
  66 +    unsigned int rcs;              /* reverse cursor */
  67 +} ColorScheme;
  68 +/*
  69 + * Terminal colors (16 first used in escape sequence,
  70 + * 2 last for custom cursor color),
  71 + * foreground, background, cursor, reverse cursor
  72 + */
  73 +static const ColorScheme schemes[] = {
  74 +    // st (dark)
  75 +    {{"black", "red3", "green3", "yellow3",
  76 +      "blue2", "magenta3", "cyan3", "gray90",
  77 +      "gray50", "red", "green", "yellow",
  78 +      "#5c5cff", "magenta", "cyan", "white",
  79 +      [256]="#cccccc", "#555555"}, 7, 0, 256, 257},
  80 +
  81 +    // Alacritty (dark)
  82 +    {{"#1d1f21", "#cc6666", "#b5bd68", "#f0c674",
  83 +      "#81a2be", "#b294bb", "#8abeb7", "#c5c8c6",
  84 +      "#666666", "#d54e53", "#b9ca4a", "#e7c547",
  85 +      "#7aa6da", "#c397d8", "#70c0b1", "#eaeaea",
  86 +      [256]="#cccccc", "#555555"}, 7, 0, 256, 257},
  87 +
  88 +    // One Half dark
  89 +    {{"#282c34", "#e06c75", "#98c379", "#e5c07b",
  90 +      "#61afef", "#c678dd", "#56b6c2", "#dcdfe4",
  91 +      "#282c34", "#e06c75", "#98c379", "#e5c07b",
  92 +      "#61afef", "#c678dd", "#56b6c2", "#dcdfe4",
  93 +      [256]="#cccccc", "#555555"}, 7, 0, 256, 257},
  94 +
  95 +    // One Half light
  96 +    {{"#fafafa", "#e45649", "#50a14f", "#c18401",
  97 +      "#0184bc", "#a626a4", "#0997b3", "#383a42",
  98 +      "#fafafa", "#e45649", "#50a14f", "#c18401",
  99 +      "#0184bc", "#a626a4", "#0997b3", "#383a42",
 100 +      [256]="#cccccc", "#555555"}, 7, 0, 256, 257},
 101 +
 102 +    // Solarized dark
 103 +    {{"#073642", "#dc322f", "#859900", "#b58900",
 104 +      "#268bd2", "#d33682", "#2aa198", "#eee8d5",
 105 +      "#002b36", "#cb4b16", "#586e75", "#657b83",
 106 +      "#839496", "#6c71c4", "#93a1a1", "#fdf6e3",
 107 +      [256]="#93a1a1", "#fdf6e3"}, 12, 8, 256, 257},
 108 +
 109 +    // Solarized light
 110 +    {{"#eee8d5", "#dc322f", "#859900", "#b58900",
 111 +      "#268bd2", "#d33682", "#2aa198", "#073642",
 112 +      "#fdf6e3", "#cb4b16", "#93a1a1", "#839496",
 113 +      "#657b83", "#6c71c4", "#586e75", "#002b36",
 114 +      [256]="#586e75", "#002b36"}, 12, 8, 256, 257},
 115 +
 116 +    // Gruvbox dark
 117 +    {{"#282828", "#cc241d", "#98971a", "#d79921",
 118 +      "#458588", "#b16286", "#689d6a", "#a89984",
 119 +      "#928374", "#fb4934", "#b8bb26", "#fabd2f",
 120 +      "#83a598", "#d3869b", "#8ec07c", "#ebdbb2",
 121 +      [256]="#ebdbb2", "#555555"}, 15, 0, 256, 257},
 122 +
 123 +    // Gruvbox light
 124 +    {{"#fbf1c7", "#cc241d", "#98971a", "#d79921",
 125 +      "#458588", "#b16286", "#689d6a", "#7c6f64",
 126 +      "#928374", "#9d0006", "#79740e", "#b57614",
 127 +      "#076678", "#8f3f71", "#427b58", "#3c3836",
 128 +      [256]="#3c3836", "#555555"}, 15, 0, 256, 257},
 129  };
 130  
 131 +static const char * const * colorname;
 132 +int colorscheme = 0;
 133  
 134  /*
 135   * Default colors (colorname index)
 136   * foreground, background, cursor, reverse cursor
 137   */
 138 -unsigned int defaultfg = 258;
 139 -unsigned int defaultbg = 259;
 140 -unsigned int defaultcs = 256;
 141 -static unsigned int defaultrcs = 257;
 142 +unsigned int defaultfg;
 143 +unsigned int defaultbg;
 144 +unsigned int defaultcs;
 145 +static unsigned int defaultrcs;
 146  
 147  /*
 148   * Default shape of cursor
 149 @@ -201,6 +242,17 @@ static Shortcut shortcuts[] = {
 150      { TERMMOD,              XK_Y,           selpaste,       {.i =  0} },
 151      { ShiftMask,            XK_Insert,      selpaste,       {.i =  0} },
 152      { TERMMOD,              XK_Num_Lock,    numlock,        {.i =  0} },
 153 +    { MODKEY,               XK_1,           selectscheme,   {.i =  0} },
 154 +    { MODKEY,               XK_2,           selectscheme,   {.i =  1} },
 155 +    { MODKEY,               XK_3,           selectscheme,   {.i =  2} },
 156 +    { MODKEY,               XK_4,           selectscheme,   {.i =  3} },
 157 +    { MODKEY,               XK_5,           selectscheme,   {.i =  4} },
 158 +    { MODKEY,               XK_6,           selectscheme,   {.i =  5} },
 159 +    { MODKEY,               XK_7,           selectscheme,   {.i =  6} },
 160 +    { MODKEY,               XK_8,           selectscheme,   {.i =  7} },
 161 +    { MODKEY,               XK_9,           selectscheme,   {.i =  8} },
 162 +    { MODKEY,               XK_0,           nextscheme,     {.i = +1} },
 163 +    { MODKEY|ControlMask,   XK_0,           nextscheme,     {.i = -1} },
 164  };
 165  
 166  /*
 167 diff --git a/st.c b/st.c
 168 index 51049ba..3ffe333 100644
 169 --- a/st.c
 170 +++ b/st.c
 171 @@ -2196,6 +2196,28 @@ tstrsequence(uchar c)
 172      term.esc |= ESC_STR;
 173  }
 174  
 175 +void
 176 +tupdatebgcolor(int oldbg, int newbg)
 177 +{
 178 +    for (int y = 0; y < term.row; y++) {
 179 +        for (int x = 0; x < term.col; x++) {
 180 +            if (term.line[y][x].bg == oldbg)
 181 +                term.line[y][x].bg = newbg;
 182 +        }
 183 +    }
 184 +}
 185 +
 186 +void
 187 +tupdatefgcolor(int oldfg, int newfg)
 188 +{
 189 +    for (int y = 0; y < term.row; y++) {
 190 +        for (int x = 0; x < term.col; x++) {
 191 +            if (term.line[y][x].fg == oldfg)
 192 +                term.line[y][x].fg = newfg;
 193 +        }
 194 +    }
 195 +}
 196 +
 197  void
 198  tcontrolcode(uchar ascii)
 199  {
 200 diff --git a/st.h b/st.h
 201 index 519b9bd..2700de5 100644
 202 --- a/st.h
 203 +++ b/st.h
 204 @@ -90,6 +90,8 @@ int tattrset(int);
 205  void tnew(int, int);
 206  void tresize(int, int);
 207  void tsetdirtattr(int);
 208 +void tupdatebgcolor(int, int);
 209 +void tupdatefgcolor(int, int);
 210  void ttyhangup(void);
 211  int ttynew(const char *, char *, const char *, char **);
 212  size_t ttyread(void);
 213 diff --git a/x.c b/x.c
 214 index 8a16faa..bc0a48c 100644
 215 --- a/x.c
 216 +++ b/x.c
 217 @@ -59,6 +59,8 @@ static void zoom(const Arg *);
 218  static void zoomabs(const Arg *);
 219  static void zoomreset(const Arg *);
 220  static void ttysend(const Arg *);
 221 +static void nextscheme(const Arg *);
 222 +static void selectscheme(const Arg *);
 223  
 224  /* config.h for applying patches and the configuration. */
 225  #include "config.h"
 226 @@ -185,6 +187,7 @@ static void mousesel(XEvent *, int);
 227  static void mousereport(XEvent *);
 228  static char *kmap(KeySym, uint);
 229  static int match(uint, uint);
 230 +static void updatescheme(void);
 231  
 232  static void run(void);
 233  static void usage(void);
 234 @@ -785,7 +788,7 @@ xloadcols(void)
 235          for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp)
 236              XftColorFree(xw.dpy, xw.vis, xw.cmap, cp);
 237      } else {
 238 -        dc.collen = MAX(LEN(colorname), 256);
 239 +        dc.collen = 258;
 240          dc.col = xmalloc(dc.collen * sizeof(Color));
 241      }
 242  
 243 @@ -2008,6 +2011,47 @@ usage(void)
 244          " [stty_args ...]\n", argv0, argv0);
 245  }
 246  
 247 +void
 248 +nextscheme(const Arg *arg)
 249 +{
 250 +    colorscheme += arg->i;
 251 +    if (colorscheme >= (int)LEN(schemes))
 252 +        colorscheme = 0;
 253 +    else if (colorscheme < 0)
 254 +        colorscheme = LEN(schemes) - 1;
 255 +    updatescheme();
 256 +}
 257 +
 258 +void
 259 +selectscheme(const Arg *arg)
 260 +{
 261 +    if (BETWEEN(arg->i, 0, LEN(schemes)-1)) {
 262 +        colorscheme = arg->i;
 263 +        updatescheme();
 264 +    }
 265 +}
 266 +
 267 +void
 268 +updatescheme(void)
 269 +{
 270 +    int oldbg, oldfg;
 271 +
 272 +    oldbg = defaultbg;
 273 +    oldfg = defaultfg;
 274 +    colorname = schemes[colorscheme].colors;
 275 +    defaultbg = schemes[colorscheme].bg;
 276 +    defaultfg = schemes[colorscheme].fg;
 277 +    defaultcs = schemes[colorscheme].cs;
 278 +    defaultrcs = schemes[colorscheme].rcs;
 279 +    xloadcols();
 280 +    if (defaultbg != oldbg)
 281 +        tupdatebgcolor(oldbg, defaultbg);
 282 +    if (defaultfg != oldfg)
 283 +        tupdatefgcolor(oldfg, defaultfg);
 284 +    cresize(win.w, win.h);
 285 +    redraw();
 286 +}
 287 +
 288  int
 289  main(int argc, char *argv[])
 290  {
 291 @@ -2060,6 +2104,12 @@ main(int argc, char *argv[])
 292      } ARGEND;
 293  
 294  run:
 295 +    colorname = schemes[colorscheme].colors;
 296 +    defaultbg = schemes[colorscheme].bg;
 297 +    defaultfg = schemes[colorscheme].fg;
 298 +    defaultcs = schemes[colorscheme].cs;
 299 +    defaultrcs = schemes[colorscheme].rcs;
 300 +
 301      if (argc > 0) /* eat all remaining arguments */
 302          opt_cmd = argv;
 303  
 304 -- 
 305 2.36.1
 306