From 3ebc8b3c49f4f7c2374647de7ace435c38493bcf Mon Sep 17 00:00:00 2001 From: = <=> Date: Sat, 16 Jan 2021 16:26:01 -0500 Subject: [PATCH] Added centered master and awesomebar --- .TODO.swp | Bin 12288 -> 0 bytes .drw.c.swp | Bin 16384 -> 16384 bytes .dwm.1.swp | Bin 16384 -> 0 bytes .dwm.c.swp | Bin 24576 -> 16384 bytes .gitignore | 5 + .transient.c.swp | Bin 12288 -> 0 bytes .util.c.swp | Bin 12288 -> 0 bytes config.def.h | 13 +- config.h | 121 ++++++++ dwm | Bin 0 -> 67600 bytes dwm-attachbelow-toggleable-6.2.diff | 199 +++++++++++++ dwm-awesomebar-20200907-6.2.diff | 431 ++++++++++++++++++++++++++++ dwm-centeredmaster-6.1.diff | 142 +++++++++ dwm-fullgaps-6.2.diff | 95 ++++++ dwm.c | 320 +++++++++++++++++++-- 15 files changed, 1297 insertions(+), 29 deletions(-) delete mode 100644 .TODO.swp delete mode 100644 .dwm.1.swp create mode 100644 .gitignore delete mode 100644 .transient.c.swp delete mode 100644 .util.c.swp create mode 100644 config.h create mode 100755 dwm create mode 100644 dwm-attachbelow-toggleable-6.2.diff create mode 100644 dwm-awesomebar-20200907-6.2.diff create mode 100644 dwm-centeredmaster-6.1.diff create mode 100644 dwm-fullgaps-6.2.diff diff --git a/.TODO.swp b/.TODO.swp deleted file mode 100644 index 9ca9ffb771a4a6008e195409e8dba77e15f6bef4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI&yGjHx6b9g|*lgj2wY4~Equ^dt5F4=(R75Pi^x4V37dA6lGFjXe(O2*xd$iJ(2&)t6<*t~EfpP*@O(qh(k8(YoG^TYF>k6;A_DDZ26IkmIB)hf2Ht**#Y z?dsPjaU%sNKmiI+fC3bt00k)U_XNVQq8?(~GiB?uWvqOO<&uE{6rcbFC_n)UP=Epy zpa2CZK!HCfpp8rP3Q&Lo6rcbFC_n)U zP~e{k)Fp9Q-Z$_PW8#5qfJxhFZ=~nkAeWBw5_H=lh{4dhNs26}x@co$G&DM(3zx2M zOv|U$7zg-FTM5qDTx@>;F}KK6wW>QEB%z;mCG;SlH+8*kZ%PhGY{3Pozh8^7PKOp7 sz%APBAG0#z;m1)3Xv+{Jd}CQ;3I!&LQg=U|^;_mFZl)0oDC--~a#s diff --git a/.drw.c.swp b/.drw.c.swp index 648f3b06f402b747151942a28198fcb5a1d225f5..a39e231d400518dcfb5dc656956892b1e1770a3d 100644 GIT binary patch delta 15 WcmZo@U~Fh$oFKuZVz5!_nLPj|=>+ir delta 15 WcmZo@U~Fh$oFKt8L1?4YGkX9i+XX)W diff --git a/.dwm.1.swp b/.dwm.1.swp deleted file mode 100644 index 116f22d1e13d9c2cb9d58deb5a9b6b7e4ea43b36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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

nszX`Z&$YhTY#Gf7+CWD=BhsFzlrh*eJ~ ze9-;JS>%}cAW2YFfr6_pP)Z7q- zl++y*!C4Yi?&}8YY2=KQ;i%7GmXZ*l51BPlhqRbzdN$86vsO6FwLIGE8U5ZP5Ho?} zAYF7ihn;$lZ6KqlBR>ZZ3k6Jb5+dIcZi9@A3{bd^4eIaj-TA8)o9k_g+HR8DC#KEkY&_hvByHpao4WXwq zswRUE1Wbm}+Q#(kYf#o(#@tz4vT$`$Sfe!68EORFMxJ3+?aD@9C#_RpM_++Wo#tBN z-7=!;&|DLmtv;G-ndzn*wFP=bK^R!d02)lU6g1OvNP*I#~2wvkBW$-nXi3Jo$d zHgy~j)WKRDth1);$iM5|-Oq@8%e7a&hNZX{nu}<_p&F4AUM@ZwkuIzBr37h%gYc4O- zPw$@c>1pJxnU^(QGTm*au~s{M8-!W1onx~;xZxVKH>x<>QArYp-91@nK0#G(!|P(pr~9P63^db?*E@{FUlGYs;*u6BjW52GMI421lkZ9CUwb`!I;nX2ME zHDBq<~zK*L>c3V6$t{iI*9TSlgG`W*r8@ud{T@Uemd2=Y}xyu7#7SX n7$X90p5*z$#^ps!d}Eu)TkrR68UJFx$gU?9wDNia-}L_gM?AVa diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..72c710f --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*.sw[op] +*.o +*.rej +*.orig +ses diff --git a/.transient.c.swp b/.transient.c.swp deleted file mode 100644 index 349566a5cd4633c9fec80783891ed4d1706a3eb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2O-~a+7{>=aZ4@;1;B_d5l&16r!I%Jg01POt#tQ7sEZr$Px^LN?()u3#1SX!m zdGO>#4PHHY(VHel`38FN188F6f3_`HNH82R&!)f5&df6}&u{k9bXSYZ3uS&bKgMt! zXYBd=^UJ5EQ+;Vk zD(qtqu=_)u46>cFZ%5gwQb7jD02v?yWPl8i0Wv@a$N(8217v^<96$q>&Df74jJ-aJ z&Ex<7?(hH2V~l+T@4!p&6g&bCK?rK#5|{!dPy{Ez05}Z34>0x(yZ|@AMUVsi;8#Cm zKfxF90lWbl;2C%Vmcckkf#2BICio0Kfsf!V*Z_LZuK-!+lTGtV;ENG{2Pqn6MYPo1 zI^LGn8yprou<1xw@JvaE?8?2qD|f{7q@HZs>`5Gh(sehml=RnN6Q>Q=*5SA#%xPa{#BJWwTlt7Q+`Bh0Y%VwXeV zcOS0G(&8c_pe^yvbw;MnED^ySRNHfM950;cH1vs~y)y;R+LH{{xMxW}vmQu0In5#I z*W89J_>@^H70iZ`Zr(Y^b~L+kwYRn5%UIdHZD{Dku|k&DYJBUl&DZ#7uwCV&E*9h2 G0{a8e12D7z diff --git a/.util.c.swp b/.util.c.swp deleted file mode 100644 index 96d6dfce3198ee77f42afdef25002c97f4cc6015..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2&ui2`6vwCD7O6@-E3Xy1N!(_;75r7V9;9Gl?PYB*T9!1KbO-W_$z-b*tDXh% zKk(woqkn+j#Djl`7sb05zmsmUSg6p0PmzU2iY&PfDSMJjde?efK6XM;M zJL{LbQxk8dgivW3WR*A!+$s7 z3^u?9j%i?0TwUnQ+u}Hoykh02^QfY=8~0fs<&!6cge(20t|( zetLYJ`0F~}@`Vks0XDz}*Z><~18jf|umLu}2G{@_IDrO&NQm7@AugW5@c93K|NZ~- zSs^}vx8N1n1|txG5Ih1m!F4bPTHrMJg+4#Q5AYp)17E=>@DaQRufa?30z3dqzz0`= z2ME}CE&yI^fDNz#Hoykh02^QfY=8~00XFbI3_KGJ`B)jJ<1Px(z^+k9t#j?HuJw9| zH5zeInb2ucvqhzeaA>0{CMQnK!}$%GohAFLG&+%)4Z3rk4eEBOd8_Ht4!Vwlfy^Q& zC~V~@F0{%_?Cdpb+2R(B&w@c|0&S35$LpC;ov6|vWl=;*I$@q+7Y+kWUR~?^zP-;V zS9sIK6KH8Foe|OxJ&YZD+9{|@VUQ$w=wzu(H}PQVsdQb}&WbMNp>{{eagIG47&?%O zU0qS%lRSKDtFkbuB1tp#NAAO!1EJe6qp~f3xb!Ctu_#fShhi!}6bf`*+V-d~CG}SB nF0b~NDOQQ3IM)>B#S^WzhVYX`l&DZ<>", NULL }, /* no layout function means floating behavior */ { "[M]", monocle }, + { "|M|", centeredmaster }, + { ">M>", centeredfloatingmaster }, }; /* key definitions */ @@ -62,8 +64,10 @@ static Key keys[] = { { MODKEY, XK_p, spawn, {.v = dmenucmd } }, { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, { MODKEY, XK_b, togglebar, {0} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, + { MODKEY, XK_j, focusstackvis, {.i = +1 } }, + { MODKEY, XK_k, focusstackvis, {.i = -1 } }, + { MODKEY|ShiftMask, XK_j, focusstackhid, {.i = +1 } }, + { MODKEY|ShiftMask, XK_k, focusstackhid, {.i = -1 } }, { MODKEY, XK_i, incnmaster, {.i = +1 } }, { MODKEY, XK_d, incnmaster, {.i = -1 } }, { MODKEY, XK_h, setmfact, {.f = -0.05} }, @@ -74,6 +78,8 @@ static Key keys[] = { { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_u, setlayout, {.v = &layouts[3]} }, + { MODKEY, XK_o, setlayout, {.v = &layouts[4]} }, { MODKEY, XK_space, setlayout, {0} }, { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, { MODKEY, XK_0, view, {.ui = ~0 } }, @@ -82,6 +88,8 @@ 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_s, show, {0} }, + { MODKEY, XK_h, hide, {0} }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) @@ -100,6 +108,7 @@ static Button buttons[] = { /* click event mask button function argument */ { ClkLtSymbol, 0, Button1, setlayout, {0} }, { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { ClkWinTitle, 0, Button1, togglewin, {0} }, { ClkWinTitle, 0, Button2, zoom, {0} }, { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, { ClkClientWin, MODKEY, Button1, movemouse, {0} }, diff --git a/config.h b/config.h new file mode 100644 index 0000000..b1b01c0 --- /dev/null +++ b/config.h @@ -0,0 +1,121 @@ +/* See LICENSE file for copyright and license details. */ + +/* appearance */ +static const char *fonts[] = { + "monospace:size=10" +}; +static const char dmenufont[] = "monospace:size=10"; +static const char normbordercolor[] = "#444444"; +static const char normbgcolor[] = "#222222"; +static const char normfgcolor[] = "#bbbbbb"; +static const char selbordercolor[] = "#005577"; +static const char selbgcolor[] = "#005577"; +static const char selfgcolor[] = "#eeeeee"; +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 */ + +/* 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 }, + { "Iceweasel", 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 }, + { "|M|", centeredmaster }, + { ">M>", centeredfloatingmaster }, +}; + +/* 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[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL }; +static const char *termcmd[] = { "x-terminal-emulator", NULL }; + +static Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstackvis, {.i = +1 } }, + { MODKEY, XK_k, focusstackvis, {.i = -1 } }, + { MODKEY|ShiftMask, XK_j, focusstackhid, {.i = +1 } }, + { MODKEY|ShiftMask, XK_k, focusstackhid, {.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, 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_u, setlayout, {.v = &layouts[3]} }, + { MODKEY, XK_o, setlayout, {.v = &layouts[4]} }, + { 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, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_s, show, {0} }, + { MODKEY|ShiftMask, XK_h, hide, {0} }, + 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 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, Button1, togglewin, {0} }, + { 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/dwm b/dwm new file mode 100755 index 0000000000000000000000000000000000000000..7c18896d43000bc0923822f2d06276a01730e741 GIT binary patch literal 67600 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 K*K$*=82ksN1 +Date: Mon, 6 May 2019 18:34:40 +0100 +Subject: [PATCH 1/4] Adds attach below option + +--- + config.def.h | 1 + + dwm.c | 31 ++++++++++++++++++++++++++++--- + 2 files changed, 29 insertions(+), 3 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..51ad933 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -35,6 +35,7 @@ static const Rule rules[] = { + static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ + static const int nmaster = 1; /* number of clients in master area */ + static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ ++static const int attachbelow = 1; /* 1 means attach at the end */ + + static const Layout layouts[] = { + /* symbol arrange function */ +diff --git a/dwm.c b/dwm.c +index 4465af1..bd715a2 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -147,6 +147,7 @@ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interac + static void arrange(Monitor *m); + static void arrangemon(Monitor *m); + static void attach(Client *c); ++static void attachBelow(Client *c); + static void attachstack(Client *c); + static void buttonpress(XEvent *e); + static void checkotherwm(void); +@@ -405,6 +406,21 @@ attach(Client *c) + c->next = c->mon->clients; + c->mon->clients = c; + } ++void ++attachBelow(Client *c) ++{ ++ //If there is nothing on the monitor or the selected client is floating, attach as normal ++ if(c->mon->sel == NULL || c->mon->sel == c || c->mon->sel->isfloating) { ++ attach(c); ++ return; ++ } ++ ++ //Set the new client's next property to the same as the currently selected clients next ++ c->next = c->mon->sel->next; ++ //Set the currently selected clients next property to the new client ++ c->mon->sel->next = c; ++ ++} + + void + attachstack(Client *c) +@@ -1062,7 +1078,10 @@ manage(Window w, XWindowAttributes *wa) + c->isfloating = c->oldstate = trans != None || c->isfixed; + if (c->isfloating) + XRaiseWindow(dpy, c->win); +- attach(c); ++ if( attachbelow ) ++ attachBelow(c); ++ else ++ attach(c); + attachstack(c); + XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, + (unsigned char *) &(c->win), 1); +@@ -1417,7 +1436,10 @@ sendmon(Client *c, Monitor *m) + detachstack(c); + c->mon = m; + c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ +- attach(c); ++ if( attachbelow ) ++ attachBelow(c); ++ else ++ attach(c); + attachstack(c); + focus(NULL); + arrange(NULL); +@@ -1897,7 +1919,10 @@ updategeom(void) + m->clients = c->next; + detachstack(c); + c->mon = mons; +- attach(c); ++ if( attachbelow ) ++ attachBelow(c); ++ else ++ attach(c); + attachstack(c); + } + if (m == selmon) +-- +2.21.0 + + +From e212c1d8cbdcc56c33c717131dfa7c1689e27e9f Mon Sep 17 00:00:00 2001 +From: Jonathan Hodgson +Date: Mon, 6 May 2019 19:27:57 +0100 +Subject: [PATCH 2/4] fixes comment + +--- + config.def.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/config.def.h b/config.def.h +index 51ad933..cb8053a 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -35,7 +35,7 @@ static const Rule rules[] = { + static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ + static const int nmaster = 1; /* number of clients in master area */ + static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ +-static const int attachbelow = 1; /* 1 means attach at the end */ ++static const int attachbelow = 1; /* 1 means attach after the currently active window */ + + static const Layout layouts[] = { + /* symbol arrange function */ +-- +2.21.0 + + +From 7568ea3f8756e7e82b30c4943556ae646a445d1c Mon Sep 17 00:00:00 2001 +From: Jonathan Hodgson +Date: Mon, 6 May 2019 20:00:30 +0100 +Subject: [PATCH 3/4] Makes changes to man page to reflect attach below patch + +--- + dwm.1 | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/dwm.1 b/dwm.1 +index 13b3729..fb6e76c 100644 +--- a/dwm.1 ++++ b/dwm.1 +@@ -29,6 +29,9 @@ color. The tags of the focused window are indicated with a filled square in the + 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 ++The attach below patch makes newly spawned windows attach after the currently ++selected window ++.P + dwm draws a small border around windows to indicate the focus state. + .SH OPTIONS + .TP +-- +2.21.0 + + +From 362b95a5b9f91673f27f3e3343b5738df3c9d6e9 Mon Sep 17 00:00:00 2001 +From: Jonathan Hodgson +Date: Sun, 2 Jun 2019 15:11:57 +0100 +Subject: [PATCH 4/4] Allows attach below to be toggled + +--- + config.def.h | 2 +- + dwm.c | 6 ++++++ + 2 files changed, 7 insertions(+), 1 deletion(-) + +diff --git a/config.def.h b/config.def.h +index cb8053a..b4d35aa 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -35,7 +35,7 @@ static const Rule rules[] = { + static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ + static const int nmaster = 1; /* number of clients in master area */ + static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ +-static const int attachbelow = 1; /* 1 means attach after the currently active window */ ++static int attachbelow = 1; /* 1 means attach after the currently active window */ + + static const Layout layouts[] = { + /* symbol arrange function */ +diff --git a/dwm.c b/dwm.c +index bd715a2..5d88653 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -148,6 +148,7 @@ static void arrange(Monitor *m); + static void arrangemon(Monitor *m); + static void attach(Client *c); + static void attachBelow(Client *c); ++static void toggleAttachBelow(); + static void attachstack(Client *c); + static void buttonpress(XEvent *e); + static void checkotherwm(void); +@@ -422,6 +423,11 @@ attachBelow(Client *c) + + } + ++void toggleAttachBelow() ++{ ++ attachbelow = !attachbelow; ++} ++ + void + attachstack(Client *c) + { +-- +2.21.0 + diff --git a/dwm-awesomebar-20200907-6.2.diff b/dwm-awesomebar-20200907-6.2.diff new file mode 100644 index 0000000..1cb92a9 --- /dev/null +++ b/dwm-awesomebar-20200907-6.2.diff @@ -0,0 +1,431 @@ +diff --git a/config.def.h b/config.def.h +index 1c0b587..bb8f3f7 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -16,6 +16,7 @@ static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_cyan, col_cyan }, ++ [SchemeHid] = { col_cyan, col_gray1, col_cyan }, + }; + + /* tagging */ +@@ -64,8 +65,10 @@ static Key keys[] = { + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_b, togglebar, {0} }, +- { MODKEY, XK_j, focusstack, {.i = +1 } }, +- { MODKEY, XK_k, focusstack, {.i = -1 } }, ++ { MODKEY, XK_j, focusstackvis, {.i = +1 } }, ++ { MODKEY, XK_k, focusstackvis, {.i = -1 } }, ++ { MODKEY|ShiftMask, XK_j, focusstackhid, {.i = +1 } }, ++ { MODKEY|ShiftMask, XK_k, focusstackhid, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, +@@ -84,6 +87,8 @@ 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_s, show, {0} }, ++ { MODKEY, XK_h, hide, {0} }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) +@@ -102,6 +107,7 @@ static Button buttons[] = { + /* click event mask button function argument */ + { ClkLtSymbol, 0, Button1, setlayout, {0} }, + { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, ++ { ClkWinTitle, 0, Button1, togglewin, {0} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, +diff --git a/dwm.c b/dwm.c +index 4465af1..e780189 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -50,6 +50,7 @@ + #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 HIDDEN(C) ((getstate(C->win) == IconicState)) + #define LENGTH(X) (sizeof X / sizeof X[0]) + #define MOUSEMASK (BUTTONMASK|PointerMotionMask) + #define WIDTH(X) ((X)->w + 2 * (X)->bw) +@@ -59,7 +60,7 @@ + + /* enums */ + enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ +-enum { SchemeNorm, SchemeSel }; /* color schemes */ ++enum { SchemeNorm, SchemeSel, SchemeHid }; /* color schemes */ + enum { NetSupported, NetWMName, NetWMState, NetWMCheck, + NetWMFullscreen, NetActiveWindow, NetWMWindowType, + NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ +@@ -117,6 +118,8 @@ struct Monitor { + int nmaster; + int num; + int by; /* bar geometry */ ++ int btw; /* width of tasks portion of bar */ ++ int bt; /* number of tasks */ + int mx, my, mw, mh; /* screen size */ + int wx, wy, ww, wh; /* window area */ + unsigned int seltags; +@@ -124,6 +127,7 @@ struct Monitor { + unsigned int tagset[2]; + int showbar; + int topbar; ++ int hidsel; + Client *clients; + Client *sel; + Client *stack; +@@ -168,12 +172,16 @@ 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 void focusstackvis(const Arg *arg); ++static void focusstackhid(const Arg *arg); ++static void focusstack(int inc, int vis); + 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 hide(const Arg *arg); ++static void hidewin(Client *c); + static void incnmaster(const Arg *arg); + static void keypress(XEvent *e); + static void killclient(const Arg *arg); +@@ -203,6 +211,8 @@ 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 show(const Arg *arg); ++static void showwin(Client *c); + static void showhide(Client *c); + static void sigchld(int unused); + static void spawn(const Arg *arg); +@@ -213,6 +223,7 @@ 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 togglewin(const Arg *arg); + static void unfocus(Client *c, int setfocus); + static void unmanage(Client *c, int destroyed); + static void unmapnotify(XEvent *e); +@@ -439,10 +450,25 @@ buttonpress(XEvent *e) + arg.ui = 1 << i; + } else if (ev->x < x + blw) + click = ClkLtSymbol; +- else if (ev->x > selmon->ww - TEXTW(stext)) ++ /* 2px right padding */ ++ else if (ev->x > selmon->ww - TEXTW(stext) + lrpad - 2) + click = ClkStatusText; +- else +- click = ClkWinTitle; ++ else { ++ x += blw; ++ c = m->clients; ++ ++ if (c) { ++ do { ++ if (!ISVISIBLE(c)) ++ continue; ++ else ++ x += (1.0 / (double)m->bt) * m->btw; ++ } while (ev->x > x && (c = c->next)); ++ ++ click = ClkWinTitle; ++ arg.v = c; ++ } ++ } + } else if ((c = wintoclient(ev->window))) { + focus(c); + restack(selmon); +@@ -452,7 +478,7 @@ buttonpress(XEvent *e) + 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); ++ buttons[i].func((click == ClkTagBar || click == ClkWinTitle) && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); + } + + void +@@ -695,7 +721,7 @@ dirtomon(int dir) + void + drawbar(Monitor *m) + { +- int x, w, sw = 0; ++ int x, w, sw = 0, n = 0, scm; + int boxs = drw->fonts->h / 9; + int boxw = drw->fonts->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; +@@ -709,6 +735,8 @@ drawbar(Monitor *m) + } + + for (c = m->clients; c; c = c->next) { ++ if (ISVISIBLE(c)) ++ n++; + occ |= c->tags; + if (c->isurgent) + urg |= c->tags; +@@ -729,16 +757,37 @@ drawbar(Monitor *m) + x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); + + if ((w = m->ww - sw - x) > bh) { +- if (m->sel) { +- drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); +- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); +- if (m->sel->isfloating) +- drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); ++ if (n > 0) { ++ int remainder = w % n; ++ int tabw = (1.0 / (double)n) * w + 1; ++ for (c = m->clients; c; c = c->next) { ++ if (!ISVISIBLE(c)) ++ continue; ++ if (m->sel == c) ++ scm = SchemeSel; ++ else if (HIDDEN(c)) ++ scm = SchemeHid; ++ else ++ scm = SchemeNorm; ++ drw_setscheme(drw, scheme[scm]); ++ ++ if (remainder >= 0) { ++ if (remainder == 0) { ++ tabw--; ++ } ++ remainder--; ++ } ++ drw_text(drw, x, 0, tabw, bh, lrpad / 2, c->name, 0); ++ x += tabw; ++ } + } else { + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, x, 0, w, bh, 1, 1); + } + } ++ ++ m->bt = n; ++ m->btw = w; + drw_map(drw, m->barwin, 0, 0, m->ww, bh); + } + +@@ -784,9 +833,17 @@ void + focus(Client *c) + { + if (!c || !ISVISIBLE(c)) +- for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); +- if (selmon->sel && selmon->sel != c) ++ for (c = selmon->stack; c && (!ISVISIBLE(c) || HIDDEN(c)); c = c->snext); ++ if (selmon->sel && selmon->sel != c) { + unfocus(selmon->sel, 0); ++ ++ if (selmon->hidsel) { ++ hidewin(selmon->sel); ++ if (c) ++ arrange(c->mon); ++ selmon->hidsel = 0; ++ } ++ } + if (c) { + if (c->mon != selmon) + selmon = c->mon; +@@ -830,28 +887,57 @@ focusmon(const Arg *arg) + } + + void +-focusstack(const Arg *arg) ++focusstackvis(const Arg *arg) ++{ ++ focusstack(arg->i, 0); ++} ++ ++void ++focusstackhid(const Arg *arg) ++{ ++ focusstack(arg->i, 1); ++} ++ ++void ++focusstack(int inc, int hid) + { + Client *c = NULL, *i; + +- if (!selmon->sel) ++ if (!selmon->sel && !hid) + return; +- if (arg->i > 0) { +- for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); ++ if (!selmon->clients) ++ return; ++ ++ if (inc > 0) { ++ if (selmon->sel) ++ for (c = selmon->sel->next; ++ c && (!ISVISIBLE(c) || (!hid && HIDDEN(c))); ++ c = c->next); + if (!c) +- for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); ++ for (c = selmon->clients; ++ c && (!ISVISIBLE(c) || (!hid && HIDDEN(c))); ++ c = c->next); + } else { +- for (i = selmon->clients; i != selmon->sel; i = i->next) +- if (ISVISIBLE(i)) +- c = i; ++ if (selmon->sel) { ++ for (i = selmon->clients; i != selmon->sel; i = i->next) ++ if (ISVISIBLE(i) && !(!hid && HIDDEN(i))) ++ c = i; ++ } else ++ c = selmon->clients; + if (!c) + for (; i; i = i->next) +- if (ISVISIBLE(i)) ++ if (ISVISIBLE(i) && !(!hid && HIDDEN(i))) + c = i; + } ++ + if (c) { + focus(c); + restack(selmon); ++ ++ if (HIDDEN(c)) { ++ showwin(c); ++ c->mon->hidsel = 1; ++ } + } + } + +@@ -963,6 +1049,36 @@ grabkeys(void) + } + } + ++void ++hide(const Arg *arg) ++{ ++ hidewin(selmon->sel); ++ focus(NULL); ++ arrange(selmon); ++} ++ ++void ++hidewin(Client *c) { ++ if (!c || HIDDEN(c)) ++ return; ++ ++ Window w = c->win; ++ static XWindowAttributes ra, ca; ++ ++ // more or less taken directly from blackbox's hide() function ++ XGrabServer(dpy); ++ XGetWindowAttributes(dpy, root, &ra); ++ XGetWindowAttributes(dpy, w, &ca); ++ // prevent UnmapNotify events ++ XSelectInput(dpy, root, ra.your_event_mask & ~SubstructureNotifyMask); ++ XSelectInput(dpy, w, ca.your_event_mask & ~StructureNotifyMask); ++ XUnmapWindow(dpy, w); ++ setclientstate(c, IconicState); ++ XSelectInput(dpy, root, ra.your_event_mask); ++ XSelectInput(dpy, w, ca.your_event_mask); ++ XUngrabServer(dpy); ++} ++ + void + incnmaster(const Arg *arg) + { +@@ -1067,12 +1183,14 @@ manage(Window w, XWindowAttributes *wa) + 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 (!HIDDEN(c)) ++ setclientstate(c, NormalState); + if (c->mon == selmon) + unfocus(selmon->sel, 0); + c->mon->sel = c; + arrange(c->mon); +- XMapWindow(dpy, c->win); ++ if (!HIDDEN(c)) ++ XMapWindow(dpy, c->win); + focus(NULL); + } + +@@ -1195,7 +1313,7 @@ movemouse(const Arg *arg) + Client * + nexttiled(Client *c) + { +- for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); ++ for (; c && (c->isfloating || !ISVISIBLE(c) || HIDDEN(c)); c = c->next); + return c; + } + +@@ -1248,6 +1366,16 @@ propertynotify(XEvent *e) + void + quit(const Arg *arg) + { ++ // fix: reloading dwm keeps all the hidden clients hidden ++ Monitor *m; ++ Client *c; ++ for (m = mons; m; m = m->next) { ++ if (m) { ++ for (c = m->stack; c; c = c->next) ++ if (c && HIDDEN(c)) showwin(c); ++ } ++ } ++ + running = 0; + } + +@@ -1610,6 +1738,25 @@ seturgent(Client *c, int urg) + XFree(wmh); + } + ++void ++show(const Arg *arg) ++{ ++ if (selmon->hidsel) ++ selmon->hidsel = 0; ++ showwin(selmon->sel); ++} ++ ++void ++showwin(Client *c) ++{ ++ if (!c || !HIDDEN(c)) ++ return; ++ ++ XMapWindow(dpy, c->win); ++ setclientstate(c, NormalState); ++ arrange(c->mon); ++} ++ + void + showhide(Client *c) + { +@@ -1746,6 +1893,23 @@ toggleview(const Arg *arg) + } + } + ++void ++togglewin(const Arg *arg) ++{ ++ Client *c = (Client*)arg->v; ++ ++ if (c == selmon->sel) { ++ hidewin(c); ++ focus(NULL); ++ arrange(c->mon); ++ } else { ++ if (HIDDEN(c)) ++ showwin(c); ++ focus(c); ++ restack(selmon); ++ } ++} ++ + void + unfocus(Client *c, int setfocus) + { diff --git a/dwm-centeredmaster-6.1.diff b/dwm-centeredmaster-6.1.diff new file mode 100644 index 0000000..6926892 --- /dev/null +++ b/dwm-centeredmaster-6.1.diff @@ -0,0 +1,142 @@ +diff --git a/config.def.h b/config.def.h +index 7054c06..527b214 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -39,6 +39,8 @@ static const Layout layouts[] = { + { "[]=", tile }, /* first entry is default */ + { "><>", NULL }, /* no layout function means floating behavior */ + { "[M]", monocle }, ++ { "|M|", centeredmaster }, ++ { ">M>", centeredfloatingmaster }, + }; + + /* key definitions */ +@@ -74,6 +76,8 @@ static Key keys[] = { + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, ++ { MODKEY, XK_u, setlayout, {.v = &layouts[3]} }, ++ { MODKEY, XK_o, setlayout, {.v = &layouts[4]} }, + { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, +diff --git a/dwm.c b/dwm.c +index 0362114..1e81412 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -233,6 +233,8 @@ static int xerror(Display *dpy, XErrorEvent *ee); + static int xerrordummy(Display *dpy, XErrorEvent *ee); + static int xerrorstart(Display *dpy, XErrorEvent *ee); + static void zoom(const Arg *arg); ++static void centeredmaster(Monitor *m); ++static void centeredfloatingmaster(Monitor *m); + + /* variables */ + static const char broken[] = "broken"; +@@ -2139,3 +2141,106 @@ main(int argc, char *argv[]) + XCloseDisplay(dpy); + return EXIT_SUCCESS; + } ++ ++void ++centeredmaster(Monitor *m) ++{ ++ unsigned int i, n, h, mw, mx, my, oty, ety, tw; ++ Client *c; ++ ++ /* count number of clients in the selected monitor */ ++ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); ++ if (n == 0) ++ return; ++ ++ /* initialize areas */ ++ mw = m->ww; ++ mx = 0; ++ my = 0; ++ tw = mw; ++ ++ if (n > m->nmaster) { ++ /* go mfact box in the center if more than nmaster clients */ ++ mw = m->nmaster ? m->ww * m->mfact : 0; ++ tw = m->ww - mw; ++ ++ if (n - m->nmaster > 1) { ++ /* only one client */ ++ mx = (m->ww - mw) / 2; ++ tw = (m->ww - mw) / 2; ++ } ++ } ++ ++ oty = 0; ++ ety = 0; ++ for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) ++ if (i < m->nmaster) { ++ /* nmaster clients are stacked vertically, in the center ++ * of the screen */ ++ h = (m->wh - my) / (MIN(n, m->nmaster) - i); ++ resize(c, m->wx + mx, m->wy + my, mw - (2*c->bw), ++ h - (2*c->bw), 0); ++ my += HEIGHT(c); ++ } else { ++ /* stack clients are stacked vertically */ ++ if ((i - m->nmaster) % 2 ) { ++ h = (m->wh - ety) / ( (1 + n - i) / 2); ++ resize(c, m->wx, m->wy + ety, tw - (2*c->bw), ++ h - (2*c->bw), 0); ++ ety += HEIGHT(c); ++ } else { ++ h = (m->wh - oty) / ((1 + n - i) / 2); ++ resize(c, m->wx + mx + mw, m->wy + oty, ++ tw - (2*c->bw), h - (2*c->bw), 0); ++ oty += HEIGHT(c); ++ } ++ } ++} ++ ++void ++centeredfloatingmaster(Monitor *m) ++{ ++ unsigned int i, n, w, mh, mw, mx, mxo, my, myo, tx; ++ Client *c; ++ ++ /* count number of clients in the selected monitor */ ++ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); ++ if (n == 0) ++ return; ++ ++ /* initialize nmaster area */ ++ if (n > m->nmaster) { ++ /* go mfact box in the center if more than nmaster clients */ ++ if (m->ww > m->wh) { ++ mw = m->nmaster ? m->ww * m->mfact : 0; ++ mh = m->nmaster ? m->wh * 0.9 : 0; ++ } else { ++ mh = m->nmaster ? m->wh * m->mfact : 0; ++ mw = m->nmaster ? m->ww * 0.9 : 0; ++ } ++ mx = mxo = (m->ww - mw) / 2; ++ my = myo = (m->wh - mh) / 2; ++ } else { ++ /* go fullscreen if all clients are in the master area */ ++ mh = m->wh; ++ mw = m->ww; ++ mx = mxo = 0; ++ my = myo = 0; ++ } ++ ++ for(i = tx = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) ++ if (i < m->nmaster) { ++ /* nmaster clients are stacked horizontally, in the center ++ * of the screen */ ++ w = (mw + mxo - mx) / (MIN(n, m->nmaster) - i); ++ resize(c, m->wx + mx, m->wy + my, w - (2*c->bw), ++ mh - (2*c->bw), 0); ++ mx += WIDTH(c); ++ } else { ++ /* stack clients are stacked horizontally */ ++ w = (m->ww - tx) / (n - i); ++ resize(c, m->wx + tx, m->wy, w - (2*c->bw), ++ m->wh - (2*c->bw), 0); ++ tx += WIDTH(c); ++ } ++} 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.c b/dwm.c index 0362114..dd9d45a 100644 --- a/dwm.c +++ b/dwm.c @@ -50,6 +50,7 @@ #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 HIDDEN(C) ((getstate(C->win) == IconicState)) #define LENGTH(X) (sizeof X / sizeof X[0]) #define MOUSEMASK (BUTTONMASK|PointerMotionMask) #define WIDTH(X) ((X)->w + 2 * (X)->bw) @@ -59,7 +60,7 @@ /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel, SchemeLast }; /* color schemes */ +enum { SchemeNorm, SchemeSel, SchemeHid, SchemeLast }; /* color schemes */ enum { NetSupported, NetWMName, NetWMState, NetWMFullscreen, NetActiveWindow, NetWMWindowType, NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ @@ -117,6 +118,8 @@ struct Monitor { int nmaster; int num; int by; /* bar geometry */ + int btw; /* width of tasks portion of bar */ + int bt; /* number of tasks */ int mx, my, mw, mh; /* screen size */ int wx, wy, ww, wh; /* window area */ unsigned int seltags; @@ -124,6 +127,7 @@ struct Monitor { unsigned int tagset[2]; int showbar; int topbar; + int hidsel; Client *clients; Client *sel; Client *stack; @@ -169,12 +173,16 @@ 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 void focusstackvis(const Arg *arg); +static void focusstackhid(const Arg *arg); +static void focusstack(int inc, int vis); 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 hide(const Arg *arg); +static void hidewin(Client *c); static void incnmaster(const Arg *arg); static void keypress(XEvent *e); static void killclient(const Arg *arg); @@ -203,6 +211,8 @@ static void setfullscreen(Client *c, int fullscreen); static void setlayout(const Arg *arg); static void setmfact(const Arg *arg); static void setup(void); +static void show(const Arg *arg); +static void showwin(Client *c); static void showhide(Client *c); static void sigchld(int unused); static void spawn(const Arg *arg); @@ -213,6 +223,7 @@ 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 togglewin(const Arg *arg); static void unfocus(Client *c, int setfocus); static void unmanage(Client *c, int destroyed); static void unmapnotify(XEvent *e); @@ -233,6 +244,8 @@ static int xerror(Display *dpy, XErrorEvent *ee); static int xerrordummy(Display *dpy, XErrorEvent *ee); static int xerrorstart(Display *dpy, XErrorEvent *ee); static void zoom(const Arg *arg); +static void centeredmaster(Monitor *m); +static void centeredfloatingmaster(Monitor *m); /* variables */ static const char broken[] = "broken"; @@ -438,10 +451,25 @@ buttonpress(XEvent *e) arg.ui = 1 << i; } else if (ev->x < x + blw) click = ClkLtSymbol; + /* 2px right padding */ else if (ev->x > selmon->ww - TEXTW(stext)) click = ClkStatusText; - else - click = ClkWinTitle; + else { + x += blw; + c = m->clients; + + if (c) { + do { + if (!ISVISIBLE(c)) + continue; + else + x += (1.0 / (double)m->bt) * m->btw; + } while (ev->x > x && (c = c->next)); + + click = ClkWinTitle; + arg.v = c; + } + } } else if ((c = wintoclient(ev->window))) { focus(c); click = ClkClientWin; @@ -449,7 +477,7 @@ buttonpress(XEvent *e) 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); + buttons[i].func((click == ClkTagBar || click == ClkWinTitle) && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); } void @@ -704,13 +732,15 @@ dirtomon(int dir) void drawbar(Monitor *m) { - int x, xx, w, dx; + int xx, x, w, sw = 0, n = 0, scm; unsigned int i, occ = 0, urg = 0; Client *c; - dx = (drw->fonts[0]->ascent + drw->fonts[0]->descent + 2) / 4; + x = (drw->fonts[0]->ascent + drw->fonts[0]->descent + 2) / 4; for (c = m->clients; c; c = c->next) { + if (ISVISIBLE(c)) + n++; occ |= c->tags; if (c->isurgent) urg |= c->tags; @@ -720,7 +750,7 @@ drawbar(Monitor *m) w = TEXTW(tags[i]); drw_setscheme(drw, m->tagset[m->seltags] & 1 << i ? &scheme[SchemeSel] : &scheme[SchemeNorm]); drw_text(drw, x, 0, w, bh, tags[i], urg & 1 << i); - drw_rect(drw, x + 1, 1, dx, dx, m == selmon && selmon->sel && selmon->sel->tags & 1 << i, + drw_rect(drw, x + 1, 1, x, x, m == selmon && selmon->sel && selmon->sel->tags & 1 << i, occ & 1 << i, urg & 1 << i); x += w; } @@ -741,10 +771,29 @@ drawbar(Monitor *m) x = m->ww; if ((w = x - xx) > bh) { x = xx; - if (m->sel) { - drw_setscheme(drw, m == selmon ? &scheme[SchemeSel] : &scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, m->sel->name, 0); - drw_rect(drw, x + 1, 1, dx, dx, m->sel->isfixed, m->sel->isfloating, 0); + if (n > 0) { + int remainder = w % n; + int tabw = (1.0 / (double)n) * w + 1; + for (c = m->clients; c; c = c->next) { + if (!ISVISIBLE(c)) + continue; + if (m->sel == c) + scm = SchemeSel; + else if (HIDDEN(c)) + scm = SchemeHid; + else + scm = SchemeNorm; + drw_setscheme(drw, &scheme[scm]); + + if (remainder >= 0) { + if (remainder == 0) { + tabw--; + } + remainder--; + } + drw_text(drw, x, 0, tabw, bh, c->name, 0); + x += tabw; + } } else { drw_setscheme(drw, &scheme[SchemeNorm]); drw_rect(drw, x, 0, w, bh, 1, 0, 1); @@ -795,10 +844,17 @@ void focus(Client *c) { if (!c || !ISVISIBLE(c)) - for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); - /* was if (selmon->sel) */ - if (selmon->sel && selmon->sel != c) + for (c = selmon->stack; c && (!ISVISIBLE(c) || HIDDEN(c)); c = c->snext); + if (selmon->sel && selmon->sel != c) { unfocus(selmon->sel, 0); + + if (selmon->hidsel) { + hidewin(selmon->sel); + if (c) + arrange(c->mon); + selmon->hidsel = 0; + } + } if (c) { if (c->mon != selmon) selmon = c->mon; @@ -843,28 +899,57 @@ focusmon(const Arg *arg) } void -focusstack(const Arg *arg) +focusstackvis(const Arg *arg) +{ + focusstack(arg->i, 0); +} + +void +focusstackhid(const Arg *arg) +{ + focusstack(arg->i, 1); +} + +void +focusstack(int inc, int hid) { Client *c = NULL, *i; - if (!selmon->sel) + if (!selmon->sel && !hid) return; - if (arg->i > 0) { - for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); + if (!selmon->clients) + return; + + if (inc > 0) { + if (selmon->sel) + for (c = selmon->sel->next; + c && (!ISVISIBLE(c) || (!hid && HIDDEN(c))); + c = c->next); if (!c) - for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); + for (c = selmon->clients; + c && (!ISVISIBLE(c) || (!hid && HIDDEN(c))); + c = c->next); } else { - for (i = selmon->clients; i != selmon->sel; i = i->next) - if (ISVISIBLE(i)) - c = i; + if (selmon->sel) { + for (i = selmon->clients; i != selmon->sel; i = i->next) + if (ISVISIBLE(i) && !(!hid && HIDDEN(i))) + c = i; + } else + c = selmon->clients; if (!c) for (; i; i = i->next) - if (ISVISIBLE(i)) + if (ISVISIBLE(i) && !(!hid && HIDDEN(i))) c = i; } + if (c) { focus(c); restack(selmon); + + if (HIDDEN(c)) { + showwin(c); + c->mon->hidsel = 1; + } } } @@ -978,6 +1063,36 @@ grabkeys(void) } } +void +hide(const Arg *arg) +{ + hidewin(selmon->sel); + focus(NULL); + arrange(selmon); +} + +void +hidewin(Client *c) { + if (!c || HIDDEN(c)) + return; + + Window w = c->win; + static XWindowAttributes ra, ca; + + // more or less taken directly from blackbox's hide() function + XGrabServer(dpy); + XGetWindowAttributes(dpy, root, &ra); + XGetWindowAttributes(dpy, w, &ca); + // prevent UnmapNotify events + XSelectInput(dpy, root, ra.your_event_mask & ~SubstructureNotifyMask); + XSelectInput(dpy, w, ca.your_event_mask & ~StructureNotifyMask); + XUnmapWindow(dpy, w); + setclientstate(c, IconicState); + XSelectInput(dpy, root, ra.your_event_mask); + XSelectInput(dpy, w, ca.your_event_mask); + XUngrabServer(dpy); +} + void incnmaster(const Arg *arg) { @@ -1081,12 +1196,14 @@ manage(Window w, XWindowAttributes *wa) 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 (!HIDDEN(c)) + setclientstate(c, NormalState); if (c->mon == selmon) unfocus(selmon->sel, 0); c->mon->sel = c; arrange(c->mon); - XMapWindow(dpy, c->win); + if (!HIDDEN(c)) + XMapWindow(dpy, c->win); focus(NULL); } @@ -1212,7 +1329,7 @@ movemouse(const Arg *arg) Client * nexttiled(Client *c) { - for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); + for (; c && (c->isfloating || !ISVISIBLE(c) || HIDDEN(c)); c = c->next); return c; } @@ -1265,6 +1382,16 @@ propertynotify(XEvent *e) void quit(const Arg *arg) { + // fix: reloading dwm keeps all the hidden clients hidden + Monitor *m; + Client *c; + for (m = mons; m; m = m->next) { + if (m) { + for (c = m->stack; c; c = c->next) + if (c && HIDDEN(c)) showwin(c); + } + } + running = 0; } @@ -1603,6 +1730,25 @@ setup(void) focus(NULL); } +void +show(const Arg *arg) +{ + if (selmon->hidsel) + selmon->hidsel = 0; + showwin(selmon->sel); +} + +void +showwin(Client *c) +{ + if (!c || !HIDDEN(c)) + return; + + XMapWindow(dpy, c->win); + setclientstate(c, NormalState); + arrange(c->mon); +} + void showhide(Client *c) { @@ -1739,6 +1885,23 @@ toggleview(const Arg *arg) } } +void +togglewin(const Arg *arg) +{ + Client *c = (Client*)arg->v; + + if (c == selmon->sel) { + hidewin(c); + focus(NULL); + arrange(c->mon); + } else { + if (HIDDEN(c)) + showwin(c); + focus(c); + restack(selmon); + } +} + void unfocus(Client *c, int setfocus) { @@ -2139,3 +2302,106 @@ main(int argc, char *argv[]) XCloseDisplay(dpy); return EXIT_SUCCESS; } + +void +centeredmaster(Monitor *m) +{ + unsigned int i, n, h, mw, mx, my, oty, ety, tw; + Client *c; + + /* count number of clients in the selected monitor */ + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); + if (n == 0) + return; + + /* initialize areas */ + mw = m->ww; + mx = 0; + my = 0; + tw = mw; + + if (n > m->nmaster) { + /* go mfact box in the center if more than nmaster clients */ + mw = m->nmaster ? m->ww * m->mfact : 0; + tw = m->ww - mw; + + if (n - m->nmaster > 1) { + /* only one client */ + mx = (m->ww - mw) / 2; + tw = (m->ww - mw) / 2; + } + } + + oty = 0; + ety = 0; + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) + if (i < m->nmaster) { + /* nmaster clients are stacked vertically, in the center + * of the screen */ + h = (m->wh - my) / (MIN(n, m->nmaster) - i); + resize(c, m->wx + mx, m->wy + my, mw - (2*c->bw), + h - (2*c->bw), 0); + my += HEIGHT(c); + } else { + /* stack clients are stacked vertically */ + if ((i - m->nmaster) % 2 ) { + h = (m->wh - ety) / ( (1 + n - i) / 2); + resize(c, m->wx, m->wy + ety, tw - (2*c->bw), + h - (2*c->bw), 0); + ety += HEIGHT(c); + } else { + h = (m->wh - oty) / ((1 + n - i) / 2); + resize(c, m->wx + mx + mw, m->wy + oty, + tw - (2*c->bw), h - (2*c->bw), 0); + oty += HEIGHT(c); + } + } +} + +void +centeredfloatingmaster(Monitor *m) +{ + unsigned int i, n, w, mh, mw, mx, mxo, my, myo, tx; + Client *c; + + /* count number of clients in the selected monitor */ + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); + if (n == 0) + return; + + /* initialize nmaster area */ + if (n > m->nmaster) { + /* go mfact box in the center if more than nmaster clients */ + if (m->ww > m->wh) { + mw = m->nmaster ? m->ww * m->mfact : 0; + mh = m->nmaster ? m->wh * 0.9 : 0; + } else { + mh = m->nmaster ? m->wh * m->mfact : 0; + mw = m->nmaster ? m->ww * 0.9 : 0; + } + mx = mxo = (m->ww - mw) / 2; + my = myo = (m->wh - mh) / 2; + } else { + /* go fullscreen if all clients are in the master area */ + mh = m->wh; + mw = m->ww; + mx = mxo = 0; + my = myo = 0; + } + + for(i = tx = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) + if (i < m->nmaster) { + /* nmaster clients are stacked horizontally, in the center + * of the screen */ + w = (mw + mxo - mx) / (MIN(n, m->nmaster) - i); + resize(c, m->wx + mx, m->wy + my, w - (2*c->bw), + mh - (2*c->bw), 0); + mx += WIDTH(c); + } else { + /* stack clients are stacked horizontally */ + w = (m->ww - tx) / (n - i); + resize(c, m->wx + tx, m->wy, w - (2*c->bw), + m->wh - (2*c->bw), 0); + tx += WIDTH(c); + } +}