From 98ffd01c4337542477b5d43ad8cccab2e8e6b7ba Mon Sep 17 00:00:00 2001 From: Nash Brooks Date: Wed, 2 Jun 2021 02:20:32 -0400 Subject: [PATCH] diffed --- config.def.h | 4 + config.def.h.orig | 115 + config.h | 4 + dwm | Bin 61728 -> 66416 bytes dwm-autostart-20210120-cb3f58a.diff | 179 ++ dwm-cursorwarp-mononly-20210222-61bb8b2.diff | 25 + dwm-fullgaps-6.2.diff | 95 + dwm.1 | 23 + dwm.c | 117 +- dwm.c.orig | 2249 ++++++++++++++++++ dwm.c.rej | 27 + dwm.o | Bin 56880 -> 59176 bytes 12 files changed, 2829 insertions(+), 9 deletions(-) create mode 100644 config.def.h.orig create mode 100644 dwm-autostart-20210120-cb3f58a.diff create mode 100644 dwm-cursorwarp-mononly-20210222-61bb8b2.diff create mode 100644 dwm-fullgaps-6.2.diff create mode 100644 dwm.c.orig create mode 100644 dwm.c.rej diff --git a/config.def.h b/config.def.h index a9d65b7..59871a3 100644 --- a/config.def.h +++ b/config.def.h @@ -2,6 +2,7 @@ /* appearance */ static const unsigned int borderpx = 1; /* border pixel of windows */ +static const unsigned int gappx = 5; /* gaps between windows */ static const unsigned int snap = 32; /* snap pixel */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ @@ -84,6 +85,9 @@ static Key keys[] = { { MODKEY|ShiftMask, XK_k, focusmon, {.i = +1 } }, { MODKEY, XK_o, tagmon, {.i = -1 } }, { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY, XK_minus, setgaps, {.i = -1 } }, + { MODKEY, XK_equal, setgaps, {.i = +1 } }, + { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) diff --git a/config.def.h.orig b/config.def.h.orig new file mode 100644 index 0000000..a9d65b7 --- /dev/null +++ b/config.def.h.orig @@ -0,0 +1,115 @@ +/* See LICENSE file for copyright and license details. */ + +/* appearance */ +static const unsigned int borderpx = 1; /* border pixel of windows */ +static const unsigned int snap = 32; /* 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=10" }; +static const char dmenufont[] = "monospace:size=10"; +static const char col_gray1[] = "#222222"; +static const char col_gray2[] = "#444444"; +static const char col_gray3[] = "#bbbbbb"; +static const char col_gray4[] = "#eeeeee"; +static const char col_cyan[] = "#005577"; +static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_cyan, col_cyan }, +}; + +/* tagging */ +static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; + +static const Rule rules[] = { + /* xprop(1): + * WM_CLASS(STRING) = instance, class + * WM_NAME(STRING) = title + */ + /* class instance title tags mask isfloating monitor */ + { "Gimp", NULL, NULL, 0, 1, -1 }, + { "Firefox", NULL, NULL, 1 << 8, 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 Layout layouts[] = { + /* symbol arrange function */ + { "[]=", tile }, /* first entry is default */ + { "><>", NULL }, /* no layout function means floating behavior */ + { "[M]", monocle }, +}; + +/* key definitions */ +#define MODKEY Mod4Mask +#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} }, + +/* helper for spawning shell commands in the pre dwm-5.0 fashion */ +#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } + +/* commands */ +static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ +static const char *dmenucmd[] = { "rofi", "-show", "drun", NULL }; +static const char *termcmd[] = { "alacritty", NULL }; + +static Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_r, spawn, {.v = dmenucmd } }, + { MODKEY, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY|ShiftMask, XK_Return, zoom, {0} }, + { MODKEY, XK_Tab, view, {0} }, + { MODKEY|ShiftMask, XK_c, killclient, {0} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_j, focusmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_k, focusmon, {.i = +1 } }, + { MODKEY, XK_o, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + 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) + { MODKEY|ShiftMask, XK_q, quit, {0} }, +}; + +/* button definitions */ +/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ +static Button buttons[] = { + /* click event mask button function argument */ + { ClkLtSymbol, 0, Button1, setlayout, {0} }, + { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, + { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, + { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, + { ClkTagBar, 0, Button1, view, {0} }, + { ClkTagBar, 0, Button3, toggleview, {0} }, + { ClkTagBar, MODKEY, Button1, tag, {0} }, + { ClkTagBar, MODKEY, Button3, toggletag, {0} }, +}; + diff --git a/config.h b/config.h index a9d65b7..59871a3 100644 --- a/config.h +++ b/config.h @@ -2,6 +2,7 @@ /* appearance */ static const unsigned int borderpx = 1; /* border pixel of windows */ +static const unsigned int gappx = 5; /* gaps between windows */ static const unsigned int snap = 32; /* snap pixel */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ @@ -84,6 +85,9 @@ static Key keys[] = { { MODKEY|ShiftMask, XK_k, focusmon, {.i = +1 } }, { MODKEY, XK_o, tagmon, {.i = -1 } }, { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY, XK_minus, setgaps, {.i = -1 } }, + { MODKEY, XK_equal, setgaps, {.i = +1 } }, + { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) diff --git a/dwm b/dwm index a8797a53fbd841af5fe043199f3b86591d9d9aeb..6b754ff32914a79612b4e7139844c6e26be2cf4c 100755 GIT binary patch literal 66416 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 D>hY!@ literal 61728 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

5J{4qDU`zvWLY{NcoMT;3tI1-TO6`)T&0nQ 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 +Date: Wed, 10 Jun 2020 10:59:02 +0000 +Subject: [PATCH] dwm-xdgautostart-6.2.diff + +=================================================================== +--- + dwm.1 | 23 +++++++++++++++++ + dwm.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 105 insertions(+) + +diff --git a/dwm.1 b/dwm.1 +index 13b3729..9533aa6 100644 +--- a/dwm.1 ++++ b/dwm.1 +@@ -30,6 +30,14 @@ top left corner. The tags which are applied to one or more windows are + indicated with an empty square in the top left corner. + .P + dwm draws a small border around windows to indicate the focus state. ++.P ++On start, dwm can start additional programs that may be specified in two special ++shell scripts (see the FILES section below), autostart_blocking.sh and ++autostart.sh. The former is executed first and dwm will wait for its ++termination before starting. The latter is executed in the background before ++dwm enters its handler loop. ++.P ++Either of these files may be omitted. + .SH OPTIONS + .TP + .B \-v +@@ -152,6 +160,21 @@ Toggles focused window between floating and tiled state. + .TP + .B Mod1\-Button3 + Resize focused window while dragging. Tiled windows will be toggled to the floating state. ++.SH FILES ++The files containing programs to be started along with dwm are searched for in ++the following directories: ++.IP "1. $XDG_DATA_HOME/dwm" ++.IP "2. $HOME/.local/share/dwm" ++.IP "3. $HOME/.dwm" ++.P ++The first existing directory is scanned for any of the autostart files below. ++.TP 15 ++autostart.sh ++This file is started as a shell background process before dwm enters its handler ++loop. ++.TP 15 ++autostart_blocking.sh ++This file is started before any autostart.sh; dwm waits for its termination. + .SH CUSTOMIZATION + dwm is customized by creating a custom config.h and (re)compiling the source + code. This keeps it fast, secure and simple. +diff --git a/dwm.c b/dwm.c +index 4465af1..2156b49 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -193,6 +194,7 @@ 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 runautostart(void); + static void scan(void); + static int sendevent(Client *c, Atom proto); + static void sendmon(Client *c, Monitor *m); +@@ -235,7 +237,11 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee); + static void zoom(const Arg *arg); + + /* variables */ ++static const char autostartblocksh[] = "autostart_blocking.sh"; ++static const char autostartsh[] = "autostart.sh"; + static const char broken[] = "broken"; ++static const char dwmdir[] = "dwm"; ++static const char localshare[] = ".local/share"; + static char stext[256]; + static int screen; + static int sw, sh; /* X display screen geometry width, height */ +@@ -1380,6 +1386,83 @@ run(void) + handler[ev.type](&ev); /* call handler */ + } + ++void ++runautostart(void) ++{ ++ char *pathpfx; ++ char *path; ++ char *xdgdatahome; ++ char *home; ++ struct stat sb; ++ ++ if ((home = getenv("HOME")) == NULL) ++ /* this is almost impossible */ ++ return; ++ ++ /* if $XDG_DATA_HOME is set and not empty, use $XDG_DATA_HOME/dwm, ++ * otherwise use ~/.local/share/dwm as autostart script directory ++ */ ++ xdgdatahome = getenv("XDG_DATA_HOME"); ++ if (xdgdatahome != NULL && *xdgdatahome != '\0') { ++ /* space for path segments, separators and nul */ ++ pathpfx = ecalloc(1, strlen(xdgdatahome) + strlen(dwmdir) + 2); ++ ++ if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) { ++ free(pathpfx); ++ return; ++ } ++ } else { ++ /* space for path segments, separators and nul */ ++ pathpfx = ecalloc(1, strlen(home) + strlen(localshare) ++ + strlen(dwmdir) + 3); ++ ++ if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) { ++ free(pathpfx); ++ return; ++ } ++ } ++ ++ /* check if the autostart script directory exists */ ++ if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) { ++ /* the XDG conformant path does not exist or is no directory ++ * so we try ~/.dwm instead ++ */ ++ char *pathpfx_new = realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3); ++ if(pathpfx_new == NULL) { ++ free(pathpfx); ++ return; ++ } ++ pathpfx = pathpfx_new; ++ ++ if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) { ++ free(pathpfx); ++ return; ++ } ++ } ++ ++ /* try the blocking script first */ ++ path = ecalloc(1, strlen(pathpfx) + strlen(autostartblocksh) + 2); ++ if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) { ++ free(path); ++ free(pathpfx); ++ } ++ ++ if (access(path, X_OK) == 0) ++ system(path); ++ ++ /* now the non-blocking script */ ++ if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) { ++ free(path); ++ free(pathpfx); ++ } ++ ++ if (access(path, X_OK) == 0) ++ system(strcat(path, " &")); ++ ++ free(pathpfx); ++ free(path); ++} ++ + void + scan(void) + { +@@ -2142,6 +2223,7 @@ main(int argc, char *argv[]) + die("pledge"); + #endif /* __OpenBSD__ */ + scan(); ++ runautostart(); + run(); + cleanup(); + XCloseDisplay(dpy); +-- +2.27.0 + diff --git a/dwm-cursorwarp-mononly-20210222-61bb8b2.diff b/dwm-cursorwarp-mononly-20210222-61bb8b2.diff new file mode 100644 index 0000000..e1d9230 --- /dev/null +++ b/dwm-cursorwarp-mononly-20210222-61bb8b2.diff @@ -0,0 +1,25 @@ +From 1e4936416fa5517fe447e3388e1d44c913e29f56 Mon Sep 17 00:00:00 2001 +From: Markus Dam +Date: Mon, 22 Feb 2021 13:40:13 +0100 +Subject: [PATCH] Add cursor warping + +--- + dwm.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/dwm.c b/dwm.c +index 331a309..c80ef8a 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -882,6 +882,8 @@ focusmon(const Arg *arg) + unfocus(selmon->sel, 0); + selmon = m; + focus(NULL); ++ if (selmon->sel) ++ XWarpPointer(dpy, None, selmon->sel->win, 0, 0, 0, 0, selmon->sel->w/2, selmon->sel->h/2); + } + + void +-- +2.30.1 + diff --git a/dwm-fullgaps-6.2.diff b/dwm-fullgaps-6.2.diff new file mode 100644 index 0000000..7206aec --- /dev/null +++ b/dwm-fullgaps-6.2.diff @@ -0,0 +1,95 @@ +diff --git a/config.def.h b/config.def.h +index 1c0b587..38d2f6c 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -2,6 +2,7 @@ + + /* appearance */ + static const unsigned int borderpx = 1; /* border pixel of windows */ ++static const unsigned int gappx = 5; /* gaps between windows */ + static const unsigned int snap = 32; /* snap pixel */ + static const int showbar = 1; /* 0 means no bar */ + static const int topbar = 1; /* 0 means bottom bar */ +@@ -84,6 +85,9 @@ static Key keys[] = { + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, ++ { MODKEY, XK_minus, setgaps, {.i = -1 } }, ++ { MODKEY, XK_equal, setgaps, {.i = +1 } }, ++ { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) +diff --git a/dwm.c b/dwm.c +index 4465af1..4363627 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -119,6 +119,7 @@ struct Monitor { + int by; /* bar geometry */ + 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]; +@@ -199,6 +200,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); +@@ -638,6 +640,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); +@@ -1497,6 +1500,16 @@ 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) + { +@@ -1683,16 +1696,16 @@ 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; + } + } + +-- +2.20.1 + diff --git a/dwm.1 b/dwm.1 index ddc8321..86e73f9 100644 --- a/dwm.1 +++ b/dwm.1 @@ -30,6 +30,14 @@ top left corner. The tags which are applied to one or more windows are indicated with an empty square in the top left corner. .P dwm draws a small border around windows to indicate the focus state. +.P +On start, dwm can start additional programs that may be specified in two special +shell scripts (see the FILES section below), autostart_blocking.sh and +autostart.sh. The former is executed first and dwm will wait for its +termination before starting. The latter is executed in the background before +dwm enters its handler loop. +.P +Either of these files may be omitted. .SH OPTIONS .TP .B \-v @@ -152,6 +160,21 @@ Toggles focused window between floating and tiled state. .TP .B Mod1\-Button3 Resize focused window while dragging. Tiled windows will be toggled to the floating state. +.SH FILES +The files containing programs to be started along with dwm are searched for in +the following directories: +.IP "1. $XDG_DATA_HOME/dwm" +.IP "2. $HOME/.local/share/dwm" +.IP "3. $HOME/.dwm" +.P +The first existing directory is scanned for any of the autostart files below. +.TP 15 +autostart.sh +This file is started as a shell background process before dwm enters its handler +loop. +.TP 15 +autostart_blocking.sh +This file is started before any autostart.sh; dwm waits for its termination. .SH CUSTOMIZATION dwm is customized by creating a custom config.h and (re)compiling the source code. This keeps it fast, secure and simple. diff --git a/dwm.c b/dwm.c index b0b3466..1f25864 100644 --- a/dwm.c +++ b/dwm.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -119,6 +120,7 @@ struct Monitor { int by; /* bar geometry */ 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]; @@ -194,12 +196,14 @@ 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 runautostart(void); static void scan(void); static int sendevent(Client *c, Atom proto); 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); @@ -236,7 +240,11 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee); static void zoom(const Arg *arg); /* variables */ +static const char autostartblocksh[] = "autostart_blocking.sh"; +static const char autostartsh[] = "autostart.sh"; static const char broken[] = "broken"; +static const char dwmdir[] = "dwm"; +static const char localshare[] = ".local/share"; static char stext[256]; static int screen; static int sw, sh; /* X display screen geometry width, height */ @@ -250,7 +258,7 @@ static void (*handler[LASTEvent]) (XEvent *) = { [ConfigureRequest] = configurerequest, [ConfigureNotify] = configurenotify, [DestroyNotify] = destroynotify, - [EnterNotify] = enternotify, + /* [EnterNotify] = enternotify, */ [Expose] = expose, [FocusIn] = focusin, [KeyPress] = keypress, @@ -639,6 +647,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); @@ -828,6 +837,8 @@ focusmon(const Arg *arg) unfocus(selmon->sel, 0); selmon = m; focus(NULL); + if (selmon->sel) + XWarpPointer(dpy, None, selmon->sel->win, 0, 0, 0, 0, selmon->sel->w/2, selmon->sel->h/2); } void @@ -1381,6 +1392,83 @@ run(void) handler[ev.type](&ev); /* call handler */ } +void +runautostart(void) +{ + char *pathpfx; + char *path; + char *xdgdatahome; + char *home; + struct stat sb; + + if ((home = getenv("HOME")) == NULL) + /* this is almost impossible */ + return; + + /* if $XDG_DATA_HOME is set and not empty, use $XDG_DATA_HOME/dwm, + * otherwise use ~/.local/share/dwm as autostart script directory + */ + xdgdatahome = getenv("XDG_DATA_HOME"); + if (xdgdatahome != NULL && *xdgdatahome != '\0') { + /* space for path segments, separators and nul */ + pathpfx = ecalloc(1, strlen(xdgdatahome) + strlen(dwmdir) + 2); + + if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) { + free(pathpfx); + return; + } + } else { + /* space for path segments, separators and nul */ + pathpfx = ecalloc(1, strlen(home) + strlen(localshare) + + strlen(dwmdir) + 3); + + if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) { + free(pathpfx); + return; + } + } + + /* check if the autostart script directory exists */ + if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) { + /* the XDG conformant path does not exist or is no directory + * so we try ~/.dwm instead + */ + char *pathpfx_new = realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3); + if(pathpfx_new == NULL) { + free(pathpfx); + return; + } + pathpfx = pathpfx_new; + + if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) { + free(pathpfx); + return; + } + } + + /* try the blocking script first */ + path = ecalloc(1, strlen(pathpfx) + strlen(autostartblocksh) + 2); + if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) { + free(path); + free(pathpfx); + } + + if (access(path, X_OK) == 0) + system(path); + + /* now the non-blocking script */ + if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) { + free(path); + free(pathpfx); + } + + if (access(path, X_OK) == 0) + system(strcat(path, " &")); + + free(pathpfx); + free(path); +} + void scan(void) { @@ -1498,6 +1586,16 @@ 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) { @@ -1684,18 +1782,18 @@ 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); + 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); if (my + HEIGHT(c) < m->wh) - my += HEIGHT(c); + 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); + 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); if (ty + HEIGHT(c) < m->wh) - ty += HEIGHT(c); + ty += HEIGHT(c) + m->gappx; } } @@ -2145,6 +2243,7 @@ main(int argc, char *argv[]) die("pledge"); #endif /* __OpenBSD__ */ scan(); + runautostart(); run(); cleanup(); XCloseDisplay(dpy); diff --git a/dwm.c.orig b/dwm.c.orig new file mode 100644 index 0000000..6826fb5 --- /dev/null +++ b/dwm.c.orig @@ -0,0 +1,2249 @@ +/* See LICENSE file for copyright and license details. + * + * dynamic window manager is designed like any other X client as well. It is + * driven through handling X events. In contrast to other X clients, a window + * manager selects for SubstructureRedirectMask on the root window, to receive + * events about window (dis-)appearance. Only one X connection at a time is + * allowed to select for this event mask. + * + * The event handlers of dwm are organized in an array which is accessed + * whenever a new event has been fetched. This allows event dispatching + * in O(1) time. + * + * Each child of the root window is called a client, except windows which have + * set the override_redirect flag. Clients are organized in a linked client + * list on each monitor, the focus history is remembered through a stack list + * on each monitor. Each client contains a bit array to indicate the tags of a + * client. + * + * Keys and tagging rules are organized as arrays and defined in config.h. + * + * To understand everything else, start reading main(). + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef XINERAMA +#include +#endif /* XINERAMA */ +#include + +#include "drw.h" +#include "util.h" + +/* macros */ +#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) +#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 LENGTH(X) (sizeof X / sizeof X[0]) +#define MOUSEMASK (BUTTONMASK|PointerMotionMask) +#define WIDTH(X) ((X)->w + 2 * (X)->bw) +#define HEIGHT(X) ((X)->h + 2 * (X)->bw) +#define TAGMASK ((1 << LENGTH(tags)) - 1) +#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + +/* enums */ +enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ +enum { SchemeNorm, SchemeSel }; /* 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; + unsigned int ui; + float f; + const void *v; +} Arg; + +typedef struct { + unsigned int click; + unsigned int mask; + unsigned int button; + void (*func)(const Arg *arg); + const Arg arg; +} Button; + +typedef struct Monitor Monitor; +typedef struct Client Client; +struct Client { + char name[256]; + float mina, maxa; + int x, y, w, h; + int oldx, oldy, oldw, oldh; + int basew, baseh, incw, inch, maxw, maxh, minw, minh; + int bw, oldbw; + unsigned int tags; + int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; + Client *next; + Client *snext; + Monitor *mon; + Window win; +}; + +typedef struct { + unsigned int mod; + KeySym keysym; + void (*func)(const Arg *); + const Arg arg; +} Key; + +typedef struct { + const char *symbol; + void (*arrange)(Monitor *); +} Layout; + +struct Monitor { + char ltsymbol[16]; + float mfact; + int nmaster; + int num; + int by; /* bar geometry */ + 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]; + int showbar; + int topbar; + Client *clients; + Client *sel; + Client *stack; + Monitor *next; + Window barwin; + const Layout *lt[2]; +}; + +typedef struct { + const char *class; + const char *instance; + const char *title; + unsigned int tags; + int isfloating; + int monitor; +} Rule; + +/* function declarations */ +static void applyrules(Client *c); +static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); +static void arrange(Monitor *m); +static void arrangemon(Monitor *m); +static void attach(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); +static void clientmessage(XEvent *e); +static void configure(Client *c); +static void configurenotify(XEvent *e); +static void configurerequest(XEvent *e); +static Monitor *createmon(void); +static void destroynotify(XEvent *e); +static void detach(Client *c); +static void detachstack(Client *c); +static Monitor *dirtomon(int dir); +static void drawbar(Monitor *m); +static void drawbars(void); +static void enternotify(XEvent *e); +static void expose(XEvent *e); +static void focus(Client *c); +static void focusin(XEvent *e); +static void focusmon(const Arg *arg); +static void focusstack(const Arg *arg); +static Atom getatomprop(Client *c, Atom prop); +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); +static void killclient(const Arg *arg); +static void manage(Window w, XWindowAttributes *wa); +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 *nexttiled(Client *c); +static void pop(Client *); +static void propertynotify(XEvent *e); +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 runautostart(void); +static void scan(void); +static int sendevent(Client *c, Atom proto); +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); +static void seturgent(Client *c, int urg); +static void showhide(Client *c); +static void sigchld(int unused); +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 togglefloating(const Arg *arg); +static void toggletag(const Arg *arg); +static void toggleview(const Arg *arg); +static void unfocus(Client *c, int setfocus); +static void unmanage(Client *c, int destroyed); +static void unmapnotify(XEvent *e); +static void updatebarpos(Monitor *m); +static void updatebars(void); +static void updateclientlist(void); +static int updategeom(void); +static void updatenumlockmask(void); +static void updatesizehints(Client *c); +static void updatestatus(void); +static void updatetitle(Client *c); +static void updatewindowtype(Client *c); +static void updatewmhints(Client *c); +static void view(const Arg *arg); +static Client *wintoclient(Window w); +static Monitor *wintomon(Window w); +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); + +/* variables */ +static const char autostartblocksh[] = "autostart_blocking.sh"; +static const char autostartsh[] = "autostart.sh"; +static const char broken[] = "broken"; +static const char dwmdir[] = "dwm"; +static const char localshare[] = ".local/share"; +static char stext[256]; +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 (*xerrorxlib)(Display *, XErrorEvent *); +static unsigned int numlockmask = 0; +static void (*handler[LASTEvent]) (XEvent *) = { + [ButtonPress] = buttonpress, + [ClientMessage] = clientmessage, + [ConfigureRequest] = configurerequest, + [ConfigureNotify] = configurenotify, + [DestroyNotify] = destroynotify, + /* [EnterNotify] = enternotify, */ + [Expose] = expose, + [FocusIn] = focusin, + [KeyPress] = keypress, + [MappingNotify] = mappingnotify, + [MapRequest] = maprequest, + [MotionNotify] = motionnotify, + [PropertyNotify] = propertynotify, + [UnmapNotify] = unmapnotify +}; +static Atom wmatom[WMLast], netatom[NetLast]; +static int running = 1; +static Cur *cursor[CurLast]; +static Clr **scheme; +static Display *dpy; +static Drw *drw; +static Monitor *mons, *selmon; +static Window root, wmcheckwin; + +/* configuration, allows nested code to access above variables */ +#include "config.h" + +/* compile-time check if all tags fit into an unsigned int bit array. */ +struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; + +/* function implementations */ +void +applyrules(Client *c) +{ + const char *class, *instance; + unsigned int i; + const Rule *r; + Monitor *m; + XClassHint ch = { NULL, NULL }; + + /* rule matching */ + c->isfloating = 0; + c->tags = 0; + XGetClassHint(dpy, c->win, &ch); + class = ch.res_class ? ch.res_class : broken; + instance = ch.res_name ? ch.res_name : broken; + + for (i = 0; i < LENGTH(rules); i++) { + r = &rules[i]; + if ((!r->title || strstr(c->name, r->title)) + && (!r->class || strstr(class, r->class)) + && (!r->instance || strstr(instance, r->instance))) + { + c->isfloating = r->isfloating; + c->tags |= r->tags; + for (m = mons; m && m->num != r->monitor; m = m->next); + if (m) + c->mon = m; + } + } + if (ch.res_class) + XFree(ch.res_class); + if (ch.res_name) + XFree(ch.res_name); + c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; +} + +int +applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact) +{ + int baseismin; + Monitor *m = c->mon; + + /* set minimum possible */ + *w = MAX(1, *w); + *h = MAX(1, *h); + if (interact) { + if (*x > sw) + *x = sw - WIDTH(c); + if (*y > sh) + *y = sh - HEIGHT(c); + if (*x + *w + 2 * c->bw < 0) + *x = 0; + if (*y + *h + 2 * c->bw < 0) + *y = 0; + } else { + if (*x >= m->wx + m->ww) + *x = m->wx + m->ww - WIDTH(c); + if (*y >= m->wy + m->wh) + *y = m->wy + m->wh - HEIGHT(c); + if (*x + *w + 2 * c->bw <= m->wx) + *x = m->wx; + if (*y + *h + 2 * c->bw <= m->wy) + *y = m->wy; + } + if (*h < bh) + *h = bh; + if (*w < bh) + *w = bh; + if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { + /* see last two sentences in ICCCM 4.1.2.3 */ + baseismin = c->basew == c->minw && c->baseh == c->minh; + if (!baseismin) { /* temporarily remove base dimensions */ + *w -= c->basew; + *h -= c->baseh; + } + /* adjust for aspect limits */ + if (c->mina > 0 && c->maxa > 0) { + if (c->maxa < (float)*w / *h) + *w = *h * c->maxa + 0.5; + else if (c->mina < (float)*h / *w) + *h = *w * c->mina + 0.5; + } + if (baseismin) { /* increment calculation requires this */ + *w -= c->basew; + *h -= c->baseh; + } + /* adjust for increment value */ + if (c->incw) + *w -= *w % c->incw; + if (c->inch) + *h -= *h % c->inch; + /* restore base dimensions */ + *w = MAX(*w + c->basew, c->minw); + *h = MAX(*h + c->baseh, c->minh); + if (c->maxw) + *w = MIN(*w, c->maxw); + if (c->maxh) + *h = MIN(*h, c->maxh); + } + return *x != c->x || *y != c->y || *w != c->w || *h != c->h; +} + +void +arrange(Monitor *m) +{ + if (m) + showhide(m->stack); + else for (m = mons; m; m = m->next) + showhide(m->stack); + if (m) { + arrangemon(m); + restack(m); + } else for (m = mons; m; m = m->next) + arrangemon(m); +} + +void +arrangemon(Monitor *m) +{ + strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); + if (m->lt[m->sellt]->arrange) + m->lt[m->sellt]->arrange(m); +} + +void +attach(Client *c) +{ + c->next = c->mon->clients; + c->mon->clients = c; +} + +void +attachstack(Client *c) +{ + c->snext = c->mon->stack; + c->mon->stack = c; +} + +void +buttonpress(XEvent *e) +{ + 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 - (int)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); +} + +void +checkotherwm(void) +{ + xerrorxlib = XSetErrorHandler(xerrorstart); + /* this causes an error if some other window manager is running */ + XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); + XSync(dpy, False); + XSetErrorHandler(xerror); + XSync(dpy, False); +} + +void +cleanup(void) +{ + Arg a = {.ui = ~0}; + Layout foo = { "", NULL }; + Monitor *m; + size_t i; + + view(&a); + selmon->lt[selmon->sellt] = &foo; + for (m = mons; m; m = m->next) + while (m->stack) + unmanage(m->stack, 0); + XUngrabKey(dpy, AnyKey, AnyModifier, root); + while (mons) + cleanupmon(mons); + for (i = 0; i < CurLast; i++) + drw_cur_free(drw, cursor[i]); + for (i = 0; i < LENGTH(colors); i++) + free(scheme[i]); + XDestroyWindow(dpy, wmcheckwin); + drw_free(drw); + XSync(dpy, False); + XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); +} + +void +cleanupmon(Monitor *mon) +{ + Monitor *m; + + if (mon == mons) + mons = mons->next; + else { + for (m = mons; m && m->next != mon; m = m->next); + m->next = mon->next; + } + XUnmapWindow(dpy, mon->barwin); + XDestroyWindow(dpy, mon->barwin); + free(mon); +} + +void +clientmessage(XEvent *e) +{ + XClientMessageEvent *cme = &e->xclient; + Client *c = wintoclient(cme->window); + + if (!c) + return; + if (cme->message_type == netatom[NetWMState]) { + if (cme->data.l[1] == netatom[NetWMFullscreen] + || cme->data.l[2] == netatom[NetWMFullscreen]) + setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */ + || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); + } else if (cme->message_type == netatom[NetActiveWindow]) { + if (c != selmon->sel && !c->isurgent) + seturgent(c, 1); + } +} + +void +configure(Client *c) +{ + XConfigureEvent ce; + + ce.type = ConfigureNotify; + ce.display = dpy; + ce.event = c->win; + ce.window = c->win; + ce.x = c->x; + ce.y = c->y; + ce.width = c->w; + ce.height = c->h; + ce.border_width = c->bw; + ce.above = None; + ce.override_redirect = False; + XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); +} + +void +configurenotify(XEvent *e) +{ + Monitor *m; + Client *c; + XConfigureEvent *ev = &e->xconfigure; + int dirty; + + /* TODO: updategeom handling sucks, needs to be simplified */ + if (ev->window == root) { + dirty = (sw != ev->width || sh != ev->height); + sw = ev->width; + sh = ev->height; + if (updategeom() || dirty) { + drw_resize(drw, sw, bh); + updatebars(); + for (m = mons; m; m = m->next) { + 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); + } + focus(NULL); + arrange(NULL); + } + } +} + +void +configurerequest(XEvent *e) +{ + Client *c; + Monitor *m; + XConfigureRequestEvent *ev = &e->xconfigurerequest; + XWindowChanges wc; + + if ((c = wintoclient(ev->window))) { + if (ev->value_mask & CWBorderWidth) + c->bw = ev->border_width; + else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) { + m = c->mon; + if (ev->value_mask & CWX) { + c->oldx = c->x; + c->x = m->mx + ev->x; + } + if (ev->value_mask & CWY) { + c->oldy = c->y; + c->y = m->my + ev->y; + } + if (ev->value_mask & CWWidth) { + c->oldw = c->w; + c->w = ev->width; + } + if (ev->value_mask & CWHeight) { + c->oldh = c->h; + c->h = ev->height; + } + if ((c->x + c->w) > m->mx + m->mw && c->isfloating) + c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */ + if ((c->y + c->h) > m->my + m->mh && c->isfloating) + c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */ + if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) + configure(c); + if (ISVISIBLE(c)) + XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); + } else + configure(c); + } else { + wc.x = ev->x; + wc.y = ev->y; + wc.width = ev->width; + wc.height = ev->height; + wc.border_width = ev->border_width; + wc.sibling = ev->above; + wc.stack_mode = ev->detail; + XConfigureWindow(dpy, ev->window, ev->value_mask, &wc); + } + XSync(dpy, False); +} + +Monitor * +createmon(void) +{ + Monitor *m; + + m = ecalloc(1, sizeof(Monitor)); + m->tagset[0] = m->tagset[1] = 1; + m->mfact = mfact; + 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); + return m; +} + +void +destroynotify(XEvent *e) +{ + Client *c; + XDestroyWindowEvent *ev = &e->xdestroywindow; + + if ((c = wintoclient(ev->window))) + unmanage(c, 1); +} + +void +detach(Client *c) +{ + Client **tc; + + for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); + *tc = c->next; +} + +void +detachstack(Client *c) +{ + Client **tc, *t; + + for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); + *tc = c->snext; + + if (c == c->mon->sel) { + for (t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext); + c->mon->sel = t; + } +} + +Monitor * +dirtomon(int dir) +{ + Monitor *m = NULL; + + if (dir > 0) { + if (!(m = selmon->next)) + m = mons; + } else if (selmon == mons) + for (m = mons; m->next; m = m->next); + else + for (m = mons; m->next != selmon; m = m->next); + return m; +} + +void +drawbar(Monitor *m) +{ + int x, w, tw = 0; + int boxs = drw->fonts->h / 9; + int boxw = drw->fonts->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; + 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]); + tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ + drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); + } + + for (c = m->clients; c; c = c->next) { + occ |= c->tags; + if (c->isurgent) + urg |= c->tags; + } + 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]); + 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, + m == selmon && selmon->sel && selmon->sel->tags & 1 << i, + urg & 1 << i); + x += w; + } + w = blw = TEXTW(m->ltsymbol); + drw_setscheme(drw, scheme[SchemeNorm]); + x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); + + if ((w = m->ww - tw - 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); + } else { + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, x, 0, w, bh, 1, 1); + } + } + drw_map(drw, m->barwin, 0, 0, m->ww, bh); +} + +void +drawbars(void) +{ + Monitor *m; + + for (m = mons; m; m = m->next) + drawbar(m); +} + +void +enternotify(XEvent *e) +{ + Client *c; + Monitor *m; + XCrossingEvent *ev = &e->xcrossing; + + if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) + return; + c = wintoclient(ev->window); + m = c ? c->mon : wintomon(ev->window); + if (m != selmon) { + unfocus(selmon->sel, 1); + selmon = m; + } else if (!c || c == selmon->sel) + return; + focus(c); +} + +void +expose(XEvent *e) +{ + Monitor *m; + XExposeEvent *ev = &e->xexpose; + + if (ev->count == 0 && (m = wintomon(ev->window))) + drawbar(m); +} + +void +focus(Client *c) +{ + if (!c || !ISVISIBLE(c)) + for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); + if (selmon->sel && selmon->sel != c) + unfocus(selmon->sel, 0); + if (c) { + if (c->mon != selmon) + selmon = c->mon; + if (c->isurgent) + seturgent(c, 0); + detachstack(c); + attachstack(c); + grabbuttons(c, 1); + XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel); + setfocus(c); + } else { + XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); + } + selmon->sel = c; + drawbars(); +} + +/* there are some broken focus acquiring clients needing extra handling */ +void +focusin(XEvent *e) +{ + XFocusChangeEvent *ev = &e->xfocus; + + if (selmon->sel && ev->window != selmon->sel->win) + setfocus(selmon->sel); +} + +void +focusmon(const Arg *arg) +{ + Monitor *m; + + if (!mons->next) + return; + if ((m = dirtomon(arg->i)) == selmon) + return; + unfocus(selmon->sel, 0); + selmon = m; + focus(NULL); +} + +void +focusstack(const Arg *arg) +{ + Client *c = NULL, *i; + + if (!selmon->sel || selmon->sel->isfullscreen) + return; + if (arg->i > 0) { + for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); + if (!c) + for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); + } else { + for (i = selmon->clients; i != selmon->sel; i = i->next) + if (ISVISIBLE(i)) + c = i; + if (!c) + for (; i; i = i->next) + if (ISVISIBLE(i)) + c = i; + } + if (c) { + focus(c); + restack(selmon); + } +} + +Atom +getatomprop(Client *c, Atom prop) +{ + int di; + unsigned long dl; + unsigned char *p = NULL; + Atom da, atom = None; + + if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, + &da, &di, &dl, &dl, &p) == Success && p) { + atom = *(Atom *)p; + XFree(p); + } + return atom; +} + +int +getrootptr(int *x, int *y) +{ + int di; + unsigned int dui; + Window dummy; + + return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); +} + +long +getstate(Window w) +{ + int format; + long result = -1; + unsigned char *p = NULL; + unsigned long n, extra; + Atom real; + + if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], + &real, &format, &n, &extra, (unsigned char **)&p) != Success) + return -1; + if (n != 0) + result = *p; + XFree(p); + return result; +} + +int +gettextprop(Window w, Atom atom, char *text, unsigned int size) +{ + char **list = NULL; + int n; + XTextProperty name; + + if (!text || size == 0) + return 0; + text[0] = '\0'; + if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems) + return 0; + if (name.encoding == XA_STRING) + strncpy(text, (char *)name.value, size - 1); + else { + if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { + strncpy(text, *list, size - 1); + XFreeStringList(list); + } + } + text[size - 1] = '\0'; + XFree(name.value); + 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) +{ + updatenumlockmask(); + { + unsigned int i, j; + unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; + KeyCode code; + + XUngrabKey(dpy, AnyKey, AnyModifier, root); + for (i = 0; i < LENGTH(keys); i++) + if ((code = XKeysymToKeycode(dpy, keys[i].keysym))) + for (j = 0; j < LENGTH(modifiers); j++) + XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, + True, GrabModeAsync, GrabModeAsync); + } +} + +void +incnmaster(const Arg *arg) +{ + selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); + arrange(selmon); +} + +#ifdef XINERAMA +static int +isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) +{ + while (n--) + if (unique[n].x_org == info->x_org && unique[n].y_org == info->y_org + && unique[n].width == info->width && unique[n].height == info->height) + return 0; + return 1; +} +#endif /* XINERAMA */ + +void +keypress(XEvent *e) +{ + unsigned int i; + KeySym keysym; + XKeyEvent *ev; + + ev = &e->xkey; + keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); + for (i = 0; i < LENGTH(keys); i++) + if (keysym == keys[i].keysym + && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) + && keys[i].func) + keys[i].func(&(keys[i].arg)); +} + +void +killclient(const Arg *arg) +{ + if (!selmon->sel) + return; + if (!sendevent(selmon->sel, wmatom[WMDelete])) { + XGrabServer(dpy); + XSetErrorHandler(xerrordummy); + XSetCloseDownMode(dpy, DestroyAll); + XKillClient(dpy, selmon->sel->win); + XSync(dpy, False); + XSetErrorHandler(xerror); + XUngrabServer(dpy); + } +} + +void +manage(Window w, XWindowAttributes *wa) +{ + Client *c, *t = NULL; + Window trans = None; + XWindowChanges wc; + + c = ecalloc(1, sizeof(Client)); + c->win = w; + /* geometry */ + c->x = c->oldx = wa->x; + c->y = c->oldy = wa->y; + c->w = c->oldw = wa->width; + c->h = c->oldh = wa->height; + c->oldbw = wa->border_width; + + updatetitle(c); + if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { + c->mon = t->mon; + c->tags = t->tags; + } else { + c->mon = selmon; + applyrules(c); + } + + if (c->x + WIDTH(c) > c->mon->mx + c->mon->mw) + c->x = c->mon->mx + c->mon->mw - WIDTH(c); + if (c->y + HEIGHT(c) > c->mon->my + c->mon->mh) + c->y = c->mon->my + c->mon->mh - HEIGHT(c); + c->x = MAX(c->x, c->mon->mx); + /* only fix client y-offset, if the client center might cover the bar */ + c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx) + && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); + c->bw = borderpx; + + wc.border_width = c->bw; + XConfigureWindow(dpy, w, CWBorderWidth, &wc); + XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel); + configure(c); /* propagates border_width, if size doesn't change */ + updatewindowtype(c); + updatesizehints(c); + updatewmhints(c); + 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); + attachstack(c); + XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, + (unsigned char *) &(c->win), 1); + XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ + setclientstate(c, NormalState); + if (c->mon == selmon) + unfocus(selmon->sel, 0); + c->mon->sel = c; + arrange(c->mon); + XMapWindow(dpy, c->win); + focus(NULL); +} + +void +mappingnotify(XEvent *e) +{ + XMappingEvent *ev = &e->xmapping; + + XRefreshKeyboardMapping(ev); + if (ev->request == MappingKeyboard) + grabkeys(); +} + +void +maprequest(XEvent *e) +{ + static XWindowAttributes wa; + XMapRequestEvent *ev = &e->xmaprequest; + + if (!XGetWindowAttributes(dpy, ev->window, &wa)) + return; + if (wa.override_redirect) + return; + if (!wintoclient(ev->window)) + manage(ev->window, &wa); +} + +void +monocle(Monitor *m) +{ + unsigned int n = 0; + Client *c; + + 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); +} + +void +motionnotify(XEvent *e) +{ + static Monitor *mon = NULL; + Monitor *m; + XMotionEvent *ev = &e->xmotion; + + if (ev->window != root) + return; + if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { + unfocus(selmon->sel, 1); + selmon = m; + focus(NULL); + } + 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 * +nexttiled(Client *c) +{ + for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); + return c; +} + +void +pop(Client *c) +{ + detach(c); + attach(c); + focus(c); + arrange(c->mon); +} + +void +propertynotify(XEvent *e) +{ + Client *c; + Window trans; + XPropertyEvent *ev = &e->xproperty; + + if ((ev->window == root) && (ev->atom == XA_WM_NAME)) + updatestatus(); + else if (ev->state == PropertyDelete) + return; /* ignore */ + else if ((c = wintoclient(ev->window))) { + switch(ev->atom) { + default: break; + case XA_WM_TRANSIENT_FOR: + if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && + (c->isfloating = (wintoclient(trans)) != NULL)) + arrange(c->mon); + break; + case XA_WM_NORMAL_HINTS: + updatesizehints(c); + break; + case XA_WM_HINTS: + updatewmhints(c); + drawbars(); + break; + } + if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { + updatetitle(c); + if (c == c->mon->sel) + drawbar(c->mon); + } + if (ev->atom == netatom[NetWMWindowType]) + updatewindowtype(c); + } +} + +void +quit(const Arg *arg) +{ + running = 0; +} + +Monitor * +recttomon(int x, int y, int w, int h) +{ + Monitor *m, *r = selmon; + int a, area = 0; + + for (m = mons; m; m = m->next) + if ((a = INTERSECT(x, y, w, h, m)) > area) { + area = a; + r = m; + } + return r; +} + +void +resize(Client *c, int x, int y, int w, int h, int interact) +{ + if (applysizehints(c, &x, &y, &w, &h, interact)) + resizeclient(c, x, y, w, h); +} + +void +resizeclient(Client *c, int x, int y, int w, int h) +{ + XWindowChanges wc; + + c->oldx = c->x; c->x = wc.x = x; + c->oldy = c->y; c->y = wc.y = y; + c->oldw = c->w; c->w = wc.width = w; + c->oldh = c->h; c->h = wc.height = h; + wc.border_width = c->bw; + XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); + configure(c); + 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); + if (!m->sel) + return; + if (m->sel->isfloating || !m->lt[m->sellt]->arrange) + XRaiseWindow(dpy, m->sel->win); + if (m->lt[m->sellt]->arrange) { + wc.stack_mode = Below; + wc.sibling = m->barwin; + for (c = m->stack; c; c = c->snext) + if (!c->isfloating && ISVISIBLE(c)) { + XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); + wc.sibling = c->win; + } + } + XSync(dpy, False); + while (XCheckMaskEvent(dpy, EnterWindowMask, &ev)); +} + +void +run(void) +{ + XEvent ev; + /* main event loop */ + XSync(dpy, False); + while (running && !XNextEvent(dpy, &ev)) + if (handler[ev.type]) + handler[ev.type](&ev); /* call handler */ +} + +void +runautostart(void) +{ + char *pathpfx; + char *path; + char *xdgdatahome; + char *home; + struct stat sb; + + if ((home = getenv("HOME")) == NULL) + /* this is almost impossible */ + return; + + /* if $XDG_DATA_HOME is set and not empty, use $XDG_DATA_HOME/dwm, + * otherwise use ~/.local/share/dwm as autostart script directory + */ + xdgdatahome = getenv("XDG_DATA_HOME"); + if (xdgdatahome != NULL && *xdgdatahome != '\0') { + /* space for path segments, separators and nul */ + pathpfx = ecalloc(1, strlen(xdgdatahome) + strlen(dwmdir) + 2); + + if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) { + free(pathpfx); + return; + } + } else { + /* space for path segments, separators and nul */ + pathpfx = ecalloc(1, strlen(home) + strlen(localshare) + + strlen(dwmdir) + 3); + + if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) { + free(pathpfx); + return; + } + } + + /* check if the autostart script directory exists */ + if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) { + /* the XDG conformant path does not exist or is no directory + * so we try ~/.dwm instead + */ + char *pathpfx_new = realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3); + if(pathpfx_new == NULL) { + free(pathpfx); + return; + } + pathpfx = pathpfx_new; + + if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) { + free(pathpfx); + return; + } + } + + /* try the blocking script first */ + path = ecalloc(1, strlen(pathpfx) + strlen(autostartblocksh) + 2); + if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) { + free(path); + free(pathpfx); + } + + if (access(path, X_OK) == 0) + system(path); + + /* now the non-blocking script */ + if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) { + free(path); + free(pathpfx); + } + + if (access(path, X_OK) == 0) + system(strcat(path, " &")); + + free(pathpfx); + free(path); +} + +void +scan(void) +{ + unsigned int i, num; + Window d1, d2, *wins = NULL; + XWindowAttributes wa; + + if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { + for (i = 0; i < num; i++) { + if (!XGetWindowAttributes(dpy, wins[i], &wa) + || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) + continue; + if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState) + manage(wins[i], &wa); + } + for (i = 0; i < num; i++) { /* now the transients */ + if (!XGetWindowAttributes(dpy, wins[i], &wa)) + continue; + if (XGetTransientForHint(dpy, wins[i], &d1) + && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) + manage(wins[i], &wa); + } + if (wins) + XFree(wins); + } +} + +void +sendmon(Client *c, Monitor *m) +{ + if (c->mon == m) + return; + unfocus(c, 1); + detach(c); + detachstack(c); + c->mon = m; + c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ + attach(c); + attachstack(c); + focus(NULL); + arrange(NULL); +} + +void +setclientstate(Client *c, long state) +{ + long data[] = { state, None }; + + XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, + PropModeReplace, (unsigned char *)data, 2); +} + +int +sendevent(Client *c, Atom proto) +{ + int n; + Atom *protocols; + int exists = 0; + XEvent ev; + + if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { + while (!exists && n--) + exists = protocols[n] == proto; + XFree(protocols); + } + if (exists) { + ev.type = ClientMessage; + ev.xclient.window = c->win; + ev.xclient.message_type = wmatom[WMProtocols]; + ev.xclient.format = 32; + ev.xclient.data.l[0] = proto; + ev.xclient.data.l[1] = CurrentTime; + XSendEvent(dpy, c->win, False, NoEventMask, &ev); + } + return exists; +} + +void +setfocus(Client *c) +{ + if (!c->neverfocus) { + XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); + XChangeProperty(dpy, root, netatom[NetActiveWindow], + XA_WINDOW, 32, PropModeReplace, + (unsigned char *) &(c->win), 1); + } + sendevent(c, wmatom[WMTakeFocus]); +} + +void +setfullscreen(Client *c, int fullscreen) +{ + if (fullscreen && !c->isfullscreen) { + XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, + PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); + c->isfullscreen = 1; + c->oldstate = c->isfloating; + c->oldbw = c->bw; + c->bw = 0; + c->isfloating = 1; + resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); + XRaiseWindow(dpy, c->win); + } else if (!fullscreen && c->isfullscreen){ + XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, + PropModeReplace, (unsigned char*)0, 0); + c->isfullscreen = 0; + c->isfloating = c->oldstate; + c->bw = c->oldbw; + c->x = c->oldx; + c->y = c->oldy; + c->w = c->oldw; + c->h = c->oldh; + resizeclient(c, c->x, c->y, c->w, c->h); + arrange(c->mon); + } +} + +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) +{ + if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) + selmon->sellt ^= 1; + if (arg && arg->v) + selmon->lt[selmon->sellt] = (Layout *)arg->v; + strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); + if (selmon->sel) + arrange(selmon); + else + drawbar(selmon); +} + +/* arg > 1.0 will set mfact absolutely */ +void +setmfact(const Arg *arg) +{ + float f; + + if (!arg || !selmon->lt[selmon->sellt]->arrange) + return; + f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; + if (f < 0.05 || f > 0.95) + return; + selmon->mfact = f; + arrange(selmon); +} + +void +setup(void) +{ + int i; + XSetWindowAttributes wa; + Atom utf8string; + + /* clean up any zombies immediately */ + sigchld(0); + + /* init screen */ + screen = DefaultScreen(dpy); + sw = DisplayWidth(dpy, screen); + sh = DisplayHeight(dpy, screen); + root = RootWindow(dpy, screen); + drw = drw_create(dpy, screen, root, sw, sh); + if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) + die("no fonts could be loaded."); + lrpad = drw->fonts->h; + bh = drw->fonts->h + 2; + updategeom(); + /* init atoms */ + utf8string = XInternAtom(dpy, "UTF8_STRING", False); + wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); + wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); + wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); + wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); + netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); + netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); + netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); + netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); + netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); + netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); + netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); + 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[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); + /* init bars */ + updatebars(); + updatestatus(); + /* supporting window for NetWMCheck */ + wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); + XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, + PropModeReplace, (unsigned char *) &wmcheckwin, 1); + XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8, + PropModeReplace, (unsigned char *) "dwm", 3); + XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32, + PropModeReplace, (unsigned char *) &wmcheckwin, 1); + /* EWMH support per view */ + XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, + PropModeReplace, (unsigned char *) netatom, NetLast); + XDeleteProperty(dpy, root, netatom[NetClientList]); + /* select events */ + wa.cursor = cursor[CurNormal]->cursor; + wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask + |ButtonPressMask|PointerMotionMask|EnterWindowMask + |LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; + XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); + XSelectInput(dpy, root, wa.event_mask); + grabkeys(); + focus(NULL); +} + + +void +seturgent(Client *c, int urg) +{ + XWMHints *wmh; + + c->isurgent = urg; + if (!(wmh = XGetWMHints(dpy, c->win))) + return; + wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint); + XSetWMHints(dpy, c->win, wmh); + XFree(wmh); +} + +void +showhide(Client *c) +{ + if (!c) + return; + if (ISVISIBLE(c)) { + /* show clients top down */ + XMoveWindow(dpy, c->win, c->x, c->y); + if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) + resize(c, c->x, c->y, c->w, c->h, 0); + showhide(c->snext); + } else { + /* hide clients bottom up */ + showhide(c->snext); + XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); + } +} + +void +sigchld(int unused) +{ + if (signal(SIGCHLD, sigchld) == SIG_ERR) + die("can't install SIGCHLD handler:"); + while (0 < waitpid(-1, NULL, WNOHANG)); +} + +void +spawn(const Arg *arg) +{ + if (arg->v == dmenucmd) + dmenumon[0] = '0' + selmon->num; + if (fork() == 0) { + if (dpy) + close(ConnectionNumber(dpy)); + setsid(); + execvp(((char **)arg->v)[0], (char **)arg->v); + fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]); + perror(" failed"); + exit(EXIT_SUCCESS); + } +} + +void +tag(const Arg *arg) +{ + if (selmon->sel && arg->ui & TAGMASK) { + selmon->sel->tags = arg->ui & TAGMASK; + focus(NULL); + arrange(selmon); + } +} + +void +tagmon(const Arg *arg) +{ + if (!selmon->sel || !mons->next) + return; + sendmon(selmon->sel, dirtomon(arg->i)); +} + +void +tile(Monitor *m) +{ + unsigned int i, n, h, mw, my, ty; + Client *c; + + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); + if (n == 0) + return; + + if (n > m->nmaster) + mw = m->nmaster ? m->ww * m->mfact : 0; + else + 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) - m->gappx; + resize(c, m->wx + m->gappx, m->wy + my, mw - (2*c->bw) - m->gappx, h - (2*c->bw), 0); + if (my + HEIGHT(c) < m->wh) + my += HEIGHT(c) + m->gappx; + } else { + 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); + if (ty + HEIGHT(c) < m->wh) + 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) +{ + if (!selmon->sel) + return; + if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ + return; + selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; + if (selmon->sel->isfloating) + resize(selmon->sel, selmon->sel->x, selmon->sel->y, + selmon->sel->w, selmon->sel->h, 0); + arrange(selmon); +} + +void +toggletag(const Arg *arg) +{ + unsigned int newtags; + + if (!selmon->sel) + return; + newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); + if (newtags) { + selmon->sel->tags = newtags; + focus(NULL); + arrange(selmon); + } +} + +void +toggleview(const Arg *arg) +{ + unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); + + if (newtagset) { + selmon->tagset[selmon->seltags] = newtagset; + focus(NULL); + arrange(selmon); + } +} + +void +unfocus(Client *c, int setfocus) +{ + if (!c) + return; + grabbuttons(c, 0); + XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); + if (setfocus) { + XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); + XDeleteProperty(dpy, root, netatom[NetActiveWindow]); + } +} + +void +unmanage(Client *c, int destroyed) +{ + Monitor *m = c->mon; + XWindowChanges wc; + + detach(c); + detachstack(c); + if (!destroyed) { + wc.border_width = c->oldbw; + XGrabServer(dpy); /* avoid race conditions */ + XSetErrorHandler(xerrordummy); + XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); + setclientstate(c, WithdrawnState); + XSync(dpy, False); + XSetErrorHandler(xerror); + XUngrabServer(dpy); + } + free(c); + focus(NULL); + updateclientlist(); + arrange(m); +} + +void +unmapnotify(XEvent *e) +{ + Client *c; + XUnmapEvent *ev = &e->xunmap; + + if ((c = wintoclient(ev->window))) { + if (ev->send_event) + setclientstate(c, WithdrawnState); + else + unmanage(c, 0); + } +} + +void +updatebars(void) +{ + Monitor *m; + XSetWindowAttributes wa = { + .override_redirect = True, + .background_pixmap = ParentRelative, + .event_mask = ButtonPressMask|ExposureMask + }; + XClassHint ch = {"dwm", "dwm"}; + 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), + CopyFromParent, DefaultVisual(dpy, screen), + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); + XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); + XMapRaised(dpy, m->barwin); + XSetClassHint(dpy, m->barwin, &ch); + } +} + +void +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; + } else + m->by = -bh; +} + +void +updateclientlist() +{ + Client *c; + Monitor *m; + + XDeleteProperty(dpy, root, netatom[NetClientList]); + for (m = mons; m; m = m->next) + for (c = m->clients; c; c = c->next) + XChangeProperty(dpy, root, netatom[NetClientList], + XA_WINDOW, 32, PropModeAppend, + (unsigned char *) &(c->win), 1); +} + +int +updategeom(void) +{ + int dirty = 0; + +#ifdef XINERAMA + if (XineramaIsActive(dpy)) { + int i, j, n, nn; + Client *c; + Monitor *m; + XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); + XineramaScreenInfo *unique = NULL; + + for (n = 0, m = mons; m; m = m->next, n++); + /* only consider unique geometries as separate screens */ + unique = ecalloc(nn, sizeof(XineramaScreenInfo)); + for (i = 0, j = 0; i < nn; i++) + if (isuniquegeom(unique, j, &info[i])) + memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); + XFree(info); + nn = j; + if (n <= nn) { /* new monitors available */ + for (i = 0; i < (nn - n); i++) { + for (m = mons; m && m->next; m = m->next); + if (m) + m->next = createmon(); + else + mons = createmon(); + } + for (i = 0, m = mons; i < nn && m; m = m->next, i++) + if (i >= n + || unique[i].x_org != m->mx || unique[i].y_org != m->my + || unique[i].width != m->mw || unique[i].height != m->mh) + { + dirty = 1; + m->num = i; + m->mx = m->wx = unique[i].x_org; + m->my = m->wy = unique[i].y_org; + m->mw = m->ww = unique[i].width; + m->mh = m->wh = unique[i].height; + updatebarpos(m); + } + } else { /* less monitors available nn < n */ + for (i = nn; i < n; i++) { + for (m = mons; m && m->next; m = m->next); + while ((c = m->clients)) { + dirty = 1; + m->clients = c->next; + detachstack(c); + c->mon = mons; + attach(c); + attachstack(c); + } + if (m == selmon) + selmon = mons; + cleanupmon(m); + } + } + free(unique); + } else +#endif /* XINERAMA */ + { /* default monitor setup */ + if (!mons) + mons = createmon(); + if (mons->mw != sw || mons->mh != sh) { + dirty = 1; + mons->mw = mons->ww = sw; + mons->mh = mons->wh = sh; + updatebarpos(mons); + } + } + if (dirty) { + selmon = mons; + selmon = wintomon(root); + } + return dirty; +} + +void +updatenumlockmask(void) +{ + unsigned int i, j; + XModifierKeymap *modmap; + + numlockmask = 0; + modmap = XGetModifierMapping(dpy); + for (i = 0; i < 8; i++) + for (j = 0; j < modmap->max_keypermod; j++) + if (modmap->modifiermap[i * modmap->max_keypermod + j] + == XKeysymToKeycode(dpy, XK_Num_Lock)) + numlockmask = (1 << i); + XFreeModifiermap(modmap); +} + +void +updatesizehints(Client *c) +{ + long msize; + XSizeHints size; + + if (!XGetWMNormalHints(dpy, c->win, &size, &msize)) + /* size is uninitialized, ensure that size.flags aren't used */ + size.flags = PSize; + if (size.flags & PBaseSize) { + c->basew = size.base_width; + c->baseh = size.base_height; + } else if (size.flags & PMinSize) { + c->basew = size.min_width; + c->baseh = size.min_height; + } else + c->basew = c->baseh = 0; + if (size.flags & PResizeInc) { + c->incw = size.width_inc; + c->inch = size.height_inc; + } else + c->incw = c->inch = 0; + if (size.flags & PMaxSize) { + c->maxw = size.max_width; + c->maxh = size.max_height; + } else + c->maxw = c->maxh = 0; + if (size.flags & PMinSize) { + c->minw = size.min_width; + c->minh = size.min_height; + } else if (size.flags & PBaseSize) { + c->minw = size.base_width; + c->minh = size.base_height; + } else + c->minw = c->minh = 0; + if (size.flags & PAspect) { + c->mina = (float)size.min_aspect.y / size.min_aspect.x; + c->maxa = (float)size.max_aspect.x / size.max_aspect.y; + } else + c->maxa = c->mina = 0.0; + c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh); +} + +void +updatestatus(void) +{ + if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) + strcpy(stext, "dwm-"VERSION); + drawbar(selmon); +} + +void +updatetitle(Client *c) +{ + if (!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name)) + gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name); + if (c->name[0] == '\0') /* hack to mark broken clients */ + strcpy(c->name, broken); +} + +void +updatewindowtype(Client *c) +{ + Atom state = getatomprop(c, netatom[NetWMState]); + Atom wtype = getatomprop(c, netatom[NetWMWindowType]); + + if (state == netatom[NetWMFullscreen]) + setfullscreen(c, 1); + if (wtype == netatom[NetWMWindowTypeDialog]) + c->isfloating = 1; +} + +void +updatewmhints(Client *c) +{ + XWMHints *wmh; + + if ((wmh = XGetWMHints(dpy, c->win))) { + if (c == selmon->sel && wmh->flags & XUrgencyHint) { + wmh->flags &= ~XUrgencyHint; + XSetWMHints(dpy, c->win, wmh); + } else + c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; + if (wmh->flags & InputHint) + c->neverfocus = !wmh->input; + else + c->neverfocus = 0; + XFree(wmh); + } +} + +void +view(const Arg *arg) +{ + if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) + return; + selmon->seltags ^= 1; /* toggle sel tagset */ + if (arg->ui & TAGMASK) + selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; + focus(NULL); + arrange(selmon); +} + +Client * +wintoclient(Window w) +{ + Client *c; + Monitor *m; + + for (m = mons; m; m = m->next) + for (c = m->clients; c; c = c->next) + if (c->win == w) + return c; + return NULL; +} + +Monitor * +wintomon(Window w) +{ + int x, y; + Client *c; + Monitor *m; + + if (w == root && getrootptr(&x, &y)) + return recttomon(x, y, 1, 1); + for (m = mons; m; m = m->next) + if (w == m->barwin) + return m; + if ((c = wintoclient(w))) + return c->mon; + return selmon; +} + +/* There's no way to check accesses to destroyed windows, thus those cases are + * ignored (especially on UnmapNotify's). Other types of errors call Xlibs + * default error handler, which may call exit. */ +int +xerror(Display *dpy, XErrorEvent *ee) +{ + if (ee->error_code == BadWindow + || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch) + || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable) + || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable) + || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable) + || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch) + || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) + || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) + || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) + return 0; + fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", + ee->request_code, ee->error_code); + return xerrorxlib(dpy, ee); /* may call exit */ +} + +int +xerrordummy(Display *dpy, XErrorEvent *ee) +{ + return 0; +} + +/* Startup Error handler to check if another window manager + * is already running. */ +int +xerrorstart(Display *dpy, XErrorEvent *ee) +{ + die("dwm: another window manager is already running"); + return -1; +} + +void +zoom(const Arg *arg) +{ + Client *c = selmon->sel; + + if (!selmon->lt[selmon->sellt]->arrange + || (selmon->sel && selmon->sel->isfloating)) + return; + if (c == nexttiled(selmon->clients)) + if (!c || !(c = nexttiled(c->next))) + return; + pop(c); +} + +int +main(int argc, char *argv[]) +{ + if (argc == 2 && !strcmp("-v", argv[1])) + die("dwm-"VERSION); + else if (argc != 1) + die("usage: dwm [-v]"); + if (!setlocale(LC_CTYPE, "") || !XSupportsLocale()) + fputs("warning: no locale support\n", stderr); + if (!(dpy = XOpenDisplay(NULL))) + die("dwm: cannot open display"); + checkotherwm(); + setup(); +#ifdef __OpenBSD__ + if (pledge("stdio rpath proc exec", NULL) == -1) + die("pledge"); +#endif /* __OpenBSD__ */ + scan(); + runautostart(); + run(); + cleanup(); + XCloseDisplay(dpy); + return EXIT_SUCCESS; +} diff --git a/dwm.c.rej b/dwm.c.rej new file mode 100644 index 0000000..8a8f14c --- /dev/null +++ b/dwm.c.rej @@ -0,0 +1,27 @@ +--- dwm.c ++++ dwm.c +@@ -1696,16 +1709,16 @@ 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; + } + } + diff --git a/dwm.o b/dwm.o index f2e2a20b29b860aaf7d7df4a3de5966b7b264d3e..c96033ced41e55529027efe68bedd645c585f29c 100644 GIT binary patch literal 59176 zcmeIbdwf*Y)jxc4Q6ra`XtBl?>!?u^MN9;hRIC{?ffF4hkRTCMh$IjskeJL!Py}>{ za(ax?s;zx$Tie=}=P7ON*o%z1N!TY;&GIzxVTb z|9XG>lbLhQcdz~3Yp;D;E&u_x+1759&&%bHl%h@)M9B%PPO z7R~z5?c9-==}#~5qZ49&bbQv%SlRYyc-p42Ps8z-i+4Uuf?;>FKYd~>Yjdn@7vgqB z%l5~@@vX7q&C!h%9}T-Z!@t{H)^ptg8-a~J zs5fQ2H*I3#cz;=4@$*ry8yB4ilDV<2+`O1KWpw9(M0VCr2=#pYsyAyiOsi74ox2jp z!&>vm0!O-K8`n}1k1#ASqoeQD((WGoRl8m1QBI}ZX*#5~_s{MLKX_4O^(Q&uHQxpj zt)1z5|BP1q7e^Lc|7qT-;oG}$Jp6+4@a@YF)8)cCXr72h*tfMOi*~{aGDob;+Y#PnoL^HS7ZEO$>9r z?XX#LU*9;_tL||92UdfHbyQ?SLEgU0dLibx-l&s0a10Nxe*8`xpU9}dg>#isgt`ws z^Yn=G)mhideAjdFsgC1QyRE#O6m`9O*Q&$Db#&O~%(?759Ln=><;?D>@u#>C=TnS- z*ES{SkJI{j+g!gQk19TAPXC@cJ#Ol~rZ_j?T@N`*U!0LqA)^VMS#oQZLvZZi5wiO>8Q2w zkwb%fn$9nAhz3(zntD_{q~0qTq)d_4#QOv331$yNM3oO@#`gLU6r;HD4>{?MpxNMSs7v z$pe`(6b(^^lFNFcwNdZsjbL)3-V2qT??k;1Yh3?U8eP!uw^Vj^dz*E1cv`o&RhurW zyAoqawXTv_+4I-s$Fz;3S>3VXO&EJ5>J=45T1(U)CwJu@S-Jz4IQd2_>^@I1VfU53 zi(`IO2}Yy|m08;>%XY2``9C2eRC=4UdZNXz(pcqRf-$MbdnH!(+NzQMPlz|Gr}&kq z_s2hsxc_`i!TpuKFk%KJ}H4!l%9z zF8a$y;mh9+pYhh!M}HK)Mby^qsFI4v%@;fAH~V(c@$SSSh@OV%iTd&|6+f*zR`z{rm&vci%6>xaE_pvz-m5Y1rRb%-qd)KOpMx=r+Ii`Yni;M?MUBQM%IwpI+2_A`_DOx3#ba~omHxin zXda{7E;TeguKGCIC3Pv+ziwW-@DnspuZKGLSU*M0*q=JV_1>&3-4XLEC;BtTXLb9@ z5;UaZ?(`gJ;rfrXLaOh{x;bdEv!WMAXGUu)OW&DU<9eTAbSQBBRrAu%U{tO0wh}Go ziH(#Z+P@|JAmF}t(X_*BPNJ+TM)`}&V`Y2V3o1+ZLbd?4STO-rQ<48sJUk}dcUa6{ zJRw@V7sJ2^(mCqwo7#CGyyow8?mtNS#{4by~b|#K#}RyxvJ&wIdxWV(}}*pTvrH7axp!A7egDFaKA6 zf7JgT@kad{sZDp~R(FjmI=5zG`{g+m$xP|*evAnT#fABL^Kt5?wiL|4 zd=*~NLuSNo1~ z7k7_v{bBt*@vJ?rm*-!Q=ec?P+uYRV5q-ald;8GXRUY1@g}G&Y;hUdBwlN6Kr1J6{X0xlNU%q63BuulWzU@Ot|GI<+fam|I!83uKjLFNAN|3lb&%4o;%s zCra_D%Es69Tzo|jjh4N8-KetmNHSb@VPSGuSxr&$kg|#~iBn@<4d&uEqmO~v@!Ctg z_K0`kc<;hOuV#W*Q{+`l^eV=rfB#SF`*S*?{hO;&n@05c@iJ9!$;0BF8erqzw*H>< zI|usv%ic)LXCGmzw|y$AKU4)XQ#&}M%IogiTjh6P^y*JMih*7Y4Jzv@uY6v5>_0GY z_|bWBPtAL-rv!ksR(Z?k;j#l-;Ccnz){B zTiPqs-mGqJWwWUGQ^q8=db1{Yvx>Ya6TK;8(tkwu(mZq`rbz!4U6{|+9Nc$Yx^Wp02Qpj=sG?jhH)g&&-Fu28C)#{ij%(g%&1(wR0;m4G0*+BvGaM$2 zf(2AbAN|_x(gg!DFL$+algN;08L`4V`pQ>L;Wq@O9)SR+%Fgf66_;whN+0tpCioYQ zb~o)g%+0xptm)U3%xuaUM(t76YJY1vk0n<+e))vzE5#Gj9V@k^#Kkc0rB*9$wl@1e z{(Tx%qN=J~hA>2-=b8ANj@}Dsu=91XzvLiYzlE%%rksZk$64tvnt9On)o`F@o+2rm zKLv}adGPP{eEdP_u7?hVc+}gbE~DO-XlhHgTXrl!Cs{3Z-E}%$yM76)sY~a*uP#yY z_6Zo>XU4jkvSYgalO<5 zkB(MzaeesfaLg3NC6{+L7mi3&!Xj)(q8XL^Dhl01g&m2Q6W3Rxl+o}Vn`VlkyiY5- z#-9_NQR(f${HdtwX1o2lg|VCjnnP-0;o;%V{sD*C_5S=ADXAoNNu_|fh0?LP#p!y} zg}V~Y`2p6O6V&_w1<3#SbCiw?5uF{K6NL|5F(HPbws^lD%%a|t;jZ5zPd9aK6DpC} zm3HnX@AgdnTzz>LBVQPES43L?_8Y-_OU1e;YATd-C4&?<4M*pCacg-TNUa z_Cp%kC!lIX&7xz5cy}$al~vOE$!A z#XX-|K`@7Lf{0-^F5{5SJL$lkDqzF=I}%4qhK@ch~EEcpgX;6A~y5 zls@-KGw@zj-oKK-oc2GKa}0PKhT)P>t`m^S)se1=la-gc+&ND zu72kW`1XlI>GbI=*Q?C54)0wv)f~8g@Mv|-&{mAfWO@MqLfM8Q&kc*h*-gol!VmAs zYd;S8*=Bf`a#gDJjdV91%uDUb@=~OHY4?FjCo6GyX?N^!mM;WRVn<-uw$hEB}Co8c^`-p;@NEeBbUTMNIpZy33_ zs9UwqabFQ)`i8sPQglLLeYuXrgnD0zMAC_hjOfTBL{5-MI-$U>b8TUS^4LL=wS}(h z-BvD=bV6bM>cpv7V#N!w#yT}tI1#JiP3k)KQTT`yDXZ{u!uv*UQwXIC&+7J5lpTrD zx*OI04L`*z+EHk5l!IHQWMJFygD@|RY-Eq2c5LR&LF;n8FVN?s8)=X)-BFc#8f%^R zN~E@R4<2OtBJzgFz+`UHOD$_6#`kD-US2&zRSkx|5;XO%x~UbImR)~EVO}CP7Jl#) z9Shxt+=+>Md-PKK6Iy6Yi2G9@W^8gn4LG~$Kfg;O##MF7E&l@*)_b!2z}Eak$d8tL zoi32x*YV}AtHXEat|Z0{HKF(&G#ngUivqYQ4281{4_kd0+mCykn3=V&D`K9<$(DFm^(iKF~Z8W+9Jh>D%ysY^uVQ521> zUZ>i+ica*@rIz=n6?J0%=%TDKdG~aUIwne6InS>=qjJq_iBtVMs94d5smic2{z3HP zPcfrnhXg0yrdaWguH0j^p4fNR`S_2Knpo^+Wo;{adF5E*DP|t!glL{mylsl+6K_-T zCzHBzvoeLrNrcK*|7}DP{c2x&MIRZxQ(1~9rOs;bCz5^_<>TK$s$*MqEeWKMA)GK^5pF|j z+AIB^_x2{J!IbuHFur^QkADwUz1|?@Y>fuCrf@f+si|YTLapXiR%pnFV4tOL1-0XR zcRsw!uIhd`wCIarw|~1^HhNofZ}d?V*ny%WR3aLVpJHpo(RB*QKN#%Spf431Px@f* zRh70Jh#OJJrG?eh*XnQ~Q;XJah)H7)WZ+|ytI;zv^~5~V10_ygG`OIpI|jDW-L6im zCUR%g_Ea@5H83hXq*T&lKy+gST&g^97-eSzyX5PYv#65N{TcrnxS##FL*d^_v~HOj zNgUGK3RgjI8z}pCDbHs{_`zkhrMu!?Ki_j0RmFhwg8hMb+2Xw9$-G+38CO}IdMf+l zUB_=;{r2a{Fnk28t-3MEbzNJ~ztc_iMB-(CN&XSD2kp`5EwRU`@OrDF^tBmGKX6A# zHy!WEO7EZEE2z`x3xD-19qfZ$eP;M~xV11d@9|ar8MR_rd$61I?TOhcS#-j-Lcy5m@0=B1;s)JD?$ zVP`cO-~lWPkLR0JTm5tNr>CI-shnNEi<*p-Sv3b`h5w<%@XpS-5^YDNtSs#= zJ#eKHeTbHPI;A$om5wZ#Q(Lf%SFJCO9kjf7*RQFMq|VJvehY2DugUe>^K^QURSX~X z%PXC#{w>VUb|SVbv$Vm%SC#r#Zt_Xp2K$ot|9eYuN9*igd1Tz5)PcR3VzvRY&Q(H@BsT5P!}#1<{$8YQRBnm~T_t<^X}lfr`KG7Wu6a zzq&Bymyb!$K@l!t`pemAoueFJ+SL0#67w*5C9Q*$O4PQLf+0$z2HZ}X-S3uhM z5qxWHwKh}$tfbUDuT=BYLd#Q2EKjNJsRdZf)61;~-XTLjvKr~?X3yz88{K10&&96y ziK^+nZy^?DUq;pKM~mEZl{=Hf0zfa6%cA8N7tf8l$y&ruP@|xmI+&F>3LPtTFgrOC z_fnrAYdUlb_mbW?4dBdzp@vyHni8W@Ph3i3$>EA*c5f>hN9L}p>vyP;ej$@3FHb!| zWpxsxQ%{iF=_J3h?IwlboUPtBzS>te_+VchNrJw*=i;kdgt#L`?m{}Dte_g%?A|kR z&x7v%qp>T*pXHJbid{dCeC^}Cm)vu2{&+3rc@!2xxRFZk_))HRySkCuH$3%WmZ#Dr z_YB-+UBh=-dA}*uf!zjg8+D+~Sc=#6eswPlLysKvC*~L#`?tSLIk_oXhEBpwFgWD- zYCsL2vHj}9J_^@O$?wbkD17Or55xJY?cf&I_66ZHo?kW!-%4`XFgWp3@_R2qMtEER z)21pHwnls>Ysx5p$|$r*ce6KTRPWgkK`+tq-Sij%t(&IQrtf(Z%kNnw{@mW-3dG)gTD zQcb+#9!j?Byj2#YT9?gx!S&u%C4oKu zM60I~C-Dp&BgZAN+DjA`JPiMY1|TKXH$_rrTvj}C!2}(rBHajQC2mzVlWU#Cdi4Nx zkT(^FlA=MLn!?r;(ZUidc#m@<^-)^RPJjb2%5nf)xYe?|$WG4Vr;t39KZub96&sdE zB{&1t^RnItdi(p4Ry9C1O+7*LKc#$Jr$jLyV@Q#ve+hi`b?D~U?AXV&dgI_SbyJQ9 zYm6>>ydGqKx-SR+8cUdrku%ldJ%433Eo<|ul?}+n9ope3QfuZ9W!apEqL%J}>!4T7 zs_F)1%FAVa-vGjTxs1Djlp8#Ie3w^WnX79+FO}gt!}Qc_^Wy&hYMG2>ytbm=VDpt7 z(=~9wFp($&>S)|bOP>ccUUm|xg0*sTq@Ezqh+?=e?3SrXKRIk*mep$s>N+SQ-B=#% zxYA9@b5*gECu765=#=DfWIDQYsC~t7=YGm6MK@4;cVQq;T{|HwyylMp(~;L`gnbfY zd3X)^5b*1ZFh><77T`OE_L(|(V)6=Vm~$}}r*~kn-&d1*Oie0DZ1SlErZju+ZDmCC zmJ%0tLeo93f*j0usGX2bN|eC%xLV++_h7i|Q;XSKXq4Cao`NUJcq057WjasYYF7!| zvX-XgA?cjIldvA9$|{QVa(E>g<=`?8+{#6vX#m1zubK%G$KY-o&FnCz?_w`;ZT!TW zXz83Ra{bwO67Ds65>9XTa$d+Sq!ow>u&iP=#m|k7eoZjB_0N}guE_NhJ{G)Np)wu|5w-J=ac1#67n98?smGL0hMl1ci~O2Gv_HQ+g1ZT0 z()Un9_J7j~Rr+4UokH9mg!8%@40N+$$Qd7Z5q^pZ@CG#C*`@vHc>Bq9Lt9k)$@}## z2=@8n{;#Mt+9Ou_;GfXlPI;-nAJ035JL#sbf0K5rm91&rsYk4?^KO1Q<00toh&>uz zVD&JY7Sro9#!C;VwHe2#0UoXOyici=ie8+IuJa}jkgFJ-hUXC!@TcmYiK?2xjhxBV zXh!Cp=K7bx&aWlP-7d8;pV{w-s{Jo`SgP4PbUe!XWnaGz-H+@)yYCUT2HHUPz3)=@ zMFRFO)v(E4dr|rvn36o!NNPFuK;dL!wWXfmEIn{ZZw363(gU-5>(L_XdT2pcls=Rb zVCl7uz3)jXdZ3L)k{8$b%i;r1eE6%}^iild7mpH2OYTV&QNEb>Rnz7k+tHN%8wS8q zh^m&DzJ!JfeLe?mgr6wF^PI|!8G6*`o2BXMH+0!fGxOb@fLGelr1DE&GbpdUs-l%T zRhZ}^?ztPOEho<}-CO!vTtB&5<&WRTjX~99CES*Befts5zLmWZzF|F*xcyjme|~uK z`QHD+ReINp{r!&-FKkAIE>7Pt(54=v1!nqMwTRV?Y}ezN8=Jf(Q04uNHw4N~OP=rg z7h;oXN8;=#=Cj(eioE0)ZA9!6M90+@R%7Sop9UD|q_h@YJ;hc&75>M6OGl zQqN~L1o|%adN-o&IHh}E*yH6E_I)Qu8C~61Mp@dfm)g>;pWT|$y?)&URd`+QVk&oe z_{UGCp3LsOP)+UTG&^X@8F)~M+ksz=(R5d$&_C=X8W9s;pN>)R1{zn>mn&~rndI`` z9sATUsMZh|d9RA;VfWnH-^UXtyWaj;sr^}AGzO|%ulD*ldf;&b$?JN*t&{6fROcC9 z^Ad`ldRPr^;m#d&alW(i4A*~{Iuz!{@S2+e@)P7fKf(Qd(k(gP^`9WAzTH@2%tLd< z!-!a-e)&mpH(Ys8ZsWfSPCOtr#1r9$6xv7fb#k%JtxjJ`j*qte?A}Y%_^cm|IgTf5 zx$~-L>Ssl%*E8KL)zRUE*W7?&)cEJ8N560P!9~;;FsfaJQFx%!y+hAlNd>i{f(|6g za_kSyBK=-e30ClMYqhHa{osVRu_So{K{sP`@GS`pc^3?wq^j6`VO;)9Mk?@FET$X`~x60EF7K#+1B2n3j=p;I@8-Y_|rJ#CP+;1o> zlHDnyYs!DAY zMdM}r!<`8X1W*?%1%42VtO$ksc|3^vindDse}?M($;13f@H}sTUiz_S|0gaf;VDTZ zph~RtZ&kH@Rm5Lj)HUks`0s@LtdA?{Hq<98hsBDwMZG7Kz;bM@MaMv#+Cntv`&8l4 ztb@_4=PS!LtsE9D-dU;JNz_-5+LpZ(j(-@{kAt7Pd~`CRZ$0AP)j{0<$=YAGbH&J< z=@ZI!UU#VOl2C}Kgt?POOG-d>C^%9am#}jgI@^%P}vqy#iB;UP_l9px9HeaE;1#*HPROSzP7YH-;AK z1&$i`vE$YaX|*SY)d=*YjYF<`j6+XU@tQ!pAle}r!8aH zb*VfcAgxthH?0M7WtLvY!g#8dRD4ud603_Uqq?fp^*!*ohSI-EFCq2x{c~(5!%tO> z|B|XQ)xDC#c}V*)20KWT7a8|fHKlKYY1k5+ks`!Q@lSS_uqpDT+X#H)Mm=1cxmQ9< zPVZg#L(4EWs0vh6=o}}=6NVTit}RNx^0XQ=lEY`Cn&9kyifNymUDnyJcJb^8KLbOX zcFkCh)nUBFgXR3VM{*X5GcWzaKZ2;N2g@qN#a#WAb-I&K_*BRk&jq}he(fnLqF#5Q zPO$hh{{OCO=isP=B>^sc~i2IH|?_6M>~Vm=1se=3X8V!Arrptcv^Oy3N;^dtE4 zD`T$rYmzPP_hX%LPc8jizY9>W{S++P`?Fc+Z$f<99$<} zu!K7|<05_h>nMP_IsQ-_9P|Lx1JoUvOy6kIcbI7WWW6qCxBE(`zr?sjLyL}Pu=?r- zKBhr+XD9C8L2Y|FUGDYopw`Rm>@{X>?tf}VPG>$MFfI0PHz&r7WJ6)WC=pE@`SjpN|a;m#7p_V;N2sBOJ8snLv3?RvZ8#c6C$ zx`tc@gz|Mci) zV^n7K;;96`x+K~U=u!P_g1;&ccmBgSuYqh%^#q)+TH#+b-mk{92Aj&BU(u3NJrP)w z?261K@8>xG4zj)f0Cj#m6omu} z%BTb2%5kOrF;v%x^kHaRR6IOVt;PY>r_ATdxqr#_iw^NtqiMt2;FW5K4M)E=| z90xqH+2pbLfp^uZQ^Lz{sv(1*Z@qqZMLo16nReH~&;d?I^KQ|DuvIITAe}Jf>-cH@Dx+b=vHFu2<7k}uzL>YeQ zJ%ub+9RjrYQ{Q#Dv7*kmuZ3CRV&x?-!vLR*_+45Z^*j!q_#EguZ|^|YnH}>!I88m7 z<87y|vx&OSDDU~x)PpYr*veAcWu}D+>(uU^7wr@IfPHMP}ST%EFN8|jf zTO%j6JCOzTi<%o72tNJnv1dA`U+pB@q187dKq7Nazxp!ASytahN_{i3v?bEqGQYmL zG18uFZEa~w4AXST8zqahv^Fk{G%RXwZLVMLKz2dP(nLEnOg1+}u4qKk`i91avChoe z$rI+*)Xu27Xo@py>fGuX(`u(xOpDjhMXWMjSz9@GR@FtZX|o8Zsm1?j(MfIe!pgam zr&Y|XapqoBSvxmcQCoF!Mp8jFGpnno&8V%6X$d5{C_1$=bD^nBNoX(^QWb7x#f5{# z=1!g&kJnVpsI0sw6QPxwTYE|M0H=Y?ja5bC)23+gig;D!MYVI|RW-GaI}J+I#iq=S z;jz@Y>guHSGhlo5%_n22E>3ppo9pMdElMPoJ8dls7CEQ4H?=Ht8qg{*l%D5&YvQ+@ zIa4olrYu_0>P%kL*0`Xh!zp#nbjCU3owJ;?opYQCPMNc$Wob)$YyJGjZ?-SGrt!Se z5@*ohOJ2|*H>C*x9xmy>e9POdXUrS=;Md>jqHC8i?l)iB+Xku)M@^#FH?xO?xQy!2f-?ek*UQ zYH6ACOwK_uqJRcnCd8w0Is=orI^TB-@D#*o{s(FO|3Wd|x`rP5zs54R>b9|#8Cwi4 znyjnJCt&E*B&qIfgN^4YJm_Zp6Sxi1{V2-X#s}riB^ILp8z)O!)zUHs9>Ok<$H=x{ zu9U|+0`Tz`{&*gMC*VX3#qw|t;k@_a;n8!|=*;>YEK!MSR{QZ<#H&R29JuCms=Lwi zk?@67`3Cz!gC699OZm|8&>^#x564a~n=?10O`Y_AYh9Vcx8h{SA1v|AEsN+zDzVlD zPAB46n)1+Y809!P7cI{8xKVc$B*>Rj@}wkfJxg&09;0MI8Dfwf%g}>>5qdnWfLt~G zfIB-^vq(4wj75 z|27WZ86=~3PZA%gsN%Z0VIAaZ8oG^++a8)J!_m>`cHLjN zp6Y;an!(~SL>lF4{QL_p2rD_mvw!c9*I_MFYbM= zq@XC>NAKONGvTGUiV~HNR#zEC-;H};klj3^toeolN?L7{2neM!8=RzoQU-fNAQ})^ z^=~dExX7PBs=%#FuV zS}c^~-UhY#)OU{CwLw>g&OkO5QM~_h=dV#wRemnDsKh!b)xWdPqyGq_-6%X1axI<@ z=uf=QUO^xBGPNBv89y(~DyaTQ;)f}q54YBMw8fJ{Z=gqN0sONtDe0y@%SrxCZcF>; zGRd_v_Lzf>nSpsO&I;R3KP;s;5LFhO~d)3i5K5L}M742|~X_((oM@&7Kp=wYXq>mYuK|DV#AL+F1>Pw_$N zDUL#$K78rBoRN|0F|sd3E87ry#h0TLQqK65R=nsd@r$i^>Xrma{30vfPTyd~+v%IE z_-CGuKSoeF&>FxT@;`}84mVcA~SS#L6f4UVf`3t|QY(qxUOZn`0 z5ta0%0`O7N$M`xZUigFJEB{UUa*jWfk8;T76Ujd)Uh)r$m;8g`%Q>HMk})4?+@v7+ z2gOVNLGhA*P<*+{#lb$q;E>0cl7CRVdp ziZ55WIM`zu93p%v`3J>I{z37Qe^7im=W`AptNAGT z2gOVNLGhA*P<%P(Q^v>4Axoc0{z37Qe^9*S9~3X?ugYZn|DO{wv5ez^rRIA0w{n35 z|2N|QOADM>QgYT==bYo5*re+;^^MYgyd5 z)TvJTCmi+l;lL=2(g!E&ni)=3M}F4VM;w;7 z4#G4KjOI9*LkL3_Du`c4n2Z(T3lLVP#hl@MEWlBG)oTd5FqEIl&R!bAgh%pg2}3}^ zR3PjwJ}==TVfXU6tP4p0EsUwML__&AKuY7@>x};g9jArzZ_bW}3U17)3`Me=hlL8J zYz^g4dODOhc{tz-oQLwFTc3s~@f5JZzDa4p*#Sz~N#&$; z)f``sb4r&zH3Lks5Se$I^ErjKgsEC%$^b| z&weD7kAy|Qx;g$ta-1en8E1qFQaL$aWDN`DyQCO0L&*ve{T|ESn&FyEvQgM$O{f5J z;B*l;ik&dJ|4N*$dX6zR&H6e_y;kXWeX#zUi_38}-TgsO9DvqBT1p^|8* z2ojJ)3S@|+l;=F=s>eCXRk9>BVREQ^a>$K_s;fdJmyjUYXD!S9nB<@el{1okyV8m3 zay`dCMMvb&MLOL~y5E?KoKw)LJm;b8P!SMRXGRBVo9}SibErIuTa|lC=-#aCn?oD3 zDns2_7lgKFRfTqD#X`HYCWZE7Ra0cMSjBPfMA9+b=wftKcB#tPrIPFdD`f04FMD>V zX-cSdUZ`nOXkPY{p{97KwKmig4b58`YN`&k#?^WD%weIX8KKr1EjBgOG&$7Tpe|;H znkqxB?r{ZOW+zO|ioI~M18{<6h3hWj~F^=ThUNHk6x75sou1 zV;@*Bm2*L8U3N}k)_@JhL#Bjf)w&2axH&sUeF|1jXb@SO(gBEvHdyL&e_`DsV%QE0o-Ys$TLzw}RzPCT;|>?>ffB zzGgd*Q9E}-CFtUVnt2TAwsSh4h*aA||F|UwxpJQ!Xqy!nKo*21pfg%smim4^y(0~w zm%hMr3-z-u>iaiSKf96gPaS$;s5<-VP+crEZ+@r_J-JD7p%FkBiC_w9cb78P(ZmHi zq_U@}p%T^WTncCf$A5+Dcc{FeV(L)TWOi++?xN5|FNJiRd<&uiL0SA)maJ0tA2*-iTK1Ao0(~+ zi>Mz&vah0Q&vzBU^iaVCfUeW+E0b#k>DO?2Rd>iU`w|sR69n~$JepV5vrGrhomHXy zcIZRp>1I4hIQm}p0!gK9K<{~=(4Y^h4F6#41jdM8y|W0%3kV|}V!93^G>{{xIb%BT zs|WaL+$raH#jol(`wD8{6A*VP$6ZYXlW9z^q<%*8?`-PxJ?O|=2le`B&sK;Q;&Ugb zeUH+rdf@S5UiM$K2}605e>clfJ!mPiX=cWnh zD>N~w{?CrmZ6t#>dUJMNsC&)dV)pxHneXQ`r&Ai#c}fk_+K<@DaZ$>qGgq zz^RU$Vf2MLg1%-@9jW{$qmCYf0u@1ZL}@2-+9jlivW=Px)Yyo@H2Ytw*Uk;qxuNPs zYFgGMk3hVG)6$qn_12&&rb4Pmwe7oD<~Wv_m5GIa2JBIeS8eYio#_Ul3Ot$Gn#+A={X(<0P#%mexqeR*FhVrNCd8e82 zI|#2)`c4TITpEf@C)cT@O3iE09_2gV$+BvGgKfX0zZ%c0$Onsu)@9|Sb3%7!MMHOI zWlzJ23n+WmP`(1S>3=Zy1*8XTe`7Y(QW4tuuW2t#;!1o-O z$EJkt&W4M&9=Y6$+TDmxH_q?Qz8u))z~Tm$b4wP`S_7@7bz>&pj?c~< z6dE4d#+>QEE(PWSn-2_y&Zz-5ld*PSImaIono#kj`Cb(;;ETFVuJb|vP|-P9MGh5m z0`Au2fXNOt1z~NPfz>#Gs}SRIy?`aY#<*I`;at|5g^d4^<+y1(#kkHg^brjx9p(EH z%U{Ds8W*#m=SIHfsll1Vc(;X5!8P&7dQaA^wJd)p7fte=#qzf@PW_O=e0+#U-KEAk zyXq8$b9U;~mHwjp2_(Ond1!p1a4kNnT#SpIZU9c@lJ%vOtBd97DPRiU)CY&gCgS-o z##LVib~ir6vlB-O!gCMKN&aY7yk5mR4!t@xOC}ebOL-q;`3{ypmE|`v{xinaIv5z$ zEAf}HA)jRVpF#n`zhGRge-XDEAJX$~wu9JzI8F$^%feq{{^QvvQhpAwzc79;<7zDo zEY0|dJfBK=KLSqt_u@!F>~j$3q~{uzSL<6~^wT(mpCI!T+nb)iCj31f2i2Mt@~0x6 z`0ugwKN{DB?|}>jnina2gLzJ*4uzoBtT>*`^4k?UpyyQh#l%DQqaga9%JSVfs=!Cu z2ci1Cn_-uaXR-V`mJ|D*%lPdUem<_LybF)e1mah_jIUu_tz989o$)zGYI(J0#pxxC z-|`iWU#Snye8vwl?lFE9>9|&q~hvUa0&$wFC0sjnm zR;D#M8NG7Qo~c~*T;VjHQW(Mbdd82}u=5qhcQ8Ji@vk#};x{xP?T5w#;xA`ht<4}( z%J?11sl<~p%yT~Dk%$I57{7?|I~h+hUdQ-IRh!UmGQ|ZYU1~p|5uEkS*QWEPQvN^j4x$e^yvnk<&3~n z&pPn%=WJv7jV#~9@oz95IY|SzF}|Pi`xvihJPYGH*G%kL}1&ps^oSTbN z$M}yKZ(#mL;Hv-fbsirVvwZd#4XE`9PQS|d)2D0vES8Tjp2ZIah+nac@p8udSpEja zPdh^cG=Eb#hw*O4yK^<}1E+DjTwglXeEbf}uVw>Cd$>!<=Quy18GnrNaV-A;#S!Uk?&LZ2)zbG9GlbmkntjxAIZnh85jHV^x%Y$kos4- zB~O<*#yH8*&exQDo>R{H=X1mfjL%~{A_;KJG5jupPvd+gy_D-L#wESr=QA$;gy2<- z%e5S97?=D6r|TS)*AACLUf-n}98=FYH``3)0>?uh+=Jy2PSojkxKb-raL_f(m`Jra`BjfbXs%Cheaq<(*@G|4{Z?9%} zgYme9|Aq0n7T(MFQVZY5__Y@PPsTk9|BP|+5r;AUoFzY!@pmo! zD~ywWWQJoH$0Ru@9LIRb!cSsc?%7GA(-=S2k}qYv(8A9FZntIPni_yl55Vas)P~}j z7l1Dez*_=vx@R&J|JY$e`5qB~9~Xe19)M2>z$XXbwE_5|0K6>#zcv6*1>m;^;CBV!8v^i+0r-{x{G|ZA zHvs=E03Qy=d#HN+S^$1(0Df)&J}m&B7l2nC9!2b|{_XOZC2H<}S zz&{MY$rT&Q{)YtM!vpXm1Mp)4@JIlDQUHE-06sYYpA~>#6@XtKfUga}e-wbP55OM? zz&8irI|J~S1MqhO@O=SzF8t}C>iviSd~^VQ8t@~H^@!T%$9!56Ab(B(9u2^!1mLp* z@P+`qB>=x60KX*w|4{(GApq|Vz;_4We+j_f4ZuGLz&{DVzX-q&4e%>Q2H>Lt@UI8p zCkNo;0&u$LI#m0lXA8&9cN!WK_4AwffaeS6FLstTb|ez&odj1U7bP5dBSKr_{6wM! z|Jv@fH#XA&pLQqN+EAZpyrRCXwWZy;qRGLV6%sA;n-?`MO*kFu%?S<3B}@uO=c;E@+vbY)91~ z1!UFLqNUE_#^tRjy^t?WE}>^Zm(;f}b{4kPUxDa$XGwi)E1nL;`ym!BSgznJlBh`3 zUBjX_U7?K~sJ%upE@ii{z7<77w#nw^c2ol%K-KnLg52sVN#U7wY( z4ara_zBXuLQ3CbKkHsQ8&8KWRc2Rp8`(**F~pUjUi^_*-rDF;WMf-mIU7b7 z2(`@GUcIPs*+8AJP!c7gSB5}sn3cf>ycMLaMR=CL&Movd4zf1d8MM*%))l2n3tiFA z)G4*Zwq$doswb)WW%XlAooiZ9(bNV=1bQh+)zX)=BvD)ZW)b9ZHTnY~>UAH`xw)mS z9j$79Q{()_=#SLXQPmEbMt!q>t~m4XuzGeF4-{troTJ8;%wK{xk}PRlnxqpj&P8)t zJ}z@snmIc&b2eU`&0k)>)EOJED50-X`Z|-o#?#kX^mR6UokL#}=&Ovr@PZ8bR^p{f zzI2>IRI*Z)u2dx~RVhnV(o&W7OqKRbos~*^rb>IJN_(bCd!|Zzrb>IJN_(bCJ5Hq? zr_zp7X~(Iw<5b#lD(yIxcAQE(Zh|v+N_^U+XngLp$&+jF5|rBLqNLyOpj90fTO0+I&aO!4Ki4cqmf&%9T&YIbn3#($xNK2F0#ge>HGO=(Qbno1c$S>&HNSNKIOZAw9RUn$EekYNGK@pU=!rZTnt;{*8r47xS zT5fY=!mtfYQHybVz*tMJFt2M{=qkRb9bDAPY7*!j3)MARyK3yjfJwcbT!zUgi!>`e zt2=d3^o?bz9iXOW!O_SxZloM&iJ-$DY21u9rm7QFKhWhMtgAnofDRavG32Ux$j}+> zOZu zN0&xvLRXT>HdDHN{t~(5u33Y(4mD>wjBcf0E|coowbY{*qNbK!O`11j{%)6n2~#6n zCOzcT&!123L;G^f)0k~gMnu+KggVnbPxL}7lj6SGsNZiVB@OEMq zUN>;sBE6rl(-toK&Fby_h@O8ODiYgMr6*ACnHh zG4QDdexrfUV4Qe z0eITNpGF!Adky~I<67+YS%5rl%BVnj{?g;QIk za0TPUL-&eApKA@=w8KvVc%HX#X}2F+xQq`4ShrHJ?R*B~w*E0gp14KNngIE^hWulO z{31(U^t{QCH`{rifj@5WD@5TW984DMl(h-`U>~kMJQr;NjlCRv~ ztFdt5nH_-7vv6t83oKmP^I8iR{#z}4gI3%5o`s7Yeinc~VBy052IF=+`8+^=4Bz@C z`+VE5Tcd#!*VC+LvxVQyQGBc0wsVwmX>VJQhQeYCm-C_78v}dJy%%r!t)&q7d`K^aN+;Cg-gBsj&ZwO4_NY2t}PZW`aEahlJ9EjFnHbzkUwb1oBron{9Lk~?&kaaJ;YbS?J&$Fa z?63Ta+y5U25y$O!Qzqj z-(lg8f{()W0rjiY#36z0AT#bNj!_!bdQkvT(8ITE@u^<~ZR4!e7X^&HsB#UU(k1a4FZv7B1tS6B%qbvCoMCcwGSA6@dRF0RM<_Dwnz6 zSa3W51hJ3kbGCu|h?o9yk%8ZA;PVW;%fOczIOQ$;-w(jMEnNKAZ5A%|^)%zeZO-E_ zSn`tZo&fv<3vb8*Awt#(`Y861d=F)u@_ij2vCokP{)T}c6TlNOkQn~e{KNJRfhaq2G5EBdC!o4+mOG-!2e?4cNzFQ2L4ON zvw{7_z<*=lw;1>z44&T__~VBBtp?s>$p6*ApEB^j8F<>@p*Ha%J`@gExYSqni8`KS z|BjEepOK7b1EaVN_)r*S;ldL!cuc?R6iZ&lpRpD${AXFX@ZS)CcQH;n_TnS@-)G?F zIP+)#&$EX7y9Uoc4BX`Tmx1>g@*@jzfk65^j*sYbih-N+KP2?Ni?wXCQ9ZsAg2crUyPBx}x(M;o|l zhw~U0I|$F!hP=5hTW8>=oqu8ACjUl@U*^r1Eqn~y;cpf$^J%|@k7xPuC+qTx{u}hA zbDxDvxgKGh?6VgiX(!GpgL$N0PPA~*b28(^W0tqhl9zh_Ljc|#fd9$DrChIDxRfi+ zIO$`K1N$s_83ztnxbS~&;liI?r0qlebkADsHkom;zl?iREnIl&4W7RnJgt_z*zNiN z{JsEua{&H+0RFj!iyaDzb$O*+cX4|=$-?En&sYl=`SBJm@>48a{G6#4E^}I8H=SPP89z)Mx82Eh#exJoNk=xb77B1~@ zlZA_&w;KFugZ~*zUh2Ki!X@8NEL`#(ei}#-r2R|2`HWNjn)A!I4BQ+Ke`@gv|27Mk z@npA!%Q&zv0RPOwh3EV+O8t!f!ZRlTUl@R|Ht?08yi3zMzJZf1wlKbqalu5NA6oJ^ zbG`4faMANG7XCEz?_-?!_u(V_2MqZ^`w6G(gi?Sh$ooW#Nx9 ze;4Dn9d5Ja#SRY{@@D&a&XN~>4g}!2V+WU4&= z?g+sBGj&4IQ|8V4EnMudopI9NoWGv4ccUb1lE`K!TW`b#6m4c15Gk71nh{Rkhi z+qnVq<%awYLwi`+-l*H?*kSt^UHRFf0x1kCrkb=9ydO-aN(C9e4uhYXYd>| zUMnW`BJH-)!i8r#o8!+Ki)XaX&iTHD3;$gP&p!?RUt03FG0!s=em~>g z+(GPe?X+;|FS%#ygtq*23l}|`Ec_kLx7EToFn%rLWVZwONW1!-B`^FB8aVa4e=*Oq z2G4$j=M_Vq@(`XrL;hn!K6#ENw99+^grV^k3m5*I7^gfbc&uJ=C~@@D(J;O`ndrkxMZ(fSbo zeFp#hBL?to20ru10eriG@B7LCZq7T)M-7c%@bv-wC4*=GHwJKX+-^K!0N-QCpJ(iw znd^oBE*y}jHX?T8>00^E-!X8Rx5*Bl8u&z(GZ4 z`sIALTKF2CPv2skcs{~M^r1FD!PbADhE=`~;auboFi!IH*(LKeL(U1 z{^~sjPF&v@hA)I)8#wVud%oYmzYkpWe28(9&BD3h-G;o$v%|peG=qB z_zw)8w1JcSrF^}YkG7uwu;it@pBwmp82q_pECjKC1Ir!GxXqt$$qWB62L40viQOUw zPF&KSP72^3W62BuSq6TW!9UT!i9f;mM+5j>OJ4Y=8~Be5etNGX1v(IaA@g6xxNV;X zOJ4Yw82FFDBlbxcIB|(TxjcY>wIwh7^u9z2bodEA!oSYIi9eV1zk_jG|GO-C;s1q! z-)-=3FmU1;!Ti4u;NNJ;3%~jQO+PjGw_Ea~nE#mo{ueEI;eW%xe`fH%W8kF!Xy)%_ z+_n$B$C3gaC{Fl4G4P)Q7yHZqRf+r<=0C*nyUcNB1mhwv{6`u1JqG`111EjPGym}c z{6&`h7Nnst-ohs`Pnp3(bDxx}+>#fbxP`y2>7D5TJoNrd3Q}I-X|V8jw3xFffae-Z z{ymmoWyq6{Ec)MQ$xFW9HE@~-SMWSY@4ciTdcLSH9eVF2glFJ_$R4l&x>S(d!; z*#D;~JW+$kTrW&Ect|H%m(qIhyaP(%Ma1LW^9 zp_FZwA*6_57k#39|}7Sc{AVF4V?BaM9+5u@DB`}d|{FQ+`vZ~_@Q|! zdu0dGXQIAzMlnw1GWDVN0a75`)Tbx_Kg+;PeJU6y`~Md{qNi)fhYUTd4cyef&cIE5 z<^|vj8K-=y3^LBN8u&`m2OkPagU8%gxz>;;SLHK)FT{@xobvembYgLwUl=&$OKpO} z1`B^w!_IaK7d>|}P8?ywK8LU$M|slc)nZK)GH^<>LBq~b7B2k9GfuKE<0JJ_WXX%3 zXBs%=`%C&lIM2X|>ve@XPL+jkVSGB{Bujf%lJDh~{EIBVz>qiVo!%cvfp|>(YK!L{ zCFMBRS-9AN-Zw~rc>Wt7(Z{pow~!D5y@!wj$sb|pe}^S6{C64hX1n@%fV}+18u34m zkLdGAfc$0)mwkgB7B21KS;mP!ZSeoek{A77HRO*p%KM>#oBRCv;G_Ui)jscx(AB{2 z@Yp!tu2J&TA0s4;P^}Lc9(mt?tA#h8paI#hCVpD)$b0K)FP(zqEAQ{WSHl@R64Ag; z3zy#q*l*$TI|;JyD*W=h5G4d42rj?3P;KGz`x31do++1sQ@P~5`|Avxx}wO-{wqbB zcDUD)zwLMkAndeo`JIRT0l4hTQ8eXy74wwvcwpnz7Cw^YTLbWQ7B2OEuZ4^KcUt%x z%)j5lr5zqLaB6Q7==VM-i2fp9VBjR5ucXkP4V)-Neu9AyYR?94%C}m0B%(7|XW>%b zdo5hr)lLhS-{sgJfalWyfFR|S-^Y;kvW-_;^76YktpWJD0Q_DHmvZg2aOp?;EnLbg z>p0O<`cVn5I|LX0Y6}D3Q}h)65(^jpY6}l{ha|(}xGM@-u%6OB(Px5Co-fH1;Uu3m`uYtUblWQ$Jf;bB6EWAL&&Yc#{ z#dq$ua29vg2jKS_IO#9s`@PeqU7DmEfD1XOG466611zOypa+&~o2N z@c&}GmeUC?zYE%I;T`M`-E86V`=9q%xcvU-77Lf(|J-lk(%%bMFVRQF6X{Qa%kO#K zY{{?T@yopLNh0#QooP#6ez&uP%a`E~X#+oP;qtqeX$zO%z0703OL*jWFUMQB{O)D5 zh0E_=-fiLXyO&!mTz>cRpoL36Dr7%O^pW4Uq~HCaAh`U#iaeqS0EvJr*v%Klu*}m+{KnU!}a|_b11*KO_2xAMRSX{Ql%x z3zu(;w0Tz*gTpoPo4JZ8jTePrLD+QQ}cAy-(qtbcE}aM}MEJ#sL=>?5r( z@OCYtzsKSg---GwoUwQtvOYG+SzBXs{aE!b^Rf8Vi+X456?k{@*tQnBAn{VXwts9! z2uOWfBH7B25<=uy_5NrZY-`EjiY`MtzdeCB)^i@Xz^m!!w=BV{`4i4q{K`P%*eMsy zJYD~wfWBV1G�aUVg5%X>6Li0Iz{>G>iHF_B?`wG%mF^C~fJN-OP-%TCW z2od9)PD}A2z0RZyBS?CA|Fc9%`Q=!N2s*dz_vdfv6!N=2c6zxk$H`FkTl=7vIQUh4 zB>Pbww*BgWQT}%MohpC`GVbXs$BD=ZA8T+ND*x5bXo0&qL&~2{?fjPj8!G?q89IIB z-`KwiVngL0VaHdVAEW$f2(+REc6yrTztnetwekb@7x26bNCn$|w1+TM`n7wsJU#Pn20Q)#16D}s Apa1{> literal 56880 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