sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

dwm-colorschemes-6.5.diff (4731B)


      1 From d067cd3815e35c8c5b804893a551d24fa7505e4b Mon Sep 17 00:00:00 2001
      2 From: Listeria monocytogenes <listeria@disroot.org>
      3 Date: Wed, 26 Jun 2024 11:49:20 -0300
      4 Subject: [PATCH] add setscheme() to cycle between colorschemes
      5 
      6 ---
      7  config.def.h | 15 +++++++++++----
      8  dwm.c        | 49 ++++++++++++++++++++++++++++++++++++++++---------
      9  2 files changed, 51 insertions(+), 13 deletions(-)
     10 
     11 diff --git a/config.def.h b/config.def.h
     12 index 9efa774..f87f707 100644
     13 --- a/config.def.h
     14 +++ b/config.def.h
     15 @@ -12,10 +12,16 @@ static const char col_gray2[]       = "#444444";
     16  static const char col_gray3[]       = "#bbbbbb";
     17  static const char col_gray4[]       = "#eeeeee";
     18  static const char col_cyan[]        = "#005577";
     19 -static const char *colors[][3]      = {
     20 -	/*               fg         bg         border   */
     21 -	[SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
     22 -	[SchemeSel]  = { col_gray4, col_cyan,  col_cyan  },
     23 +static const char *colors[][SchemeN][3] = {
     24 +		/*               fg         bg         border   */
     25 +	{ /* dark */
     26 +		[SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
     27 +		[SchemeSel]  = { col_gray4, col_cyan,  col_cyan  },
     28 +	},
     29 +	{ /* light */
     30 +		[SchemeNorm] = { col_gray2, col_gray4, col_gray3 },
     31 +		[SchemeSel]  = { col_gray1, col_cyan,  col_cyan  },
     32 +	},
     33  };
     34  
     35  /* tagging */
     36 @@ -85,6 +91,7 @@ static const Key keys[] = {
     37  	{ MODKEY,                       XK_period, focusmon,       {.i = +1 } },
     38  	{ MODKEY|ShiftMask,             XK_comma,  tagmon,         {.i = -1 } },
     39  	{ MODKEY|ShiftMask,             XK_period, tagmon,         {.i = +1 } },
     40 +	{ MODKEY,                       XK_s,      setscheme,      {.i = +1 } },
     41  	TAGKEYS(                        XK_1,                      0)
     42  	TAGKEYS(                        XK_2,                      1)
     43  	TAGKEYS(                        XK_3,                      2)
     44 diff --git a/dwm.c b/dwm.c
     45 index f1d86b2..9c00a09 100644
     46 --- a/dwm.c
     47 +++ b/dwm.c
     48 @@ -59,7 +59,7 @@
     49  
     50  /* enums */
     51  enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
     52 -enum { SchemeNorm, SchemeSel }; /* color schemes */
     53 +enum { SchemeNorm, SchemeSel, SchemeN /* keeplast */ }; /* color schemes */
     54  enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
     55         NetWMFullscreen, NetActiveWindow, NetWMWindowType,
     56         NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
     57 @@ -202,6 +202,7 @@ static void setfocus(Client *c);
     58  static void setfullscreen(Client *c, int fullscreen);
     59  static void setlayout(const Arg *arg);
     60  static void setmfact(const Arg *arg);
     61 +static void setscheme(const Arg *arg);
     62  static void setup(void);
     63  static void seturgent(Client *c, int urg);
     64  static void showhide(Client *c);
     65 @@ -262,7 +263,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
     66  static Atom wmatom[WMLast], netatom[NetLast];
     67  static int running = 1;
     68  static Cur *cursor[CurLast];
     69 -static Clr **scheme;
     70 +static Clr **schemes, **scheme;
     71  static Display *dpy;
     72  static Drw *drw;
     73  static Monitor *mons, *selmon;
     74 @@ -486,9 +487,9 @@ cleanup(void)
     75  		cleanupmon(mons);
     76  	for (i = 0; i < CurLast; i++)
     77  		drw_cur_free(drw, cursor[i]);
     78 -	for (i = 0; i < LENGTH(colors); i++)
     79 -		free(scheme[i]);
     80 -	free(scheme);
     81 +	for (i = 0; i < LENGTH(colors) * SchemeN; i++)
     82 +		free(schemes[i]);
     83 +	free(schemes);
     84  	XDestroyWindow(dpy, wmcheckwin);
     85  	drw_free(drw);
     86  	XSync(dpy, False);
     87 @@ -1536,10 +1537,37 @@ setmfact(const Arg *arg)
     88  	arrange(selmon);
     89  }
     90  
     91 +void
     92 +setscheme(const Arg *arg)
     93 +{
     94 +	ptrdiff_t si;
     95 +	Monitor *m;
     96 +	Client *c;
     97 +
     98 +	/* select default color scheme */
     99 +	if (!arg || arg->i == 0)
    100 +		si = 0;
    101 +	else
    102 +		si = (scheme - schemes) + arg->i * SchemeN;
    103 +
    104 +	/* wrap around, won't work if (abs(arg->i) > LENGTH(colors)) */
    105 +	if (si < 0)
    106 +		si += LENGTH(colors) * SchemeN;
    107 +	else if (si >= LENGTH(colors) * SchemeN)
    108 +		si -= LENGTH(colors) * SchemeN;
    109 +
    110 +	scheme = &schemes[si];
    111 +
    112 +	drawbars();
    113 +	for (m = mons; m; m = m->next)
    114 +		for (c = m->clients; c; c = c->next)
    115 +			XSetWindowBorder(dpy, c->win, scheme[c == selmon->sel ? SchemeSel : SchemeNorm][ColBorder].pixel);
    116 +}
    117 +
    118  void
    119  setup(void)
    120  {
    121 -	int i;
    122 +	int i, j;
    123  	XSetWindowAttributes wa;
    124  	Atom utf8string;
    125  	struct sigaction sa;
    126 @@ -1584,9 +1612,12 @@ setup(void)
    127  	cursor[CurResize] = drw_cur_create(drw, XC_sizing);
    128  	cursor[CurMove] = drw_cur_create(drw, XC_fleur);
    129  	/* init appearance */
    130 -	scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
    131 -	for (i = 0; i < LENGTH(colors); i++)
    132 -		scheme[i] = drw_scm_create(drw, colors[i], 3);
    133 +	schemes = ecalloc(LENGTH(colors), SchemeN * sizeof(Clr *));
    134 +	for (j = LENGTH(colors) - 1; j >= 0; j--) {
    135 +		scheme = &schemes[j * SchemeN];
    136 +		for (i = 0; i < SchemeN; i++)
    137 +			scheme[i] = drw_scm_create(drw, colors[j][i], 3);
    138 +	}
    139  	/* init bars */
    140  	updatebars();
    141  	updatestatus();
    142 -- 
    143 2.47.1
    144