Introduction
Introduction Statistics Contact Development Disclaimer Help
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 {
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.