Compare commits

...

3 Commits

  1. 2
      LICENSE
  2. 2
      README.md
  3. 67
      config.def.h
  4. 4
      config.mk
  5. 74
      dwm.c

2
LICENSE

@ -18,7 +18,7 @@ MIT/X Consortium License
© 2015-2016 Eric Pruitt <eric.pruitt@gmail.com> © 2015-2016 Eric Pruitt <eric.pruitt@gmail.com>
© 2016-2017 Markus Teich <markus.teich@stusta.mhn.de> © 2016-2017 Markus Teich <markus.teich@stusta.mhn.de>
© 2020-2022 Chris Down <chris@chrisdown.name> © 2020-2022 Chris Down <chris@chrisdown.name>
© 2021-2022 Ivan Polyakov <code at vilor dot one> © 2021-2024 Ivan Polyakov <code at vilor dot one>
Permission is hereby granted, free of charge, to any person obtaining a Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"), copy of this software and associated documentation files (the "Software"),

2
README.md

@ -1,6 +1,6 @@
dwm dwm
=== ===
Vilor's dwm based on [dwm 6.4](README.dwm.md) Vilor's dwm based on [dwm 6.5](README.dwm.md)
Used patches Used patches
------------ ------------

67
config.def.h

@ -2,20 +2,31 @@
#include <X11/XF86keysym.h> #include <X11/XF86keysym.h>
/* appearance */ /*** appearance ***/
static const unsigned int borderpx = 1; /* border pixel of windows */ static const unsigned int borderpx = 1; /* border pixel of windows */
static const unsigned int snap = 32; /* snap pixel */ static const unsigned int snap = 32; /* snap pixel */
static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */
static const unsigned int systrayonleft = 0; /* 0: systray in the right corner, >0: systray on left of status text */
static const unsigned int systrayspacing = 2; /* systray spacing */
static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/
static const int showsystray = 1; /* 0 means no systray */
static const int showbar = 1; /* 0 means no bar */ static const int showbar = 1; /* 0 means no bar */
static const int topbar = 1; /* 0 means bottom bar */ static const int topbar = 1; /* 0 means bottom bar */
static const char *fonts[] = { "monospace:size=10" }; static const char *fonts[] = { "monospace:size=10" };
static const char dmenufont[] = "monospace:size=10"; static const char dmenufont[] = "monospace:size=10";
/* default theme /** systray **/
/* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */
static const unsigned int systraypinning = 0;
/* 0: systray in the right corner, >0: systray on left of status text */
static const unsigned int systrayonleft = 0;
/* systray spacing */
static const unsigned int systrayspacing = 2;
/*
* 1: if pinning fails, display systray on the first monitor,
* False: display systray on the last monitor
*/
static const int systraypinningfailfirst = 1;
/* 0 means no systray */
static const int showsystray = 1;
/** default theme **/
/*
static const char col_gray1[] = "#222222"; static const char col_gray1[] = "#222222";
static const char col_gray2[] = "#444444"; static const char col_gray2[] = "#444444";
static const char col_gray3[] = "#bbbbbb"; static const char col_gray3[] = "#bbbbbb";
@ -23,19 +34,20 @@ static const char col_gray4[] = "#eeeeee";
static const char col_cyan[] = "#005577"; static const char col_cyan[] = "#005577";
*/ */
/* my theme */ /** my theme **/
static const char col_gray1[] = "#2e3440"; static const char col_gray1[] = "#2e3440";
static const char col_gray2[] = "#444444"; static const char col_gray2[] = "#444444";
static const char col_gray3[] = "#bbbbbb"; static const char col_gray3[] = "#bbbbbb";
static const char col_gray4[] = "#eeeeee"; static const char col_gray4[] = "#eeeeee";
static const char col_cyan[] = "#9b3e46"; static const char col_cyan[] = "#9b3e46";
static const char *colors[][3] = { static const char *colors[][3] = {
/* fg bg border */ /* fg bg border */
[SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
[SchemeSel] = { col_gray4, col_cyan, col_cyan }, [SchemeSel] = { col_gray4, col_cyan, col_cyan },
}; };
/* tagging */ /** tagging **/
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
static const Rule rules[] = { static const Rule rules[] = {
@ -48,11 +60,18 @@ static const Rule rules[] = {
{ "Firefox", NULL, NULL, 1 << 8, 0, -1 }, { "Firefox", NULL, NULL, 1 << 8, 0, -1 },
}; };
/* layout(s) */ /*** layout(s) ***/
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ /* factor of master area size [0.05..0.95] */
static const int nmaster = 1; /* number of clients in master area */ static const float mfact = 0.55;
static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */
static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ /* number of clients in master area */
static const int nmaster = 1;
/* 1 means respect size hints in tiled resizals */
static const int resizehints = 0;
/* 1 will force focus on the fullscreen window */
static const int lockfullscreen = 1;
static const Layout layouts[] = { static const Layout layouts[] = {
/* symbol arrange function */ /* symbol arrange function */
@ -61,7 +80,7 @@ static const Layout layouts[] = {
{ "[M]", monocle }, { "[M]", monocle },
}; };
/* key definitions */ /*** key definitions ***/
#define MODKEY Mod4Mask #define MODKEY Mod4Mask
#define TAGKEYS(KEY,TAG) \ #define TAGKEYS(KEY,TAG) \
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \ { MODKEY, KEY, view, {.ui = 1 << TAG} }, \
@ -72,11 +91,16 @@ static const Layout layouts[] = {
/* helper for spawning shell commands in the pre dwm-5.0 fashion */ /* helper for spawning shell commands in the pre dwm-5.0 fashion */
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */ /** commands **/
static const char *dmenucmd[] = { "dmenu_run", "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; /* component of dmenucmd, manipulated in spawn() */
static char dmenumon[2] = "0";
static const char *dmenucmd[] = {
"dmenu_run", "-m", dmenumon, "-fn", dmenufont,
"-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4,
NULL
};
static const char *termcmd[] = { "st", NULL }; static const char *termcmd[] = { "st", NULL };
static const char *volupcmd[] = static const char *volupcmd[] =
{ "/usr/bin/amixer", "set", "Master", "5%+", NULL }; { "/usr/bin/amixer", "set", "Master", "5%+", NULL };
static const char *voldowncmd[] = static const char *voldowncmd[] =
@ -133,8 +157,11 @@ static const Key keys[] = {
{ MODKEY|ShiftMask, XK_q, quit, {0} }, { MODKEY|ShiftMask, XK_q, quit, {0} },
}; };
/* button definitions */ /*** button definitions ***/
/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ /*
* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
* ClkClientWin, or ClkRootWin
*/
static const Button buttons[] = { static const Button buttons[] = {
/* click event mask button function argument */ /* click event mask button function argument */
{ ClkLtSymbol, 0, Button1, setlayout, {0} }, { ClkLtSymbol, 0, Button1, setlayout, {0} },

4
config.mk

@ -1,5 +1,5 @@
# dwm version # dwm version
VERSION = 6.4 VERSION = 6.5
# Customize below to fit your system # Customize below to fit your system
@ -26,7 +26,7 @@ INCS = -I${X11INC} -I${FREETYPEINC}
LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
# flags # flags
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} #CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS} CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS}
LDFLAGS = ${LIBS} LDFLAGS = ${LIBS}

74
dwm.c

@ -230,7 +230,6 @@ static void setmfact(const Arg *arg);
static void setup(void); static void setup(void);
static void seturgent(Client *c, int urg); static void seturgent(Client *c, int urg);
static void showhide(Client *c); static void showhide(Client *c);
static void sigchld(int unused);
static void spawn(const Arg *arg); static void spawn(const Arg *arg);
static Monitor *systraytomon(Monitor *m); static Monitor *systraytomon(Monitor *m);
static void tag(const Arg *arg); static void tag(const Arg *arg);
@ -289,6 +288,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
[MapRequest] = maprequest, [MapRequest] = maprequest,
[MotionNotify] = motionnotify, [MotionNotify] = motionnotify,
[PropertyNotify] = propertynotify, [PropertyNotify] = propertynotify,
[ResizeRequest] = resizerequest,
[UnmapNotify] = unmapnotify [UnmapNotify] = unmapnotify
}; };
static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast]; static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast];
@ -443,7 +443,6 @@ attach(Client *c)
void void
attachstack(Client *c) attachstack(Client *c)
{ {
static Atom wmatom[WMLast], netatom[NetLast];
c->snext = c->mon->stack; c->snext = c->mon->stack;
c->mon->stack = c; c->mon->stack = c;
} }
@ -986,6 +985,16 @@ getatomprop(Client *c, Atom prop)
return atom; return atom;
} }
unsigned int
getsystraywidth()
{
unsigned int w = 0;
Client *i;
if(showsystray)
for(i = systray->icons; i; w += i->w + systrayspacing, i = i->next) ;
return w ? w + systrayspacing : 1;
}
int int
getrootptr(int *x, int *y) getrootptr(int *x, int *y)
{ {
@ -1014,16 +1023,6 @@ getstate(Window w)
return result; return result;
} }
unsigned int
getsystraywidth()
{
unsigned int w = 0;
Client *i;
if(showsystray)
for(i = systray->icons; i; w += i->w + systrayspacing, i = i->next) ;
return w ? w + systrayspacing : 1;
}
int int
gettextprop(Window w, Atom atom, char *text, unsigned int size) gettextprop(Window w, Atom atom, char *text, unsigned int size)
{ {
@ -1073,16 +1072,26 @@ grabkeys(void)
{ {
updatenumlockmask(); updatenumlockmask();
{ {
unsigned int i, j; unsigned int i, j, k;
unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
KeyCode code; int start, end, skip;
KeySym *syms;
XUngrabKey(dpy, AnyKey, AnyModifier, root); XUngrabKey(dpy, AnyKey, AnyModifier, root);
XDisplayKeycodes(dpy, &start, &end);
syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip);
if (!syms)
return;
for (k = start; k <= end; k++)
for (i = 0; i < LENGTH(keys); i++) for (i = 0; i < LENGTH(keys); i++)
if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) /* skip modifier codes, we do that ourselves */
if (keys[i].keysym == syms[(k - start) * skip])
for (j = 0; j < LENGTH(modifiers); j++) for (j = 0; j < LENGTH(modifiers); j++)
XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, XGrabKey(dpy, k,
True, GrabModeAsync, GrabModeAsync); keys[i].mod | modifiers[j],
root, True,
GrabModeAsync, GrabModeAsync);
XFree(syms);
} }
} }
@ -1624,6 +1633,7 @@ sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, lo
exists = True; exists = True;
mt = proto; mt = proto;
} }
if (exists) { if (exists) {
ev.type = ClientMessage; ev.type = ClientMessage;
ev.xclient.window = w; ev.xclient.window = w;
@ -1714,9 +1724,16 @@ setup(void)
int i; int i;
XSetWindowAttributes wa; XSetWindowAttributes wa;
Atom utf8string; Atom utf8string;
struct sigaction sa;
/* do not transform children into zombies when they terminate */
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT | SA_RESTART;
sa.sa_handler = SIG_IGN;
sigaction(SIGCHLD, &sa, NULL);
/* clean up any zombies immediately */ /* clean up any zombies (inherited from .xinitrc etc) immediately */
sigchld(0); while (waitpid(-1, NULL, WNOHANG) > 0);
/* init screen */ /* init screen */
screen = DefaultScreen(dpy); screen = DefaultScreen(dpy);
@ -1818,21 +1835,23 @@ showhide(Client *c)
} }
} }
void
sigchld(int unused)
{
if (signal(SIGCHLD, sigchld) == SIG_ERR)
die("can't install SIGCHLD handler:");
while (0 < waitpid(-1, NULL, WNOHANG));
}
void void
spawn(const Arg *arg) spawn(const Arg *arg)
{ {
struct sigaction sa;
if (arg->v == dmenucmd)
dmenumon[0] = '0' + selmon->num;
if (fork() == 0) { if (fork() == 0) {
if (dpy) if (dpy)
close(ConnectionNumber(dpy)); close(ConnectionNumber(dpy));
setsid(); setsid();
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = SIG_DFL;
sigaction(SIGCHLD, &sa, NULL);
execvp(((char **)arg->v)[0], (char **)arg->v); execvp(((char **)arg->v)[0], (char **)arg->v);
die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]); die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]);
} }
@ -2206,6 +2225,7 @@ updatestatus(void)
updatesystray(); updatesystray();
} }
void void
updatesystrayicongeom(Client *i, int w, int h) updatesystrayicongeom(Client *i, int w, int h)
{ {

Loading…
Cancel
Save