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.
This commit is contained in:
Max Schillinger 2022-06-23 21:58:37 +02:00 committed by Łukasz Pankowski
parent 3a6d6d7401
commit 01b6343666
4 changed files with 157 additions and 31 deletions

View File

@ -93,46 +93,87 @@ char *termname = "st-256color";
*/ */
unsigned int tabspaces = 8; unsigned int tabspaces = 8;
/* Terminal colors (16 first used in escape sequence) */ typedef struct {
static const char *colorname[] = { const char* const colors[258]; /* terminal colors */
/* 8 normal colors */ unsigned int fg; /* foreground */
"black", unsigned int bg; /* background */
"red3", unsigned int cs; /* cursor */
"green3", unsigned int rcs; /* reverse cursor */
"yellow3", } ColorScheme;
"blue2", /*
"magenta3", * Terminal colors (16 first used in escape sequence,
"cyan3", * 2 last for custom cursor color),
"gray90", * 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},
/* 8 bright colors */ // Alacritty (dark)
"gray50", {{"#1d1f21", "#cc6666", "#b5bd68", "#f0c674",
"red", "#81a2be", "#b294bb", "#8abeb7", "#c5c8c6",
"green", "#666666", "#d54e53", "#b9ca4a", "#e7c547",
"yellow", "#7aa6da", "#c397d8", "#70c0b1", "#eaeaea",
"#5c5cff", [256]="#cccccc", "#555555"}, 7, 0, 256, 257},
"magenta",
"cyan",
"white",
[255] = 0, // 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},
/* more colors can be added after 255 to use with DefaultXX */ // One Half light
"#cccccc", {{"#fafafa", "#e45649", "#50a14f", "#c18401",
"#555555", "#0184bc", "#a626a4", "#0997b3", "#383a42",
"gray90", /* default foreground colour */ "#fafafa", "#e45649", "#50a14f", "#c18401",
"black", /* default background colour */ "#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) * Default colors (colorname index)
* foreground, background, cursor, reverse cursor * foreground, background, cursor, reverse cursor
*/ */
unsigned int defaultfg = 258; unsigned int defaultfg;
unsigned int defaultbg = 259; unsigned int defaultbg;
unsigned int defaultcs = 256; unsigned int defaultcs;
static unsigned int defaultrcs = 257; static unsigned int defaultrcs;
/* /*
* Default shape of cursor * Default shape of cursor
@ -201,6 +242,17 @@ static Shortcut shortcuts[] = {
{ TERMMOD, XK_Y, selpaste, {.i = 0} }, { TERMMOD, XK_Y, selpaste, {.i = 0} },
{ ShiftMask, XK_Insert, selpaste, {.i = 0} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} },
{ TERMMOD, XK_Num_Lock, numlock, {.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} },
}; };
/* /*

22
st.c
View File

@ -2171,6 +2171,28 @@ tstrsequence(uchar c)
term.esc |= ESC_STR; 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 void
tcontrolcode(uchar ascii) tcontrolcode(uchar ascii)
{ {

2
st.h
View File

@ -90,6 +90,8 @@ int tattrset(int);
void tnew(int, int); void tnew(int, int);
void tresize(int, int); void tresize(int, int);
void tsetdirtattr(int); void tsetdirtattr(int);
void tupdatebgcolor(int, int);
void tupdatefgcolor(int, int);
void ttyhangup(void); void ttyhangup(void);
int ttynew(const char *, char *, const char *, char **); int ttynew(const char *, char *, const char *, char **);
size_t ttyread(void); size_t ttyread(void);

52
x.c
View File

@ -59,6 +59,8 @@ static void zoom(const Arg *);
static void zoomabs(const Arg *); static void zoomabs(const Arg *);
static void zoomreset(const Arg *); static void zoomreset(const Arg *);
static void ttysend(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. */ /* config.h for applying patches and the configuration. */
#include "config.h" #include "config.h"
@ -185,6 +187,7 @@ static void mousesel(XEvent *, int);
static void mousereport(XEvent *); static void mousereport(XEvent *);
static char *kmap(KeySym, uint); static char *kmap(KeySym, uint);
static int match(uint, uint); static int match(uint, uint);
static void updatescheme(void);
static void run(void); static void run(void);
static void usage(void); static void usage(void);
@ -801,7 +804,7 @@ xloadcols(void)
for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp) for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp)
XftColorFree(xw.dpy, xw.vis, xw.cmap, cp); XftColorFree(xw.dpy, xw.vis, xw.cmap, cp);
} else { } else {
dc.collen = MAX(LEN(colorname), 256); dc.collen = 258;
dc.col = xmalloc(dc.collen * sizeof(Color)); dc.col = xmalloc(dc.collen * sizeof(Color));
} }
@ -2027,6 +2030,47 @@ usage(void)
" [stty_args ...]\n", argv0, argv0); " [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 int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
@ -2079,6 +2123,12 @@ main(int argc, char *argv[])
} ARGEND; } ARGEND;
run: 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 */ if (argc > 0) /* eat all remaining arguments */
opt_cmd = argv; opt_cmd = argv;