Introduction
Introduction Statistics Contact Development Disclaimer Help
dwm-autodarkmode-20240602-6.5.diff - sites - public wiki contents of suckless.o…
git clone git://git.suckless.org/sites
Log
Files
Refs
---
dwm-autodarkmode-20240602-6.5.diff (5913B)
---
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..d4e3ddc 100644
43 --- a/dwm.c
44 +++ b/dwm.c
45 @@ -198,6 +198,7 @@ static void scan(void);
46 static int sendevent(Client *c, Atom proto);
47 static void sendmon(Client *c, Monitor *m);
48 static void setclientstate(Client *c, long state);
49 +static void setcolormode(int sig);
50 static void setfocus(Client *c);
51 static void setfullscreen(Client *c, int fullscreen);
52 static void setlayout(const Arg *arg);
53 @@ -206,6 +207,7 @@ static void setup(void);
54 static void seturgent(Client *c, int urg);
55 static void showhide(Client *c);
56 static void spawn(const Arg *arg);
57 +static void spawndmenu(const Arg *arg);
58 static void tag(const Arg *arg);
59 static void tagmon(const Arg *arg);
60 static void tile(Monitor *m);
61 @@ -262,11 +264,12 @@ static void (*handler[LASTEvent]) (XEvent *) = {
62 static Atom wmatom[WMLast], netatom[NetLast];
63 static int running = 1;
64 static Cur *cursor[CurLast];
65 -static Clr **scheme;
66 +static Clr **scheme, **schemedark, **schemelight;
67 static Display *dpy;
68 static Drw *drw;
69 static Monitor *mons, *selmon;
70 static Window root, wmcheckwin;
71 +static const char **dmenucmd;
72
73 /* configuration, allows nested code to access above variables */
74 #include "config.h"
75 @@ -486,9 +489,12 @@ cleanup(void)
76 cleanupmon(mons);
77 for (i = 0; i < CurLast; i++)
78 drw_cur_free(drw, cursor[i]);
79 - for (i = 0; i < LENGTH(colors); i++)
80 - free(scheme[i]);
81 - free(scheme);
82 + for (i = 0; i < LENGTH(colorsdark); i++) {
83 + free(schemedark[i]);
84 + free(schemelight[i]);
85 + }
86 + free(schemedark);
87 + free(schemelight);
88 XDestroyWindow(dpy, wmcheckwin);
89 drw_free(drw);
90 XSync(dpy, False);
91 @@ -1442,6 +1448,32 @@ setclientstate(Client *c, long state)
92 PropModeReplace, (unsigned char *)data, 2);
93 }
94
95 +void
96 +setcolormode(int sig)
97 +{
98 + static const char *file = ".lightmode";
99 + static char *path = NULL;
100 + const char *home;
101 + size_t size;
102 +
103 + if (!path && (home = getenv("HOME"))) {
104 + size = strlen(home) + 1 + strlen(file) + 1;
105 + path = malloc(size);
106 + if (!path)
107 + die("dwm: malloc failed");
108 +
109 + snprintf(path, size, "%s/%s", home, file);
110 + }
111 +
112 + if (access(path, F_OK) == 0) {
113 + scheme = schemelight;
114 + dmenucmd = dmenulight;
115 + } else {
116 + scheme = schemedark;
117 + dmenucmd = dmenudark;
118 + }
119 +}
120 +
121 int
122 sendevent(Client *c, Atom proto)
123 {
124 @@ -1550,6 +1582,11 @@ setup(void)
125 sa.sa_handler = SIG_IGN;
126 sigaction(SIGCHLD, &sa, NULL);
127
128 + /* set color mode on SIGHUP */
129 + sigemptyset(&sa.sa_mask);
130 + sa.sa_handler = setcolormode;
131 + sigaction(SIGHUP, &sa, NULL);
132 +
133 /* clean up any zombies (inherited from .xinitrc etc) immediate…
134 while (waitpid(-1, NULL, WNOHANG) > 0);
135
136 @@ -1584,9 +1621,13 @@ setup(void)
137 cursor[CurResize] = drw_cur_create(drw, XC_sizing);
138 cursor[CurMove] = drw_cur_create(drw, XC_fleur);
139 /* init appearance */
140 - scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
141 - for (i = 0; i < LENGTH(colors); i++)
142 - scheme[i] = drw_scm_create(drw, colors[i], 3);
143 + schemedark = ecalloc(LENGTH(colorsdark), sizeof(Clr *));
144 + schemelight = ecalloc(LENGTH(colorslight), sizeof(Clr *));
145 + for (i = 0; i < LENGTH(colorsdark); i++) {
146 + schemedark[i] = drw_scm_create(drw, colorsdark[i], 3);
147 + schemelight[i] = drw_scm_create(drw, colorslight[i], 3);
148 + }
149 + setcolormode(0);
150 /* init bars */
151 updatebars();
152 updatestatus();
153 @@ -1649,8 +1690,6 @@ spawn(const Arg *arg)
154 {
155 struct sigaction sa;
156
157 - if (arg->v == dmenucmd)
158 - dmenumon[0] = '0' + selmon->num;
159 if (fork() == 0) {
160 if (dpy)
161 close(ConnectionNumber(dpy));
162 @@ -1666,6 +1705,13 @@ spawn(const Arg *arg)
163 }
164 }
165
166 +void
167 +spawndmenu(const Arg *arg)
168 +{
169 + dmenumon[0] = '0' + selmon->num;
170 + spawn(&(const Arg){.v = dmenucmd});
171 +}
172 +
173 void
174 tag(const Arg *arg)
175 {
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.