From 62e4dafbc25eb144ff6c65f1695ade1f58e560c4 Mon Sep 17 00:00:00 2001 From: = <=> Date: Sat, 16 Jan 2021 20:42:40 -0500 Subject: [PATCH] Add pertag and fullgaps patches --- .../dwm-attachbelow-toggleable-6.2.diff | 0 .../dwm-awesomebar-20200907-6.2.diff | 0 config.def.h | 6 + config.h | 7 + dwm | Bin 67600 -> 71856 bytes dwm-fullgaps-6.2.diff | 95 ---------- dwm-fullgaps-toggle-20200830.diff | 148 +++++++++++++++ dwm-pertag-20200914-61bb8b2.diff | 177 ++++++++++++++++++ dwm.c | 150 +++++++++++++-- 9 files changed, 474 insertions(+), 109 deletions(-) rename dwm-attachbelow-toggleable-6.2.diff => .pc/dwm-attachbelow-toggleable-6.2.diff (100%) rename dwm-awesomebar-20200907-6.2.diff => .pc/dwm-awesomebar-20200907-6.2.diff (100%) delete mode 100644 dwm-fullgaps-6.2.diff create mode 100644 dwm-fullgaps-toggle-20200830.diff create mode 100644 dwm-pertag-20200914-61bb8b2.diff diff --git a/dwm-attachbelow-toggleable-6.2.diff b/.pc/dwm-attachbelow-toggleable-6.2.diff similarity index 100% rename from dwm-attachbelow-toggleable-6.2.diff rename to .pc/dwm-attachbelow-toggleable-6.2.diff diff --git a/dwm-awesomebar-20200907-6.2.diff b/.pc/dwm-awesomebar-20200907-6.2.diff similarity index 100% rename from dwm-awesomebar-20200907-6.2.diff rename to .pc/dwm-awesomebar-20200907-6.2.diff diff --git a/config.def.h b/config.def.h index 0552002..9a47c27 100644 --- a/config.def.h +++ b/config.def.h @@ -12,6 +12,7 @@ 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 Gap default_gap = {.isgap = 1, .realgap = 10, .gappx = 10}; 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 */ @@ -91,6 +92,11 @@ static Key keys[] = { { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, { MODKEY, XK_s, show, {0} }, { MODKEY, XK_h, hide, {0} }, + { MODKEY|ShiftMask, XK_b, toggleAttachBelow, {0} }, + { MODKEY, XK_minus, setgaps, {.i = -5 } }, + { MODKEY, XK_equal, setgaps, {.i = +5 } }, + { MODKEY|ShiftMask, XK_minus, setgaps, {.i = GAP_RESET } }, + { MODKEY|ShiftMask, XK_equal, setgaps, {.i = GAP_TOGGLE} }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) diff --git a/config.h b/config.h index 310bc50..cebb96f 100644 --- a/config.h +++ b/config.h @@ -12,6 +12,7 @@ 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 Gap default_gap = {.isgap = 1, .realgap = 10, .gappx = 10}; 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 */ @@ -33,6 +34,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 int attachbelow = 1; /* 1 means attach after the currently active window */ static const Layout layouts[] = { /* symbol arrange function */ @@ -90,6 +92,11 @@ static Key keys[] = { { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_s, show, {0} }, { MODKEY|ShiftMask, XK_h, hide, {0} }, + { MODKEY|ShiftMask, XK_b, toggleAttachBelow, {0} }, + { MODKEY, XK_minus, setgaps, {.i = -5 } }, + { MODKEY, XK_equal, setgaps, {.i = +5 } }, + { MODKEY|ShiftMask, XK_minus, setgaps, {.i = GAP_RESET } }, + { MODKEY|ShiftMask, XK_equal, setgaps, {.i = GAP_TOGGLE} }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) diff --git a/dwm b/dwm index aaf82c8a84ac1e000810418d028022fde777e2e7..c38ebc65f599e17ef829697919a3cf2356d8549e 100755 GIT binary patch literal 71856 zcmeEvdwf*I`S%HMG*ED(62*JGP(eilf`SFzKvow`bmgLWg%E-SLlTo+zzZ4;u^f-9 zsnv@9YD=wFtG4B5y&(0HAev}x4c1G%rh+xPSS_jZ-c zd7gRZnP;B4J@d?*IoCwWP92h$XPMtn>tu^i@reo())Do4W@y6JRO=g7*gD8M(Ao|0 z!|>101;b@S5Q(1&^A%_fMaXpb>-b=Jpr$jS$(0+9O}ev@j&lCHKV1#h9Gzb- zy%exv;AcWrddoVlrh4%SlaH%eGNGorHnDob>ZvD8IAQX!jdjOPl5&qm8YVsM%=y-X zznW5d%Ko#zc;)0{3VcLFh0M}fuDpz z4Mu-73OX461Qd2K{HPrGJLIm$I8hko|R!ROT+@*I$(UM|Q%zXfF%(NM|nGP;7`fH|9~9ycjw6Wz8v~|A_t#ia+G&c4n6Ol1OKNS z`M#Y)&m6M`tM`|3(7&96{)HTRSeFAoA_xCXxyqFT|9B30uFRq5wjB7+a>&`3LrzZD zgX!&?Ipq97j(m6J=r4Ua=pV}=&qF!nKRE~eg*o#5dyaCwlLKFwBi}1?;AiA0*XSJm zZbc3`zn4Rv>vP}>bMQ&$(9gp;2n4|rqbI3m@2miJl4tai-Ll3Pv=>Io|oR{P%S2_p(WDfl8Iq+k0lP)dm#AH0EjYEIs%kD$)?QKuF{}k=R9#+Kx1?%b9UdAlUtujM zt*WVtSAju&RYUx8Yr&aStK*TCRkff!t)XIZtPa^!HCPMg*RH6jSE5)8$}1W#)kLLL zjq!%M%T3JO%WEqc?~y{jd0?5zU{*s_1v0E&4SrgDT@)5e$~v>I0g6)s%&lrz$>&+i zDrzsO`m!z*yHo3Gumj8Y))Jsj7@aI#ld}IaNy=sv4Jp zU~yeV!xAW>9=cb=<#kJ{msVFnFcf??)mmE;uR|TMl8p4KoEde^ucdI3p{g>eI@TfE zLG2P<4Rb208$E%~t!SwCT>l3K< zxrzGvx`udTSzToXiv)ens;Ovfq%zTfs%vUy)l{nnQWZC4@(PMdEUT`q@;6si1XGbK z7W>=7ygEXvZBp~TN)mBSt*cC+RkIML$w+m~1A>i`%JGUiYgtw0rM|X#R((}%X?0_L zO$Dlp4Y8r3wvnQvhp5ubs;gaEeMzFh%U3lO>WlSk+Qg|Sw6Btt9u4Ets--BfsXr(} z>H>X_4N=;2rZz#?P_d$7c4J9pym}={pb=80xs@nXZKHK+B^p5k6j`!l37;|uB^}^c zMO>QCk|i_i>S{6sx;JJ~Xl5jm(#}mRZj4vQF_ZvxX2puCSVco4pHYyCL`^&^UT0LA zsIRH6M8C~&Hd!rL3U$`TscTJa0X3_xrmmr+rlwAEAV#_<8z2Gp8Xp6;fynAOYNm01 zeCbp}PM#Fdq|n9J>D91i=vm6hYK(DcEh@9}ig@KRt7>(1+-j_fLlU-TjB@DuR%7)g zwG}lMhOXMm`pd1Qbq$wVhzAjIHC43?@V~VbU82%jQMH0(7*P}jMyCdFuBu#FZ!KNb zPz}ATs;G|FS1++DrHBg`R<5pCh;~s?gMozkHzE!UD_7KG^oK8~Qjh*CDynO(l}qa} zM8}s}jkWp#qeztnvIP?-(noZHJnP0n#6%*NLhqGQrydGrS3V_Xp;9iaT2c|OK(31$ z8&#&(LJS<%X=Sr#&RRI>*ol+9$4SRd@lA#LaftRYVM6wP2B#3&kijv`#Q0MyitN9c zcs^yI43!^eo=upc;*-HL_slb6V6=F@A@G&)KSjZ?N#=M(aO-!z2WY5ux5g#*uO3d$ zKLgC4@q?QAzF?}t_iI0?!FQdg@Rs(28vIEgDEznp{uGU06u>Xg_+BWt#r}y_H>M^kCqw0RFl) zice1ff7(2S?+f53e_P@E19+=e;qyml=X=Rz3SSh!zpLq^0eq}V(Z>S#e?F%0ivsu` zv?zRi0Dtkt3coslU$;=tUR(m;3jU^}HT{MFKBejJ58zug{l);kU(;_2 z;2llh7QkB?-xa_oHNG!^-}ZoNKm7r`(R;x@c|u_NwV@vqz?=Mv1Nhs2q4>uF_(=^4 zU!Mct8oFy8`%eS1JB|Iq(JhW|!;fyA^$L4ty+tANFf4e*jbD0Po2kz#INu0leYg7r-0-1qbJlKY%ys;^5MDHX?}e^ zJkL;=pYikBK&&=MgkuVnJiFsrJ*mhdAAX3Bew+{QUzHa7@Nj8+zo|Yv^ESV*53iS| z5*78~DUo&hp+eHNBZ!qefUv6e3K8qhY!Eb zhY$JitvYbbAu1Bk1Pqd`+fM)KK>hh_(C6klMla-58vj)@9V>N`tW0X z_%0uQKOer^hd;oF@A2Ue^x;!JJkN@lU!M- zeE7qC_%S~G5k7p84?ot2ALqk=(}yqi;g9s;r~2^YeE6^rKi-Fr`tV2j@G&3$Xdixo z4?n?&U*yB{AwTlL?6D%ho9ubuk+!L_u*T8_{l!}dLQ2J z#M|J*pWvgv--kCYDn@Vg;k8RkQf>0#r}_A_`S2(C@SQ&Vw|w|6AAY(I-|fTC@Zo!W z_>+D3ln;N358vm*hkf{dAHKwgxAsz_HS24p51;SD&+_35eE3oyevA(v@!^Yn_)~rO zaX$QMK76qcANAp<`tY-T_^=Oux(^@q;m`2lV?KPD55K^NFZbaW`S54@@XLJovwZk^ zA3o;8ulC{3_Tig+_&GlOIv-vyjU=|!ho9%8U+=@K(~&B2gAad>kN$oi{#+k^qYuBp zhu`GGpXbB3`S9oa@SQ$9_rA@q%ZJx4Jc;V|;V&}82zz{Z?K+g$ln<|6hl20(;TH); z{pt7ND|~oM`@Puy7yIz}K76GQU*N+p@!`k#@Krv1kq^Jrhacy|U*f|T`|!(r_^Cd8 zwGSWm;g|dHQ6K(NA3o;8*ZA-YeE1bU{30J-yM`rpnGav*qp$bj>wWmuKKx}qe3K8~ z;KQ%;;TwJU|2}4GAlkemKkC}gy>D63mbUnifv#xt*8FEZqJb$NAZlRjcKi(;62=o@ zX<6x>0sO|kMVOO7x=Y|!2-8$gw+Z|r;h}^#3cQ6dP4n~yfj1MTNuF*M_+i2{#nVj! zKR}q>D_t+}-GuWAFB14p!Zf+lF@bL(OjA1@7Wf9jG_ljg0$)d%rggeV;428zq)rzI z+(4M7blMVlIboX6>Ao+37`vD-P3Lrvz~>X@5-Qy#@EpQ4q0?;wpH7&jb9$q|GYQjV zPHzzSB*HY6)2#weB1{uG-6Zf)glQV5>jgfHFiqn0B7yfOOj9@=6L>GeT)L&h0*@d} zlQ>;0@DRc@h0{d>|MNY-G=b9v0)ImIV8WKbej_@&riv+%cFiqBUfxr!fX{x3zftM4eiJI=)CG}63 zrfIrI;PVO7Bu#e-Jclq%(R7=@rxT_Ln%*ezOu{rh(;Eani7-vhbgRIV2-DO|Hwkce|62e^qze1R%V7g7<7YWZIyiwpSglYPvHwe6$ zFipO6tH2Kvrm2^168HharxC6f_-?{c!ixmHlkjZ9F@bL(d^+K3DZPN_x)4qpD<0cbdSL26Q)U)?h<$oVVYv;Hi1tk zOcN}9D{f2-Ad07YjUuFiod)k--0a2k=FN3k3dz@Wq5Jf&WZ+A>qD%Nc|IDM7T%b zw+PcDN_PqT3SpW;={A91BwR^&qrh7T)AUJi5O_0Tnmp-NfgdJJQzzXd@B@Tt;-u>Z zzMC*7p!6bv?<8DJI41BdgqITz3w#6NO9>YXd>vt$F6knHuOLj5C0!tJ17VsfX-nW2 zyDe*JD`5Fe{Ajkb?c%8OL9}^$Uu<4k(thABOr6P5vm}^t$*q_z3$I3+ouNa}%A?5{ zZ>AX7uP~U_A1}moyA<)9Zif%_gbryU<7agU`kxB@l)D*>|03%2Mce;!O0>OyXf*Hn z=(aE7qrqT;W{^M7vsCgi>6>O;hICfqxcSlM8GC@riaLLckBquAHot9IsR^jT)H3{e z-kuG*yo*da6Q-|3oyHo%d#VJhP2ZP|T(FLK$BD)kcjOEFrQ(!R7{liu!H!1r@>ht?_=E!l0GH!To_nU$lV5QZi+hdHzH~i z)G2(M*KD*BBcy<7v^o?b(iVEm3O(HxP0sI*IO@|BIt;;|q423q>ro%7iFc&V$0!eec%E5g zqMkr%Ycv0lBGvCvjFa3u!c!$qB&jDZRU%1Bq)Jq37KN!#lGKq*;S1P|oy1OOejmBH z^LHBg`;`1BUbu*Lae(CJ#vm8V9M0D|JrV=6hf-w~PT_*=@+z8oQ4^E9<$cIamwT}= zQRQy+YNm)agJ#sv0`?vR4$vlunz!Uf-C<}p9jWaw?$JE@*)k9ro{E;x-|(7(L{?&r ztXEY)hU;W#_Kt_r%q(B8Hkl*}HBMlq5sJ(ejmlaz35cP|O6_PdTJbWUteu*!J4@Ja zLD-*sKndG7ABuEOOG8S|*dIBj)}S#dX`9J1Ipdqas)DrL2HJ7Js!r4h5G6oW=o(br z1u&YOqneaU&81B5QhmpXVX}y%Trn3L#X?>Cj(dkyoD*3{g8$jZG@w1sz@qWuw*YVUbu8a1Onhqt`0 zsEay}r2JWJhSBcTT%41O;+l-2y>cu$eX4}XD3d}J!(KFvxj*`?NO$PEM$CY%nYO43 z#shzPoKQXBmcxQOlTZ++5~0joiY(~xQe7ksQ^K=s#81_pZbGOUploei3JdW=_Z zzxuA!8#uAFtEGIZZOfPjG%6+2&yit_I7PCK!(M=-GwRldGbH6bv(>ow30h}MTVf2N zP!rEX;rTx@3Xf9=DV`d6Rb>Z;Fd;yx_Cu*mnY=bY)ks4tZq;*l^9~kQ4}4Df4h;IK zQm1^o$|qcm0WY+6E97rpGscSV>7k`xTfKW^5D*RjV^DG%#;Ndh3@KZp&daHTAWQR_ z?NooXcwb3oEO6Ye8?gc};;8KS|LI zmJae~(zl01amCAn9}*Y4OjjP?1{GR!j0qf7YrHm+Noa;9CQ064Lb}@Y+ z+R@Sk5UQ{`B3%rkZVMTplBuRRnx28D0yZWDPuw;?#XPLU0nJY_8!NF_^Ha>pN(^s) zig{V_-DQ&MwPo0FA}=+sdC5wAo%R_|U}C=Ry}>^3DBYeGMI zmC-7lLQ6^|>PPC|$d4*ens8evubZU!tPfYD6}2uPAJmF3m7d`>Cc8sK(IGtcUqu)T zdxTjcu_dfU@4zsE)?!$NIjVF-Ue)y>73M_RP-*ORR(dEj7fmKvb4bMK&8T|Ry^Mf; znBSbplc4SqYK(2rbC;Ev4q~Q34>Vc9L^0E?8y(}J!}-o9n%nh%Vc!kbWEUC6PxTV` z_)LrRB}TiEC-Wk&;xDX(Jdv>X_`!(LF?;vNpxA>E)0Cc*d{5}Q*%%uom!mM9r7W>V zQy4b;68mMED$5Q_b8TCwr56K#^O{#NU4IJoz(RwD)`^A^ZRlJWemhd-^rhU9I6p|z3M^}I+8 zRZfd^H%_6D5Vxmy9|!}*d8C}Cp0|!g20d1sgIIU8IW?5pT=g1zUT7`NMd16?l-sAK z+{h+ZhK6k^XN&3@d0SvqJMHc1L-IPe^^fPA4BC85&yh#`wCq4cZe(61PCMy1ElID& z;?pRmSf-5Tw){Z9hBn*s%T(dr#3ODw7-42dmn=EE+-WbtdenJ774L;U&?l9;-4>mz zgl-FKYP_fx`DL2J+PA1*X*i?3=7PBk9V>k|oK3)i0Lm~jPL0AC2z~o5U{f=hqZ7Fw zvC?0tfcw=Pdr2BmUZOAxM)NtbC+4&Z?=*ATh8z8y6%pFcubI|~Y(TYxHNxbSWk|!O z)%RDjjcnK~LM5jx(D?k1G@d;f%6NuhY7Y9OFhI)3wtPq#xIP<#hzt*9kJ8ZQ+9Xb$p|a7)s5(r_D)l3hTGiTWv?RaT8ABz&2N7wL zcGMB+ln|p!N7Di}b^O2$P|OEK-F52#MqPViH-aR53TkA0i|y2nbkZ=P^PsbLclcyV zZ-ZcrVf)$bcpPQaRPKKUM~`Q{_+(ZqF%IDR?f z+!#qVIjz(YpWIgJN20=GhI2SVq(a#T!KK9B(HjC9)zh?&*?C9`c=E$zR<~6(WLf5~k{3xPk_OMR2ub*!h-HV2aM4fb`?oh~0uGHVy z0kA>&Xi)o6y@#u;nwSl8M6S2+(VY`>UV;5F+AVE`F6M7?u49=@lh+FtS-PPol{t}4 zbl|Pvg{oG(l;@_)wPf5xwVc(3XmlI=?F?W$or2~yTQS7FpsJ(CEpY9ZU}H_&a`iXe z!Yz0rYgdl5$x~Al(&V+}b&jXTmFuUQsqXYrwR)-e63-y1xA@c`WdAZ{$oYoKqgzp@*{GRV^+-256+pim4(Gx8xT;uyn1@pte{JC; zRdl-IRO;vC;WVfJs{%7EM4Sqz=%|c6tVXMJcwE)e-s~D{;+8x6sBD zd5F@x829NbCN7O9#G!G>q6CxnDF9Iy>|}r@5;6_T#q!-W(s|NI(T_^I&`L4vp`Eon zGeo$h+}3ek#nY{b{>7mH_+vbLslo>qLpz(-?6eZBCJ3q|AuDNXrUh#}SqWYhEcI!q zpveMmY3Q#ngpO+uUH>=L5+q`nKSH~D8L^HLk{i>teHuEd4G`1~=oLU+pN1~p0&Xi$ z_Ruc?-AU1yA(MX^I=^|^Vpm&9)Uq=BwP9{5a zfnav5Ooh(Mj>&`B&CJeDdh|{!{(q%Ix2YI8V6+-5`J-kj1xBHi`!Hkf`0NX(Yka%& zA|s?dp{Y#HBveIYQ@I1U8Uwq&mmJx7c(A;eh2f`E2IQxhAj(~pAQ)~l;PNXL_EDm7zCEifxpV~+PtFUVSVhUE2f-S60dzfLXeA^(~&yabOq~`aY znRA+VD1kXj#pW^Ztj^C?(!aSt3LtCkWgp0_I4H4<6miadgGL*7SI59BCU?5DKusM% zr%^XnFQC&}FQ6}mwpy${K_-b3jJspuDY3rgEIt)q@pR2z2U_dED#@ zXBn5YW}HY@M`XLLIH7+jk7;FG+E*tU4cy}JwAmlSdV?xD;}ZaEC*X!xEAKa&$#)hJ zL9@s1M4Vc4E!kg?U`mI!{R>Id)XJ>Tr&=arKG5zNbWJC+gG&kHLB>r%ZA{I5L%WJ8 zvBX_&VSBekJY#AX2dpe_RWW`C8WtA44rV`ll9G^KguJdi&Qchw!eQ)+ts2oB*#Wa{ zNB+v2_;=MoC_fn?d$Ea}_TPQrbisL)eo85o39-(%-}|*?Iqi^@bA01SBtyKFzTHQK z?L52VCGZM|OB~o;_5%Qv=w-=K$rmjvr})dcsxjg>G8vdq{4J$U&-kus&#q*S(3zDU ziyU41EQq5@)(O)3C{1yCSwd@VB~iD#E~cNn{sEu9nWTM|730aIX6# zipj2bKRRx={ka(~li^zodJCqnHdeM9J_5M6KM5VxjhSuK`$lK*P5x2Mvh4kt4X@7SBjRC(4$adc$%OJ5THhS**U#NdNz(4 zdZmuTB}$@>)JOZWU2TWw3BeBhwbDEBhpnr<$7YF=b|vgVci50=k?o-t7(m&P=O7Z> zX+vnWtbH^XTg;@gosD)ej}7@2lGt4^lAAk+eAdM#;>&6mT~UTUHWAzEV?Rd%m`@jF z(e;3i?Ohz?yW#K9#K9gxJ7n%4qhWbSxLY&{UF>IKlh|WR+O15VhaTI8kqslHZsp$y zT|WehY;BDutNJb|xlm6t$r)EQz%6p=yJ&QdJrc5`vHnd0y^~@836R^=16jR&OSmlx zK=&KOY~~G9dXbrUn?t(&7|>pC{0?!+886l&7n`}b_V@hpmm%H^Z1e%>kpKatMN0ce z4l>5*gcvMo@tj2SMD?CiBeGV2S=22&AAviE_Ga?*y|C`>iaPT;G3VIR7|$83 zJ%@VIU40=_dwA5e>^hS!d)j;pd3=E-I5@t+z}dFhYVsBHsBR4VSQpwaNNh*yWa)AC zW`f}QM~L4?@ulhZ`Np>*;VR=>i=>qm@T2r<$vFnBIESqKwU_(~Oci}mEW`8K%qm=3 z@^E2;#tPN!`Xlu`DA`-4O@r*U+++{>$bL>TPn6L0SF&DQn@cHXR{eVc+W~rN{r;PR z`x$VVZFX;xxL9Hfcb7ay-7kTCEd%AN_`w@~w@?wLDh%6pJqa*wC-w!ve(TkdJs(i- z=|GnW6I3===wGTtvt6aCmaN_c8F;s@W4mGs$2<}%Gn8xpi5*J$CDuYRokT~zn29{n zL_#SKzCK71BB_q13(+k2Ga0K^vNprz_vFIGxfp)4L@L*6+KwYevYLx3gF55ri88I2 z4`NpR=q(WuMd?UQc{SUmq*clOL+$XNn&w07OUCaJT6?UTEfCH9Ap1-l%)v~ZNa!SC z^o5y%>xz%jxF~SPDqN`Lud0A#KNY^=JaO9?Xh?$AY@ge-47s3Z>@JgSuZ@93)Y7L^ z{ZSa>^-nxTBFJl7MUYU-O`6o3*!tM9MQXJA91~ljjQMIpHx~0j&7b5sSqSMpn$PK= zgk$p-&Y{i=(dPEi&b)Q`k{UX0!l6^Y+Ya;Zn)Mx#4f}|Q_5&2zp|>cqo(+~Vaz82y z>?G*QN`eEO09-=gz>NY51n5=(7Y$D29R)-M=*bM5GRQD4>TZG1pAvu4;Y^Mvo zaY*LKOkq|lEr#UGf-@}C#DAjo-Hq1&Wwaifim`u-EOF?t>T_e$UAs*X*=rdXa}tkZ zJ@)qzuYl=}{apa55}bEL0~i783&sjg=3(}{8WFUyY8kep@m=;T9;9VgzJpV78gAYFvpBho+q_B-8If}{Nd%5Z%! zWK7s<-|l(yj+j`_%4+UsK4|FU*x@>siCFqT%G&*4v*_pr%{}56-A9QPM$qT9vi8zd ziV8hKyHj`&<^~iBU8)&@n%0`P1l%Y;A0o_AOU9v>%H)-YIY(A7eQs+$GEv!$QBNto z$Bun!ag{+3O~ZmfQd&GFHQS*|&3EYWgw)3{BR4$Rq}DV#^)RNUYXEt(;i}X{>Iv() zsS2T^bRzNY>O^edislF}5trAH(?n%T<;ucZyZmHtBE@pSGQWBO(-^JBF+WiDaT0`! zy*)YyTe=`K?mZ-6t1wvUGdYWG8LKtJ#sD#AVhc+X1tI|MWS19&f<-Uu1h zcF#L?NUlf0j~d|*onZwxRhAtu4oM`IJnDdV04 z=LatW`j}b3{h{V9BcYFBttx(K{obJhvltSq*T*~6 z6yPnco_~Y4=MplOqqda7bZMm$aV3IAHZ_U5eS2a$8?6f*MPcv%4@Q&t<5?MSRT5jR z3+b%c0n4QyS>l+@4(sZpqORTgD>l3A_FFbEbh zzvKz1+v?p-ol(d5g~8H|>`K<7QteAAbnM&`rxPNQjv}4`^IeJ9pBLF>yqTfvqp}Ij zy<+=#X8W}s)6X;`&Pp~9DraiR{`fIy$nM2osWJQak0UxczDSNj6&ZJ%n_Wyy^)%6xC%PL|MLs0FPIBG@a55aHo7Jr54JoIcYN`~^6L z$%4%+96lNw5)o?jTanH+d&6z1`y42bCeZKNc`QP^D#AZlZq+iDTgd;-N7!treh4Q; zZ)efbLVB@1g@%l!hp;!y9)ZBvG6>!DymTXG$8F2dO_vJXf5&HQ@N&VcaE-nK*XaD6 z+!VZLwYW~`Y*W^dH(sPifG7L3H!`z#>jg0$zkFtZ zp5D+}tcIA3d^j0&Cx+`+RC=)nkr84Y8Ka(G8IG{If2dGk<$=zq9a=O5D!Z~hQpv*Q zD1DSRvAvN`YE6F))>}MhxOxx%O$=*Z(UsS{;#D;8@^05|hKAXIx{&BfB=WTXr3Q2w z{2Hp^!==AVIgwdlJ=<#cw;XHiJpc zc1?eP1d^Zq{x6xx)HjVd=*}!IpO+?r#?EE7@6D8-z$N3eGa=ADA_=B3Z-4DR^>RXg zaOO+A=R4$H>|3FOlD2Y8Tl;vN*W5ou4vHg6Hd@YPE_6)as;U`y z*T*X0o0z@BTK$fbA{35OmS>D%A%Md1V5uk2tLOOz_f|Q}@xFy$!Q3Dd_Zh8~ey>k} zjp-A39K25?Rzl`cBC|1tGTubb;u7X%|1onhg(!vTRafnX@}O76e}G(Xe^_aiQwCN? z_O}hpjmHWgR%(Q|fH^$E6!yiyyWwR>hJ8mnW|Be8^&`li$Njh~;*}pU>y_8`a1eKd zm$A7DU1;r(ytX1oo4|13e-VjYYWN>~EbJ7~RIjlxSRLY4*-f3xljn&zQEl+2{6Rf? z&1TZ>WMMBAPP*lp^J|w8sT@B)Z};&y1`Q`1b*D(YYo87>)!Wc|rFUD;lDhDxSj|P< zQH)0xhiABjg_}KIB4jgob*ci#S~CqO&=T!0gq51hCn+UJ|N7A2b%jDlP_zBAK|{^0 zM`sob>eUK%rhA3L7^CrW@JzWF`%)=&R1_6uJEURFBS-rx&C;v+@v~Sgs@qL;KEK>&A@kDv%Px|8r;HiIyK{RQ(Db~R7d7@Q~X$#mSIGYTG zLkZHJL(u@9>dA!2%o*6Pu9AVO&e7r}*i4TJy{s!lyFuG4CjwJK_ksd@_X0-|~ zof&`EbFwVLS=(fJ&)N8s^8W1PQ}@}+hnY7|^T9;MD++q=uON5x)?!R^Mc~-OksrHT zcz}CARY(u%R%})SV8C&~m-E~y%OrEV1VNcw-c!aIG>Mn{l2~cOc*dFO{&VqXm;M8G zUpy_@7J2McF|iPrEmyq*i@|e>ESd_BmB4;qfU}PiO}V!8rqc*9^7lGcB%<_*Y9=fjizq2kwX#(xsgYjQ+W=| zyK*FoY|``4V^2YJcmVC!9zYgJypfi~{EPjVS+G6spfyn2?yYrtUqBo`)X9A&`S1 z@Poih=tNSkJrfT&ji5GSy1CWKp5WShu?SquH2EB&g=iS+Js_9`V8&CjR{Bo-!LliH zXyRCC3&$exc6(xtc?Ve>7Mi_B%+m@siAUlUzkav0rN?=BI2Pub7o-1tFQO-NiQ5E8 zm#hEsN}d>rOx1D^QmS`|RzX2%NJV_98B@a0l{aeF9*#C#$X0a8!JQ$@Grr_g*`0WgW3LTAFGiv;wpc+HpXF_qNtd+#F@qaBE z=eo#eO=~{0;+GihE`UKpUu%}?I>0eov!TZlpFxxp$c^h}=#foEz3=Ynu}+OT1)d)7 z)_OcObo~X;qi?}cpv(t*7YZ!1658p3;Hd148)>b$_WO)PLjnZ!D4B1 z=x~_<`MQ6xGW&;y)<%Mn>?C%BX1dp7%wtru2w-2xAX%7{NZAx@kfG6@CGq9xjfDlG zONpGXBA;jE*nxr1l;3^S2|{d#GF+ZSJt5N>ObWu!6`}nR+AhWb%rV05dy47}!P0V+ z3afvdX(OqpX*W?12Nf|@VN7xv^@32_cQa6I&Js3-T}lckJC8{!k47QyNX^pBp*gkq z=t%9ucOE%<>BS6k{53og{-uAHMpCb-ytLuX|PFF<~#rfFaDH5X@oDh+okN=^@N=6DJYq;Q$s zkKruzxO#a#^musKQm#wgucha!Dk;$K2KvOpujb8xm9+V!#meui<~b2aD=Z%XN&lZ~L)~E9&T&Z@_)`cErljF}zEdb#$!U8xhF!Ine0?Yw_c= zVjk2n+<>o20EoaulP)l;g-_F2B*k{tU?RALq)-{!kckLSuGjG0HEDWT>y)S*j zj``Ca{iyI=ayt0_Q1LC66dft+k?hV9Lltg9lildq5Zd5*x)mdl-v66RacK?nA3Uiz z7o>(MwC#@64`;FD_HXY-kmTzQ<)DxuVlMKA5yxXYV#que6-L?}aSYHH-1Nd4tkvs7 z#CoqOVUs(Cta@?rO<@Z&pa>qFWdHUHR8nN4Tfj(1J`%wv*L(6d^f$WFhf*W53<9qHr4e=rrs=s zzQsvnHt}atGJ})ddk-?l7Y5tAAJ0JtCCc~Y@HVX1eR-cfAP4IylZ)EQ&z2)dA-TDO za5i$7+_OvK>bD0%WnJ0gdSu+$&xmpiMym#5d}>v@^5%`>?2_bUz zr0kzd??0K*Y}|H@JbAtA-d{+=mrjs;EA#wr*z}W*RCGq>xuk^8_BS;bu2F!Vhk~GMfBCpt>k?B$@5y`p&|??pB|T8AvA=Jj0@YA? z&ClqL{>{z8UNYktbMeaTriS>0w3&I2zc2VB^77&1*|ehoR0=n1dcK zA!B2n-!GLXja9}<0I}7IgF+#%j+eBCGB)PHCi{Ty_hAl7_mvR(8D^Av1}`Zao5u6haS-Q-jep2u z<%5z1T&n~H|hYMG>q zm5N0Abd&SOcpfFfk*shQdfWJRg`O@!{Zz(k&w@I(w{|$#O8e15qH1(bSa85U^c~+4 zM$|)2UQMdak%?G6vB|;TkJ-1rOoDJ!7EEd@8Ruv7mHcRxAFvX+g)t4lYXne%+}Qm+ zmd7-SJg4?e6No_TcI@X6r&?FVpLFYV?Da^TG1jl$VX+H1Pvyhnf<@9tMS|@Onr##| zq+Uf`KTH^>%*okM%PPUx7n2t4^X@$i0Xr>T+J_jR=8!Dsr0nPJAOSl6l;efHJ(7X! zu+H&zzGU=%q6}he7Fob}2J00oZ`#DWF;6;Ek~o~II?*M#4}l)vzYHaN`*G%yysZEQ zdb+HMF9&p_{s&#hZ6T_;f8Y36{0ZGW9^}paqvQMHPw3_Y1llb=rMZ7(sAUu&MUQt5 zGUpE-xq&&r5>5&)a2|Li{d=G_ zVY9Yno*=svvWG}?IC~Ei0Gm(KaF@W12MQniU$EBYaa8)CL#YBCP=&t%RKYIpw_BW5e}{8~zG5N>0>S1iTl3H-^m> z$iEB;VLwNhUS0|boSuzGC5c#vP}%sd?82=&L`AdbK+<6J$`PtlZ#jaw*zbQ&GV4Y# zcxK|{H1fqK3-3*yPQ)z6HU_u5Q4X{JEHloX=xn`1xlL+1j~!~cV;9E~JBIwcIr5Bq ziGvo537YcG-lp7*EQiFZBjz2c3)xfU6s3JArN`Dk<>E_W94KX(^&K^ubVnWg^V`fg zb_ZVC>>bhCyL)S37An9jlw;e3SDs*qHTCn3KxSG(-I-|#k2yASe##^uG%h2PPJ%;Gp@G@x^ zc@1KqVqzml&!Ad~eN=tzD+=)OM6^WiO<-PwuX+k*`(xfWwg}LkMtJe9=xiL?=*aIP zUre%W^OCS?G7!FexYNbGC2mjqGhc6NPrZV$9qJ$-Zp#UuUhv6GqMp5GpTP_{9#yL? zqPa)_(VCj5PFf=05(_~cPxrN`Pk9jw_lG=-`{4aNNxcm*F)p6gEY~TPdK0X*!ydX8 z82q$F=&X6iNp$0c4=&(3-Ki2|-~|s3m$*6=+Xi`kzQmZDx{+)DgWU2RTudqo{c;9|D5FZ4C^2Nx=_Ix~^V^*A zCri~EHJ#ovxKnvS+{jj}Fy#mlj&zyDKgje52pqj1xPk?**6^M)Y~y)u5Ret9ehD1? zAGm`JW271tfijV5u)R0*+-O-B5miH64Z9aq* zkM1<;hoaI>K0o?vKHCi-^G5gbyE6k+&|vHb540ZpJo06CV#TqchSoZmJy=s2gYgQ% z*b_*Lye{(yl)<<|Q7eNn1*SJ*QK}5aA;R8%n~1MB7)P=|+F%@RGBKKgJYoiPCF`Xj zd1}u@L?t5Xn$_|Wo$Wbi(@bTFeMbR3HJ$S#l`8~4o(Tdr=)Q*=5hZ3DVR56T0yWX(59V9YG@ceC+*&JS+pw&A$mI zn2tSZ;reNkTydXF=*IhV68)A$ya>nMD&%q(&NWx6#^tlpeu7w7X+I=UPAd(rE_OT= zD`rsI4 zorrm{^PiXqgI3zA&!tam`Bd5e(`LWoMu?8y_SMaP;SaoKKOG6Y?r`G&VAMd#k0ck} z7YbNu==m4i#j!W>dy&i7j9S%#Gd3goq>K$6sc}4^sBFfMuyG?cBm5R(Gh$8_oADym z*Sn*R{Q_u|nOudrJZLapyF*4(=c#@L9SAWA2~?;+Y&E>s-)$@-nAbE78U{=VfJDrm5P+Mwg44}$Xkp94wv{+ zB6Cp3opKhFxb`>%Wl0nrhgD#Vz#y65hZ{1D5h5KSv~~j&WcKQCG7t&p_oy8-e9!^* zTRu3w2TKTwrzb&g_v{qC#IJ@K0rjjJEYVLT5%(g+^*8DJqDh?6c?idKVfP2}k=|ML z4sxJ1`pqv#oBTxwXfL*J?T#Lad1{M!N}gD}jYWPYMSbp;IlG7RdgiTGN>E-Nt#MA$ob=J%r~yht6A&o95r6GgjV zj9v>_I%G%vP)cP4&}({e&!LO`axKf!vVfwtEW+O+MNHX&U&f%Lr5*wB87^jMoKAfu zZ{ygdUUv66F~{8w^DnaN%iaRFX%RXroF=4oz^n_ z)FDPI5(!@2L~3{#8+0{S`?Bapj2kWXL+aIWL&;ZlBmLTn+WQl&TyK`HWf_%@F1Q8n z5PuW=L@h0P3p=Bhwdw_!!XIC!B+Jy|crf9yGJkLJ6f%z$s{e5N^>!#P|87Dz_?+oui%^sDcf0K()38Djb7)l)Mzx%N=eXE=)C2{jtQ zDRqnr`#1M5N#IpYlwRE)I-ZM^e%xRPH#6vxQ!XrF&2^+!p(FMd38gyvqc7*wS@(BX zP=L}|c$irO&F&Izk^nxDVUpYm{X(NT6W3g;_`k9-Q&ux8$Z2ui1Z9^-8kw5GCo`Q} zH~~Rm#WAftehC=wEd=^}RG}@9dNX=2JtfGy&vtJU85z2F1yXdAnm^9N4e+>{RlO!% z*oH{wW4@`Z4pPlio~f%vRjx>gEq(irERL?9BP6~OuzSTk492L2z4$ua$I-kO%JSO5 zw*YTBcY@|zNi!;jpwumy=L`rXg1nB_1jCg+*i?SbkAS`Hc29 z=kccH%c)1v3z6_I*Rb$nopWc`evdF}yA<1+az^|&8u3b&W3>n_9J818u|*d4J;JH* zE(Adl)McS-JB3iL(ah&d_cxW`gI2g{lZUl5*N$g$&nkmha-LcC!()6r5Jo@I^bI8GoF8640y81JmImnyKM`T}^pa4UfRZ zmhzf=L1dSH*S+v<#LL|BFz*gBwRqNmwgnGBja3fs&9hk5-oD4CV|@ou7sW)P}7 zwj8@|jiBl!%hnXAaL*%gnXe>`aqMzMb-JHwN;cJjj(xPEI>JvC@>8K6(SGd1nZNz{ zRVYOV?)YPfUD(2rL{E7SAPVz7(&@4KZCGPS^_t@TTLfy3Oir0p4_cJ?F&ZP7&xHcF z0AYIF69>QEnqe+_fBaZsdW#|mLkzqT?buf%uhh6giK``FY6&CClSoLuhqX%1t`e!t zM{%E~uoT5*isC3A#rHJDdp8S@a}`Ctk7A9ccv4Z!P!t~`FmhCDiaQm>EJd-^M{&NU zSgk1X6vf>>iqka3If~*>S4wG{d=!&3#bibC8%1%kkK$lWv6rIwrJ|VbqbSrAeK$#I zf21h(_fhPwDSoRczO5+w5t!0in&Kfvu|iS2hv4Z_)(a}66TV3_h4WR^vy6h3EKxsG zQKzY>`xyndy+qxjq9&`TB!lFXznr8Z*K#H6*e9yUdKLMmj=V%g?xiBrQ6@^lsX z(G_5XbI>aC7dmo+itJaB`>Dt~b!35x{GE#2#UMGQMMr*0y9sx20-Jg%gg=KK$P5a{ z3iXr^C9t1Cusk0I*dBNo+yL921S7FG3J;Y;qaILcn;EDT;)WYQgYicqfW(A~oA2V* z`N(m~m5O{GgXH{Hj?Y$jzU|`fq(iourN}GKe|g???R`M6 z-XnxB%+3d7UJbM~g4r;6hZX=!w?&&b&6>UBIH5HB|p94F39+i(x3Zf5}?ltl7nm z3bXE+J&`^&%aIx$kiq@Ksb+A0YaI4&WJ-9N**pXKfz*khZE3qE3O?aq|&J?*NUD*+N%B&U=^Zd9{qBy}iy3MQ&3aH-djrJAOHg`~!)HijnBuS7y^ z2t}BkYnhAuLv}qPoo;wE&bF+aigbKN&A@HI$FMTF9)h&BH=GY4ErHj0SvpVcB86?iK?8Ipq z;hmkjU1c|&>H72s`Z`@X&}NE*Z^eR_UYn}jgr9tX!Y~7~U*=^+7Ubm5N&zSzwq%-1 z)L=MR(yTPNHK8x*%m(<~{W818}k8~=gts}~3;D#0_3SxJ=iNwg z44}+KY`ZnHW!cA(1gvkve(0CSv^|A^-g@~^WVb&@_GsFxGhV1J6|vomSb(O7evhj? z?Uy~|JcSG#nYMqf35;jOzROFY*-!)P3{uaP_9}zWvzfirAoN6M&o>C!tpkrzjmYX? z5sntv7hoLJaMK3V=Ac(m*tSm2x#k=s`5PBE)Pwn^4E!N7;7`PLM&btL2Nmq!8ZsP| z6-qVSU-XpZyHT%@_F=x>CkQhxmsUw#=pe{^sLeY)iUDQ7pO$@yhKUf z)Yi}UxIj0Mkn?{+)2iB|JzgMbo$g-Z39|RepgK^$EUP^vgL5ss6swNL%FXD9N9gM1 zTKU~N(i+Y$3zXrk2k~AxTnrCvkVX7YKqmQFY5UepQeIYOugzk-G7~HNF-rkEFSzq= z$anaXn|)3ebu>UdRjASFWQl$Qmgrddy7r-2iS`a88fp?@FM!#=17rWS)?eD+3#3ZR z4!8|)Dc%ahKO#?W%D9VoAVE!)5abBqV#$AW7JL6w+p$^q9c&v%SLrMx!{hM zzC1M$R7?D*#YE4Z=e*qfSsrunyM>qooj+aZ>K=GDZN5$Z$%)c zx^ja+Ggn+qW`&1K{3yml4R1Il~-(WR6( z@RE3+X6ET_!XKH=ZUeE0`yVI?xxcy>at}!YdxJ2;oir%9DazU_O$!Kbg7LmanQu~= zpWQil(^8ITC`R45JAY4#h|MM*d5Rwg#yA33fbm*R6ngSF+-AgbA=2len*G}@TbrPb zCRqVIv4`m6jZdQwV&Tp89ygUchc$77xLZKi{sUJk5G6ev2xf{pYb7Nn|CT@U0pGbG zjsC{DeP=ZQu`~;W#3Eb6qH>44m5`Gw-MGBWVv{bS#HlDIV7}%#GC`*<% zm7KjSZv@iBmRsj8$Grb$1n=RZ@%-R&XdE{%$dcH(PULj$`=pZng8{@OU_($qXEMBLt;`%@nVb zh;XSp>WXDtnX2-7BuhXtT#-!gmEI{w&8Zt4t!L4knJ|S2lazIhY^J;RG2oWhg}VbK z4%w4(dhedN0|7Cgb(?$+%E z&YhmcY@*)&;J1X!l&uojcOl62X4VVn3T7(`jY+M&v`P~Xs65oF&$RZ$^`4UPK^JeS zWS=OKb)@b?f9Cm_=dt|z^Je_1=;C*%)dk(ybSj`Zi2C`$BDG-wvl=2=Bq|a4`9!l^E_K-CDN~ zV0=gAo&6Q5lDNY$vJ>WlGarf3zQ6RUIY0ZlS&1e`F0O%QxpalhT=?BsJ-`Y?$*YBrRtq%3BcBX`*5;u+XrgNPjHK8J zV`ILKhbfdJcZTClv8mLy6C3w+2~E+|aD#*#b&&9wuS;kO>4-N13BxL3@z*6Z#Z}`K z5|*lj9Ouvm@KyPLN~`nQiW5P9@)~7Q_Il;Ej20WiXPO(MXp)>_((GmU{>757YKZv! ztdM0j#@Bn}KAr0^3S(si|I7!eAY80oP!O_N8f~G?tVpHaJ9q8k`QE`7nNiwr#qiIg z@&a86$UI-bogwKG7!WxbqVoY^Z>|JOUN=nF^1TEc`zH*vdO|Swls=@*-}nvHNii_s zRoF%-L{Cu5nFjrAWGZqG7(4cP!o;3~z>O8V_LRl)U4qfb=48Q5cI~l(i^n`=*oQN! za5(T%(}jBz#uU*m&xVeAqH34E$HhiC zP7uTCgs)G*BY@8T*cfn`2`*1xGoWOf0ajC=<)_5`x8geX6y(~Bgk*^C*+o(f_vl+= zcVGD($pr-~x(u^-)V(P4UQIo0)AfkPKjS3+9XRRpLK~=!E9=EMn~&LKL%x(NvSBRS zFqh5;;*1-UJMzItcm8$-9D`_nwI#Aae;WaGoBVW7`sfbhb4L@?@JGn|PNZfG95{t_ zj+|ByQH%sGCOrWrGe^yd&lygHG6@u?BF(8yMNAb=TNN9*-WiN)7^r&3F^wWr=@gFw;bHiZlFx1vRR$R<6hzqo%~cTf1c+{PP_hJo zP87&|oDq1Y!EAGg!W-Qxdf)?|C000nPR921JoVhKnR3m=A{QQIJ^2L7&9-~TFQx4s zO3M)WWW_&yB=rcQIEWaDyUNzKB|r=7vd}&lLqtL7@j?p^OZolj#|l3?$gLt03ZJ@& zM4VT|7(WXqexfwL-NIjG$4pT%ec<>V#&G#f%Q)p7kG%d(8J=Ag+sEMM-98HKP<+mZg27jS zG!JK`xyMJ4kJwuQ`#pMVv#3`FsFw=$mppoBWhLTAhK%6MVxmdp^XMIvl_KOzF%>BW z&i6ceJMoA`;YSGm9gp5~LT(iFxIh_?-hJfa^XT0!@uOOa{&zikl_VCA-g%PRc=XN? zD7Qy%=AVq?r31T;DCGW3fG*I4P1=mpj0d({`|sy54oh85))-4**>S0h!|7}W$~i~V zZZ{%&Cu(%|3ifv@saZ=Ze@)^S;&JiDw_=Pj-N^7ZX2|Qvi?LwEfqiVssA1;whh%-Y zpPNX*w#mAy!Fe8nS0Qm!Nt=;REJt!v@|9@$xGG~g#A%VBd}3@4qv2_m*z(l`lvuoy zbRpQEEbv{ySO9r3HYGrTb=qU$qUpHLu2c1G!iP>jDpBCY<%iZjK40E$SNR|4!;g@!JuCd7S@H4oX<=aN6>7Bv=~FJR$Z1cRO=j9-Szn_|*ncHmCc zSPh$_8vH_>U7(O?<1q5+Z|0;qR$7VjFQPf9w%w5$Xp_dGJ>8sHQPz%B4Uz@6l;q?D zS_+m7L*%*_^ZNa7z0P?V>sT9rOn=ePX??saP#h%ul7ZcZIXE(>4Yocbs_T~12I%yjP9M|}Tn$3&-QH<~FJyX+baI^*!O?&|=A&0j z;=}2I{t+u@5#st8`uI=IBB)fdnawqqu;WfQ?ts91{VQ=Po8*6VWaqXN2Z=1ON3YoQ z_h0m+OByw1cBEc@S`|7y)+-C7#X*G!P!z?CoAC}^y}BfW98{360(SdPCGc7ko=V6< z?&P&5ijf>a2yVCc<*6O^?yTL>BV`u^oXqh9k0-yMydxb`b{3_hVsLi`%q_YZZ}%5r zJ8bEr=kIFXlILvOmfp;o!U>CiQ*gY>nI-sk@0@^~oyeAV6}u=)KB&Cg(;NI^(eL#C zOsteAmO8%BmnUZ!22<)Q94B%Li8&T?Po@X_^hwo9^pOL6$+@NLbN{rgzTZ7qud3Ba zztpSddprZZ>M#D5*dMxnA5*{TJdT_!xf*w>NPGOxdXw%RJP*WWE1FCxSC;BS&;|C( zd-HoH=e6S#(^CEKtk;!cFpqXVla3A|~3Z}HW|A4aU zPW~!Z(0C(TzS~PQ#vYXwMj_nhkYd|b={h2>DuDF*Jw$j~)@hHgqNTYbu;S2 z7Y+<8Z7n&sEIH%csn}~gXSVZt$^6;Q-%93{IJ@RYlM{Gya&Fo9&-vndYSsnFtNrt# z@dGBl9XiA+b3Q3^{!;4vsbpaE`_blS^P@Lvu5R|Egmz<)LHUk&{Kq=7tstm`X&O;%e^Ut3d8U;kGS z`J$T4GuImO!!qwHeggvq5_^rN8Gt*GKXnZULls}u&`{TKOi^V;ZEan=sHU!BNzu}} z+W1LDM~-bg5=Rqr#23|9#N$;Bwa1RIYU?CLQDc2oW%bhPswKdY1$b62t17Bmy{sb9 z7#B41&*oQAQ&U%25w9w$tgESOFnLnWIFc@{ZfJ}v=GC=D#3+_4z^`a=l}K9!c^m3h z6jf*;;tkccmq3EbWfcvLRdK7avZAJ9aZMF@`hSZX>MpISwdPhNDywGIEvbq%)D@k1 z>Pd~&S5(cIh*jK*y4t$N`ijb`3`&w8K3RU&;gjTN9llt8*5Sp)Q>L7FVkWGTA9t+f z#}Mk2e?;3Ns;X$LssV}ho0mqOV(70b zzsfqf{ABBb@{6nsE}CJTJpE*A$%?Al#KML|tuN{g0N)Gn#1YBx;%V zT187Ms%xrnrbDf5NZ=eQH@%L(!`0 z+9h?XidIzAR$KzGy0NIDrlG20$>l|;v|2RS5!Qs2Ou{n-BdkOt$WAH(Ty(*Nl^2b$ zR#h~R>ZBs{HFlVqs-nh3eSKX+e1ytKci+1Ds@kF@)s6Kv6_*=9M4FycB(VBUVOz4S zrc>^`gTE&L^S9%ayaR@QYx*$D;+eGiGw?wxJlD?|7}$ug3E={SRdWXhIuZT@VG7|x zxQsjB#%9L+fq`QXK6wsYCA}mArD8d?q55RMABf?FUNRRN?B}k8O9l{+5A4fP6pMAK|SCPsb%7k08A0yGW1l37r1hiLf0f z|3;6rtX&8vBV2tu(j)v3VI1Kr>yaMe3wIzr!rSgddW4%dAU(prARIjk?czsBk8thX zNRMzVj=;nb_Tp^ftqAMzHuxh5A4T{o!sQPjJwoe2q{rF)4-rmAcn0>0=OH}jXGo9m zz=x3@;k&;?dW3b4AU(qK9z%MB2S1MVA+*o`)86?9M_Jrq{N)lttazqXF-OoPz-F@Hp-gn=1AK@)NXa{r;^n_0Mp@X2g$9mo*=y2$f`{0LWcEJz5{BQ6>*Wl~Oo1q^- z_dq*7g&&&OuTZr`M1B_Q}4zSDzeReiD9S7b$gysp9`WbbY)w zq<%*UW-54%deNMcXztjfk6e(w#Jk|c^G+W+;HSC)?Jvg9=3kiQS6!x)j)jlHcy}S* zDqT<%&1s5^Iw~u28+v5;ViX@SL8+%4{a*ML6>zQy62EZ+t`4%dDCF0~!MvHS5m zz)KFp_4K$1{EMJJvfs8J1Mi3XNmQQ$Jcb!Z^wAak@q=e#wHsfYPxHt;>z@XGIXFHf z6X3tJdPT%Th${&j}OP_zyFRq&BPevRR}NcU0yXV1N;b3W9z zk#SB$*U~&Q!}BtxDfJTWg=xOEH~9eY7TnXG0Jc1`-VdVv#o%XGDs`>H7g|0O{4Q`T z@2CCsKKA1;1Ah$so*<8`vi{$J51iHWF@71mKlu4UzX|WfQ1%h{1>jN46>R^3)9KO`@ z6!xcLKrQoN6PYLqKWZS``-@!4(2=O1>0{-_pb~5bMW_rJhI2e&qljXT!%mY=ra9Y!#u0b;d3lcfj5Eo5ArEK_V;fq_)Ul5?cgc! zZ=C)eu>I=-uecHS(O~gZ-Orf@<^R+za9LvRZ5-gjQ_;+_`&0MDfOV^zt8%!@f`37xcX|%cCDZ z4n6_%?q!bO+=%q`qZIrp@Dhg?+4hs*?|?t;^lzi>UkbeDKBbx+{~gxf3jPszr^7$A zydC_})k;-3e46E5;GcpY>BP^n@w4$9^X~nJ89(?EJWssf`2S%2rQrP^R_abC{t6pE z3BD3s|7HL5{@rW+Dex=TD)oxv-)8--;1N8xOn3N|mbZf!ga5>7Ki9V31zz-sQu?!2 zHh$zz>(9n>*kO(4mT5BeSWoqdmHeTOXvJ-vgcH< zf476L!}DfO=T8^-#AmQh;f$}39bYz{gGb=`biUKSxwe0C@H@a?bk2|G?DT`JS&|t>Agvlqz@HH#bOqeA~fm!LM+}S7yi81+Kp%{G{W5 z%=RxE&+#K(JoK}eZa)tG2KYM6Bkb!Zqs5;i$52!XetCOnj*Mru$XY*y{~D=AoqeeD ztg{c>>^@u$e#2|{av<8XF(PJ?rTefRd@uMohnLtf>;TWfGyh_TFR=V$@M`eS9R7F9 z`(iEP{MVK0?VMwtJ;w%t{|svfa~yxt`p1LM1>flKb(U9yd%Ki6$2msB>@ivnegf7Y zuq2Qk|3$vt-+$}D`+~=Vd`6n@06!MIr`O=e;ChYY%b-8v9q;sf4XOq|2<`>Puls^jjGyJ&|E^M3>VlEcoZBK7Mssh?7#)qR z$Q&JwFYjF(&2P#ojSgShXG}CPJ3725nqL%+kBr7fMsrbrWHj4D6P{ihI)HX`nD5i~ zd*J_R59IiZ44${spQw1=xqs<-^!oLokaUd;da5TcBGwDHcA5A#?J#7D9rdyP)g4KE=a(@;Nc5um4a zI^`PiWEod-SeN3K{x~sGMDj^#NUy)@gvUES9WR<1U^ZBOHNNbk6Z@Sb{ljB{pBVou zWyZs*2PI!Bew+vXczIm*Oa2n+_?MEuUE2L$%SQcwAP$iV<$Nd+EfcL2Z4_-1Z5C}2 zZ4=!tx?8kUv|BW5hzZ_Lbf9RVXo+Z%s{5I*|HIna;{PmLWlKhR5KOp&=CGSzC11m!Lgp|(} z-Sw#1n08z*f1^mskMd_Zc>EH+Q+Pu7bkW~zkPVT9=xot~Inf;29`+~2zx5%r@%oPO&*`m%$$HhI0seDcl#p`n zzs%R9K!p4V*}pZfxSZpgA;k;*H_6g<=x>mslOHr2x66H-yfVbsgt-4qjym)&3Gw+M z|FjVICp7{8+z^k2{F3!JKJqCWNsJ~W%j+5U504N1#Cu7e z?bH8psC{z!$;1A7X>W3?Y=qk9`899Rq4{(v{^U}ZCnP&qboLsvfqAHZMkS=&KN+!2 z-doDq|FB=MJw9PSUoQ!%DAOg6$A{zB>k>MVzyE~ElQTX!k01GHQ{DQLA%8-+OqXo@ zh?FxvIpdQvJ~`u)Gd?-vlQX_dmu&pZP<(R6Cue+e#wTZda>gfTe3>rU_?~662FIJ~`u)Gd?-vlQTYf z!ZYa{QI4Mr4~$RF_~eXF&iLevPtN${^v{#{C*CF-BE3S&`x|SKbDe;k_dk}i-UFNH zG)m6vLHPd8a%y<~l!;~%_+k5RbN+3b_sHoF-yg}@kE}bz7!tN`k57oxZ;wxaC$LSw zJw72$zdb&}$BY_vZY*A0F}y!9E?ZTS+g>#HH z)EUxPQCDA8TjOM=g4I=2murJ;&8=?GA*=8kn|ZTpvC&X*HGWs36qRac;#1RJUPW?h zWnKB4imAz&XoNXqomyU3SH93VxUF3}78>yTRX(R`2KrLlpu?cVZ*+Qny_Ywmb`C!H z-VoTK|HbB!@akj5^QBcbs9b+z2p(7FkHLms^P>M{*`N+!MNxhJ1=B!eg8nY?Q)9u( z*be*keWn|0V2qzFCl;00q2AIC??Y@>e}+r%1NymcNWDx$B)xp7$4-B)E<`H9j}A#c z*CDA~chq%t3h%#*P==|O?LXJ`sGs?+^g1WwP_F>jYlh5o-H@6u{&4@L82@h6>{I%= zZb{|3WqAK_{Q5N1$7G~5$aPRE*G;uwd&2uqKc47)qWkA3c3AXymWzgu|3Z`p{W0-T z?Lw{ib3(c-?3Wv7OqBfRWme!lpqFRZ51DC4tqWysHUaw^x0SwB4fd&JM< z=XFR;QT;uJV2TAZ*nSW{y8rZV{K!hDGbQz+|g01W!~cbVGM+#d$r>EqARE!c?S zhxY@%FR=e>Q-k}N^_i!>0&sM|&-V=u{D=Ns@aq0Ez9-M2-Zv;j+Gxc7j@d1<@c~4i zyYzGYd!zVcvSWFEv)?=qQt$@j?>t)P@P3j!-^cx2`WOAweLz9KC+}OBQhaBF9g`;L zqwWv+*T{O(nhevAHTDf1(?Cqxp>$(Ix5Y4tnDHf~ANipZCPt&^S5WQ950%q@YN*__ V&e4U&9;iD@;_E;08cd literal 67600 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 = 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-fullgaps-toggle-20200830.diff b/dwm-fullgaps-toggle-20200830.diff new file mode 100644 index 0000000..2e64b80 --- /dev/null +++ b/dwm-fullgaps-toggle-20200830.diff @@ -0,0 +1,148 @@ +diff --git a/config.def.h b/config.def.h +index 1c0b587..b172f63 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 Gap default_gap = {.isgap = 1, .realgap = 10, .gappx = 10}; + 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,10 @@ 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 = -5 } }, ++ { MODKEY, XK_equal, setgaps, {.i = +5 } }, ++ { MODKEY|ShiftMask, XK_minus, setgaps, {.i = GAP_RESET } }, ++ { MODKEY|ShiftMask, XK_equal, setgaps, {.i = GAP_TOGGLE} }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) +diff --git a/dwm.c b/dwm.c +index 664c527..25bc9b7 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -57,6 +57,9 @@ + #define TAGMASK ((1 << LENGTH(tags)) - 1) + #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + ++#define GAP_TOGGLE 100 ++#define GAP_RESET 0 ++ + /* enums */ + enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ + enum { SchemeNorm, SchemeSel }; /* color schemes */ +@@ -111,6 +114,12 @@ typedef struct { + void (*arrange)(Monitor *); + } Layout; + ++typedef struct { ++ int isgap; ++ int realgap; ++ int gappx; ++} Gap; ++ + struct Monitor { + char ltsymbol[16]; + float mfact; +@@ -119,6 +128,7 @@ struct Monitor { + int by; /* bar geometry */ + int mx, my, mw, mh; /* screen size */ + int wx, wy, ww, wh; /* window area */ ++ Gap *gap; + unsigned int seltags; + unsigned int sellt; + unsigned int tagset[2]; +@@ -169,6 +179,7 @@ static void focus(Client *c); + static void focusin(XEvent *e); + static void focusmon(const Arg *arg); + static void focusstack(const Arg *arg); ++static void gap_copy(Gap *to, const Gap *from); + static Atom getatomprop(Client *c, Atom prop); + static int getrootptr(int *x, int *y); + static long getstate(Window w); +@@ -200,6 +211,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); +@@ -639,6 +651,8 @@ createmon(void) + m->nmaster = nmaster; + m->showbar = showbar; + m->topbar = topbar; ++ m->gap = malloc(sizeof(Gap)); ++ gap_copy(m->gap, &default_gap); + m->lt[0] = &layouts[0]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; + strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); +@@ -1498,6 +1512,35 @@ setfullscreen(Client *c, int fullscreen) + } + } + ++void ++gap_copy(Gap *to, const Gap *from) ++{ ++ to->isgap = from->isgap; ++ to->realgap = from->realgap; ++ to->gappx = from->gappx; ++} ++ ++void ++setgaps(const Arg *arg) ++{ ++ Gap *p = selmon->gap; ++ switch(arg->i) ++ { ++ case GAP_TOGGLE: ++ p->isgap = 1 - p->isgap; ++ break; ++ case GAP_RESET: ++ gap_copy(p, &default_gap); ++ break; ++ default: ++ p->realgap += arg->i; ++ p->isgap = 1; ++ } ++ p->realgap = MAX(p->realgap, 0); ++ p->gappx = p->realgap * p->isgap; ++ arrange(selmon); ++} ++ + void + setlayout(const Arg *arg) + { +@@ -1684,18 +1727,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->gap->gappx; ++ for (i = 0, my = ty = m->gap->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); +- if (my + HEIGHT(c) < m->wh) +- my += HEIGHT(c); ++ h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gap->gappx; ++ resize(c, m->wx + m->gap->gappx, m->wy + my, mw - (2*c->bw) - m->gap->gappx, h - (2*c->bw), 0); ++ if (my + HEIGHT(c) + m->gap->gappx < m->wh) ++ my += HEIGHT(c) + m->gap->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); +- if (ty + HEIGHT(c) < m->wh) +- ty += HEIGHT(c); ++ h = (m->wh - ty) / (n - i) - m->gap->gappx; ++ resize(c, m->wx + mw + m->gap->gappx, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gap->gappx, h - (2*c->bw), 0); ++ if (ty + HEIGHT(c) + m->gap->gappx < m->wh) ++ ty += HEIGHT(c) + m->gap->gappx; + } + } + diff --git a/dwm-pertag-20200914-61bb8b2.diff b/dwm-pertag-20200914-61bb8b2.diff new file mode 100644 index 0000000..c8d7fbc --- /dev/null +++ b/dwm-pertag-20200914-61bb8b2.diff @@ -0,0 +1,177 @@ +diff --git a/dwm.c b/dwm.c +index 664c527..ac8e4ec 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -111,6 +111,7 @@ typedef struct { + void (*arrange)(Monitor *); + } Layout; + ++typedef struct Pertag Pertag; + struct Monitor { + char ltsymbol[16]; + float mfact; +@@ -130,6 +131,7 @@ struct Monitor { + Monitor *next; + Window barwin; + const Layout *lt[2]; ++ Pertag *pertag; + }; + + typedef struct { +@@ -272,6 +274,15 @@ static Window root, wmcheckwin; + /* configuration, allows nested code to access above variables */ + #include "config.h" + ++struct Pertag { ++ unsigned int curtag, prevtag; /* current and previous tag */ ++ int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ ++ float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ ++ unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ ++ const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ ++ int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ ++}; ++ + /* compile-time check if all tags fit into an unsigned int bit array. */ + struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; + +@@ -632,6 +643,7 @@ Monitor * + createmon(void) + { + Monitor *m; ++ unsigned int i; + + m = ecalloc(1, sizeof(Monitor)); + m->tagset[0] = m->tagset[1] = 1; +@@ -642,6 +654,20 @@ createmon(void) + m->lt[0] = &layouts[0]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; + strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); ++ m->pertag = ecalloc(1, sizeof(Pertag)); ++ m->pertag->curtag = m->pertag->prevtag = 1; ++ ++ for (i = 0; i <= LENGTH(tags); i++) { ++ m->pertag->nmasters[i] = m->nmaster; ++ m->pertag->mfacts[i] = m->mfact; ++ ++ m->pertag->ltidxs[i][0] = m->lt[0]; ++ m->pertag->ltidxs[i][1] = m->lt[1]; ++ m->pertag->sellts[i] = m->sellt; ++ ++ m->pertag->showbars[i] = m->showbar; ++ } ++ + return m; + } + +@@ -967,7 +993,7 @@ grabkeys(void) + void + incnmaster(const Arg *arg) + { +- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); ++ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); + arrange(selmon); + } + +@@ -1502,9 +1528,9 @@ void + setlayout(const Arg *arg) + { + if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) +- selmon->sellt ^= 1; ++ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; + if (arg && arg->v) +- selmon->lt[selmon->sellt] = (Layout *)arg->v; ++ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; + strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); + if (selmon->sel) + arrange(selmon); +@@ -1523,7 +1549,7 @@ setmfact(const Arg *arg) + f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; + if (f < 0.05 || f > 0.95) + return; +- selmon->mfact = f; ++ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; + arrange(selmon); + } + +@@ -1702,7 +1728,7 @@ tile(Monitor *m) + void + togglebar(const Arg *arg) + { +- selmon->showbar = !selmon->showbar; ++ selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; + updatebarpos(selmon); + XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); + arrange(selmon); +@@ -1741,9 +1767,33 @@ void + toggleview(const Arg *arg) + { + unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); ++ int i; + + if (newtagset) { + selmon->tagset[selmon->seltags] = newtagset; ++ ++ if (newtagset == ~0) { ++ selmon->pertag->prevtag = selmon->pertag->curtag; ++ selmon->pertag->curtag = 0; ++ } ++ ++ /* test if the user did not select the same tag */ ++ if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) { ++ selmon->pertag->prevtag = selmon->pertag->curtag; ++ for (i = 0; !(newtagset & 1 << i); i++) ; ++ selmon->pertag->curtag = i + 1; ++ } ++ ++ /* apply settings for this view */ ++ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; ++ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; ++ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; ++ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; ++ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; ++ ++ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) ++ togglebar(NULL); ++ + focus(NULL); + arrange(selmon); + } +@@ -2038,11 +2088,37 @@ updatewmhints(Client *c) + void + view(const Arg *arg) + { ++ int i; ++ unsigned int tmptag; ++ + if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) + return; + selmon->seltags ^= 1; /* toggle sel tagset */ +- if (arg->ui & TAGMASK) ++ if (arg->ui & TAGMASK) { + selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; ++ selmon->pertag->prevtag = selmon->pertag->curtag; ++ ++ if (arg->ui == ~0) ++ selmon->pertag->curtag = 0; ++ else { ++ for (i = 0; !(arg->ui & 1 << i); i++) ; ++ selmon->pertag->curtag = i + 1; ++ } ++ } else { ++ tmptag = selmon->pertag->prevtag; ++ selmon->pertag->prevtag = selmon->pertag->curtag; ++ selmon->pertag->curtag = tmptag; ++ } ++ ++ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; ++ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; ++ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; ++ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; ++ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; ++ ++ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) ++ togglebar(NULL); ++ + focus(NULL); + arrange(selmon); + } diff --git a/dwm.c b/dwm.c index bf5e321..2055553 100644 --- a/dwm.c +++ b/dwm.c @@ -58,6 +58,9 @@ #define TAGMASK ((1 << LENGTH(tags)) - 1) #define TEXTW(X) (drw_text(drw, 0, 0, 0, 0, (X), 0) + drw->fonts[0]->h) +#define GAP_TOGGLE 100 +#define GAP_RESET 0 + /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ enum { SchemeNorm, SchemeSel, SchemeHid, SchemeLast }; /* color schemes */ @@ -112,6 +115,13 @@ typedef struct { void (*arrange)(Monitor *); } Layout; +typedef struct { + int isgap; + int realgap; + int gappx; +} Gap; + +typedef struct Pertag Pertag; struct Monitor { char ltsymbol[16]; float mfact; @@ -122,6 +132,7 @@ struct Monitor { int bt; /* number of tasks */ int mx, my, mw, mh; /* screen size */ int wx, wy, ww, wh; /* window area */ + Gap *gap; unsigned int seltags; unsigned int sellt; unsigned int tagset[2]; @@ -134,6 +145,7 @@ struct Monitor { Monitor *next; Window barwin; const Layout *lt[2]; + Pertag *pertag; }; typedef struct { @@ -145,6 +157,7 @@ typedef struct { 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); @@ -178,6 +191,7 @@ static void focusmon(const Arg *arg); static void focusstackvis(const Arg *arg); static void focusstackhid(const Arg *arg); static void focusstack(int inc, int vis); +static void gap_copy(Gap *to, const Gap *from); static int getrootptr(int *x, int *y); static long getstate(Window w); static int gettextprop(Window w, Atom atom, char *text, unsigned int size); @@ -210,6 +224,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); @@ -285,6 +300,15 @@ static Window root; /* configuration, allows nested code to access above variables */ #include "config.h" +struct Pertag { + unsigned int curtag, prevtag; /* current and previous tag */ + int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ + float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ + unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ + const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ + int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ +}; + /* compile-time check if all tags fit into an unsigned int bit array. */ struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; @@ -690,6 +714,7 @@ Monitor * createmon(void) { Monitor *m; + unsigned int i; m = ecalloc(1, sizeof(Monitor)); m->tagset[0] = m->tagset[1] = 1; @@ -697,9 +722,25 @@ createmon(void) m->nmaster = nmaster; m->showbar = showbar; m->topbar = topbar; + m->gap = malloc(sizeof(Gap)); + gap_copy(m->gap, &default_gap); m->lt[0] = &layouts[0]; m->lt[1] = &layouts[1 % LENGTH(layouts)]; strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); + m->pertag = ecalloc(1, sizeof(Pertag)); + m->pertag->curtag = m->pertag->prevtag = 1; + + for (i = 0; i <= LENGTH(tags); i++) { + m->pertag->nmasters[i] = m->nmaster; + m->pertag->mfacts[i] = m->mfact; + + m->pertag->ltidxs[i][0] = m->lt[0]; + m->pertag->ltidxs[i][1] = m->lt[1]; + m->pertag->sellts[i] = m->sellt; + + m->pertag->showbars[i] = m->showbar; + } + return m; } @@ -1121,7 +1162,7 @@ hidewin(Client *c) { void incnmaster(const Arg *arg) { - selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); + selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); arrange(selmon); } @@ -1672,13 +1713,42 @@ setfullscreen(Client *c, int fullscreen) } } +void +gap_copy(Gap *to, const Gap *from) +{ + to->isgap = from->isgap; + to->realgap = from->realgap; + to->gappx = from->gappx; +} + +void +setgaps(const Arg *arg) +{ + Gap *p = selmon->gap; + switch(arg->i) + { + case GAP_TOGGLE: + p->isgap = 1 - p->isgap; + break; + case GAP_RESET: + gap_copy(p, &default_gap); + break; + default: + p->realgap += arg->i; + p->isgap = 1; + } + p->realgap = MAX(p->realgap, 0); + p->gappx = p->realgap * p->isgap; + arrange(selmon); +} + void setlayout(const Arg *arg) { if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) - selmon->sellt ^= 1; + selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; if (arg && arg->v) - selmon->lt[selmon->sellt] = (Layout *)arg->v; + selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); if (selmon->sel) arrange(selmon); @@ -1697,7 +1767,7 @@ setmfact(const Arg *arg) f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; if (f < 0.1 || f > 0.9) return; - selmon->mfact = f; + selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; arrange(selmon); } @@ -1853,23 +1923,25 @@ 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->gap->gappx; + for (i = 0, my = ty = m->gap->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->gap->gappx; + resize(c, m->wx + m->gap->gappx, m->wy + my, mw - (2*c->bw) - m->gap->gappx, h - (2*c->bw), 0); + if (my + HEIGHT(c) + m->gap->gappx < m->wh) + my += HEIGHT(c) + m->gap->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->gap->gappx; + resize(c, m->wx + mw + m->gap->gappx, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gap->gappx, h - (2*c->bw), 0); + if (ty + HEIGHT(c) + m->gap->gappx < m->wh) + ty += HEIGHT(c) + m->gap->gappx; } } void togglebar(const Arg *arg) { - selmon->showbar = !selmon->showbar; + selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; updatebarpos(selmon); XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); arrange(selmon); @@ -1908,9 +1980,33 @@ void toggleview(const Arg *arg) { unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); + int i; if (newtagset) { selmon->tagset[selmon->seltags] = newtagset; + + if (newtagset == ~0) { + selmon->pertag->prevtag = selmon->pertag->curtag; + selmon->pertag->curtag = 0; + } + + /* test if the user did not select the same tag */ + if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) { + selmon->pertag->prevtag = selmon->pertag->curtag; + for (i = 0; !(newtagset & 1 << i); i++) ; + selmon->pertag->curtag = i + 1; + } + + /* apply settings for this view */ + selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; + selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; + selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; + selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; + selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; + + if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) + togglebar(NULL); + focus(NULL); arrange(selmon); } @@ -2229,11 +2325,37 @@ updatewmhints(Client *c) void view(const Arg *arg) { + int i; + unsigned int tmptag; + if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) return; selmon->seltags ^= 1; /* toggle sel tagset */ - if (arg->ui & TAGMASK) + if (arg->ui & TAGMASK) { selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; + selmon->pertag->prevtag = selmon->pertag->curtag; + + if (arg->ui == ~0) + selmon->pertag->curtag = 0; + else { + for (i = 0; !(arg->ui & 1 << i); i++) ; + selmon->pertag->curtag = i + 1; + } + } else { + tmptag = selmon->pertag->prevtag; + selmon->pertag->prevtag = selmon->pertag->curtag; + selmon->pertag->curtag = tmptag; + } + + selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; + selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; + selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; + selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; + selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; + + if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) + togglebar(NULL); + focus(NULL); arrange(selmon); }