Last active
November 11, 2017 22:56
-
-
Save tskrynnyk/9d1eaf84fb315cffef72ed112162bc95 to your computer and use it in GitHub Desktop.
dwm patched
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -u dwm-6.1.orig/config.def.h dwm-6.1/config.def.h | |
--- dwm-6.1.orig/config.def.h 2015-11-08 23:39:37.000000000 +0100 | |
+++ dwm-6.1/config.def.h 2017-11-11 23:09:56.362039662 +0100 | |
@@ -25,20 +25,19 @@ | |
* WM_NAME(STRING) = title | |
*/ | |
/* class instance title tags mask isfloating monitor */ | |
- { "Gimp", NULL, NULL, 0, 1, -1 }, | |
- { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, | |
+ { "NULL", NULL, NULL, 0, 0, -1 }, | |
}; | |
/* layout(s) */ | |
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ | |
static const int nmaster = 1; /* number of clients in master area */ | |
-static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ | |
+static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */ | |
static const Layout layouts[] = { | |
/* symbol arrange function */ | |
- { "[]=", tile }, /* first entry is default */ | |
- { "><>", NULL }, /* no layout function means floating behavior */ | |
- { "[M]", monocle }, | |
+ { "T", tile }, /* first entry is default */ | |
+ { "F", NULL }, /* no layout function means floating behavior */ | |
+ { "M", monocle }, | |
}; | |
/* key definitions */ | |
@@ -57,6 +56,7 @@ | |
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL }; | |
static const char *termcmd[] = { "st", NULL }; | |
+#include "movestack.c" | |
static Key keys[] = { | |
/* modifier key function argument */ | |
{ MODKEY, XK_p, spawn, {.v = dmenucmd } }, | |
@@ -68,6 +68,8 @@ | |
{ MODKEY, XK_d, incnmaster, {.i = -1 } }, | |
{ MODKEY, XK_h, setmfact, {.f = -0.05} }, | |
{ MODKEY, XK_l, setmfact, {.f = +0.05} }, | |
+ { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, | |
+ { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, | |
{ MODKEY, XK_Return, zoom, {0} }, | |
{ MODKEY, XK_Tab, view, {0} }, | |
{ MODKEY|ShiftMask, XK_c, killclient, {0} }, | |
@@ -76,6 +78,7 @@ | |
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, | |
{ MODKEY, XK_space, setlayout, {0} }, | |
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} }, | |
+ { MODKEY, XK_s, togglesticky, {0} }, | |
{ MODKEY, XK_0, view, {.ui = ~0 } }, | |
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, | |
{ MODKEY, XK_comma, focusmon, {.i = -1 } }, | |
diff -u dwm-6.1.orig/config.mk dwm-6.1/config.mk | |
--- dwm-6.1.orig/config.mk 2015-11-08 23:39:37.000000000 +0100 | |
+++ dwm-6.1/config.mk 2017-11-11 20:04:16.000000000 +0100 | |
@@ -7,9 +7,6 @@ | |
PREFIX = /usr/local | |
MANPREFIX = ${PREFIX}/share/man | |
-X11INC = /usr/X11R6/include | |
-X11LIB = /usr/X11R6/lib | |
- | |
# Xinerama, comment if you don't want it | |
XINERAMALIBS = -lXinerama | |
XINERAMAFLAGS = -DXINERAMA | |
@@ -18,17 +15,17 @@ | |
FREETYPELIBS = -lfontconfig -lXft | |
FREETYPEINC = /usr/include/freetype2 | |
# OpenBSD (uncomment) | |
-FREETYPEINC = ${X11INC}/freetype2 | |
+#FREETYPEINC = ${X11INC}/freetype2 | |
# includes and libs | |
-INCS = -I${X11INC} -I${FREETYPEINC} | |
-LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} | |
+INCS = -I${FREETYPEINC} | |
+LIBS = -lX11 ${XINERAMALIBS} ${FREETYPELIBS} | |
# flags | |
-CPPFLAGS = -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} | |
+CPPFLAGS += -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} | |
#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} | |
-CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS} | |
-LDFLAGS = -s ${LIBS} | |
+CFLAGS += -std=c99 -pedantic -Wall -Wno-deprecated-declarations ${INCS} ${CPPFLAGS} | |
+LDFLAGS += -s ${LIBS} | |
# Solaris | |
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" | |
diff -u dwm-6.1.orig/dwm.c dwm-6.1/dwm.c | |
--- dwm-6.1.orig/dwm.c 2015-11-08 23:39:37.000000000 +0100 | |
+++ dwm-6.1/dwm.c 2017-11-11 22:54:15.755964105 +0100 | |
@@ -49,7 +49,7 @@ | |
#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) | |
#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ | |
* MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) | |
-#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) | |
+#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]) || C->issticky) | |
#define LENGTH(X) (sizeof X / sizeof X[0]) | |
#define MOUSEMASK (BUTTONMASK|PointerMotionMask) | |
#define WIDTH(X) ((X)->w + 2 * (X)->bw) | |
@@ -92,7 +92,7 @@ | |
int basew, baseh, incw, inch, maxw, maxh, minw, minh; | |
int bw, oldbw; | |
unsigned int tags; | |
- int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; | |
+ int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, issticky; | |
Client *next; | |
Client *snext; | |
Monitor *mon; | |
@@ -211,6 +211,7 @@ | |
static void tile(Monitor *); | |
static void togglebar(const Arg *arg); | |
static void togglefloating(const Arg *arg); | |
+static void togglesticky(const Arg *arg); | |
static void toggletag(const Arg *arg); | |
static void toggleview(const Arg *arg); | |
static void unfocus(Client *c, int setfocus); | |
@@ -393,9 +394,24 @@ | |
void | |
arrangemon(Monitor *m) | |
{ | |
+ int n = 0; | |
+ Client *c; | |
strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); | |
- if (m->lt[m->sellt]->arrange) | |
- m->lt[m->sellt]->arrange(m); | |
+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); | |
+ if ((m->lt[m->sellt]->arrange != monocle && n > 1) || !m->lt[m->sellt]->arrange) { | |
+ for (c = m->clients; c; c = c->next) { | |
+ if (ISVISIBLE(c) && (!m->lt[m->sellt]->arrange || !c->isfloating) && (c->bw != borderpx)) { | |
+ c->oldbw = c->bw; | |
+ c->bw = borderpx; | |
+ resizeclient(c, m->wx, m->wy, m->ww - (2 * c->bw), m->wh - (2 * c->bw)); | |
+ } | |
+ } | |
+ if (m->lt[m->sellt]->arrange) { | |
+ m->lt[m->sellt]->arrange(m); | |
+ } | |
+ } else { | |
+ monocle(m); | |
+ } | |
} | |
void | |
@@ -430,9 +446,15 @@ | |
} | |
if (ev->window == selmon->barwin) { | |
i = x = 0; | |
- do | |
+ unsigned int occ = 0; | |
+ for(c = m->clients; c; c = c->next) | |
+ occ |= c->tags; | |
+ do { | |
+ /* do not reserve space for vacant tags */ | |
+ if(!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) | |
+ continue; | |
x += TEXTW(tags[i]); | |
- while (ev->x >= x && ++i < LENGTH(tags)); | |
+ } while (ev->x >= x && ++i < LENGTH(tags)); | |
if (i < LENGTH(tags)) { | |
click = ClkTagBar; | |
arg.ui = 1 << i; | |
@@ -717,11 +739,14 @@ | |
} | |
x = 0; | |
for (i = 0; i < LENGTH(tags); i++) { | |
+ /* do not draw vacant tags */ | |
+ if(!(occ & 1 << i || m->tagset[m->seltags] & 1 << i)) | |
+ continue; | |
w = TEXTW(tags[i]); | |
drw_setscheme(drw, m->tagset[m->seltags] & 1 << i ? &scheme[SchemeSel] : &scheme[SchemeNorm]); | |
drw_text(drw, x, 0, w, bh, tags[i], urg & 1 << i); | |
drw_rect(drw, x + 1, 1, dx, dx, m == selmon && selmon->sel && selmon->sel->tags & 1 << i, | |
- occ & 1 << i, urg & 1 << i); | |
+ 0, urg & 1 << i); | |
x += w; | |
} | |
w = blw = TEXTW(m->ltsymbol); | |
@@ -1123,10 +1148,19 @@ | |
for (c = m->clients; c; c = c->next) | |
if (ISVISIBLE(c)) | |
n++; | |
- if (n > 0) /* override layout symbol */ | |
+ if (n > 0 && m->lt[m->sellt]->arrange == monocle) /* override layout symbol */ | |
snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); | |
- for (c = nexttiled(m->clients); c; c = nexttiled(c->next)) | |
- resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0); | |
+ for(c = nexttiled(m->clients); c; c = nexttiled(c->next)) { | |
+ // I'm not sure, but calling resize with the border width subtractions | |
+ // fixes a glitch where windows would not redraw until they were | |
+ // manually resized after restarting dwm. | |
+ resize(c, m->wx, m->wy, m->ww - (2 * c->bw), m->wh - (2 * c->bw), False); | |
+ if (c->bw) { | |
+ c->oldbw = c->bw; | |
+ c->bw = 0; | |
+ resizeclient(c, m->wx, m->wy, m->ww, m->wh); | |
+ } | |
+ } | |
} | |
void | |
@@ -1308,9 +1342,14 @@ | |
resizemouse(const Arg *arg) | |
{ | |
int ocx, ocy, nw, nh; | |
+ int ocx2, ocy2, nx, ny; | |
Client *c; | |
Monitor *m; | |
XEvent ev; | |
+ int horizcorner, vertcorner; | |
+ int di; | |
+ unsigned int dui; | |
+ Window dummy; | |
Time lasttime = 0; | |
if (!(c = selmon->sel)) | |
@@ -1320,10 +1359,19 @@ | |
restack(selmon); | |
ocx = c->x; | |
ocy = c->y; | |
+ ocx2 = c->x + c->w; | |
+ ocy2 = c->y + c->h; | |
if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, | |
None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) | |
return; | |
- XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); | |
+ if (!XQueryPointer (dpy, c->win, &dummy, &dummy, &di, &di, &nx, &ny, &dui)) | |
+ return; | |
+ horizcorner = nx < c->w / 2; | |
+ vertcorner = ny < c->h / 2; | |
+ XWarpPointer (dpy, None, c->win, 0, 0, 0, 0, | |
+ horizcorner ? (-c->bw) : (c->w + c->bw - 1), | |
+ vertcorner ? (-c->bw) : (c->h + c->bw - 1)); | |
+ | |
do { | |
XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); | |
switch(ev.type) { | |
@@ -1339,6 +1387,11 @@ | |
nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); | |
nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); | |
+ nx = horizcorner ? ev.xmotion.x : c->x; | |
+ ny = vertcorner ? ev.xmotion.y : c->y; | |
+ nw = MAX(horizcorner ? (ocx2 - nx) : (ev.xmotion.x - ocx - 2 * c->bw + 1), 1); | |
+ nh = MAX(vertcorner ? (ocy2 - ny) : (ev.xmotion.y - ocy - 2 * c->bw + 1), 1); | |
+ | |
if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww | |
&& c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) | |
{ | |
@@ -1347,11 +1400,13 @@ | |
togglefloating(NULL); | |
} | |
if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) | |
- resize(c, c->x, c->y, nw, nh, 1); | |
+ resize(c, nx, ny, nw, nh, 1); | |
break; | |
} | |
} while (ev.type != ButtonRelease); | |
- XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); | |
+ XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, | |
+ horizcorner ? (-c->bw) : (c->w + c->bw - 1), | |
+ vertcorner ? (-c->bw) : (c->h + c->bw - 1)); | |
XUngrabPointer(dpy, CurrentTime); | |
while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | |
if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { | |
@@ -1706,9 +1761,23 @@ | |
if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ | |
return; | |
selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; | |
- if (selmon->sel->isfloating) | |
+ if (selmon->sel->isfloating) { | |
+ if (selmon->sel->bw != borderpx) { | |
+ selmon->sel->oldbw = selmon->sel->bw; | |
+ selmon->sel->bw = borderpx; | |
+ } | |
resize(selmon->sel, selmon->sel->x, selmon->sel->y, | |
- selmon->sel->w, selmon->sel->h, 0); | |
+ selmon->sel->w - selmon->sel->bw * 2, selmon->sel->h - selmon->sel->bw * 2, 0); | |
+ } | |
+ arrange(selmon); | |
+} | |
+ | |
+void | |
+togglesticky(const Arg *arg) | |
+{ | |
+ if (!selmon->sel) | |
+ return; | |
+ selmon->sel->issticky = !selmon->sel->issticky; | |
arrange(selmon); | |
} | |
Only in dwm-6.1/: movestack.c |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment