From 144fa589b09b4e88553351f6e3ab67a5f2fad673 Mon Sep 17 00:00:00 2001 From: Quentin Snow Date: Thu, 15 Apr 2021 12:07:21 -0500 Subject: [PATCH] Added more tags and moved tagkeys to function keys --- config.h | 30 +- dwm | Bin 61928 -> 66664 bytes dwm-pango-20201020-519f869.diff | 746 ++++++++++++++++++++++++++++++++ dwm.o | Bin 58136 -> 59664 bytes 4 files changed, 764 insertions(+), 12 deletions(-) create mode 100644 dwm-pango-20201020-519f869.diff diff --git a/config.h b/config.h index decd374..c7e0727 100644 --- a/config.h +++ b/config.h @@ -19,7 +19,7 @@ static const char *colors[][3] = { }; /* tagging */ -static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; +static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "T" }; static const Rule rules[] = { /* xprop(1): @@ -27,8 +27,9 @@ static const Rule rules[] = { * WM_NAME(STRING) = title */ /* class instance title tags mask isfloating monitor */ - { "ST", NULL, NULL, 1 << 8, 0, -1 }, - { "zoom", NULL, NULL, 1 << 8, 1, -1 }, + { "zoom", NULL, NULL, 1 << 14, 1, -1 }, + { "Steam", NULL, "Steam - News", NULL, 1, -1 }, + { "Steam", NULL, "Steam Guard - Computer Authorization Required", NULL,1,-1 }, }; /* layout(s) */ @@ -84,15 +85,20 @@ static Key keys[] = { { MODKEY, XK_period, focusmon, {.i = +1 } }, { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) + TAGKEYS( XK_F1, 0) + TAGKEYS( XK_F2, 1) + TAGKEYS( XK_F3, 2) + TAGKEYS( XK_F4, 3) + TAGKEYS( XK_F5, 4) + TAGKEYS( XK_F6, 5) + TAGKEYS( XK_F7, 6) + TAGKEYS( XK_F8, 7) + TAGKEYS( XK_F9, 8) + TAGKEYS( XK_F10, 9) + TAGKEYS( XK_F11, 10) + TAGKEYS( XK_F12, 11) + TAGKEYS( XK_F13, 12) + TAGKEYS( XK_F14, 13) { MODKEY|ShiftMask, XK_q, quit, {0} }, }; diff --git a/dwm b/dwm index 28e9c773cc0b8a0163709589245ddc543936554c..58d8c160c4844eb619e1eeca2d389303d8f1555b 100755 GIT binary patch delta 26682 zcmZ{N30xJ``~J+;i?{&S6a^H8#5EU4QBZGQ6lG9UTtITgHPTcxP)zHhxLqd_J7#7Z zu4(x-%QCGr%v{@WNo_N1u_0Wr#mtubf8IIg;55H~^Z9h2InTSC_pEcy8JvvoY8fkQ zmxMPQs+gCDgJS%(ro*-*Pn=){DlVQ@0ZzL0&<`$;`CEfukKyUBSwl6s8 zoATORy?oCzj`Q^$Q5AdU29FQ)%4h<)R4Ga4Hwhw2$)^k6W8q$ zK>rkcppEamiR-y+yeir$%*NLy9{DR#HopsesN{}-;!b4P(<%*nRzD;&9Oe6Zl7Z2W!exSv=XU$&g{ z30|Av_1RpIZR1-Na(<Q zTSh$E-}M<+kTszSgIF7{nFflIZsTi8X5+JE!EC(LFCd=!pUha+M2XGdWC0Iww~gN* zs=E9?_-Y&fyzt{Xcc;LVzaj;(76I`sghBd$@VPc#wtb0>mrbzS#@AWI=O3lqCXk)( zf{pixDZ1LmOZ{6mUOs$W=czb%YFg@toj1#WM^MwN|HB~N#>>u_YvW~!OKiOCTe~GM z@>jlC$0ID40-mhlt8ILd(05(nin0$$KGw#|fYNQemk$F)$+Zb&q$M_9j)L7bUS?2k zW(rvuVAlJs%6u`zy|GP~d^)IVVW>9W3kQr3lc$tCg zi~lHqjhFt@tvt2A%plh)053BrvGFw}u<#P4LfQ_#yKn*X(pUfb)M!+4)3`%T#O$ltg z%%I%HOaIk2UiFHHjqB_GD1nWa8Km2InL)0NuPK0ymj&?dwh3eg=v&e{*Qq3E*l>pGAR3$%V~e!kl&iW$1Qxgg)g`8F&6%U*COa>5mZ?C z0t+8i!4q^^vB1KImGeX$0G(#YE6T#tfr7l+3EoQvwImCSwHVa4@Cg>)JSq_~kAZHZa@5*R$|B7QViP&$aLkEPR25531pjf1yPXTq97F zl@>n4!k1WhmxW(%;qS8Wr53)Ch2Ks*m7l7ou|=@kVi0QK_gVNR7QW2FH?{D`Eqs`T zFSqdC2#er?MbON`S6KMw7T&P%kruw%!nd&Sw=8^1&WrXx#Zy!hQT*2Y4Ycsl7T#sy z@3!z^7QU5*kFxNsEquFEB7e%bjYSY^F=%Vy6D)i?3-7V;?Jc}!;X7FPbjefx_gDm3 zQUI=#h0nI|oh^Khh3{hFb1i(Vg)gx1ao|PyF$ye#do2blEqqrCUt;0AS@`u9KHkEY zTKMjFc(1bEBIt2PpzOBr2^M~zg-^8bWfs1tg+FfLds+B$lSlcf?R#4U7c2&D3twU3 z@3ZiRh3{kGt1Z08!r!v+Nj3FP3a7ai1=N?{n!kY-zMqA6S@>iNA76f`w1D@E!|4(86mLevpMvKP~znl{n2J$g&s=w(!{&eu#z7vG7AJ ze6EF0x9|luJjy@JA}Fj8D9UgPztX~wu<#`oex!w8Z{ag6e5r-cBwn`vc8g$?#bCFE z&$96QEd2czzRbdpw(!R-{1^-GEw>29S_Bs?yjbv>(h3Vd-lA_<_z4!i+QMgB_*7Ji20sr}O}f`_C4m}TK-TKH@WKg+`BSoql%KG(wMTKEF+X8)tAo?{Ud zS`6k|_>~s^VGCbk;qxr~dJCU#;Y;uE5z0J^VEY|`GJnr0y-V#q6?#<7&sfLnvG3Pu z{^W2)iSuj4@#8QejCcR>`?Y0d`JtK~?^(|-_Gsm;|BRv#)j%tD55Xuf`oaSDx3QWs z{`njFy8FlVit;uNe-+K=WTZcNMFk?!4pr3AYOOHnR?l@A%3r4TerU(tH14KUvHK|b z*~|UB$R&Z0#Q6;m)@7Pkcdr5~J^GINoI@xFtLt=^u7xG*p5~e_)D2}{P+O=Z`<%@I z#%L^n-=<|e3fbprfbST>>;yfd7uLYCY>(d$;sMNGn(lN_j=Cp7_XK)<&JU3)Ds%Xp zC&{Kq0?FJr;VJGkT+SxDEMBrplAH!I)%Stn;rt27j{%R&Q^`>bm;F!5p5(H4l2HvH zlQmDHPno%NfCA!%z$&jR5o?Xxw<}j>c!EMlDT`tO9F%A4mrM0=44E zS15fx0zVnZ45Mfhh`1ARr_H)af zPb>aAxikW0{PTx@Ao=e>igjVp88_tr9Et}Y`)SLH9DYQSn;IYeL6slcABxc1Mb&`( zpmTUF8`L{IY#%Yc&)-%wQ(*xmb@!8N*`nU9x(?>4X#iv6?|#3Lh+P84`TaehRh$;% z8tki1^Zf+Jt+;0Iwd{27SVz6JthPJG@jYW5+-(}hpwX)uYkG1_*g(B^g|UlGbhmA~ zl)>rHTYmqtvb=$&5c$q#>_vB*POoB}XSGN~U1&wOYUO?IKT=h!E%WC&jiR5;Ue%nj zpWS^s{^Oyzo%^3u6g@pz^F3EyXjVn!t6-{nYQ;Naw)48#^(4!_?>?_T0sJ*h59$vE z|%wW2?3WQ=1u%(Ys`FZ0*u#wi8gcimJ*ZEXmEBB_sBctH&ar+hTYevNpqL! zEPf5QeVNqbd2lbRVYz*Vcc_PTqgEWW8S6^S%+H~X{Grz{1N<7&615I0u7tqZp@d!O z)3&Z^rs8j}X3ag_9j8{ak)Ae=9jnFG z-N1Gyt#vq4_YCNJQdN^#!{i?9z~CO_U|D z)qHEEzsA}>HP+7+pvjIb+9a|Ugd2pyhb!;qT zGt=*J4U<4M=K`&{AdGxwF@KHcTPRj{u4d)>q7Q-`f|sxLbhyJzPgJ2Ijn^` zV^75J&m1wMyJMyabSTPu(5I(>w(sMQ8ua0b6JS(QQxu$7#Nb(PNUv9@dJkv`h8fO7-19>?sS`##N2# z7LSBuJ-+@zR*}&-V(T|3n>jGkV#20qT^qD+2Z!k9&#~alaL4IKSo_RQ>TWhFGrsPl zk06i9&VdWrQ<+iT<_i_YpX-6E4&bLNcnGFXSB%In&3@FKbc;TS#f*jd4pryuMvU$< z(k_z1!&I9MK^gB-1e8W#fgt}{0P?Lbh#Zq!nTd|2=}Tj%maJqXR zL`lA5KIcL+?W8o-WJh?@os&RLr-F_^g^fcZ*?039SS=x|-vj@SJ52%3X2th69p4G! zkm5IxgI2UK8%~^KOkeI~K;9gzQ4%BD<2GdN`>2a@WB*T-!*wub4*rL;k%xh#$Rh~1 zNxzFMZZpT|?&C6G!k>-`ewxtgp8WkU-J zJ}97bwi`1pX>8KCr141;D&K@U9;%Vk=CP+nrw7E4i`A@Z^bqwi)^kkHdQasm%9t6a z|Ec_oJvJu)o+d~d6F)=b{gTl=4;PxnEeKTd55fPfJepFq;;}L9jIpf6*xs?Pg3)}H zZ)Zc#n0uC5qi7`!S?Wtwdtg&+YJ71JGrnS^vsGi8skPa*v26o-LtwOJXU4|51L*d~ z=YIbf&37HKS7w~SJ#G$XjL>|4Vg$TpI@R4@Jq*ob=a3Jcau1*n?s=Gb#zhBh2e0A5 z>Fci;kF#0hV$~1Xi{ru_!yaaDk87qT?>RTFi>hv60TW{CdgnqH{eKSI^G-;wZA@>Z2C_{PI;%nK)P!!1E4h2>WcO6nFxGdX+qDY2Amg)Bet%Uz#A$rU zR!@uzPX&p>Mj5V8&Ayn3G#)#fPLs2~2Tp@5`XFJqNh4`C9)UGdcMQSdA$#YK zj60o%*DACI$MOoBFXIXfQhi6#5@!VFx6wn3XS2?eQe96%bj+C`c45YMY{jH@5u-sS zs};$sdOM7NV3w3{EWb{&uhY-7*ojGzVVgezmC180?$m!07FTJ-Ta|k3pGjT4`>+8- zmZu2J(e0cEZ@6<69d`g48`EHphXc)AuRzPlL=H>K^4$I7Ziei=pl2xk>W_R=N%vi( zt{IdAl~n&x-g#kCfHbY}U^o+oqwh~G`lojO39aZzR9fN>`E2*(ySn{YZq`kd?5&5X zt&Ql9{r;kb?bQ5$F_jKXl4A~|m1|R+y3;w6-JIO9-U_5JPhdgDN>?>zo+-or*$ zJBIL)BT95?IwnG-(v5X!E*dWAj@D_m3tKp)m1EFDtaM7-&XWx^X?OT6cD8k!H|+WF56_S=+}>QgLqswXl1I?>n1RYu>W%IdTh`*3a9)w~c* ze>BI4H&-4rbE~dEv_Oc0$z2$GVrsjNn~CB*d%BA9VBHz&1!pcg`Dzn2*$E5`zMVR( z>48d2l%PJrF~E3D-$P?!Or?troEF{aBDflxHAonX*kjYis7=`y(;{13zKr-#u=%v} z)05h1y_|iZlkY}}225w65A>?vkkZjeuYZt@d7!m-4$dIR#Diy>w(N9Xf<81^>$UdN zLR4`6J%UU@{8#}gkm&)MT82tj!!+N>qk)=_t5%^FpEgzMX~hjz>1*hLSM;;$GjDvO zl95OLYkErZ+thTJa*h?6*gn=+iJqVp6=b75kL3l7uIzvva#m##k zozq+$$L`B%I-pZWMfo{oblJ}#uF&?l|0QJf@o6DlPR(zH-=LOY=7($g3NswnFCh(+ zOEmnZxGJ|{vw0W`3OF2=!=BBF&Mp9h264B^!Ei1UWhnBdV|p*s>-ma@38N|qOw-#MlaJC| z6Z!;Y1O+UTFmoo2#0sX_1FZe@$PUfnjP~MgjHk53)_+e!P5X}I2OXsRG~YKyTiR|W zcKT}?%bniAku!}2FKSXB`w^UY;PGwjWe2ABjGS@A@9)3t`@9b@Euf{GI^59n2ZgJi z${Npz4IgrX%Cj`)0^C|h+WYB>Fni1puX$t8UWTQGlmM%licwEFUBi+TvXoMK! zp^i$M0f*$efBbeK0+~4^?28yI+9=bAKl0|3S##I{y!%(7w#? zI34Z>W6$0IHQPU~jFRrz(l+kqbgXWSmS|1%yeK@`Vlr{`UW^4=TJbB{sQsc|tZZi6 zdd*+~Rn<7nZp>_p-9q@RE}8FB?eJ*~PIsCq5b05d2ZhBv+5;__Z_@530J8I(Mn^=4 zIb%xVM{AijNjO-+2KQ)QJzH~Xn2qhhnFO>a(aA$9$_h>e{nm;J6tWu}ODsr!;7Yq3f zjPV$fIJ#PlBntBgKo1=Whq`kheiKKv%XcQGbj&;I83XsN) z;t71t?f~PxYSUc@+?&Iws-^K)MI)1I2`*e&Q#tSl^5@)P+Gv<+PvphwP4&g;aJu+gKh8%I%kx^q zm1oBJeI{vaK#ia*^I?&cRrxj^+O&?#8KX2+^u8V}1(xV_^f_8<)Ane{(mm|C{B-XM zS{?in;!4qc0~@FL4h=3&iw!Hfp$^g0jt3_D`X-~t1&868-4|Q^LgXwR{&*m(61nUNbvS~Dp!OPbW36|l%ne{>|&UE82PI;)<-#M}I zG45hB<|TN?!)SCIHX)TuV1cr?hq;!R(k^7#r^qN{#5>4H8K#d)=oR`8M0!f^{Q7ZU zCOWSo5%SbwU#Ni_pYtMqjTD?p*1Zt26vs{IipNMj{sevz)lc_B{``l?_r^uaC-M{s zZ5g|JejD{UmO4K&W&&3%A;mA>A)PU~Ra>ZdSWEB_x3N|8J9|s8{W9LePk#*4Wi%%A z6={ePxpaUrP3}hYemE$0x4;g{XpP}1rxo)YwKlZOWteetABl>^jB_Q6o{r|j!YDP3 z4v+-Bw*tFpxc`t8yf=+*@0#8(P&FQ>zJ%igh>R<5;~uk8Z6E^QXdZ5d22e@$_}S2a z;!09%M2dQ+hls-bKUCAlWnpw+5n60+D`~G0`U#{-=HUVsXz{T~nahUuHOt@o$W?pf zpQY)~<|5M3Rqtpz7UDb8d_Nk)uh43#=_^!~SS^{`%uJ2WI=tkq|vYB_HrtsYKF{5oXGcJx8be?%+#J0!pVsmhm;G&i^hoFu?j1mUzd>X{k2 zf6P#n1GPzIMg`^Uz6K)h^g#zvo2WzL-2!X1u#IC%CL6S{e_R|gGS9D&*WASjH5mr5 z8%$6fPjSUv)w2=|1;N#F{*%EDEsRn3vCDAr`A95rW7T-pXHk=Tj*p}ch1L^WR$Al4 zKMZnz8aRI}d@e%@3!N6Ma8X3Z`k(VB;oS%g+u^k0PKWxKIS+(ZS}_(42h$2&cz)eB z_OYXj(i~?-u*Q#8s=L@fk0u74M?2t9s{sPuJe(yz*15hu+#F2bzwY<5PkrHaSJKuy z(Wwn*H+)Uot;OtQwrLxv8E$h^`G1$#hu&nds~TfKIID+IEa{k}Pv^zxb<7zyuh}rn z%u8sxHm*jCP0?;xf3(9=D>-xvQ#b8@dmC0fYR_gG)=SnI5;*=FUF zn3X*>v$6-X^2ncQRxT?<&FOE^Y>b`YaY`lT@>%&q?4>aY1oJSe(rH%ig69i`@ikKP zxBY{dD3o8sCz4Ifglf(JpG#xnGJKh}S`riS3=~rNHXg5T(u(6h32F5 zcNaJg2g0fstl)VPnHsZRMYEfW6gN6RQqgnz(}cLVkUk|L`d5hp3=UT$<0DZS?(y((>HVK@Pu$L-gF+X2(d5 z(X3nC#i$ZIPB5Ee*~em*H=NvPpjmbA0*nm_THs@ZRKof z$_pUxH=?Ky8Y;*M=CL46zdsj)Mhi*4fTz=CET?J2Bz~S3LEcgFaC6ZZc^(m9!Bbgv z#T*++qr~Ci2yO8dg9fASegi6&eStX(G0%z?s*6on5z)~Lv2`A$K91@x1f7W))dQT4 z=@j$mZ#&r5754^4gTcdO75ipI(-yB&k2BxcxPRA(pHefAerw=-VdZ>BhQ^9l&Qf1t zf355q`~?~)8CwdPNVldiw=c~xJB3xOXwtUMEAXVd(^IIzK8QjQx4vXD_kl_Ceap|H zRd(DLRX2{dK#9&918A;o>qgnlx%SfmXtm4Og8l!FGp4gHt5!IM_h@a<2G@lGy~r4S zcv|O>mP?_JY8-`nd8-RTS`k4S6(H#Td5#^f#Vbm;F| zdClU!3~7nd{k-Q{J)`#PCA(^k8j&}3;!MT-jp`INWa|8fMIt4C;@l~q`pur1o1Zsz zZd6i!Ue4^f4?Z$6@4?x#qJ~eMlmFn{sZ*4ArMr@#Br0*SN?e>0cdruHRf+4yLe@sn z104H_FW5ToL(lsCJ8LP*&P{&*S>U_Cj~Xk=UoZRpi;%vAdbk2~WAwDc^L+*|8Q1_L z=5gQyz;}TMfxiO30J`A69>z>Z;3Qxg@EmX{umZRq_!Dra6Mr4TFag8_D9RaNI&jEq zXc1u8TYi5vFcs*kgFnCq_6EKL91HvsmbJ1D z%K_evE#pdH?L*K9P6b{7mb~xxN1^{*Jc1em{t3JQJdLA@TR;bnU1GfT73Cq^j0OG% zECG(ky!;06AD{so@Uh?DxPhYV2BrZMKk@t50`LCR@2{XVPzl251U3eq1||S!mScSi zd;(YiG=S@YZXD@f03HW=|H935EKr*Vr>$EkM&*D&8+=1JzBgE z?dCPw>85rV()9d$e+PT)nFzzX>>gE%ENDSJe<3; z@D20T2iTeo_u%~Mz=kf4qc5{-8)m6dY}~Ug)j0O(v-jXn9Cke0a(F+C&~CyUjiXdx zT9^!OnuYrn+?(LyEL-8 z8xr_4FI2X&2$G@T=w3+*b`3`*Q8lgwKZvb)t`}j=aV$Ki49>!Rvni)1;al zoa=ZpIFKrgraqlTKHn05c;SA&6&`&PpKq%!WxnSJsVmuM&$n#<lK z@33hvc5t4<+%cUkezp}y+`f97MJ!=$FlvU zDeCh~-8e|?$p&w185)NfL{?-JvR#TI2{X zH?{J9@PXgI3Hm6w%fade2llU@ME!|s_i=Q90hoy}@tGHKrQluz*GX_xzi)s$2@d;O zv#uS(f&+>F2z*`4U$49}GxH+6CxKgybH?%??QDC@iVUiD3u zzqxJbZ^!)pHe`p38iOXeI_$O0E!D;B)aGW6tH;^3&EwUl+2Ad`92ZWoRa@v3<+UwM z9fwY`lUrIis!p<>wsZ)%{Gs1}(!n}E)0D++ZHYgZ8Md{V`Z$}pwQ2a9nETF>|H&x& zE4;NzF~!Yc&u?w3?qo-{_ELv2bz3iW33G3wik!HurMiYK-qy=eewrQJ7J;|LpKlu! zz%b|CcCd@vnzE0#hp_aQy2a5n7f-%N2fH#*Y^sh@Olt$dUnG74^4uRB7=_z?;9cy^ zms*9-#UyA-9h-w)gM$OJApI561a{-4G3W+^x3_d0`6mE-&`@B;AiV*epfb$B{`Znc5DVT^?LZf9P{HMvHUCwS4GnaBT8e=QT|J>=Cdg_ zJ+h-qem+HhE=7JGWwiM{6e!5gpWF}`%Fmm~&zZ>2m&mV`$gh*guaPKQ%zPC2wUPN$ zycRv>w?w!QpY~ZL?>NeDhsbY*Na>}8R7q+yyYWUNmhNbLulxpx{N{⋘8T0Y59$h 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 diff --git a/dwm-pango-20201020-519f869.diff b/dwm-pango-20201020-519f869.diff new file mode 100644 index 0000000..36cf292 --- /dev/null +++ b/dwm-pango-20201020-519f869.diff @@ -0,0 +1,746 @@ +From 986b03fee484ecc98c0913ee3678318bc8c29d65 Mon Sep 17 00:00:00 2001 +From: Marius Iacob +Date: Mon, 11 May 2020 12:17:20 +0300 +Subject: [PATCH 1/4] pango support + +--- + config.def.h | 2 +- + config.mk | 4 +- + drw.c | 303 +++++++++++++-------------------------------------- + drw.h | 17 ++- + dwm.c | 28 ++--- + util.h | 4 + + 6 files changed, 106 insertions(+), 252 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..d201ae6 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -5,7 +5,7 @@ static const unsigned int borderpx = 1; /* border pixel of windows */ + static const unsigned int snap = 32; /* snap pixel */ + static const int showbar = 1; /* 0 means no bar */ + static const int topbar = 1; /* 0 means bottom bar */ +-static const char *fonts[] = { "monospace:size=10" }; ++static const char font[] = "monospace 10"; + static const char dmenufont[] = "monospace:size=10"; + static const char col_gray1[] = "#222222"; + static const char col_gray2[] = "#444444"; +diff --git a/config.mk b/config.mk +index 7084c33..b5c7e12 100644 +--- a/config.mk ++++ b/config.mk +@@ -21,8 +21,8 @@ FREETYPEINC = /usr/include/freetype2 + #FREETYPEINC = ${X11INC}/freetype2 + + # includes and libs +-INCS = -I${X11INC} -I${FREETYPEINC} +-LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} ++INCS = -I${X11INC} -I${FREETYPEINC} `pkg-config --cflags xft pango pangoxft` ++LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} `pkg-config --libs xft pango pangoxft` + + # flags + CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} +diff --git a/drw.c b/drw.c +index 8fd1ca4..6d1b64e 100644 +--- a/drw.c ++++ b/drw.c +@@ -4,62 +4,12 @@ + #include + #include + #include ++#include ++#include + + #include "drw.h" + #include "util.h" + +-#define UTF_INVALID 0xFFFD +-#define UTF_SIZ 4 +- +-static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0}; +-static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8}; +-static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000}; +-static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF}; +- +-static long +-utf8decodebyte(const char c, size_t *i) +-{ +- for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) +- if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) +- return (unsigned char)c & ~utfmask[*i]; +- return 0; +-} +- +-static size_t +-utf8validate(long *u, size_t i) +-{ +- if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) +- *u = UTF_INVALID; +- for (i = 1; *u > utfmax[i]; ++i) +- ; +- return i; +-} +- +-static size_t +-utf8decode(const char *c, long *u, size_t clen) +-{ +- size_t i, j, len, type; +- long udecoded; +- +- *u = UTF_INVALID; +- if (!clen) +- return 0; +- udecoded = utf8decodebyte(c[0], &len); +- if (!BETWEEN(len, 1, UTF_SIZ)) +- return 1; +- for (i = 1, j = 1; i < clen && j < len; ++i, ++j) { +- udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type); +- if (type) +- return j; +- } +- if (j < len) +- return 0; +- *u = udecoded; +- utf8validate(u, len); +- +- return len; +-} +- + Drw * + drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) + { +@@ -99,58 +49,37 @@ drw_free(Drw *drw) + } + + /* This function is an implementation detail. Library users should use +- * drw_fontset_create instead. ++ * drw_font_create instead. + */ + static Fnt * +-xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) ++xfont_create(Drw *drw, const char *fontname) + { + Fnt *font; +- XftFont *xfont = NULL; +- FcPattern *pattern = NULL; +- +- if (fontname) { +- /* Using the pattern found at font->xfont->pattern does not yield the +- * same substitution results as using the pattern returned by +- * FcNameParse; using the latter results in the desired fallback +- * behaviour whereas the former just results in missing-character +- * rectangles being drawn, at least with some fonts. */ +- if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) { +- fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname); +- return NULL; +- } +- if (!(pattern = FcNameParse((FcChar8 *) fontname))) { +- fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname); +- XftFontClose(drw->dpy, xfont); +- return NULL; +- } +- } else if (fontpattern) { +- if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) { +- fprintf(stderr, "error, cannot load font from pattern.\n"); +- return NULL; +- } +- } else { +- die("no font specified."); +- } ++ PangoFontMap *fontmap; ++ PangoContext *context; ++ PangoFontDescription *desc; ++ PangoFontMetrics *metrics; + +- /* Do not allow using color fonts. This is a workaround for a BadLength +- * error from Xft with color glyphs. Modelled on the Xterm workaround. See +- * https://bugzilla.redhat.com/show_bug.cgi?id=1498269 +- * https://lists.suckless.org/dev/1701/30932.html +- * https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349 +- * and lots more all over the internet. +- */ +- FcBool iscol; +- if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) { +- XftFontClose(drw->dpy, xfont); +- return NULL; ++ ++ if (!fontname) { ++ die("no font specified."); + } + + font = ecalloc(1, sizeof(Fnt)); +- font->xfont = xfont; +- font->pattern = pattern; +- font->h = xfont->ascent + xfont->descent; + font->dpy = drw->dpy; + ++ fontmap = pango_xft_get_font_map(drw->dpy, drw->screen); ++ context = pango_font_map_create_context(fontmap); ++ desc = pango_font_description_from_string(fontname); ++ font->layout = pango_layout_new(context); ++ pango_layout_set_font_description(font->layout, desc); ++ ++ metrics = pango_context_get_metrics(context, desc, pango_language_from_string ("en-us")); ++ font->h = pango_font_metrics_get_height(metrics) / PANGO_SCALE; ++ ++ pango_font_metrics_unref(metrics); ++ g_object_unref(context); ++ + return font; + } + +@@ -159,35 +88,28 @@ xfont_free(Fnt *font) + { + if (!font) + return; +- if (font->pattern) +- FcPatternDestroy(font->pattern); +- XftFontClose(font->dpy, font->xfont); ++ if (font->layout) ++ g_object_unref(font->layout); + free(font); + } + + Fnt* +-drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) ++drw_font_create(Drw* drw, const char font[]) + { +- Fnt *cur, *ret = NULL; +- size_t i; ++ Fnt *fnt = NULL; + +- if (!drw || !fonts) ++ if (!drw || !font) + return NULL; + +- for (i = 1; i <= fontcount; i++) { +- if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) { +- cur->next = ret; +- ret = cur; +- } +- } +- return (drw->fonts = ret); ++ fnt = xfont_create(drw, font); ++ ++ return (drw->font = fnt); + } + + void +-drw_fontset_free(Fnt *font) ++drw_font_free(Fnt *font) + { + if (font) { +- drw_fontset_free(font->next); + xfont_free(font); + } + } +@@ -221,13 +143,6 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) + return ret; + } + +-void +-drw_setfontset(Drw *drw, Fnt *set) +-{ +- if (drw) +- drw->fonts = set; +-} +- + void + drw_setscheme(Drw *drw, Clr *scm) + { +@@ -248,24 +163,16 @@ drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int + } + + int +-drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert) ++drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup) + { + char buf[1024]; + int ty; + unsigned int ew; + XftDraw *d = NULL; +- Fnt *usedfont, *curfont, *nextfont; + size_t i, len; +- int utf8strlen, utf8charlen, render = x || y || w || h; +- long utf8codepoint = 0; +- const char *utf8str; +- FcCharSet *fccharset; +- FcPattern *fcpattern; +- FcPattern *match; +- XftResult result; +- int charexists = 0; +- +- if (!drw || (render && !drw->scheme) || !text || !drw->fonts) ++ int render = x || y || w || h; ++ ++ if (!drw || (render && !drw->scheme) || !text || !drw->font) + return 0; + + if (!render) { +@@ -280,98 +187,37 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp + w -= lpad; + } + +- usedfont = drw->fonts; +- while (1) { +- utf8strlen = 0; +- utf8str = text; +- nextfont = NULL; +- while (*text) { +- utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); +- for (curfont = drw->fonts; curfont; curfont = curfont->next) { +- charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); +- if (charexists) { +- if (curfont == usedfont) { +- utf8strlen += utf8charlen; +- text += utf8charlen; +- } else { +- nextfont = curfont; +- } +- break; +- } +- } +- +- if (!charexists || nextfont) +- break; +- else +- charexists = 0; +- } +- +- if (utf8strlen) { +- drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL); +- /* shorten text if necessary */ +- for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--) +- drw_font_getexts(usedfont, utf8str, len, &ew, NULL); +- +- if (len) { +- memcpy(buf, utf8str, len); +- buf[len] = '\0'; +- if (len < utf8strlen) +- for (i = len; i && i > len - 3; buf[--i] = '.') +- ; /* NOP */ +- +- if (render) { +- ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; +- XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], +- usedfont->xfont, x, ty, (XftChar8 *)buf, len); +- } +- x += ew; +- w -= ew; +- } +- } +- +- if (!*text) { +- break; +- } else if (nextfont) { +- charexists = 0; +- usedfont = nextfont; +- } else { +- /* Regardless of whether or not a fallback font is found, the +- * character must be drawn. */ +- charexists = 1; +- +- fccharset = FcCharSetCreate(); +- FcCharSetAddChar(fccharset, utf8codepoint); +- +- if (!drw->fonts->pattern) { +- /* Refer to the comment in xfont_create for more information. */ +- die("the first font in the cache must be loaded from a font string."); +- } +- +- fcpattern = FcPatternDuplicate(drw->fonts->pattern); +- FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset); +- FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue); +- FcPatternAddBool(fcpattern, FC_COLOR, FcFalse); +- +- FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); +- FcDefaultSubstitute(fcpattern); +- match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); +- +- FcCharSetDestroy(fccharset); +- FcPatternDestroy(fcpattern); +- +- if (match) { +- usedfont = xfont_create(drw, NULL, match); +- if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) { +- for (curfont = drw->fonts; curfont->next; curfont = curfont->next) +- ; /* NOP */ +- curfont->next = usedfont; +- } else { +- xfont_free(usedfont); +- usedfont = drw->fonts; +- } ++ len = strlen(text); ++ ++ if (len) { ++ drw_font_getexts(drw->font, text, len, &ew, NULL, markup); ++ /* shorten text if necessary */ ++ for (len = MIN(len, sizeof(buf) - 1); len && ew > w; len--) ++ drw_font_getexts(drw->font, text, len, &ew, NULL, markup); ++ ++ if (len) { ++ memcpy(buf, text, len); ++ buf[len] = '\0'; ++ if (len < strlen(text)) ++ for (i = len; i && i > len - 3; buf[--i] = '.') ++ ; /* NOP */ ++ ++ if (render) { ++ ty = y + (h - drw->font->h) / 2; ++ if(markup) ++ pango_layout_set_markup(drw->font->layout, buf, len); ++ else ++ pango_layout_set_text(drw->font->layout, buf, len); ++ pango_xft_render_layout(d, &drw->scheme[invert ? ColBg : ColFg], ++ drw->font->layout, x * PANGO_SCALE, ty * PANGO_SCALE); ++ if(markup) /* clear markup attributes */ ++ pango_layout_set_attributes(drw->font->layout, NULL); + } ++ x += ew; ++ w -= ew; + } + } ++ + if (d) + XftDrawDestroy(d); + +@@ -389,24 +235,29 @@ drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) + } + + unsigned int +-drw_fontset_getwidth(Drw *drw, const char *text) ++drw_font_getwidth(Drw *drw, const char *text, Bool markup) + { +- if (!drw || !drw->fonts || !text) ++ if (!drw || !drw->font || !text) + return 0; +- return drw_text(drw, 0, 0, 0, 0, 0, text, 0); ++ return drw_text(drw, 0, 0, 0, 0, 0, text, 0, markup); + } + + void +-drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) ++drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup) + { +- XGlyphInfo ext; +- + if (!font || !text) + return; + +- XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext); ++ PangoRectangle r; ++ if(markup) ++ pango_layout_set_markup(font->layout, text, len); ++ else ++ pango_layout_set_text(font->layout, text, len); ++ pango_layout_get_extents(font->layout, 0, &r); ++ if(markup) /* clear markup attributes */ ++ pango_layout_set_attributes(font->layout, NULL); + if (w) +- *w = ext.xOff; ++ *w = r.width / PANGO_SCALE; + if (h) + *h = font->h; + } +diff --git a/drw.h b/drw.h +index 4bcd5ad..3d3a906 100644 +--- a/drw.h ++++ b/drw.h +@@ -7,9 +7,7 @@ typedef struct { + typedef struct Fnt { + Display *dpy; + unsigned int h; +- XftFont *xfont; +- FcPattern *pattern; +- struct Fnt *next; ++ PangoLayout *layout; + } Fnt; + + enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */ +@@ -23,7 +21,7 @@ typedef struct { + Drawable drawable; + GC gc; + Clr *scheme; +- Fnt *fonts; ++ Fnt *font; + } Drw; + + /* Drawable abstraction */ +@@ -32,10 +30,10 @@ void drw_resize(Drw *drw, unsigned int w, unsigned int h); + void drw_free(Drw *drw); + + /* Fnt abstraction */ +-Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); +-void drw_fontset_free(Fnt* set); +-unsigned int drw_fontset_getwidth(Drw *drw, const char *text); +-void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h); ++Fnt *drw_font_create(Drw* drw, const char font[]); ++void drw_font_free(Fnt* set); ++unsigned int drw_font_getwidth(Drw *drw, const char *text, Bool markup); ++void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h, Bool markup); + + /* Colorscheme abstraction */ + void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); +@@ -46,12 +44,11 @@ Cur *drw_cur_create(Drw *drw, int shape); + void drw_cur_free(Drw *drw, Cur *cursor); + + /* Drawing context manipulation */ +-void drw_setfontset(Drw *drw, Fnt *set); + void drw_setscheme(Drw *drw, Clr *scm); + + /* Drawing functions */ + void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert); +-int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert); ++int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup); + + /* Map functions */ + void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h); +diff --git a/dwm.c b/dwm.c +index 9fd0286..cc180c4 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -40,6 +40,7 @@ + #include + #endif /* XINERAMA */ + #include ++#include + + #include "drw.h" + #include "util.h" +@@ -55,7 +56,8 @@ + #define WIDTH(X) ((X)->w + 2 * (X)->bw) + #define HEIGHT(X) ((X)->h + 2 * (X)->bw) + #define TAGMASK ((1 << LENGTH(tags)) - 1) +-#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) ++#define TEXTW(X) (drw_font_getwidth(drw, (X), False) + lrpad) ++#define TEXTWM(X) (drw_font_getwidth(drw, (X), True) + lrpad) + + /* enums */ + enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ +@@ -237,7 +239,7 @@ static void zoom(const Arg *arg); + + /* variables */ + static const char broken[] = "broken"; +-static char stext[256]; ++static char stext[512]; + static int screen; + static int sw, sh; /* X display screen geometry width, height */ + static int bh, blw = 0; /* bar geometry */ +@@ -697,16 +699,16 @@ void + drawbar(Monitor *m) + { + int x, w, tw = 0; +- int boxs = drw->fonts->h / 9; +- int boxw = drw->fonts->h / 6 + 2; ++ int boxs = drw->font->h / 9; ++ int boxw = drw->font->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; + Client *c; + + /* draw status first so it can be overdrawn by tags later */ + if (m == selmon) { /* status is only drawn on selected monitor */ + drw_setscheme(drw, scheme[SchemeNorm]); +- tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ +- drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); ++ tw = TEXTWM(stext) - lrpad + 2; /* 2px right padding */ ++ drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0, True); + } + + for (c = m->clients; c; c = c->next) { +@@ -718,7 +720,7 @@ drawbar(Monitor *m) + for (i = 0; i < LENGTH(tags); i++) { + w = TEXTW(tags[i]); + drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); +- drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); ++ drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i, False); + if (occ & 1 << i) + drw_rect(drw, x + boxs, boxs, boxw, boxw, + m == selmon && selmon->sel && selmon->sel->tags & 1 << i, +@@ -727,12 +729,12 @@ drawbar(Monitor *m) + } + w = blw = TEXTW(m->ltsymbol); + drw_setscheme(drw, scheme[SchemeNorm]); +- x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); ++ x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0, False); + + if ((w = m->ww - tw - x) > bh) { + if (m->sel) { + drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); +- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); ++ drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0, False); + if (m->sel->isfloating) + drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); + } else { +@@ -1543,10 +1545,10 @@ setup(void) + sh = DisplayHeight(dpy, screen); + root = RootWindow(dpy, screen); + drw = drw_create(dpy, screen, root, sw, sh); +- if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) ++ if (!drw_font_create(drw, font)) + die("no fonts could be loaded."); +- lrpad = drw->fonts->h; +- bh = drw->fonts->h + 2; ++ lrpad = drw->font->h; ++ bh = drw->font->h + 2; + updategeom(); + /* init atoms */ + utf8string = XInternAtom(dpy, "UTF8_STRING", False); +diff --git a/util.h b/util.h +index f633b51..531ab25 100644 +--- a/util.h ++++ b/util.h +@@ -1,7 +1,11 @@ + /* See LICENSE file for copyright and license details. */ + ++#ifndef MAX + #define MAX(A, B) ((A) > (B) ? (A) : (B)) ++#endif ++#ifndef MIN + #define MIN(A, B) ((A) < (B) ? (A) : (B)) ++#endif + #define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B)) + + void die(const char *fmt, ...); +-- +2.28.0 + + +From 62b46168970345a67cce6afb7bddb3c4eddbde8c Mon Sep 17 00:00:00 2001 +From: Marius Iacob +Date: Wed, 20 May 2020 17:04:34 +0300 +Subject: [PATCH 2/4] removed some blank lines + +--- + drw.c | 1 - + dwm.c | 1 - + 2 files changed, 2 deletions(-) + +diff --git a/drw.c b/drw.c +index 6d1b64e..30543f2 100644 +--- a/drw.c ++++ b/drw.c +@@ -60,7 +60,6 @@ xfont_create(Drw *drw, const char *fontname) + PangoFontDescription *desc; + PangoFontMetrics *metrics; + +- + if (!fontname) { + die("no font specified."); + } +diff --git a/dwm.c b/dwm.c +index cc180c4..d63ebb4 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -1599,7 +1599,6 @@ setup(void) + focus(NULL); + } + +- + void + seturgent(Client *c, int urg) + { +-- +2.28.0 + + +From 1d3a8696e884317c7eab0cc47c2a2e4fca1d1685 Mon Sep 17 00:00:00 2001 +From: Marius Iacob +Date: Wed, 22 Jul 2020 09:48:32 +0300 +Subject: [PATCH 3/4] Fixed patch after update + +--- + drw.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drw.c b/drw.c +index b834cef..34bda61 100644 +--- a/drw.c ++++ b/drw.c +@@ -45,7 +45,7 @@ drw_free(Drw *drw) + { + XFreePixmap(drw->dpy, drw->drawable); + XFreeGC(drw->dpy, drw->gc); +- drw_fontset_free(drw->fonts); ++ drw_font_free(drw->font); + free(drw); + } + +-- +2.28.0 + + +From 63d0a5e4a8fb109c5a032e76d5e2410fa792e45f Mon Sep 17 00:00:00 2001 +From: Marius Iacob +Date: Tue, 20 Oct 2020 21:06:48 +0300 +Subject: [PATCH 4/4] font rendering fixes + +removed hardcoded locale, should use system defined in env vars + +get height of text on a case by case basis, helps with CJK fonts +--- + drw.c | 20 ++++++++++++-------- + 1 file changed, 12 insertions(+), 8 deletions(-) + +diff --git a/drw.c b/drw.c +index 34bda61..1795a13 100644 +--- a/drw.c ++++ b/drw.c +@@ -74,7 +74,7 @@ xfont_create(Drw *drw, const char *fontname) + font->layout = pango_layout_new(context); + pango_layout_set_font_description(font->layout, desc); + +- metrics = pango_context_get_metrics(context, desc, pango_language_from_string ("en-us")); ++ metrics = pango_context_get_metrics(context, desc, NULL); + font->h = pango_font_metrics_get_height(metrics) / PANGO_SCALE; + + pango_font_metrics_unref(metrics); +@@ -166,8 +166,8 @@ int + drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert, Bool markup) + { + char buf[1024]; +- int ty; +- unsigned int ew; ++ int ty, th; ++ unsigned int ew, eh; + XftDraw *d = NULL; + size_t i, len; + int render = x || y || w || h; +@@ -190,10 +190,14 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp + len = strlen(text); + + if (len) { +- drw_font_getexts(drw->font, text, len, &ew, NULL, markup); ++ drw_font_getexts(drw->font, text, len, &ew, &eh, markup); ++ th = eh; + /* shorten text if necessary */ +- for (len = MIN(len, sizeof(buf) - 1); len && ew > w; len--) +- drw_font_getexts(drw->font, text, len, &ew, NULL, markup); ++ for (len = MIN(len, sizeof(buf) - 1); len && ew > w; len--) { ++ drw_font_getexts(drw->font, text, len, &ew, &eh, markup); ++ if (eh > th) ++ th = eh; ++ } + + if (len) { + memcpy(buf, text, len); +@@ -203,7 +207,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp + ; /* NOP */ + + if (render) { +- ty = y + (h - drw->font->h) / 2; ++ ty = y + (h - th) / 2; + if(markup) + pango_layout_set_markup(drw->font->layout, buf, len); + else +@@ -259,7 +263,7 @@ drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, + if (w) + *w = r.width / PANGO_SCALE; + if (h) +- *h = font->h; ++ *h = r.height / PANGO_SCALE; + } + + Cur * +-- +2.28.0 + diff --git a/dwm.o b/dwm.o index 13ef8bdfbc72a0bc9e6e65b0638c55faa3281bd4..9d7d9b18733eec1a6cd7b2a492400b00c57a0866 100644 GIT binary patch delta 13241 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 UFNd9htdRQihR099d!^t10{SLLv;Y7A