dwm

[fork] dynamic window manager
Log | Files | Refs | README | LICENSE

commit ac95178eee920a8228da720a1d97fa4b1fe760e1
parent 2de481c1eaa57389a7cbc4cbc0f597d2859aad80
Author: hhvn <dev@hhvn.uk>
Date:   Fri, 15 Apr 2022 19:40:59 +0100

Remove 6.2 diff

Diffstat:
Ddwm-6.2.diff | 1217-------------------------------------------------------------------------------
1 file changed, 0 insertions(+), 1217 deletions(-)

diff --git a/dwm-6.2.diff b/dwm-6.2.diff @@ -1,1217 +0,0 @@ -diff --git a/LICENSE b/LICENSE -index d221f09..a5a021d 100644 ---- a/LICENSE -+++ b/LICENSE -@@ -17,6 +17,7 @@ MIT/X Consortium License - © 2015-2016 Quentin Rameau <quinq@fifth.space> - © 2015-2016 Eric Pruitt <eric.pruitt@gmail.com> - © 2016-2017 Markus Teich <markus.teich@stusta.mhn.de> -+(C) 2019-Present - Forked by Hayden Hamilton <hayden@haydenvh.com> - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), -diff --git a/config.h b/config.h -new file mode 100644 -index 0000000..10ca556 ---- /dev/null -+++ b/config.h -@@ -0,0 +1,97 @@ -+/* See LICENSE file for copyright and license details. */ -+ -+/* appearance */ -+static const unsigned int borderpx = 2; /* border pixel of windows */ -+static const unsigned int gappx = 10; -+static const unsigned int snap = 1; /* snap pixel */ -+static const int showbar = 1; /* 0 means no bar */ -+static const int topbar = 1; /* 0 means bottom bar */ -+static const char *fonts[] = { "monospace:size=8" }; -+static const char *colors[][3] = { -+ /* fg bg border */ -+ [SchemeNorm] = { "#bbbbbb", "#0a0a10", "#0a0a10" }, -+ [SchemeSel] = { "#eeeeee", "#30404e", "#892b2b" }, -+ [SchemeStat] = { "#eeeeee", "#0a2126", "#0a2126" }, -+ [SchemeBarInact] = { "#bbbbbb", "#24284c", "#0a0a10" }, -+ [SchemeNormFloat] = { "#bbbbbb", "#0a0a10", "#0a2126" }, -+ [SchemeUrgent] = { "#892b2b", "#0a0a10", "#0a0a10" }, -+}; -+ -+/* tagging */ -+static const char *tags[] = { "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" }; -+ -+static const Rule rules[] = { -+ { "Gimp", NULL, NULL, 1 << 7, 0, 0 }, -+ { "mpv", NULL, NULL, 1 << 1, 0, 0 }, -+ { "mpvrcp", NULL, NULL, 1 << 2, 1, 0 }, -+}; -+ -+/* 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 = 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 }, -+ { "@", spiral }, -+ { "#=", dwindle }, -+ { "=#=", centeredmaster }, -+ { "=:=", centeredfloatingmaster }, -+}; -+ -+/* key definitions */ -+#define MODKEY Mod4Mask -+#define AltMask Mod1Mask -+#define TAGKEYS(KEY,TAG) \ -+ { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ -+ { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ -+ { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ -+ { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, -+#define LAYOUT(KEY, LAYOUT) \ -+ { MODKEY|AltMask, KEY, setlayout, {.v = &layouts[LAYOUT]} }, -+ -+/* helper for spawning shell commands in the pre dwm-5.0 fashion */ -+#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } -+ -+static Key keys[] = { -+ /* modifier key function argument */ -+ { MODKEY|ShiftMask, XK_Return, zoom, {0} }, -+ { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, -+ { MODKEY, XK_Tab, view, {0} }, -+ { MODKEY, XK_f, togglefullscr, {0} }, -+ { MODKEY, XK_h, setmfact, {.f = -0.05} }, -+ { MODKEY, XK_i, incnmaster, {.i = +1 } }, -+ { MODKEY, XK_j, focusstack, {.i = +1 } }, -+ { MODKEY, XK_k, focusstack, {.i = -1 } }, -+ { MODKEY, XK_l, setmfact, {.f = +0.05 } }, -+ { MODKEY, XK_p, incnmaster, {.i = -1 } }, -+ { MODKEY, XK_q, killclient, {0} }, -+ { MODKEY|ShiftMask, XK_q, quit, {0} }, -+ { MODKEY, XK_0, view, {.ui = ~0 } }, -+ { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, -+ { MODKEY, XK_comma, focusmon, {.i = -1 } }, -+ { MODKEY, XK_period, focusmon, {.i = +1 } }, -+ { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, -+ { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, -+ /* Layout */ -+ LAYOUT( XK_1, 0) -+ LAYOUT( XK_2, 1) -+ LAYOUT( XK_3, 3) -+ LAYOUT( XK_4, 4) -+ LAYOUT( XK_5, 5) -+ LAYOUT( XK_6, 6) -+ LAYOUT( XK_0, 2) -+ /* Tags */ -+ TAGKEYS( XK_1, 0) -+ TAGKEYS( XK_2, 1) -+ TAGKEYS( XK_3, 2) -+ TAGKEYS( XK_4, 3) -+ TAGKEYS( XK_5, 4) -+ TAGKEYS( XK_6, 5) -+ TAGKEYS( XK_7, 6) -+ TAGKEYS( XK_8, 7) -+ TAGKEYS( XK_9, 8) -+}; -diff --git a/dwm.c b/dwm.c -index 4465af1..7963daf 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -30,12 +30,14 @@ - #include <unistd.h> - #include <sys/types.h> - #include <sys/wait.h> -+#include <sys/stat.h> - #include <X11/cursorfont.h> - #include <X11/keysym.h> - #include <X11/Xatom.h> - #include <X11/Xlib.h> - #include <X11/Xproto.h> - #include <X11/Xutil.h> -+#include <X11/Xft/Xft.h> - #ifdef XINERAMA - #include <X11/extensions/Xinerama.h> - #endif /* XINERAMA */ -@@ -49,8 +51,15 @@ - #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 ISVISIBLEONTAG(C, T) ((C->tags & T)) -+#define ISVISIBLE(C) ISVISIBLEONTAG(C, C->mon->tagset[C->mon->seltags]) - #define LENGTH(X) (sizeof X / sizeof X[0]) -+#ifndef MAX -+#define MAX(A, B) ((A) > (B) ? (A) : (B)) -+#endif -+#ifndef MIN -+#define MIN(A, B) ((A) < (B) ? (A) : (B)) -+#endif - #define MOUSEMASK (BUTTONMASK|PointerMotionMask) - #define WIDTH(X) ((X)->w + 2 * (X)->bw) - #define HEIGHT(X) ((X)->h + 2 * (X)->bw) -@@ -59,13 +68,11 @@ - - /* enums */ - enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ --enum { SchemeNorm, SchemeSel }; /* color schemes */ -+enum { SchemeNorm, SchemeSel, SchemeStat, SchemeBarInact, SchemeUrgent, SchemeNormFloat}; /* color schemes */ - enum { NetSupported, NetWMName, NetWMState, NetWMCheck, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ - enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ --enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, -- ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ - - typedef union { - int i; -@@ -77,7 +84,6 @@ typedef union { - typedef struct { - unsigned int click; - unsigned int mask; -- unsigned int button; - void (*func)(const Arg *arg); - const Arg arg; - } Button; -@@ -117,8 +123,11 @@ struct Monitor { - int nmaster; - int num; - int by; /* bar geometry */ -+ int btw; /* width of tasks portion of bar */ -+ int bt; /* number of tasks */ - int mx, my, mw, mh; /* screen size */ - int wx, wy, ww, wh; /* window area */ -+ int gappx; /* gaps between windows */ - unsigned int seltags; - unsigned int sellt; - unsigned int tagset[2]; -@@ -147,8 +156,8 @@ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interac - static void arrange(Monitor *m); - static void arrangemon(Monitor *m); - static void attach(Client *c); -+static void attachaside(Client *c); - static void attachstack(Client *c); --static void buttonpress(XEvent *e); - static void checkotherwm(void); - static void cleanup(void); - static void cleanupmon(Monitor *mon); -@@ -163,6 +172,7 @@ static void detachstack(Client *c); - static Monitor *dirtomon(int dir); - static void drawbar(Monitor *m); - static void drawbars(void); -+static int drawstatusbar(Monitor *m, int bh, char* text); - static void enternotify(XEvent *e); - static void expose(XEvent *e); - static void focus(Client *c); -@@ -172,7 +182,6 @@ static void focusstack(const Arg *arg); - static int getrootptr(int *x, int *y); - static long getstate(Window w); - static int gettextprop(Window w, Atom atom, char *text, unsigned int size); --static void grabbuttons(Client *c, int focused); - static void grabkeys(void); - static void incnmaster(const Arg *arg); - static void keypress(XEvent *e); -@@ -182,7 +191,7 @@ static void mappingnotify(XEvent *e); - static void maprequest(XEvent *e); - static void monocle(Monitor *m); - static void motionnotify(XEvent *e); --static void movemouse(const Arg *arg); -+static Client *nexttagged(Client *c); - static Client *nexttiled(Client *c); - static void pop(Client *); - static void propertynotify(XEvent *e); -@@ -190,7 +199,6 @@ static void quit(const Arg *arg); - static Monitor *recttomon(int x, int y, int w, int h); - static void resize(Client *c, int x, int y, int w, int h, int interact); - static void resizeclient(Client *c, int x, int y, int w, int h); --static void resizemouse(const Arg *arg); - static void restack(Monitor *m); - static void run(void); - static void scan(void); -@@ -199,6 +207,7 @@ static void sendmon(Client *c, Monitor *m); - static void setclientstate(Client *c, long state); - static void setfocus(Client *c); - static void setfullscreen(Client *c, int fullscreen); -+//static void setgaps(const Arg *arg); - static void setlayout(const Arg *arg); - static void setmfact(const Arg *arg); - static void setup(void); -@@ -209,8 +218,9 @@ static void spawn(const Arg *arg); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *); --static void togglebar(const Arg *arg); -+//static void togglebar(const Arg *arg); - static void togglefloating(const Arg *arg); -+static void togglefullscr(const Arg *arg); - static void toggletag(const Arg *arg); - static void toggleview(const Arg *arg); - static void unfocus(Client *c, int setfocus); -@@ -233,18 +243,24 @@ static int xerror(Display *dpy, XErrorEvent *ee); - static int xerrordummy(Display *dpy, XErrorEvent *ee); - static int xerrorstart(Display *dpy, XErrorEvent *ee); - static void zoom(const Arg *arg); -+static void centeredmaster(Monitor *m); -+static void centeredfloatingmaster(Monitor *m); -+static void spiral(Monitor *mon); -+static void dwindle(Monitor *mon); -+static void fibonacci(Monitor *mon, int s); - - /* variables */ - static const char broken[] = "broken"; --static char stext[256]; -+static char stext[1024]; - static int screen; - static int sw, sh; /* X display screen geometry width, height */ - static int bh, blw = 0; /* bar geometry */ - static int lrpad; /* sum of left and right padding for text */ -+static int sidepad; -+static int vertpad; - static int (*xerrorxlib)(Display *, XErrorEvent *); - static unsigned int numlockmask = 0; - static void (*handler[LASTEvent]) (XEvent *) = { -- [ButtonPress] = buttonpress, - [ClientMessage] = clientmessage, - [ConfigureRequest] = configurerequest, - [ConfigureNotify] = configurenotify, -@@ -407,52 +423,21 @@ attach(Client *c) - } - - void --attachstack(Client *c) --{ -- c->snext = c->mon->stack; -- c->mon->stack = c; -+attachaside(Client *c) { -+ Client *at = nexttagged(c); -+ if(!at) { -+ attach(c); -+ return; -+ } -+ c->next = at->next; -+ at->next = c; - } - - void --buttonpress(XEvent *e) -+attachstack(Client *c) - { -- unsigned int i, x, click; -- Arg arg = {0}; -- Client *c; -- Monitor *m; -- XButtonPressedEvent *ev = &e->xbutton; -- -- click = ClkRootWin; -- /* focus monitor if necessary */ -- if ((m = wintomon(ev->window)) && m != selmon) { -- unfocus(selmon->sel, 1); -- selmon = m; -- focus(NULL); -- } -- if (ev->window == selmon->barwin) { -- i = x = 0; -- do -- x += TEXTW(tags[i]); -- while (ev->x >= x && ++i < LENGTH(tags)); -- if (i < LENGTH(tags)) { -- click = ClkTagBar; -- arg.ui = 1 << i; -- } else if (ev->x < x + blw) -- click = ClkLtSymbol; -- else if (ev->x > selmon->ww - TEXTW(stext)) -- click = ClkStatusText; -- else -- click = ClkWinTitle; -- } else if ((c = wintoclient(ev->window))) { -- focus(c); -- restack(selmon); -- XAllowEvents(dpy, ReplayPointer, CurrentTime); -- click = ClkClientWin; -- } -- for (i = 0; i < LENGTH(buttons); i++) -- if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button -- && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) -- buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); -+ c->snext = c->mon->stack; -+ c->mon->stack = c; - } - - void -@@ -484,7 +469,7 @@ cleanup(void) - cleanupmon(mons); - for (i = 0; i < CurLast; i++) - drw_cur_free(drw, cursor[i]); -- for (i = 0; i < LENGTH(colors); i++) -+ for (i = 0; i < LENGTH(colors) + 1; i++) - free(scheme[i]); - XDestroyWindow(dpy, wmcheckwin); - drw_free(drw); -@@ -567,7 +552,7 @@ configurenotify(XEvent *e) - for (c = m->clients; c; c = c->next) - if (c->isfullscreen) - resizeclient(c, m->mx, m->my, m->mw, m->mh); -- XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); -+ XMoveResizeWindow(dpy, m->barwin, m->wx + sidepad, m->by + vertpad, m->ww - 2*sidepad, bh); - } - focus(NULL); - arrange(NULL); -@@ -638,6 +623,7 @@ createmon(void) - m->nmaster = nmaster; - m->showbar = showbar; - m->topbar = topbar; -+ m->gappx = gappx; - m->lt[0] = &layouts[0]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); -@@ -692,23 +678,130 @@ dirtomon(int dir) - return m; - } - -+int -+drawstatusbar(Monitor *m, int bh, char* stext) { -+ int ret, i, w, x, len; -+ short isCode = 0; -+ char *text; -+ char *p; -+ -+ len = strlen(stext) + 1 ; -+ if (!(text = (char*) malloc(sizeof(char)*len))) -+ die("malloc"); -+ p = text; -+ memcpy(text, stext, len); -+ -+ /* compute width of the status text */ -+ w = 0; -+ i = -1; -+ while (text[++i]) { -+ if (text[i] == '^') { -+ if (!isCode) { -+ isCode = 1; -+ text[i] = '\0'; -+ w += TEXTW(text) - lrpad; -+ text[i] = '^'; -+ if (text[++i] == 'f') -+ w += atoi(text + ++i); -+ } else { -+ isCode = 0; -+ text = text + i + 1; -+ i = -1; -+ } -+ } -+ } -+ if (!isCode) -+ w += TEXTW(text) - lrpad; -+ else -+ isCode = 0; -+ text = p; -+ -+ w += 2; /* 1px padding on both sides */ -+ ret = x = m->ww - w; -+ -+ drw_setscheme(drw, scheme[LENGTH(colors)]); -+ drw->scheme[ColFg] = scheme[SchemeStat][ColFg]; -+ drw_rect(drw, x, 0, w, bh, 1, 1); -+ x++; -+ -+ /* process status text */ -+ i = -1; -+ while (text[++i]) { -+ if (text[i] == '^' && !isCode) { -+ isCode = 1; -+ -+ text[i] = '\0'; -+ w = TEXTW(text) - lrpad; -+ drw_text(drw, x, 0, w, bh, 0, text, 0); -+ -+ x += w; -+ -+ /* process code */ -+ while (text[++i] != '^') { -+ if (text[i] == 'c') { -+ char buf[8]; -+ memcpy(buf, (char*)text+i+1, 7); -+ buf[7] = '\0'; -+ drw_clr_create(drw, &drw->scheme[ColFg], buf); -+ i += 7; -+ } else if (text[i] == 'b') { -+ char buf[8]; -+ memcpy(buf, (char*)text+i+1, 7); -+ buf[7] = '\0'; -+ drw_clr_create(drw, &drw->scheme[ColBg], buf); -+ i += 7; -+ } else if (text[i] == 'd') { -+ drw->scheme[ColFg] = scheme[SchemeStat][ColFg]; -+ drw->scheme[ColBg] = scheme[SchemeStat][ColBg]; -+ } else if (text[i] == 'r') { -+ int rx = atoi(text + ++i); -+ while (text[++i] != ','); -+ int ry = atoi(text + ++i); -+ while (text[++i] != ','); -+ int rw = atoi(text + ++i); -+ while (text[++i] != ','); -+ int rh = atoi(text + ++i); -+ -+ drw_rect(drw, rx + x, ry, rw, rh, 1, 0); -+ } else if (text[i] == 'f') { -+ x += atoi(text + ++i); -+ } -+ } -+ -+ text = text + i + 1; -+ i=-1; -+ isCode = 0; -+ } -+ } -+ -+ drw->scheme[ColBg] = scheme[SchemeStat][ColBg]; -+ if (!isCode) { -+ w = TEXTW(text) - lrpad; -+ drw_text(drw, x, 0, w, bh, 0, text, 0); -+ } -+ -+ free(p); -+ -+ return ret; -+} -+ - void - drawbar(Monitor *m) - { -- int x, w, sw = 0; -+ int x, w, sw = 0, n = 0, scm; - int boxs = drw->fonts->h / 9; - int boxw = drw->fonts->h / 6 + 2; - unsigned int i, occ = 0, urg = 0; -+ char layout[16]; - Client *c; - - /* draw status first so it can be overdrawn by tags later */ -- if (m == selmon) { /* status is only drawn on selected monitor */ -- drw_setscheme(drw, scheme[SchemeNorm]); -- sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ -- drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0); -- } -+ drw_setscheme(drw, scheme[SchemeSel]); -+ sw = m->ww - drawstatusbar(m, bh, stext); - - for (c = m->clients; c; c = c->next) { -+ if (ISVISIBLE(c)) -+ n++; - occ |= c->tags; - if (c->isurgent) - urg |= c->tags; -@@ -716,29 +809,65 @@ drawbar(Monitor *m) - x = 0; - for (i = 0; i < LENGTH(tags); i++) { - w = TEXTW(tags[i]); -- drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); -+ if (urg & 1 << i) -+ drw_setscheme(drw, scheme[SchemeUrgent]); -+ else -+ drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) -- drw_rect(drw, x + boxs, boxs, boxw, boxw, -+ drw_rect(drw, x + 2*boxs, 9*boxs, boxw, boxw, - m == selmon && selmon->sel && selmon->sel->tags & 1 << i, - urg & 1 << i); - x += w; - } -- w = blw = TEXTW(m->ltsymbol); -+ -+ snprintf(layout, sizeof(layout), "%s%d", m->ltsymbol, n); -+ w = blw = TEXTW(layout); - drw_setscheme(drw, scheme[SchemeNorm]); -- x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); -+ x = drw_text(drw, x, 0, w, bh, lrpad / 2, layout, 0); - - if ((w = m->ww - sw - x) > bh) { -- if (m->sel) { -- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); -- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); -- if (m->sel->isfloating) -- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); -+ if (n > 0) { -+ int remainder = w % n; -+ int tabw = (1.0 / (double)n) * w + 1; -+ for (c = m->clients; c; c = c->next) { -+ if (!ISVISIBLE(c)) -+ continue; -+ if (m->sel == c && m == selmon) -+ scm = SchemeSel; -+ else -+ scm = SchemeBarInact; -+ drw_setscheme(drw, scheme[scm]); -+ -+ if (remainder >= 0) { -+ if (remainder == 0) { -+ tabw--; -+ } -+ remainder--; -+ } -+ drw_text(drw, x, 0, tabw - borderpx, bh, lrpad / 2, c->name, 0); -+ /* draw seperator */ -+ drw_setscheme(drw, scheme[SchemeNorm]); -+ drw_rect(drw, x + tabw - borderpx, 0, borderpx, bh, 1, 1); -+ -+ x += tabw; -+ } - } else { -- drw_setscheme(drw, scheme[SchemeNorm]); -- drw_rect(drw, x, 0, w, bh, 1, 1); -+ if (m == selmon) { -+ drw_setscheme(drw, scheme[SchemeSel]); -+ drw_rect(drw, x, 0, w - borderpx, bh, 1, 1); -+ /* draw seperator */ -+ drw_setscheme(drw, scheme[SchemeNorm]); -+ drw_rect(drw, x + w - borderpx, 0, borderpx, bh, 1, 1); -+ } else { -+ drw_setscheme(drw, scheme[SchemeNorm]); -+ drw_rect(drw, x, 0, w, bh, 1, 1); -+ } - } - } -+ -+ m->bt = n; -+ m->btw = w; - drw_map(drw, m->barwin, 0, 0, m->ww, bh); - } - -@@ -794,7 +923,6 @@ focus(Client *c) - seturgent(c, 0); - detachstack(c); - attachstack(c); -- grabbuttons(c, 1); - XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); - setfocus(c); - } else { -@@ -924,27 +1052,6 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) - return 1; - } - --void --grabbuttons(Client *c, int focused) --{ -- updatenumlockmask(); -- { -- unsigned int i, j; -- unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; -- XUngrabButton(dpy, AnyButton, AnyModifier, c->win); -- if (!focused) -- XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, -- BUTTONMASK, GrabModeSync, GrabModeSync, None, None); -- for (i = 0; i < LENGTH(buttons); i++) -- if (buttons[i].click == ClkClientWin) -- for (j = 0; j < LENGTH(modifiers); j++) -- XGrabButton(dpy, buttons[i].button, -- buttons[i].mask | modifiers[j], -- c->win, False, BUTTONMASK, -- GrabModeAsync, GrabModeSync, None, None); -- } --} -- - void - grabkeys(void) - { -@@ -1051,18 +1158,25 @@ manage(Window w, XWindowAttributes *wa) - - wc.border_width = c->bw; - XConfigureWindow(dpy, w, CWBorderWidth, &wc); -- XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); -+ if (c->isfloating) -+ XSetWindowBorder(dpy, w, scheme[SchemeNormFloat][ColBorder].pixel); -+ else -+ XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); - configure(c); /* propagates border_width, if size doesn't change */ - updatewindowtype(c); - updatesizehints(c); - updatewmhints(c); -+ -+ /* floating windows: do not cover bar */ -+ c->y = c->mon->my + gappx + 15 - borderpx; -+ c->x = c->mon->my + ((c->mon->mw - c->w) / 2); -+ - XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); -- grabbuttons(c, 0); - if (!c->isfloating) - c->isfloating = c->oldstate = trans != None || c->isfixed; - if (c->isfloating) - XRaiseWindow(dpy, c->win); -- attach(c); -+ attachaside(c); - attachstack(c); - XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, - (unsigned char *) &(c->win), 1); -@@ -1109,10 +1223,8 @@ monocle(Monitor *m) - for (c = m->clients; c; c = c->next) - if (ISVISIBLE(c)) - n++; -- if (n > 0) /* 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); -+ resize(c, m->wx + m->gappx, m->wy + m->gappx, (m->ww - 2 * c->bw) - 2*m->gappx, (m->wh - 2 * c->bw) - 2*m->gappx, 0); - } - - void -@@ -1132,64 +1244,14 @@ motionnotify(XEvent *e) - mon = m; - } - --void --movemouse(const Arg *arg) --{ -- int x, y, ocx, ocy, nx, ny; -- Client *c; -- Monitor *m; -- XEvent ev; -- Time lasttime = 0; -- -- if (!(c = selmon->sel)) -- return; -- if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ -- return; -- restack(selmon); -- ocx = c->x; -- ocy = c->y; -- if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, -- None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) -- return; -- if (!getrootptr(&x, &y)) -- return; -- do { -- XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); -- switch(ev.type) { -- case ConfigureRequest: -- case Expose: -- case MapRequest: -- handler[ev.type](&ev); -- break; -- case MotionNotify: -- if ((ev.xmotion.time - lasttime) <= (1000 / 60)) -- continue; -- lasttime = ev.xmotion.time; -- -- nx = ocx + (ev.xmotion.x - x); -- ny = ocy + (ev.xmotion.y - y); -- if (abs(selmon->wx - nx) < snap) -- nx = selmon->wx; -- else if (abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) -- nx = selmon->wx + selmon->ww - WIDTH(c); -- if (abs(selmon->wy - ny) < snap) -- ny = selmon->wy; -- else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) -- ny = selmon->wy + selmon->wh - HEIGHT(c); -- if (!c->isfloating && selmon->lt[selmon->sellt]->arrange -- && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) -- togglefloating(NULL); -- if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) -- resize(c, nx, ny, c->w, c->h, 1); -- break; -- } -- } while (ev.type != ButtonRelease); -- XUngrabPointer(dpy, CurrentTime); -- if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { -- sendmon(c, m); -- selmon = m; -- focus(NULL); -- } -+Client * -+nexttagged(Client *c) { -+ Client *walked = c->mon->clients; -+ for(; -+ walked && (walked->isfloating || !ISVISIBLEONTAG(walked, c->tags)); -+ walked = walked->next -+ ); -+ return walked; - } - - Client * -@@ -1287,71 +1349,12 @@ resizeclient(Client *c, int x, int y, int w, int h) - XSync(dpy, False); - } - --void --resizemouse(const Arg *arg) --{ -- int ocx, ocy, nw, nh; -- Client *c; -- Monitor *m; -- XEvent ev; -- Time lasttime = 0; -- -- if (!(c = selmon->sel)) -- return; -- if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ -- return; -- restack(selmon); -- ocx = c->x; -- ocy = c->y; -- 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); -- do { -- XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); -- switch(ev.type) { -- case ConfigureRequest: -- case Expose: -- case MapRequest: -- handler[ev.type](&ev); -- break; -- case MotionNotify: -- if ((ev.xmotion.time - lasttime) <= (1000 / 60)) -- continue; -- lasttime = ev.xmotion.time; -- -- nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); -- nh = MAX(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) -- { -- if (!c->isfloating && selmon->lt[selmon->sellt]->arrange -- && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) -- togglefloating(NULL); -- } -- if (!selmon->lt[selmon->sellt]->arrange || c->isfloating) -- resize(c, c->x, c->y, 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); -- XUngrabPointer(dpy, CurrentTime); -- while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); -- if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { -- sendmon(c, m); -- selmon = m; -- focus(NULL); -- } --} -- - void - restack(Monitor *m) - { - Client *c; - XEvent ev; -- XWindowChanges wc; -- -- drawbar(m); -+ XWindowChanges wc; drawbar(m); - if (!m->sel) - return; - if (m->sel->isfloating || !m->lt[m->sellt]->arrange) -@@ -1417,7 +1420,7 @@ sendmon(Client *c, Monitor *m) - detachstack(c); - c->mon = m; - c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ -- attach(c); -+ attachaside(c); - attachstack(c); - focus(NULL); - arrange(NULL); -@@ -1472,7 +1475,12 @@ setfocus(Client *c) - void - setfullscreen(Client *c, int fullscreen) - { -+ Client *c2; -+ - if (fullscreen && !c->isfullscreen) { -+ for (c2 = selmon->clients; c2; c2 = c2->next) -+ if (c2->isfullscreen) -+ return; /* prevent fullscreening of multiple clients */ - XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, - PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); - c->isfullscreen = 1; -@@ -1497,6 +1505,18 @@ setfullscreen(Client *c, int fullscreen) - } - } - -+/* -+void -+setgaps(const Arg *arg) -+{ -+ if ((arg->i == 0) || (selmon->gappx + arg->i < 0)) -+ selmon->gappx = 0; -+ else -+ selmon->gappx += arg->i; -+ arrange(selmon); -+} -+*/ -+ - void - setlayout(const Arg *arg) - { -@@ -1563,16 +1583,20 @@ setup(void) - netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); - netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); - /* init cursors */ -- cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); -+ cursor[CurNormal] = drw_cur_create(drw, XC_sailboat); - cursor[CurResize] = drw_cur_create(drw, XC_sizing); - cursor[CurMove] = drw_cur_create(drw, XC_fleur); - /* init appearance */ -- scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); -+ scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *)); -+ scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], 3); - for (i = 0; i < LENGTH(colors); i++) - scheme[i] = drw_scm_create(drw, colors[i], 3); - /* init bars */ -+ vertpad = gappx; -+ sidepad = gappx; - updatebars(); - updatestatus(); -+ updatebarpos(selmon); - /* supporting window for NetWMCheck */ - wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); - XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, -@@ -1639,8 +1663,6 @@ sigchld(int unused) - void - spawn(const Arg *arg) - { -- if (arg->v == dmenucmd) -- dmenumon[0] = '0' + selmon->num; - if (fork() == 0) { - if (dpy) - close(ConnectionNumber(dpy)); -@@ -1683,28 +1705,19 @@ tile(Monitor *m) - if (n > m->nmaster) - mw = m->nmaster ? m->ww * m->mfact : 0; - else -- mw = m->ww; -- for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) -+ mw = m->ww - m->gappx; -+ for (i = 0, my = ty = m->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) - if (i < m->nmaster) { -- h = (m->wh - my) / (MIN(n, m->nmaster) - i); -- resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); -- my += HEIGHT(c); -+ h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gappx; -+ resize(c, m->wx + m->gappx, m->wy + my, mw - (2*c->bw) - m->gappx, h - (2*c->bw), 0); -+ my += HEIGHT(c) + m->gappx; - } else { -- h = (m->wh - ty) / (n - i); -- resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); -- ty += HEIGHT(c); -+ h = (m->wh - ty) / (n - i) - m->gappx; -+ resize(c, m->wx + mw + m->gappx, m->wy + ty, m->ww - mw - (2*c->bw) - (2*m->gappx), h - (2*c->bw), 0); -+ ty += HEIGHT(c) + m->gappx; - } - } - --void --togglebar(const Arg *arg) --{ -- selmon->showbar = !selmon->showbar; -- updatebarpos(selmon); -- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); -- arrange(selmon); --} -- - void - togglefloating(const Arg *arg) - { -@@ -1719,6 +1732,13 @@ togglefloating(const Arg *arg) - arrange(selmon); - } - -+void -+togglefullscr(const Arg *arg) -+{ -+ if(selmon->sel) -+ setfullscreen(selmon->sel, !selmon->sel->isfullscreen); -+} -+ - void - toggletag(const Arg *arg) - { -@@ -1751,8 +1771,10 @@ unfocus(Client *c, int setfocus) - { - if (!c) - return; -- grabbuttons(c, 0); -- XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); -+ if (c->isfloating) -+ XSetWindowBorder(dpy, c->win, scheme[SchemeNormFloat][ColBorder].pixel); -+ else -+ XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); - if (setfocus) { - XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); - XDeleteProperty(dpy, root, netatom[NetActiveWindow]); -@@ -1811,7 +1833,7 @@ updatebars(void) - for (m = mons; m; m = m->next) { - if (m->barwin) - continue; -- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), -+ m->barwin = XCreateWindow(dpy, root, m->wx + sidepad, m->by + vertpad, m->ww - 2*sidepad, bh, 0, DefaultDepth(dpy, screen), - CopyFromParent, DefaultVisual(dpy, screen), - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); -@@ -1826,11 +1848,11 @@ updatebarpos(Monitor *m) - m->wy = m->my; - m->wh = m->mh; - if (m->showbar) { -- m->wh -= bh; -- m->by = m->topbar ? m->wy : m->wy + m->wh; -- m->wy = m->topbar ? m->wy + bh : m->wy; -+ m->wh = m->wh - vertpad - bh; -+ m->by = m->topbar ? m->wy : m->wy + m->wh + vertpad; -+ m->wy = m->topbar ? m->wy + bh + vertpad : m->wy; - } else -- m->by = -bh; -+ m->by = -bh - vertpad; - } - - void -@@ -1897,7 +1919,7 @@ updategeom(void) - m->clients = c->next; - detachstack(c); - c->mon = mons; -- attach(c); -+ attachaside(c); - attachstack(c); - } - if (m == selmon) -@@ -1989,7 +2011,7 @@ updatestatus(void) - { - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) - strcpy(stext, "dwm-"VERSION); -- drawbar(selmon); -+ drawbars(); - } - - void -@@ -2147,3 +2169,174 @@ main(int argc, char *argv[]) - XCloseDisplay(dpy); - return EXIT_SUCCESS; - } -+ -+static void -+fibonacci(Monitor *mon, int s) { -+ unsigned int i, n, nx, ny, nw, nh; -+ Client *c; -+ -+ for(n = 0, c = nexttiled(mon->clients); c; c = nexttiled(c->next), n++); -+ if(n == 0) -+ return; -+ -+ nx = mon->wx; -+ ny = 0; -+ nw = mon->ww; -+ nh = mon->wh - gappx; -+ -+ for(i = 0, c = nexttiled(mon->clients); c; c = nexttiled(c->next)) { -+ if((i % 2 && nh / 2 > 2 * c->bw) -+ || (!(i % 2) && nw / 2 > 2 * c->bw)) { -+ if(i < n - 1) { -+ if(i % 2) -+ nh /= 2; -+ else -+ nw /= 2; -+ if((i % 4) == 2 && !s) -+ nx += nw; -+ else if((i % 4) == 3 && !s) -+ ny += nh; -+ } -+ if((i % 4) == 0) { -+ if(s) -+ ny += nh; -+ else -+ ny -= nh; -+ } -+ else if((i % 4) == 1) -+ nx += nw; -+ else if((i % 4) == 2) -+ ny += nh; -+ else if((i % 4) == 3) { -+ if(s) -+ nx += nw; -+ else -+ nx -= nw; -+ } -+ if(i == 0) -+ { -+ if(n != 1) -+ nw = mon->ww * mon->mfact; -+ ny = mon->wy; -+ } -+ else if(i == 1) -+ nw = mon->ww - nw - gappx; -+ i++; -+ } -+ resize(c, nx + mon->gappx, ny + mon->gappx, nw - (2 * c->bw) - mon->gappx, nh - 2*c->bw - mon->gappx, False); -+ } -+} -+ -+static void -+dwindle(Monitor *mon) { -+ fibonacci(mon, 1); -+} -+ -+static void -+spiral(Monitor *mon) { -+ fibonacci(mon, 0); -+} -+ -+void -+centeredmaster(Monitor *m) -+{ -+ unsigned int i, n, h, mw, mx, my, oty, ety, tw; -+ Client *c; -+ -+ /* count number of clients in the selected monitor */ -+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); -+ if (n == 0) -+ return; -+ -+ /* initialize areas */ -+ mw = m->ww; -+ mx = 0; -+ my = 0; -+ tw = mw; -+ -+ if (n > m->nmaster) { -+ /* go mfact box in the center if more than nmaster clients */ -+ mw = m->nmaster ? m->ww * m->mfact : 0; -+ tw = m->ww - mw; -+ -+ if (n - m->nmaster > 1) { -+ /* only one client */ -+ mx = (m->ww - mw) / 2; -+ tw = (m->ww - mw) / 2; -+ } -+ } -+ -+ oty = 0; -+ ety = 0; -+ for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) -+ if (i < m->nmaster) { -+ /* nmaster clients are stacked vertically, in the center -+ * of the screen */ -+ h = (m->wh - my) / (MIN(n, m->nmaster) - i); -+ resize(c, m->wx + mx + gappx, m->wy + my + gappx, (mw - (2*c->bw)) - 2*gappx, -+ (h - (2*c->bw)) - 2*gappx, 0); -+ my += HEIGHT(c); -+ } else { -+ /* stack clients are stacked vertically */ -+ if ((i - m->nmaster) % 2 ) { -+ h = (m->wh - ety) / ( (1 + n - i) / 2); -+ resize(c, m->wx + gappx, m->wy + ety + gappx, tw - (2*c->bw) - gappx, -+ (h - (2*c->bw)) - 2*gappx, 0); -+ ety += HEIGHT(c); -+ } else { -+ h = (m->wh - oty) / ((1 + n - i) / 2); -+ resize(c, m->wx + mx + mw, m->wy + oty + gappx, -+ tw - (2*c->bw) - gappx, (h - (2*c->bw)) - 2*gappx, 0); -+ oty += HEIGHT(c); -+ } -+ } -+} -+ -+void -+centeredfloatingmaster(Monitor *m) -+{ -+ unsigned int i, n, w, mh, mw, mx, mxo, my, myo, tx; -+ Client *c; -+ -+ /* count number of clients in the selected monitor */ -+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); -+ if (n == 0) -+ return; -+ -+ /* initialize nmaster area */ -+ if (n > m->nmaster) { -+ /* go mfact box in the center if more than nmaster clients */ -+ if (m->ww > m->wh) { -+ mw = m->nmaster ? m->ww * m->mfact : 0; -+ mh = m->nmaster ? m->wh * 0.9 : 0; -+ } else { -+ mh = m->nmaster ? m->wh * m->mfact : 0; -+ mw = m->nmaster ? m->ww * 0.9 : 0; -+ } -+ mx = mxo = (m->ww - mw) / 2; -+ my = myo = (m->wh - mh) / 2; -+ } else { -+ /* go fullscreen if all clients are in the master area */ -+ mh = m->wh - 2*gappx; -+ mw = m->ww - 2*gappx; -+ mx = mxo = 0 + gappx; -+ my = myo = 0 + gappx; -+ } -+ -+ for(i = tx = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) -+ if (i < m->nmaster) { -+ /* nmaster clients are stacked horizontally, in the center -+ * of the screen */ -+ w = (mw + mxo - mx) / (MIN(n, m->nmaster) - i); -+ resize(c, m->wx + mx, m->wy + my, w - (2*c->bw), -+ mh - (2*c->bw), 0); -+ mx += WIDTH(c) + gappx; -+ } else { -+ /* stack clients are stacked horizontally */ -+ w = (m->ww - tx) / (n - i); -+ resize(c, m->wx + tx + gappx, m->wy + gappx, w - (2*c->bw) - 2*gappx, -+ m->wh - (2*c->bw) - 2*gappx, 0); -+ tx += WIDTH(c) + gappx; -+ } -+ /* XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, PropModeReplace, (unsigned char *)&netatom[NetWMFullscreen], 1); */ -+} -diff --git a/makefile b/makefile -new file mode 100644 -index 0000000..20c8375 ---- /dev/null -+++ b/makefile -@@ -0,0 +1,54 @@ -+# dwm - dynamic window manager -+# See LICENSE file for copyright and license details. -+ -+include config.mk -+ -+SRC = drw.c dwm.c util.c -+OBJ = ${SRC:.c=.o} -+ -+all: options dwm -+ -+options: -+ @echo dwm build options: -+ @echo "CFLAGS = ${CFLAGS}" -+ @echo "LDFLAGS = ${LDFLAGS}" -+ @echo "CC = ${CC}" -+ -+.c.o: -+ ${CC} -c ${CFLAGS} $< -+ -+${OBJ}: config.h config.mk -+ -+config.h: -+ cp config.def.h $@ -+ -+dwm: ${OBJ} -+ ${CC} -o $@ ${OBJ} ${LDFLAGS} -+ -+clean: -+ rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz -+ -+dist: clean -+ mkdir -p dwm-${VERSION} -+ cp -R LICENSE Makefile README config.def.h config.mk\ -+ dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION} -+ tar -cf dwm-${VERSION}.tar dwm-${VERSION} -+ gzip dwm-${VERSION}.tar -+ rm -rf dwm-${VERSION} -+ -+install: all -+ mkdir -p ${DESTDIR}${PREFIX}/bin -+ cp -f dwm ${DESTDIR}${PREFIX}/bin -+ chmod 755 ${DESTDIR}${PREFIX}/bin/dwm -+ mkdir -p ${DESTDIR}${MANPREFIX}/man1 -+ sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1 -+ chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1 -+ -+diff: -+ git diff cb3f58a -- `ls | sed '/dwm-6.2.diff/d'` > dwm-6.2.diff -+ -+uninstall: -+ rm -f ${DESTDIR}${PREFIX}/bin/dwm\ -+ ${DESTDIR}${MANPREFIX}/man1/dwm.1 -+ -+.PHONY: all options clean dist install uninstall