apply patch dwm-autodarkmode-20250224-6.5.diff
This commit is contained in:
76
dwm.c
76
dwm.c
@@ -157,6 +157,7 @@ static void checkotherwm(void);
|
||||
static void cleanup(void);
|
||||
static void cleanupmon(Monitor *mon);
|
||||
static void clientmessage(XEvent *e);
|
||||
static void colormodehandler(int sig);
|
||||
static void configure(Client *c);
|
||||
static void configurenotify(XEvent *e);
|
||||
static void configurerequest(XEvent *e);
|
||||
@@ -207,6 +208,7 @@ static int sendevent(Client *c, Atom proto);
|
||||
static void sendmon(Client *c, Monitor *m);
|
||||
static void setclientstate(Client *c, long state);
|
||||
static void setclienttagprop(Client *c);
|
||||
static void setcolormode(void);
|
||||
static void setfocus(Client *c);
|
||||
static void setfullscreen(Client *c, int fullscreen);
|
||||
static void setlayout(const Arg *arg);
|
||||
@@ -221,6 +223,7 @@ static void sigchld(int unused);
|
||||
static void sighup(int unused);
|
||||
static void sigterm(int unused);
|
||||
static void spawn(const Arg *arg);
|
||||
static void spawndmenu(const Arg *arg);
|
||||
static void tag(const Arg *arg);
|
||||
static void tagmon(const Arg *arg);
|
||||
static void tile(Monitor *m);
|
||||
@@ -279,11 +282,13 @@ static Atom wmatom[WMLast], netatom[NetLast];
|
||||
static int restart = 0;
|
||||
static int running = 1;
|
||||
static Cur *cursor[CurLast];
|
||||
static Clr **scheme;
|
||||
static Clr **scheme, **schemedark, **schemelight;
|
||||
static Display *dpy;
|
||||
static Drw *drw;
|
||||
static Monitor *mons, *selmon;
|
||||
static Window root, wmcheckwin;
|
||||
static const char **dmenucmd;
|
||||
static int colormodechanged;
|
||||
|
||||
/* configuration, allows nested code to access above variables */
|
||||
#include "config.h"
|
||||
@@ -518,9 +523,12 @@ cleanup(void)
|
||||
cleanupmon(mons);
|
||||
for (i = 0; i < CurLast; i++)
|
||||
drw_cur_free(drw, cursor[i]);
|
||||
for (i = 0; i < LENGTH(colors); i++)
|
||||
free(scheme[i]);
|
||||
free(scheme);
|
||||
for (i = 0; i < LENGTH(colorsdark); i++) {
|
||||
free(schemedark[i]);
|
||||
free(schemelight[i]);
|
||||
}
|
||||
free(schemedark);
|
||||
free(schemelight);
|
||||
XDestroyWindow(dpy, wmcheckwin);
|
||||
drw_free(drw);
|
||||
XSync(dpy, False);
|
||||
@@ -563,6 +571,12 @@ clientmessage(XEvent *e)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
colormodehandler(int sig)
|
||||
{
|
||||
colormodechanged = 1;
|
||||
}
|
||||
|
||||
void
|
||||
configure(Client *c)
|
||||
{
|
||||
@@ -1363,6 +1377,10 @@ propertynotify(XEvent *e)
|
||||
Window trans;
|
||||
XPropertyEvent *ev = &e->xproperty;
|
||||
|
||||
if (colormodechanged) {
|
||||
setcolormode();
|
||||
colormodechanged = 0;
|
||||
}
|
||||
if ((ev->window == root) && (ev->atom == XA_WM_NAME))
|
||||
updatestatus();
|
||||
else if (ev->state == PropertyDelete)
|
||||
@@ -1592,6 +1610,32 @@ setclientstate(Client *c, long state)
|
||||
PropModeReplace, (unsigned char *)data, 2);
|
||||
}
|
||||
|
||||
void
|
||||
setcolormode(void)
|
||||
{
|
||||
static const char *file = ".lightmode";
|
||||
static char *path = NULL;
|
||||
const char *home;
|
||||
size_t size;
|
||||
|
||||
if (!path && (home = getenv("HOME"))) {
|
||||
size = strlen(home) + 1 + strlen(file) + 1;
|
||||
path = malloc(size);
|
||||
if (!path)
|
||||
die("dwm: malloc failed");
|
||||
|
||||
snprintf(path, size, "%s/%s", home, file);
|
||||
}
|
||||
|
||||
if (access(path, F_OK) == 0) {
|
||||
scheme = schemelight;
|
||||
dmenucmd = dmenulight;
|
||||
} else {
|
||||
scheme = schemedark;
|
||||
dmenucmd = dmenudark;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sendevent(Client *c, Atom proto)
|
||||
{
|
||||
@@ -1700,6 +1744,11 @@ setup(void)
|
||||
sa.sa_handler = SIG_IGN;
|
||||
sigaction(SIGCHLD, &sa, NULL);
|
||||
|
||||
/* set color mode on SIGHUP */
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_handler = colormodehandler;
|
||||
sigaction(SIGHUP, &sa, NULL);
|
||||
|
||||
/* clean up any zombies (inherited from .xinitrc etc) immediately */
|
||||
while (waitpid(-1, NULL, WNOHANG) > 0);
|
||||
|
||||
@@ -1738,9 +1787,13 @@ setup(void)
|
||||
cursor[CurResize] = drw_cur_create(drw, XC_sizing);
|
||||
cursor[CurMove] = drw_cur_create(drw, XC_fleur);
|
||||
/* init appearance */
|
||||
scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
|
||||
for (i = 0; i < LENGTH(colors); i++)
|
||||
scheme[i] = drw_scm_create(drw, colors[i], 3);
|
||||
schemedark = ecalloc(LENGTH(colorsdark), sizeof(Clr *));
|
||||
schemelight = ecalloc(LENGTH(colorslight), sizeof(Clr *));
|
||||
for (i = 0; i < LENGTH(colorsdark); i++) {
|
||||
schemedark[i] = drw_scm_create(drw, colorsdark[i], 3);
|
||||
schemelight[i] = drw_scm_create(drw, colorslight[i], 3);
|
||||
}
|
||||
setcolormode();
|
||||
/* init bars */
|
||||
updatebars();
|
||||
updatestatus();
|
||||
@@ -1862,8 +1915,6 @@ spawn(const Arg *arg)
|
||||
{
|
||||
struct sigaction sa;
|
||||
|
||||
if (arg->v == dmenucmd)
|
||||
dmenumon[0] = '0' + selmon->num;
|
||||
if (fork() == 0) {
|
||||
if (dpy)
|
||||
close(ConnectionNumber(dpy));
|
||||
@@ -1887,6 +1938,13 @@ setclienttagprop(Client *c)
|
||||
PropModeReplace, (unsigned char *) data, 2);
|
||||
}
|
||||
|
||||
void
|
||||
spawndmenu(const Arg *arg)
|
||||
{
|
||||
dmenumon[0] = '0' + selmon->num;
|
||||
spawn(&(const Arg){.v = dmenucmd});
|
||||
}
|
||||
|
||||
void
|
||||
tag(const Arg *arg)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user