dwm-autodarkmode-20250224-6.5.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-autodarkmode-20250224-6.5.diff (6709B)
---
1 diff --git a/config.def.h b/config.def.h
2 index 9efa774..8a8d3be 100644
3 --- a/config.def.h
4 +++ b/config.def.h
5 @@ -12,11 +12,16 @@ static const char col_gray2[] = "#444444";
6 static const char col_gray3[] = "#bbbbbb";
7 static const char col_gray4[] = "#eeeeee";
8 static const char col_cyan[] = "#005577";
9 -static const char *colors[][3] = {
10 +static const char *colorsdark[][3] = {
11 /* fg bg border */
12 [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
13 [SchemeSel] = { col_gray4, col_cyan, col_cyan },
14 };
15 +static const char *colorslight[][3] = {
16 + /* fg bg border */
17 + [SchemeNorm] = { col_gray1, col_gray3, col_gray2 },
18 + [SchemeSel] = { col_cyan, col_gray4, col_cyan },
19 +};
20
21 /* tagging */
22 static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
23 @@ -56,13 +61,14 @@ static const Layout layouts[] = {
24 #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
25
26 /* commands */
27 -static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
28 -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
29 +static char dmenumon[2] = "0"; /* component of dmenu{dark,light}, manipulated in spawndmenu() */
30 +static const char *dmenudark[] = { "dmenu_run", "-m", dmenumon, "-i", "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
31 +static const char *dmenulight[] = { "dmenu_run", "-m", dmenumon, "-i", "-fn", dmenufont, "-nb", col_gray3, "-nf", col_gray1, "-sb", col_cyan, "-sf", col_gray4, NULL };
32 static const char *termcmd[] = { "st", NULL };
33
34 static const Key keys[] = {
35 /* modifier key function argument */
36 - { MODKEY, XK_p, spawn, {.v = dmenucmd } },
37 + { MODKEY, XK_p, spawndmenu, {0} },
38 { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
39 { MODKEY, XK_b, togglebar, {0} },
40 { MODKEY, XK_j, focusstack, {.i = +1 } },
41 diff --git a/dwm.c b/dwm.c
42 index f1d86b2..bd9cf3d 100644
43 --- a/dwm.c
44 +++ b/dwm.c
45 @@ -153,6 +153,7 @@ static void checkotherwm(void);
46 static void cleanup(void);
47 static void cleanupmon(Monitor *mon);
48 static void clientmessage(XEvent *e);
49 +static void colormodehandler(int sig);
50 static void configure(Client *c);
51 static void configurenotify(XEvent *e);
52 static void configurerequest(XEvent *e);
53 @@ -198,6 +199,7 @@ static void scan(void);
54 static int sendevent(Client *c, Atom proto);
55 static void sendmon(Client *c, Monitor *m);
56 static void setclientstate(Client *c, long state);
57 +static void setcolormode(void);
58 static void setfocus(Client *c);
59 static void setfullscreen(Client *c, int fullscreen);
60 static void setlayout(const Arg *arg);
61 @@ -206,6 +208,7 @@ static void setup(void);
62 static void seturgent(Client *c, int urg);
63 static void showhide(Client *c);
64 static void spawn(const Arg *arg);
65 +static void spawndmenu(const Arg *arg);
66 static void tag(const Arg *arg);
67 static void tagmon(const Arg *arg);
68 static void tile(Monitor *m);
69 @@ -262,11 +265,13 @@ static void (*handler[LASTEvent]) (XEvent *) = {
70 static Atom wmatom[WMLast], netatom[NetLast];
71 static int running = 1;
72 static Cur *cursor[CurLast];
73 -static Clr **scheme;
74 +static Clr **scheme, **schemedark, **schemelight;
75 static Display *dpy;
76 static Drw *drw;
77 static Monitor *mons, *selmon;
78 static Window root, wmcheckwin;
79 +static const char **dmenucmd;
80 +static int colormodechanged;
81
82 /* configuration, allows nested code to access above variables */
83 #include "config.h"
84 @@ -486,9 +491,12 @@ cleanup(void)
85 cleanupmon(mons);
86 for (i = 0; i < CurLast; i++)
87 drw_cur_free(drw, cursor[i]);
88 - for (i = 0; i < LENGTH(colors); i++)
89 - free(scheme[i]);
90 - free(scheme);
91 + for (i = 0; i < LENGTH(colorsdark); i++) {
92 + free(schemedark[i]);
93 + free(schemelight[i]);
94 + }
95 + free(schemedark);
96 + free(schemelight);
97 XDestroyWindow(dpy, wmcheckwin);
98 drw_free(drw);
99 XSync(dpy, False);
100 @@ -531,6 +539,12 @@ clientmessage(XEvent *e)
101 }
102 }
103
104 +void
105 +colormodehandler(int sig)
106 +{
107 + colormodechanged = 1;
108 +}
109 +
110 void
111 configure(Client *c)
112 {
113 @@ -1225,6 +1239,10 @@ propertynotify(XEvent *e)
114 Window trans;
115 XPropertyEvent *ev = &e->xproperty;
116
117 + if (colormodechanged) {
118 + setcolormode();
119 + colormodechanged = 0;
120 + }
121 if ((ev->window == root) && (ev->atom == XA_WM_NAME))
122 updatestatus();
123 else if (ev->state == PropertyDelete)
124 @@ -1442,6 +1460,32 @@ setclientstate(Client *c, long state)
125 PropModeReplace, (unsigned char *)data, 2);
126 }
127
128 +void
129 +setcolormode(void)
130 +{
131 + static const char *file = ".lightmode";
132 + static char *path = NULL;
133 + const char *home;
134 + size_t size;
135 +
136 + if (!path && (home = getenv("HOME"))) {
137 + size = strlen(home) + 1 + strlen(file) + 1;
138 + path = malloc(size);
139 + if (!path)
140 + die("dwm: malloc failed");
141 +
142 + snprintf(path, size, "%s/%s", home, file);
143 + }
144 +
145 + if (access(path, F_OK) == 0) {
146 + scheme = schemelight;
147 + dmenucmd = dmenulight;
148 + } else {
149 + scheme = schemedark;
150 + dmenucmd = dmenudark;
151 + }
152 +}
153 +
154 int
155 sendevent(Client *c, Atom proto)
156 {
157 @@ -1550,6 +1594,11 @@ setup(void)
158 sa.sa_handler = SIG_IGN;
159 sigaction(SIGCHLD, &sa, NULL);
160
161 + /* set color mode on SIGHUP */
162 + sigemptyset(&sa.sa_mask);
163 + sa.sa_handler = colormodehandler;
164 + sigaction(SIGHUP, &sa, NULL);
165 +
166 /* clean up any zombies (inherited from .xinitrc etc) immediately */
167 while (waitpid(-1, NULL, WNOHANG) > 0);
168
169 @@ -1584,9 +1633,13 @@ setup(void)
170 cursor[CurResize] = drw_cur_create(drw, XC_sizing);
171 cursor[CurMove] = drw_cur_create(drw, XC_fleur);
172 /* init appearance */
173 - scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
174 - for (i = 0; i < LENGTH(colors); i++)
175 - scheme[i] = drw_scm_create(drw, colors[i], 3);
176 + schemedark = ecalloc(LENGTH(colorsdark), sizeof(Clr *));
177 + schemelight = ecalloc(LENGTH(colorslight), sizeof(Clr *));
178 + for (i = 0; i < LENGTH(colorsdark); i++) {
179 + schemedark[i] = drw_scm_create(drw, colorsdark[i], 3);
180 + schemelight[i] = drw_scm_create(drw, colorslight[i], 3);
181 + }
182 + setcolormode();
183 /* init bars */
184 updatebars();
185 updatestatus();
186 @@ -1649,8 +1702,6 @@ spawn(const Arg *arg)
187 {
188 struct sigaction sa;
189
190 - if (arg->v == dmenucmd)
191 - dmenumon[0] = '0' + selmon->num;
192 if (fork() == 0) {
193 if (dpy)
194 close(ConnectionNumber(dpy));
195 @@ -1666,6 +1717,13 @@ spawn(const Arg *arg)
196 }
197 }
198
199 +void
200 +spawndmenu(const Arg *arg)
201 +{
202 + dmenumon[0] = '0' + selmon->num;
203 + spawn(&(const Arg){.v = dmenucmd});
204 +}
205 +
206 void
207 tag(const Arg *arg)
208 {