dwm-autodarkmode-20250224-6.5.diff - sites - public wiki contents of suckless.o… | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
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", "… | |
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… | |
28 -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", d… | |
29 +static char dmenumon[2] = "0"; /* component of dmenu{dark,light}, manip… | |
30 +static const char *dmenudark[] = { "dmenu_run", "-m", dmenumon, "-i", … | |
31 +static const char *dmenulight[] = { "dmenu_run", "-m", dmenumon, "-i", … | |
32 static const char *termcmd[] = { "st", NULL }; | |
33 | |
34 static const Key keys[] = { | |
35 /* modifier key function argu… | |
36 - { MODKEY, XK_p, spawn, {.v … | |
37 + { MODKEY, XK_p, spawndmenu, {0} … | |
38 { MODKEY|ShiftMask, XK_Return, spawn, {.v … | |
39 { MODKEY, XK_b, togglebar, {0} … | |
40 { MODKEY, XK_j, focusstack, {.i … | |
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) immediate… | |
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 { |