From f6e48cd371488743465a23704a356fc875c79896 Mon Sep 17 00:00:00 2001 From: murat Date: Tue, 14 Jan 2025 00:42:19 +0300 Subject: [PATCH] systray patch changed terminal kitty to st --- config.def.h | 11 +- config.def.h.orig | 34 +- dwm | Bin 67864 -> 72544 bytes dwm.c | 411 +++++++++++- dwm.c.orig | 17 +- dwm.o | Bin 59656 -> 69520 bytes patches/dwm-systray-20230922-9f88553.diff | 735 ++++++++++++++++++++++ 7 files changed, 1168 insertions(+), 40 deletions(-) create mode 100644 patches/dwm-systray-20230922-9f88553.diff diff --git a/config.def.h b/config.def.h index c058e39..f55dcc3 100644 --- a/config.def.h +++ b/config.def.h @@ -1,9 +1,14 @@ /* See LICENSE file for copyright and license details. */ /* appearance */ -static const unsigned int borderpx = 2; /* border pixel of windows */ -static const unsigned int gappx = 5; /* gaps between windows */ +static const unsigned int borderpx = 3; /* border pixel of windows */ +static const unsigned int gappx = 7; /* gaps between windows */ static const unsigned int snap = 32; /* snap pixel */ +static const unsigned int systraypinning = 1; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ +static const unsigned int systrayonleft = 1; /* 0: systray in the right corner, >0: systray on left of status text */ +static const unsigned int systrayspacing = 2; /* systray spacing */ +static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ +static const int showsystray = 1; /* 0 means no systray */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ static const char *fonts[] = { "FiraMono Nerd Font:size=10" }; @@ -59,7 +64,7 @@ static const Layout layouts[] = { /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -static const char *termcmd[] = { "kitty", NULL }; +static const char *termcmd[] = { "st", NULL }; /* multimedia */ static const char *volup[] = { "/home/murat/scripts/sesac.sh", NULL }; static const char *voldown[] = { "/home/murat/scripts/seskis.sh", NULL }; diff --git a/config.def.h.orig b/config.def.h.orig index f1fb147..c058e39 100644 --- a/config.def.h.orig +++ b/config.def.h.orig @@ -1,17 +1,18 @@ /* See LICENSE file for copyright and license details. */ /* appearance */ -static const unsigned int borderpx = 1; /* border pixel of windows */ +static const unsigned int borderpx = 2; /* 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 */ -static const char *fonts[] = { "monospace:size=10" }; -static const char dmenufont[] = "monospace:size=10"; -static const char col_gray1[] = "#222222"; +static const char *fonts[] = { "FiraMono Nerd Font:size=10" }; +static const char dmenufont[] = "FiraMono Nerd Font:size=10"; +static const char col_gray1[] = "#282828"; static const char col_gray2[] = "#444444"; -static const char col_gray3[] = "#bbbbbb"; -static const char col_gray4[] = "#eeeeee"; -static const char col_cyan[] = "#005577"; +static const char col_gray3[] = "#ebdbb2"; +static const char col_gray4[] = "#fbf1c7"; +static const char col_cyan[] = "#458588"; static const char *colors[][3] = { /* fg bg border */ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, @@ -59,9 +60,17 @@ static const Layout layouts[] = { static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; static const char *termcmd[] = { "kitty", NULL }; +/* multimedia */ +static const char *volup[] = { "/home/murat/scripts/sesac.sh", NULL }; +static const char *voldown[] = { "/home/murat/scripts/seskis.sh", NULL }; +static const char *volmute[] = { "/home/murat/scripts/sessustur.sh", NULL }; +static const char *next[] = { "/home/murat/scripts/sonraki.sh", NULL }; +static const char *play[] = { "/home/murat/scripts/durdurbaslat.sh", NULL }; +static const char *prev[] = { "/home/murat/scripts/onceki.sh", NULL }; /* Custom Commands */ static const char *rofi[] = { "/home/murat/.config/rofi/launchers/type-1/launcher.sh", NULL }; static const char *zenbrowser[] = { "zen-browser", NULL }; +static const char *powermenu[] = { "/home/murat/.config/rofi/powermenu/type-1/powermenu.sh", NULL }; static const Key keys[] = { /* modifier key function argument */ @@ -90,6 +99,15 @@ static const 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 } }, + { 0, XF86XK_AudioRaiseVolume, spawn, {.v = volup } }, + { 0, XF86XK_AudioLowerVolume, spawn, {.v = voldown } }, + { 0, XF86XK_AudioMute, spawn, {.v = volmute } }, + { 0, XF86XK_AudioNext, spawn, {.v = next } }, + { 0, XF86XK_AudioPlay, spawn, {.v = play } }, + { 0, XF86XK_AudioPrev, spawn, {.v = prev } }, TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) @@ -99,7 +117,7 @@ static const Key keys[] = { TAGKEYS( XK_7, 6) TAGKEYS( XK_8, 7) TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_q, quit, {0} }, + { MODKEY|ShiftMask, XK_q, spawn, {.v = powermenu} }, }; /* button definitions */ diff --git a/dwm b/dwm index a4fdd6197c74fc885a1ec459cf1d3bd99b6a326b..41c31ab534235f6f7d3a123c62585b3217fc5732 100755 GIT binary patch literal 72544 zcmeFadw3K@_BYO+qpufsl-u83>{f zoJ45b*=4=oc9+#%*IoVYvR=6;1j2oF4R}LcB_Ogr3}^%w5Lf5-IaS?BGcw=jeSUwv z@AH^lru%%V>eQ)Ir>ah!su@@1J157-#R>Xff^e%ql*P%BTrFY!l|6ZKg&d*3kSh!k zt`mA8JrV!(e9_NC@kqp<{!HSekbozZOQV-dJO^=D(4Ttk^rUjJ{?fZi4`EZGVzaWYRdFkLVUB(MwnhcPKaZ4A7JzsuhDusfr7p`}bTi=#NMOUqM)nf5eCBhgZO?gmBww zMIS<-e)=~L4Y=Z`u&_7={tg7YRQ_kd<5KtXKoDs&qL0ks3ZC>B}V_& z#NZ>xkmqm=c}~W_Ux-ofYzTO%@pvMJJXJCBFN=|XXpH{a76V@u1FwyNPmWRV$r$-x zilNWn#o%))M*g}Odj33yoga%K&y6wod=^8V1u^6?^}cjJo{iD(AI0FmGX`#ofv3fg zXL^kGei6fdu85KU#~64)3_XvDk-s>G9wx_-=gk=T?~Ku3dt=nQE{2?&V(9JF81mc} zgMV`jIU_OZ&5M!$&oSEdcnmpjj=|p(gMW4mKEIC9-uGh2?na@+(O9vp&|T@P zs9y-KB~#qKVt13z)!5*1H~N+fB{MwkdPl9-Q&$0^$nDE-Y;0(hD(b81sB~VVyTa$5 z+)(e!^EY}MfE3h2(t6R?u!J*ftf=?ay6b(DQL47SyZT9fpRb`_D4A2y=y5e5fw(PM zV63~ifhaCBug6u}w4}mAV$@gVF9lO35tQO}I~tbNPiv^67NBuc-4Irj8t;`z@G^0V z+;wPcZA1NxW%X1e8dOm4@k6>wKXT;NKn?CWwe?jE%S0b^w!rVBl44a=aYIqXQaAE5 zK9|T+SJ$wN3B_xIFtydS?#5{q9uHJ6ux`*n)(VH)>uYRS&RGd1$f&;-x;+(*Xr4}^ zQ}}C7w-ot3o`y!B*V#~6LH))RG$oI>zq@nMT%WtA6zQg0+YWbiZM|FXH>zVA^$^78 z7Sf%O3{ zWkVgB1|Ht!ONtxtq*1^CdSM7snBB1+B8JTTd(4G3quUIoLQ8pdG?w+M^}eHiA=9H) z=omEKSh1v{z$;?BEk(r|z<3r_qC~w{m|O`XtnkLP~tq-FOn5)9a=8&qYNevBk zJ%GdSsjIETd;_JbjSmJh7GaCQv@T8WBw}q!a)ACd|C(jcQCZm?~)`5s}wW*U%_p;$Y(I z%yc2O+%y4e8qpaLL=D#IX%)W88UeFOrDwU|t@mKA_f->J&j7d2TU&(%18YU);?J|m zOFX{iU_!+!mr%W6Qr}QUOljg4AVx`67DWMXX78F^5s*bdH8fnwET9{LCVAA5n!rm= zaTZL$o4_1BNVV@VX|YglS+ zZGVcAF4SoMz*>Y{j~kM3fJ>L5rw<7{2QWhJ^#iiJXg!#5rymd4@KdbTK=vm zT<`akk1p1yK96Na;obHSh3oT}Ckog3uZzNU{u`ojoqtCZuJiAT!gc;BhhoSdh3ouX zQMk_E6NT&i*G1vo@<-u1|BfhJ=ie2D>-(uJd-;@YxXyoF6y7a=6t45{h{ARLT~WBsKSi6@_4!2S zpBaVg{9RGF&fgP->*KL03Kz8TsINbIz2?`r9@j?YPjYj7T@-$$mS10IbUs&W_zO|_ zmsfEM2mqg*?G`u_tzgffAMd98?Uhn!S{Mz4ed_xre#xoq>7==&N@V!y^6RUat&M17= z{Txry?yczk*!DEXQ=;%H4Yx$$wJ-4enNj%ACpn%Ih5un8$E7Iz^Hz?RN8#HPj<1cv zPigY6i^8Av@%$BK*wKuh3C`#7ac#T;TCP&==gaJ*Vi{4AN?xlqpy=X z?$mI7z14A#hL=b2|CNS&qVNqG-W-MhQ^VIq;b9G5ABBIV;V(qt=QVso6yBxjabpzz zy_UZ%3h&hHd~XyU(eigh;T>B3Ls58whIdBcZ5pmd;k`AyD+=GB;pe09ei|-B#nCrv zxFrhL>rIcsb@?-+@Vy$JoG4u9pBshia!N69R}`M3@oziK?GBr4oD1~)?KR*-dtjl% zfR8fZhYa{w1Kw%CmmBbMO&$|4ZHnQko%})Dc^qwY|0Q+uSHk1FQN#%hIF3}h|I!S2 zVmB%X76VRo>woE;{EhgNF7&_5PX0zX{nP()I{6!6`j{jnx0613Ui~f@(NZUUa=b5p zWuLB2P7t4d{FQx{baI05Wd6!N%R4ziI07Nve>I)_m2mBf8v{HB+|0AE&n5$|$66?% z*??a`fcCexlfMxED>aNB>pD3>cq)HopHFmhg75+Sm3^-7nbvIypi3K>o@;_jYoE@N4-i`|RlC1mT1DEBidu$qB*- z^H=uS*~tmQwX2{EP!0GHo`rpO8E}gMKX1UVH{ik%P7wcL20Y1tTMc-M0UvI_(+v18 z47kOB-(bMg4S2c%&otl}20X`rk1*i52K+_?E*WsTW2FDN4ESgr#IwYJk1^oo20YV% z*BJ0D1MV^4HyQ9I13u1xHyiM51HRUP-)z9w8Sq;S_!9;^$AGUl;5GyPf&m|Iz&9B1 z2?l(l0iS5V+YGqffbTWnw;J#c1AdzUKV-mj4S1&k7Y(>-z$Y2-E(4xtz|R|ShXEIk za)RtX-+(6>@W}=|#eh#S;AsY2GT;^iUSPn}4fyQ_Jkx+rHQ+f0Tni<$)La9ug`OEM z8Sv=_J}v`3!+@6AMuQK4m7n~sbcN_2|172;wQw;b*1DfY%!EbOWw^ zHG-vP8t}!2{5b}^&Vc6{@FfOZGT`+F+-1NU40wqF_ZaYU1AdnQuQA}-mYAh_47k^j zzsZ3640y8v_Z#rF27IXjUuVFV8Sp0zc#{ENZ@}+1;4c{P6$X5R0l&w9Z#3Zd8t^s) zzS4m2HQ=iZc!vRRHsC+M{;YwYHSn_re%8Rx8u(cQKWpG;4g9QupEdCRz6Q>iue%@x zP9{l;>F>WoSh}^%7a!@60y~r1S>qzv`vFIWzl~4xkX*bG&32HX&Ita7?;tu3nL{0n z-b{2n(QS-=ndk(fH!%7yL{kVpw4Tw=5>27^&^ksxMKp!nL(PnSh-ljWhCGaZfaoNm z%Nczi(G*$_xfp#n(G*e-<$KUr%%gqc;;hl;}1_ zzfANnqBk)5FGN$wI<%hA&k{|c>d-nyKSeZ!s6)++eu(HBi1sl00ix51E@$+8L}w7~ zV)WfaQwTbg%jia;DfAr5Wb`7UDdZfoFnR&eqlivn^gN;|^c)fxT}U*AoI_pzW&KYy zg_=X1jGja^g_uJfj2=%kg_c8YjJ}EJu|#iR^a!FU#2i}B=%GYYXgRcw(F2L5kaDP* z(N_>nq2!Q<(S3=g5OS!T(eXr6=s4tJ^o8GmrjT(cm(iz*rciMxlhG%LrVw$+!sw$! z+lfwL^e05$O0>Y}gGAp(bl3N+|B22ex|7j6h!%h6k-jnXY^2_DYP0|$LN7XQ%E(`%;+nKrci3g!|1+5 zQwTLw&ggieDRdfgG5W$YpebY;%4PIvqA64w%4GBjqURHBVf0a=?;tvb(Vq}~C(#0< z4-#EQbk}#R|A{Uqx|7j6h^EkIsDsg)iC#c-8>3$)x{~M(jQ$JJ6ygl6XY{i~Q)n}^ zj?qsMO(D%tGov3OnnIZ&52GI-niil?Iiv3*x|V1cqwgkq5z)DfZX|j!(V2{1L^Opc zLl#CaAeusxp%g~XBbq{zA%W3_L{lg-)ODWqKhYF|40SSk644ZT40SMiJkb<#47D-( zCZZ|S7}~(-5kymnF|?l1Ly4x)VrU(s2NF#o#ZWV&uOOO2i6IZ8`w~qd#85e-^y+#%D%W%hcx>08B2i~+k0m%ga?JPHP#j#xA zi(L7T2<;yoxW{@=y#Gp;#VP+NDHBz75C(5JRVxL0EP6`{oKNt59BB`?bc=A0Cc;Ab zGhX-CsN*+S4AdGfLU+Y$0kQ_6;Yeja1p9B{_C65A!`qJ{;)?zr7LT2?lh| zDOW+MGL)LtMvruL5hgsiq^~n$a+1aezl?XqB}wvw9c!tc)=zzDlCr`>a`i!nUxhh3 z{FS7XHif^Cl>S~Ss@NaIW3$lAOrnF!UP~z`)LZ@Pauhj*dLE@hslGS0Yz-s2J({x;sxxZyNz6#G`9_HBkG3R~$z{fr4{e;&A` z47i2WmEA<;-{XyaklwFmeED#%l5XVVADw9?uB&&_w2;+SdWSe)yhFTGENibGZ64AB z_PEYL`-7}g1@eJACHbfnIM(GV&d+Mg+J~X_dyJ#VfTtf8gl~Ha0FQeT!URnhVE&Tr zybqIt=}u&#twocqM$bWz`2DA6mBjZO2qjCFJw@KU2CrEL-r2{|uFceI~ zH3mtM&T8`zM^AZ@ui5?^8fyNrv!sAM9ywusU;6q(U%ej3-eo`+*=Qw%-EHzAW858v z2DVrC$WHqk;ul(oyksFa6iM>;lCmm|+kVO!>VyfB;!ROo=v_Ws8oKd6kx08ZCtu!! ziB|rnIIBSZKrAkh|GSMkXqHs@)z)0R6uH!c^98{nf9H@-JLRvOa(R+d{ zRhYF;%|P-zNj_xgP?CS9SS-r#&yxQ`jgoJXlw}rqPNLL$*4GD3Oj7S-rnDkSs?1Aq z$VX@b^rji+Scj6Eqn@Hnkb-!(quJeyOW-6a$=os!LV%~a<#KwFzb}yAcLv9OD89vn zJ2lOA(tKYR`Wm53jN&9oF19AAzhy>?HyBHSyvIKfeYp8CFbZauR*;dZ z&p?3Cb6_CJAMrAuFu8dde-R4Eyg(5zuvlvrW>@vyZ?GQKVvY&g@l9Dl&BIK)6|<|r z`by1$mxMJzcBSB78kR|<2XI42yRbqYIc|6_dsk9iE-awAs_R=eUqk%Qp`qF3f>0W=U`;4(*ScAfKR~Pi9etK+2waFWKSovD zULgNKwM;6I&r0&wTT`Gm^%x4$kRO$wbqqejR3-JeQ~tUjvQyfAJdr69!&{vS=?iQp zX|YRcJOl-S?anl9CTb_9$h$13`z=$qIT~cMii(tCYc8|9`%tH(Ov$7Hi&~e8^0yd` z4tZC;{4UI_7aExoPLLEBo2J2`q%Wli>hwatE0Xe2*>!TAH8)@WMl8)oA7K=9&xxS~ zWRJX)ADkXR5{(b!6zBEyW2g`rN_uD}@;I$ulV%o*Gevoy=n~})NtufAdYbB02g4$n z`3H7dvd)%NcA$))_S%wzf=9G6igAQx5 zdJ5&IwI1{JF>iBNQ$;z^Dz%>S^-}VZM4s~B9q#LJ6=d;#`@>#LZhvwGZy=ana>$8{j%KMebw@zGc(C9wGM`nCrV0cylU&}>1a_7k-9|}RFUg);Bz9zZ;m<~dBnNm zJcsQ|Z-0k^#)@%Yg$9sRG&#|fnDHgE6r?FZg)i z@|J_8I1X2F4G0g!* zL;s6&VBzMLqsRwKE0NH5DezFpvoCkRWs$#jpwT4`G~cB@3-8x~Im4xx*1#!nK>iX( zT!#%^)mQ{$NT<9GAkg1L(8-Prdd&^rEGd2{ZbcGhm`@ytVTs!R6lYjMtmb2z(7J-U zTv=iXx$%OG<&%PmS5O7s!DQ9_;)<>5Oo!nND&v4V;E=n**GslK7{t(m%J(H?Nx^L7 z@0A~SM3i@A9po$fsc^rngW=v98R&`=<(*=m_p$40J>|a=1a+%JN(H z`F!Ckvrgf~+(JL{3Poc&Cg7|Ox`PRlz9edkgJwuc-VQK_rsx~RBq_n0c|c8w7cqH3 z)QL`flj zNEbXrOPL_BF-Uea2rMQ-m>ks$zp_j$QB0ld;H;rjGQcEXK9b*h+;>~|GyrGlFfloR zb*7t%OJm|xM}x`SJ861J6U?pjtA?R8d{CQHnrWJ$A0QJ0N8-$_U*HV}gLx93CXEjm z7M5=eozNDt7x@I4TITi>DUPfYwFm#_FJ0Hm9otoNR!42yep%sO}tFYuRVwvbK*L| zXL2Z2u;rlXIUtkek?U!O2u-E}%ocoo$$-<;N5G%PW3Q|>G&z|~`DCnO-0tx8`B`Vf zgYZFXSSv-5!k5tyYTX5M2w5?gkr~w(SJGW*Dpt}a3}u50Kvos;Wk`WlIf8EpE!+cL zY%<1dy$G6^jh$U9`KR!C+Oyi)+lwI0dxkPYsm!(TU#>39+Q%mH*|hsQtIj~Fd2`8M zvK=x{X@`eK5gzh=BEBs6K5X{fnuJMFEp>4Nf%Z(291dT>r?KN|#c|XOw;&wSHVbfB z&ibwan=|BZO3KY@J<9@bG#{4GE-8;U^RXhYAybxulgcHfu$=sOgfLR1;C&2M9->EB zm1H<>yo@2MzaKD`PfkH{ie$UsI~7&*kX}r=-Gido1eVAxcPO;80`nI} zAMMC`O7ygt%ofwIeHS9yn54dOVjS*`%xgElKHbv%U4pq~4dk08Vb=+tYqq6&^@TpS z!%4$4X+*C1k==c|=ry_fweO&w*Xz4q``k*exk+9A?B?U&6O&248)5F|*Jq(Q_Q%&! z<(T#AA%(ge6Y5;dcvv7x?}!Y)5AB{u;SCZM4O*mNH%>!EnbU;$1eQ;Ez-(Y)Okfg_ zk1<8Sm%(uPIy@GWRFkB<(u_u+p4*U39Y|xM8yZQ_pT4A#gkf?Wdr2MMg#6}yuB}ht z$@i8YKrs-o|4KZVIg#Z^o8Eal`8M_@yPQ&RCDtBSF-_M}%AVZZ-jqe&fX3mm5sRT9 z?GZ}vu!C|X&22AIrbwGp2vwfh!!jvj)j>36V?u_HZpLsTvFbk-bVa) zkQV=)Z!KYZurGXoYB(YVX%F7_3$_dFBf)`9q8UWO6pj5kwi_P?j-;$UE|AUirYTSg z_a*bajC&GtARQ^;zL?>hvO@1?cjWR!EN+2JEwRnX-_P!_z@W&R04KQ4TXHBvzpMy) zk`u%m^&tF5^_(SEPOBuzN-pK>Ly-^m+I+OxH{y(W1RN54!gD)gzH>XH9cRp!2S{Fq z=Mo<7zlR}cm|&jMMi~;30lKuqwN1n+wS5JrasGxTCE+}i9$fVpH z*G9hEVr9U`GW~@2z5No_(4>U%E?=dX+5n2Sd|~APMPd0LPDNrc_4bSo5%an7FoB{1 z&I!GOiLTbR<)*BIRFWkq`GS~`FYp9!RvQ%wFIH~PNw_`J_RT82Du{NOGHGJMq;XW$ zJp+_iSXBzED*3LAy{sw*QdP?BnXERCZSN|0>X&JfL7KvGygJF&u_{rNX9>!H?_sSF z!`5MT?m+ESp1qSc0$WJIf*%%lSj}T=?ZaeC-CeQ+Q#7+KF(cWkC?k=UF%2D@!n)Nw z=b(Aaj-_{kR;XXiWA-ndc}6sk7-WSF%o5D$U%(2En#UYjI`E8n?*238dHYVAOZxv8 zGskK3$bF)mYzv14VX!dS@LZKr){yc(+R zqN?`F2Ck*;?U>_gFtms{YVMxw61B+=gB24C*0WYf;<*H{=redLhW&_iBhWe|xdkF#p6#R~Ns zgzX_@;^rY}2bzgdbi{!MB;#L-8u=G34u{nP%zd|ekQu(@zE0kTbmL_9ErEfZnQ$Ef zC)3f^K@!3NgTOnDmWed*PNkhgDsfMt;1kxad$4@ap*hX!NtjWuq5w+@Chb%#A!*p; z3{pc>bzo442xOIeVS z_9&lzO7-1au2xfcREEvA`9>=N(u^_{QPq>>oaXIElGs3{{nvsw~cR z*gCyw2*V&RS#2Jcqq%u0XPoAdYPh!p8xb+%6iv8aQ;$reDES#0n#$`WtwSlzRiuk0xIG2R zR#KR{9~-p@+6+a864_pCXPQ3C;Jk@UtN>26V*hM4hKf^3)&h%83VVJ-2A6_xMfUHI zN{$GuEfr2D#-+=pjz7#S%0g}mMK@DfS)6WVeXf}rxj)!u*vpBz(fz^b_}-sEhK(rm zzg0gZqppLYCMpxHY`tc_nmPgUhi#ZWMv(-_W0q`BG^6hjJW+C+!Y64|J%LPYt7?iM ziCk?sFZVUa;T@tS8AW^SGbUO}X}dCGkTM68&>O_fp-jOhp#Q(962*Q1Q0OGg8wMFT znFGnWS|~Ju8RR>dXSzC!Dpl?(fl%g_9aNXxer`8;g}%!aF;`{-A@n5@ly$UQX+20s z{iZv>TWOLI-967d$3RmO!X!;pUfDt-D-D)&yYUo!S1SQFQw7*eC1%E{G6Nv2^&I`@ zB?M?Jkc_-?fK6TEI7b}3B|^^aPNeh!N`Osd0XC6|IWi;9?I!P%64{g%U{jhnkuMXx zgfb(&^`JvhNC46NXgiEojN2~S4y+uL-}0$%gy!mOCMjUsPm1R*i1K!MFTKdy9U1$A zi5Xm4WyVNe4_^aesBv+7Y#*&0O?)ymKAU>@d?)W=Y`&AXXMBecUYy<_MA!sh|G@EN z?xEbz4rT*PWfX>5=NuL&hO|DvqL2oZhe>wq7uMo|mQYh2ym9E_udp3Z`+Nf9noJgC zqfo;{ben_?AGuj~b7l5To(@997OdW(!zTxO`R!v-AD%5`mQX?LyC;Jg(UnJm2(zOWZ z+q~uLi3QdyY&NJ$oQcBHpC(XAQC}f_Oc-1T(tj23=T;GJCt6Z6RVyux-MhNkK-J3) z5bcbR`&PoA{E)JiHign?CPP4y6lGjHH+~F!^-j_&6dhPqESOtLU^jHaf~b;q9S0i$ zOnYE@8QrO6GetO15PMpA70ImA{02TLp_O2Dr&=XzMo{1k3Wh0uOQdCA9y1Q zU=z%(m`5?_()^77h#9*awoy+byE*t8>cW{?4b^fl<88Vh4__lZSli%IyyAqIY4f*7 zsm2Pu#)!8Db9YT+x1pI7e@WYgb zJ3*JxM7kDR3U(9d6a_yhEQ;BP%|FT|rs})-B+VymZK_6XGfATP2Z)nah}KJf`H0p_ zU!TAhT2ckysKAywdhuhIM+=?8wmoE4@?nK-cQEDC%&-29E!R)eLd$QNC|l@Vor9@F z+n%$v@giA*aCQ{?4g{4-7a#mFw67x)DQ$;Su=?bAREjxU59mC@Zjhk8>KY7Y&5F$} zoyetim4A#Ys%A)lpD~ zl1F-I=NzC1|5l`0kxCcB=3`UT^gfoc*}8HNwPEc=ANa%J_q&y8TrB_9qxDa5)lrf| zo68}JIvq_#0VV;>72#J<)h3qX6MoI0?mZT*QfVGmQN%b8XF?9l!=xng@Nxa+TiSIL z$#2kP*0X7%+m&h_7}1!Yh{Zy}HbU-bKK3J>gZ84=x8o!^K~i4hl6(Rw#!{i_v=mU7 zQJfzd`YyVKuEnrAX7;e}LphHf!@gX_H&4s6p~!+(!sK^-p#WfzA?O zf#OD*a$t#pe_-W52~TstT*w2X8K-TGv5h510_w&6Pd>%XLG8@HwirGKvG-h8p(>%J zw9X<#I)F}9QlLw0_!!{{|jZns}M;^7@O}3?2kWp@cJFiM}MFbsXVq&^^$@s z(&$?&?G~pk?Ei;$4FhpFaC-pUu<4q`uOQ)^BY^nl3^<5H6ZpV_PB#5@1-W>Da zFcB9eZCw>%g3LfsM_ecNJ`aqGSHD4SF=w~Gze85#(0iS-X$Y8LGZ@|;*%kO9$^V9C z3UrGuG!}Z$uT*q9@QK~Qh;%qVcVN(OM8~1c{dfA<_}Sh`@$8R4uuF?<5GtlOAP4%# z64*-%s#WbxI;Kq#ZC#R4;CU2K{|*#emt?GANTB_>VhIp(EKi%YKF$<&Ba2P=-*cm*lC$&JMRBeWLNmtP?UQ5 zAD1wcduhNk2etb$BF*3GthXbPz>4%Zf3MQe^H@?1SCU{ybXTTl7NpxDXH@#~il*Ek zjap1jT)B694a!YYO!FWww3@<|o2rh0(3q;mh?|n3CLFhE*GDCV@qtovz+sX0KQ+uH zhKoG7tCV!-vnIimX_y8kB>Hb9<0?v2yh+{spuFcbW{aS?or}okkKx8Rc*dzuYy1iV z|4sDo(oOnR8d4YC-6`UO(4wz}m`?hy0h89qN<`IXHevtiAA`}p0$BJLa4+z4`Iv9^ z;z*etry>K6Q^T+UI$XuM$6h*I?Pyo#Sd}Rw$!S&k7onl@oN@A$iN3Uqy?DfR1Xh&@ zzC^hrZofQb5YpPueJsxy#K$ys1Y}euYF3Up0WIr`dez~OmUgINnx_=|*}L$dZ8uJd z_wQo^9TIjBiYXYSa+_c#XQaw|tchEBH=I%*8cVJ(Zjr-mZAe(@EU3h}_jXDCrxe*o z2Lywq#oyp4w=hwP``lrho#;R2Q065$YV*-TAx1C%$nkqmv;#*vlhwje$zf}jpfi8gQ zG=-DZ6n0W->W|#0AiUif%uB@di}8|gd)xfW0F81mSSgyf<=~$bj}KQOK5~1Bw$Qz) zwv`sY**4wk?`xZ#?l;*ckMxa@S7!1_OI~S_%bYVwqkzJJJb za^yMburztfNcAoj{Wopmn}=svIn#4^s3X2&tRBa^Hpa0(GX_|)F<)RF(Sl6OL2RV* za1gO-tnjGE5x-*|;z{_9bF?JpJN}Vvv~Y_Yz9T8(I(}HV%A>waWzfU`YY2|}nh+Zd zKc^tfV^0PPXtQ6!l-$keYdW%(r{spWQekBcd50A4`#n-H3|emnjcw5?s+UKq7sa7J z;N}gO0BjRQO~j2Be1i2pd>KW36%A4Xgeok`uCVC4Lt)W$^%^Jxik853F0Ssi$t*XJn}LMR!3^OKUVuwy9}WP=t`ywE zvdB(9lM!Z^@ZdRehkgBUD@*3dn1rvOY<+2hdgNW^Eh{bToK`!u%~TsOR&dV;J2ZKZ zuh+a#5H*#A{_!=L*?DSQDXM(A4pq*P;Ix0lm@ub(63(~i%&ULyIM~{ly-RzaF_%n9 z2`8R0&)!MH6~D1iBt2SWp9w=agdg9|&5h*>wL!G4-OPreeY0S20}$ zRh>H&9*}h~&{V<>CH(zif;XCeKqkzZm|RWQ!G6H;-;2p|j<7HuZ58M2ByLf$s|9-r zv_D6A;UTbZKhDA+`ULI^?S)=I2SC=Iz0eZ?F#050Z~B6bX%Px4xoLs6%(bSo)v(*& zW46bPSBbQ0VoEEI(v+g^Ye$0~!3TxDlGF!~E$bj1N*||C+_uZX7EuZw_EBHjO;TZN zfcV^Q^>Zo(Drg^qenC^<<$Zo5y|u7!0~vQG4`HZbcS2%gcS61G!R7ocy1@Ot=u!ur zBUYyO@lCd#VY-!309+RJid_)@ln)pAv)3@#z8(+l+ac;sCf9)B)G#HxnrB#r$6Ra? z-hh7LBe&BgGH_CY)_NRM^fj^l_U?kdSA)F;6W zy2I6Qy36Z(hn|)pevA*FHElCIX=KEtiROl_b#Doxg9>wsGozF{8i)AnFzk+Ij={s>gsgPY`hBQ$CDa8wYPjABD2O4Spwr zcm?!5k7@EQY$oVt3-RQ8amkjQ0L38Ylx(=X{Rg%)ohHAHn?e(^4?+t6B6RI`5=XJ0 zsNwn;#ID^J)5&6@Rduk5nCbs%t)&*J(t%i(ya&p@N(#CV&aB&W-iJ$F9pMnaFB{p5 zjvJ&t-bQP1#0SrAq*bbfuIYd-olY)4CsWMCM2MO_R5LD9Qy4e>da8w-8S4Eys|#3( z1(*|Of8|afHFOId>wSy08L--pUf0&%NA#U{s($qHIt^fb=iTkeqs?Dpu)@`#=$g6Z zaqxltp|7*wf+(1#A)&(VB+;S+IlfVY=!rYa&_|0Q@HUiI=b>>JU@Zt`t6MP!fd2_N zLf*}kqL@~*I_wYWRq+Uhx`T}f`wE`-eKx-BvxrL*=Td=`d7;HSFg9=#FR+dF)KJOy z{^>n?c{`QnU%*l;7z-Ahpp8&=9MZ6Y+pocsmQ1EmWx%r_`GTo_4Yk}^rWu=dFS`vT z-=&gRUD4j(VBW=A2XB7BCQMSa4k&lCg$@hKub7eAB#X}!D#hlJHn_p;kEsIvE1v5~ zX6*Y=_96?U$|s!F!BW91;z^-xmD;q8_38nnz?Vvb5-`7-_EW|^E!K4qDzO=74lUO8 zf_@bTEOIeead{Ov_fkFBZqicn5+(=cTWLN^&=e2BpxrZI$3oVSVIkhB;IEi~nd%hQ zv$#&QIleDtHZ5fd_S;AVFkM6Dt(eL=nxUabsFY&5ouSzQpmYzx-j^k(sEv>WtzXPY z`?pn4RRkr(JK=qopxhNG=bVt_&!OP8$-#=F`IvZ>?6b%XR=>jo`dQ9`d-lJBg4Op0 zU$L|_JR13aS%G{(`{7YweiIuF_AO|xdjD2T2w82|5WEC3L@{{OxE}9Wr)bBDWxa$t z<4&rFVx{{3hqJ|#Op=#JU|E>rYyF^FO4=GH?p&c01E2s@Y z?|ivSq{u!qs!Vkg8Y{wkz=V1PB0Ye5Hp8ig&5g9eLK1NY1mzr<*OEXcvkSnM0!)j| z)M!9B_&2q%Zpu{O-oiT7&q({N;6(<|i&?0tjHBrq+V&R9dp#rVSFi`N<66C9`tJfN z=}A{#(Pkrn7~Z9tvDvOs3R#*iFIQr?Yt(9R2tLe9qM3qz-6Ba&Z_SS=AF<>u&feVEA8V* zq~PFtArD&;CHWKepKwVq+|8JCeosyfR`tP55%$Z7#g*7#mWFDP2oz8h1<3XIiilO11wDOmH7y zQ9K1MQ(Wq=AkDnFKM9qj!yqsp;LZv8iDZ|OGJ_&UBeg)qOIC^zBP1!w@2UqVYD_mM zP0iGU6OzoW&&N{{(?+V!mY;5JeUyN}y}5$9RZM_})`2IV8s}48thxRx8I0jLas;}r zP5t0{;^LPinU5C45YXlpR(H2!Xl_jaL-ZpPlS0d(eVf5jG5w{Sircr)0|%U}6{gRi zFuJ=e$q&svT?wx3gjh*%>Cc@O-*CNh%O=sc9q z0%*X6GT6#4)+VM0%yE;cVMhu7fe*J{%nsVRCl4gIBbm-|OG&|s=}jWLw+#C9^IMh) z`S|RVq<)6nFenzqV^gW=#R}rX+&v65%$Yk-CV~TC?B&7tK_uUa5?U6dKZ|rM`7{$p zGR2LFXu5iiMGs76$Sjr^Gy9R588B3X?5vc!kLS*!+;fe&r|7w{%5>*`n&q~?hd?aG z`$(n``~QGaJ3fQ6(uaMYmC4V)0=^w*UE(~kH1r0TU>jj>`76CB`RURG(#t``E=`mm6f*;Q*_sdh@`83r!L`Y!a(>0VFrGf1w%UyUC^lB zhwmH0H`G=65sDRRBULRr&AtJq*zY1{k9>l$^A03qP?V{$e=pp;fm%zO_apsnP090S4lNUCAq@=9S3%+f%C)s3rLq| zzd(hRSXIMC+DRz=5{Ry%|I9;K`KW4#wP0D!M9|!-&LQULFm?%-2gEJRbl@dC34MHy!n!zn`4pq(6@ajWxAD+7 zTwQFu4VX!~Q?ei88D7LgJ^l)m;|^?Lla8-13z4e*5UwVrY+wgXOhi7W6c^UWhnvXM z@d8<#-+6jlEC-}sc zZ=8mED2UXg=0mwz2U+Y0`xf#xu*#><#+#OHaQj?c@G7#L4ZO?0!l%9mvbAj$ex1a= zw*)yV*L1RsyJgc}s^9oMWLJtJr6Ilxk9WWdWS0B?9$6f+=`lRivbTD^7I?=jstk9U zO^cCFoj{8z+ywd^o)51FkaZ2x71MO85tpm5MUzbhU_w`UOb+691)HwzZUBf$OkK(G-a7tAhMV?)Ru}NJ@EncNl%Z6{^a`a-=4tQhX)AfT-%;8K zp7x5K=HY1yrCr9;9@o1oq> z+KZI-Tb_1N*m47 z-q6#sd77EhuHb1;>uERfv}-BtEE%w3U!|vwFqHd*r&a1{89eQK(CSv6Hbqanj;H;b z(w^mMH|lA9dD>J;yPv0-^|Z4V*0;A%+9IA7h9z!wFq1ajK=^oy?!1qTl&`Y}vP>f2Zw)uUKbF!fvwl!8@=8Q5>cJ3ss8OBz2I zR$u)qav}zSHHt7(GxO^5o!E^-=>B(?o*dhYJ$R^+ORo>{qce?0%@^ z6Xqd@!&;-dc+Y>w@)YBnTuSykcvq7)K(!s8WBQAztFg?JH%Rkm_lk_wsS0`E4bnVI z(Q@4DWLzYK#`gI#m8+H2v?#4U8o?*NpK@JR$Ly?#%s_P%<7ux&39%%UevEyUHG3XN z#jH$rtUf}8q(EDWQha~1ZNG0&*8Vvt3_?B4ylwkvUi1{!^mfVi1`AZoq1Z25P{_B# zJ#_ZXyTfWP8ki%J0Eh^IrrHmhVPe>X;g_VqZY^jy-Oix> z$9&51h&7cIq1X@4L_BXtWPhQU&|*y?Og^1;HnNxQ_%eGV`wOxFjr|qm-Rf+{-6LFJ zkP$H-N(PAtd0OCnvTxw3zJc?-e3p<4Tmt7)aaZsB)#lbote%NhF_O9`l+B3w2pP(U zqzo0VTZ;L93qW1wO=ugt%s4-oN?YO*M~0fwVV1V%XLJ=P4_c{f#f*+%P25Jxsoa(6 zFiUOdu80fm_)2kQijg+khvo;@BQ?R5gV$d@N*R}rQ(U+tkNfB52U}R$MB7KJ?xp@< zN0|Ob`k^!9T|@s+QWN!q2nEvMkVCk!!23jO%-UV!yVM_{r_QYuHb0?N%l1k!i#Yb|XO@{2!{Kg^dg293zl0 zt9R1)(IaT|rN z)loh8g2dExrO1l2FZ^N~5P&-iZ($0(^;G;-IYUS$o99f(>0$&f8Y?R*}! z1nqsHW7WYrPT$V_0$K3GWVii=#NZ%{yqjPwvsGtSx!SaksX83f;b*|4GSnZNyKR^sz;cfDScje3)A*X zbZO|&XH-R06yUW#14KB1ZPG-60VSbt zPtYb{Zm0lbOI@aA#hyvOg!>leTeS(I%nJ!{#7o+7!*K>!zpD<^GUE=*9=0mY4J8s2 zb_@WIA5~6+j$R@i1t(!&Q5xzV1k?*6Z zpJ>=of^Rmspy(MEe=l4Ih{uj^LjND8VrN)^mGRx8+3K2YXe!$*(@!M4K!z7iQtRo` z1H15k2$?0D>cbcBn`)TM>VG;Zanx3%g!@sCT`oNxA z93WBb3xQ-E+)945+K&zL!Pc?xK=?IAhiw=|_om{i?LOaFCBN8~m*l@uFAfZ5VF%Ug%Q~k(t!gxjM^30nWE3^|7Si^HWRiCUM3F3mO??=O@DK1EqP4KFn2o? zcGN}RQ+S2eBFrJCo2hZkB=t=J8h!*Wa*w}s1{BjY#!|KY~e=>oX)ot4ELPb0;YB7|8P}q<7qJ zbUE=QXx;O%1BB>#;Ev#Z2@cfeD>a#pxDz+xnua6pn;UVXSpGWWBl*X3pPQv~fggvg z9H(q?q7?tKwnLF}@Vihe#ki0d9G4=0;E>Sv?GE`JxIXen8SnNatjtVs zP2@i>fM3VsG0EV>MmR3PapsKE@`qI4X?Z_tT!o)E*^zNU52)2B61hox*OHafS2FxV z_!ls=uUoL+0MUG;Y@Abu=gOfQ73MwdB@bykc}S`9fg9OZ_2h1BWfr;r@Q&8OBZe}_ zIl6HQ8X8rd@7KB{Yn}3!np-pvvo1{bO613Smb@Mu*thsWSlF+Bv71N~GA5;zRah-Qe97lm=w#^EgPxb?d;wS zEk5dB2;eJ4CavqcDHf>(3Kdtme!3->l&j^edKTg=4b4aObXUR@#707Ev$^FHm_uMQ zbDqqt?+|gDuo744HnW8eas6T1PjD#O@AN!QdNH^Dip)saM!CX=NKnK<%`Fcyl*K?5 z?Hisv09t9tn_G?!v+bZC*ZJvh4oT+x^ZJ+OJ^@dB<@gf66J*GR>DvDQa$hp zU`{U~R5CBr`)#(_!%j+^tu0OR_uC*Z%>QJ`MN5=KyVG?@;$O0x)eCv#C&=e1z>h`3 zm&EUG$gQ-W#)F20l85-|M76ae^*^P5q#f*;YuU9*Tm5K7XjE_X+HR^H^lXJe}nkXi){zaBvV%))e zeBT-q?}r(?#XXEI1=eienVs+2PDAGzXr$TsA$nYtgH#XwOb<-wQR2wFe}uU+sf@ak zwaF9_S!Z?8gKngu1fuNXGZfYMS{;jZou1nesG;YrFc*6M0gfa3oeY76{4Q=|Fj-J0 zr^oFV6Y$k;xC9+fo{J<*wm=`uxF?Uy*b4;W-i=xz)dC@5GWJxExs~Kp1HU29o9cNM zn<+8C3=5kt&C*a%L_u{VS`Z#d$AD@4>N(C!+mO2iJh1m`1G^f$;z8Dcal8#I`R0O$ z)izyEiugNXYg+%oGuV^M^wG&4E)PaR6AHsyUn$b~t??A-yA_xEB8(0#XN?-L8R?=D zqy}hm<}0lE`3f7c{F{So!B>6mX{zz9waCg{ZTWL}_!ww~NS#|?W41)U&DKR;3f->%;Uq>38Ex794m;cxaD89W;KU(lx z3It+UFJ6Fs`%`P|$> zQcIif7IOwJsF^eH%cSNET+}dUJY#K!faZ)puv=~BjF+tI8T~5z&0TZGo7OhanAiDk zot<*S^F7Cgk$wFHYVT1Pv4Ux&#oC3u_z9aNJlK58W?qcF#7qrIQSDE#i>0H)jv9F^5}B#i!m>!Q zbcmFQV(Q5sVOi~T|6KcTO9k}*niPuv{P(j4e%8Rx8u(cQ|5s=r4%gZQq4_p{avtf<825-y);Z-9!u9JO*(&1HiP%&QA-Q=!Z>S3+6R9Dp2xvRztjNN#Y@YhvY zs5_Q09i?YjhWjlGmiydZO-z41wTzVBu)tRV4SAP)eeNX|Ut`5`-jq={kIojfF7Rp` zyY)6&m{mMEr>v;BuweQWVa~KNSK*A}8F@3DMMOCAo%zN2WpfIqJ7&xwpje!mUp9G0 z-mD^_Yg>NT-2YA$Kx*{ zAyN2x8(qQd`5QJaJ109QM;KPUpgODa7GaosLDhlH zT#M&;Y%B!Ct$cWn#PbB6^YOGJ@_7=^dOVY%%@^<-hvz9g%kfP91NJp|=HmGXp3Crj z0nbi6-^4Q&;qneV^YJ`}=N>$%fBwJru01@e>e}y_L_pMIK)|T9j!J3jr@7%NZLyt6 zCX<9F5J`Yh!O3K1LPjQ;ac1&Tyf+#eZ41b?6t%TBwH6W4llvZmsqJTY(+l%;i$RO~6gSpW$|S7qAv@w;cz5{V|k-8?7gS zj{$FcJePY3_{_I+x$={hTJRmT8~ANt3fP7RDt7_D2RsP8_{x$AKGxgZM6T7w`_? z9^ex{f}QX@?@z!Ka1kC(YzD3e?gBms{0Z@1(*T;1h^CU7SR1F{Bs7z3AhXBe;xJ$jsa)SREqY4 z@B(iEZUnvqycPKKBd|M={y&7Jvy`I!zuJLw@E|?`ybHJ)`1#*roPbS#fInh>(c5NT z;G93AKHxd{Vt+r)I~=H1AFiucD%W6z>#UO}PuYg2HN?-xr}5@oZZ2u~C&OYW1D}QX z)QrOB@Ofob1gy$sr=B!0WmtXk%#WYHV9vQMhTf@_MUk^9fB>&FG{iYstuDpXGJ;T1)&^jnAs8wLG;} zB{I}nQ!YT(aeS^sIctEb!K&Eo_FI*sWp$Qkq?}HDTGRK`-e=Jls2s)T-=SZRKAL(_ z+}1J_yQRFA>h)2*KC0JmwU&LvRjOiSrT#5N8K2#bF~hm(U#spP$>=#A$!bW3MvSy0P+EnqpMrpXyX=YeMo=M>ZRSUIKdcR1W%8XoqXX01#1~&qDXp&^?=UwSC)+L6Ib1 zcnk7Pkdu$mL7c)mdKb8h=o|-eGr;`-TwF7Ts{%J0Pw)!!E(Ny~obDrZ$?sdiT?+1c z%4>Z4TIvjyn}F>5kkyb32XVvTUIur*W(>C--0#7mx%!xazxRMU1dh&WKCMKdOK>_4 z{vh~Uh+l41jMAhZp}FEtOtmT-p0X-@d#xz}cqIm)0y7M;0IFoKcais^J94=m%G;>t z;c7h(k)(QNKCe|lO`?2La2<37u4{B0Mcr-~ zcn)|E_%DOMiSv!R5$;E59=bPa_d}-}A!~$Q`PXx~YpKtU^H0as2E^4X5Le$HJCK#? z+>Wvq?PR;7En#a(tK|(?jXtXt%fhAPPc#nSgs1|FbUf4RwO_B-SW!5n(<;KJxYj_vdywyK3w`*PcKR_)N=guEZXHT(bSnk41kZw>mbVOPW&MB}p#^N8jL-4jg3wg2hVCOzlj zH0ClxUz@!PxeM}XJZIl`ouOk8riMFh1>sn=+Oe9f)&VOBr)!dAx4sB~MPMpp5fjJP z;zHyhl;1%06tWMIOs|JQy&h6K=>F#>$h5yBy%e95aqn|0IC`zglohus z;hFBFRoRNDqK$V6u699PW86A#Pl}<<$ba7>e9e-uDl%vZjYAatl-;>p66drgx;ygO zv`scaz6SCr$#GEoZUuKYxN|gP)}#BuJq+$n;wXIIX6D}>@bu;OGsNqdhU==4vIc}F z_oEZjPp>;ip?eUz`nn1>8Kre+gw`GRWi*d?y)2kXX1$~sdcny`&BDFnoB4V$8WcM_ z+`p1)sK4#ddkK0?tcUAcV>@0evXHxQulaHIyPFE);l%Z)pRU!GS-ae2r#UPZ)TVKi zbrfaYPjv;Y%2k%9S+~V~W!}gX3ywf9i~HJP($jMRgNoVNsg>7|<9eE;6HuWsn2meb zapajxd2rl_PYt*qgY%Rl0cYRpMy|qZbF6A3lNzuhxNpLekie2qYaPMos0*6=v0l97 zih^_x;lvMOIq(V)tAIYF%l^ZKvpO(WFcT^Mjf0SHgxp7s z*L}W5&kYZf$07SFWb;Xe`=$|hWGW^HjXSO+ub=hy~YJO9HeG)5=YY za2B)|I=_d`cW7&RoMcOjl5?8dq28=8haDch`8pTzb$9ou1c3hq#=!sjURJ%oH= z%7^jW?8aQ-`wCq1X#9f%N#kBC4fbCUmC>o)8AN4jk^$P_g04zCnJ}Qoy#7&wQrTGDvH}A+%%k`CRTvoU4`j>%9Q_ z@?{z}r+7!}!E8MHIT_D}hH31yufVt2SLh;ky2}bKw>m;ru+eHQydi};*>NrMH{%)7 zTAWkYvWsy?UE;2QeDxlbpZIAmw+QFd_f_n}znkMbKbI=y zx6RfzSJ|s&)~$%!V=ng!oHT-RuPN0D@}~sK_PsoDJ<9hUSbNu5RhL>dYxKn-UCv6> zgulTT5dD+~`R_;mFCu>}&eaMU!wp3-yAkw$=(JxAJLTJtDO>va7Vcxp%1$r0mf+IV z_7DfYkFsXNPzlucH>z(UwlBk4rsKy_$eRx4a%Zr74cht70&FW~&{d(DYmUTu@RI4$K%{?GILll&r={34h9UM}ZC#=0SMBKbwGodqJ1 zOMWTeF6ZL%aGL&R7S8~A{tUByMPZsvp0dfO+vFWK`RO)!t4%(`CimLpvuyGjmV3E@ z^B84(rT>1LT;i9=#Xgc>#$V+1w)_&mMDAtzd`79?&1tD$KD0}>yhWCQoo0JsbAz$zsRM2kxTs| zm-TrQ>U2&IMTIHGvuyf>QWp}k4tSjONU1>2q$d7WalZ2zFJP=@{Pj1DZVjjB zGcIIY%s5fv-#^Qwi{)p1xj6mk?IyjHQKYwCCuhaDYP2}*lp6n%kwh6qFMf}l89etk zgLkbj=70I=;@iQz?NRg>61+{N_ou* z9w+N#?R^H%;B?Ik=Hx6+OFTW3(@R)B+a~|>d*6sy@M0%q7$*g||BQ1P7c&MJS2K1o_A`z$?qJ->xSMe= z;{nFQjK>%!HE{ima~T&i1{hZ}b}{xdjxz3G+{w6`aWCTmMpN6w-y^S@^O^}tpFQ%e zV&W}Z`nWA!{cy2@$2?UH%U6BGGjCz_{OWn0`8D$w)-0)6 zq#Q&a#ZL#E4;Mt`>i7HPTk5<7hGnzg)ExEdEFVmiQR+*J~CV8Ud-Cjw6PUb+?uIpp9Px zp2~TH%Msf|m_L23Dd&6x`a5mX_c4!V>th&yiT5*4cA;Z4KEwx^zeTfn2OCK3?EWu9 zNIU7VD(Sz?`tm%B9`}%b%GUk|Sbyz0Q%=Z$dQ|JrRPy{x`t^O*{|@U*zn)?Kb>{WE ziQsdA%4)t)Awk^XKnl+z*B!e(1{Zq)E_!%-vQ#E zVV>+o$8_e`(E#Ci+JJt~hxE^l8iK}^j-BqvkVTmPYuqU6cM5TOsoT^$ zY_nT0^r=0=+#b1(?BjAeH<)ttJB2u<{*ivSt^F^ZX!t=Je;w_x8RosBu&3xNc zhPZ+GJPmA&s1YSHpHPR24CfJI&60M1()*+ zzP}via^7ZsUB(dlT|S&1XI}2dPG|i|7mXL4&o@%jn|sAw4Zj6q4M8j{!P|@ zk@+M4YKSK0Uj^^N+hyM}rEopK@!8`t8R$n8WCwZP^dy&a zYPsQG(TQ@q3tWwec67X!N}{{)enzW8}Yx(PA2SA-8jmF6T_OiN_b!>0=S|!#2KN^A&20p$^}w$Vy(*dpAA$b#VoIm>I`A(#@NYTr?>X@0lS@Xev z<7qaXp38l|#6dsm!1p`wH)!5cb2%UlaQQnN^uOW2f7^k77QBbcEQFUG^nd5T=N$NH zlS_}w2Z?u|s^ohGse6vrx74~z4I|GDKI%|TqXU1r1D|l<|J8y2oCCkZfxpXvf5?G< z(t$syc}oR2E{(B)-f+-=$APEce|b1>A<%EXO3l-cf}e)?sdgD{iDQip`auW2%Ynxx zyd~@Xj068g2mW3M{#y?GQx5zA@TKf?6nsUA`1Uu4axAQyrR;gO17GdHFV(!IF1y6o z|6@F8eh2+F*1veUQIz}BF7W4a-a@#}p`2|F{8t?K2ORisJMjB7Z>c+0nAX&Aqh4VC zZjNtLnSaHhoHrc!KRfV~QDCWYndQKr^~LX$Clz}Iq+2u{89%#;J~*z@SU2s)G7Sj`)ux4(m{VS_zK)#ci8-a ze&1KBU-vrj4?6HqI`Gdq@U*{6se1qDz^ju>>sL7N=V{(j*Yo_H&GuQyyzf3koWVTp zFGJTw+c}QObCni{@~?2LqQquzkp?NH7h2mV(M{99bUpBIY1aryLn%~J8I?9|fysSf;E4*Z8TZ>d8K zrb7L@DV)-NQ`6m;d|qw{!+eKwmO1dWJ7aZ3VJ}N;IN6!ZW|P>kF-8f749+*G^|37N zxrqH12jbCex9W`zX0x=5qe{mjlquP(@X4r5EJ5ekP%@j0B;v8&tU2f0aqQx!2K5e- z(Y~IZAwEYX=`5c!3?|~8Dw2qWd;3yUVl*|RBG{7>`#vIt-2sz**^COO)8XFrn(9kM zA*9Xex=}eqsZ?TUBAFRbnQqnDtys_WhT5|}hCZ9!1^d!5bcix>+ff&~5mVGxGD13; z%%-wwMQA!ktua|T!)bJTq9ooRlPiQ2+vWA8Gs(1yro#hB1JS4~OsNv-R5+@#;q@62 z!j#>~f$n%zw@42Hw)yN!uP2k5J`D7jp3>lC(RVe_6Q=Ro5F1LNNf}n_?d!oFeH(hh z8H{5(+zD|;^}syXj}g0W#=C|z-Pwn6#0W;?X)~Ut60|dwl%lk$*yh#P6E$01BSV0Z z&#n)r$OE!neTf9NO^jjJyF%A~>r7<<~zFwzq>CuH%y-mYY%FGE8@_DiLcDcT@1W6o;0=h=7`!^ZpnWn#V2 zSU;>+q_`oTNbp!w!*!whFGjM+Q`DgDhZ*YPp(W#^EwMouDn=bL1?n-Wj%U(gSjkX5 z7!~Y`NzJCxbhBB3hg5IGN}F0L62{WmAs!+W+m}+bMJ(Kic96|rxUqp{WCJ;!F)#dw z&-&vrxE6X$#sWRzr9H_$G_pI~8%@B{dAH|U`Y;5v2P_N>4`DKjZC=w!X$UNcZEua= z^Z=5ylP)Oe=08yWxWN%muEQhiq^;RD*PunOWyx-SvaPAHZf2v^TD3cAJE-IK#U@ zdZG(;Tc-EOf6bw-Rf-Pv^8tr*XGc3*Yrm)9ww#(bl+*Df^nvd6e7Lj{r z;?W{1*p<~~CdmCKn$nj_#3K}zA|xozQKvU^MY!c^Ve?QX(i1WfUIkaiVEIh>>AvtBYr4Eejb8{rL&v|9{nl-sb?YeG5~T!FoI{k+v~sHwdr6pf{0>ya~-Zf}8AdSmT+N9q2q z5`GYBS^-PL%R`voQMB0X=9_8OoBL8<$usK*QCvoKrTVgwBE!?fDk6g15_F$-l!mt& zYvnzowhw&A*8QE8lE8MfKuX8{TKP})B?!x8|g(8Dtawde0t8M*;2L_U8YdYE23p)m| zAg#nT6)tPAb_FrR+mmhK{utC0d=B+VTj2k73GoqKDNSZNfum*+V|tLECU`>~u2DmX@{ez_mh3wF`haYcrw+G#;1DgG77 zGV%3T=doTCvE=H_h*rKVrUe!cjC`R1WxjV)#_(m5A+vgEJ+mHb2g?+f>%-2( z1G*2UM7mJLRH7BL1!0+choKV_=y+lx33)HAu~bH6IW~O9{?+kp${zR3q$2aS!6hTv zre65D_9}fA&{q@G8(jC9r6d%B&3cm|6pITXn<+w}&P;|~Gap9b0JX_v0;LZ1Ms(Sx zE@WOYfFO_PJ<*#stoWv5Au1=bAr$G}5TgCo^R`*2f@^R|mk&B-cqtU%*47Rla@+L4dv^m^&`j=ygiAN%utVU(Ka0ub<~ojt107y zxAen@{V~j(7%xhu?&2c5vNUPy2eWY43+k}r+mB}J=2M_DF}zk^JexI1hXI>AV@C1{qOBH5q$M&VhQcL^`hy6smq)~u z3@%~m5(j=u_c{5Prx!w5DeCF}G-%{2Iz8iCZ9#8OxVvN>#&Evf)l( zHf^w5&h&LdN>$_PIaa;Cx34-S7Y>H<)izy77xWVfoqh2{^ul;lY4z?f?q{o`L%lSK zG~&KgOK^3RL3k)igdj`D5@Ay0vs5Chs&$vDb;z#P7dzGIq#l^+ST{lzLSLvmioB9C zIYM*~IHYtAIj3Ay1q#s33HQV!Xaeq&=})z;&6JENr*IS2gS$F@yRi5f#{VTn?`62~ z;nxXNCEl~4Lr|Xc8rJB_IpKNu;H$@c{w17W&A(CgO;GaV>ur75+aCstN9_6j%kS0%Yw)Ov4r(LW zS@O&KcyVylWT{_%2PY`MdxMHTsEoqnDkSJPW|CiiS0-4_8KnK9CrGa`(r?xzEx%h6 z^m1kP_A{-v;Dp9R^2_h$1m$;gQop_bw{ZSiE>M1lCn&$$qx@tud;YJ2qb^GM%8LXY zUj0|edq*Z^+A8OSx8qZo-{U1#DZz2-c)?M@=Yn@5U6@~5#PGZ@^LirJM48 zwqOU(U&>2|NB^Dpa~!8+V#zP>NeOy*V8o52UhxALDle>moH~Rors1Si Q{(kzw3y$+_8Ei@QKddd*jQ{`u literal 67864 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 B2;%?% diff --git a/dwm.c b/dwm.c index 1618486..c8dc4d4 100644 --- a/dwm.c +++ b/dwm.c @@ -57,12 +57,27 @@ #define TAGMASK ((1 << LENGTH(tags)) - 1) #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) +#define SYSTEM_TRAY_REQUEST_DOCK 0 +/* XEMBED messages */ +#define XEMBED_EMBEDDED_NOTIFY 0 +#define XEMBED_WINDOW_ACTIVATE 1 +#define XEMBED_FOCUS_IN 4 +#define XEMBED_MODALITY_ON 10 +#define XEMBED_MAPPED (1 << 0) +#define XEMBED_WINDOW_ACTIVATE 1 +#define XEMBED_WINDOW_DEACTIVATE 2 +#define VERSION_MAJOR 0 +#define VERSION_MINOR 0 +#define XEMBED_EMBEDDED_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR + /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ enum { SchemeNorm, SchemeSel }; /* color schemes */ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, + NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, NetWMFullscreen, NetActiveWindow, NetWMWindowType, NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ +enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ @@ -142,6 +157,12 @@ typedef struct { int monitor; } Rule; +typedef struct Systray Systray; +struct Systray { + Window win; + Client *icons; +}; + /* function declarations */ static void applyrules(Client *c); static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); @@ -174,6 +195,7 @@ static void focusstack(const Arg *arg); static Atom getatomprop(Client *c, Atom prop); static int getrootptr(int *x, int *y); static long getstate(Window w); +static unsigned int getsystraywidth(); static int gettextprop(Window w, Atom atom, char *text, unsigned int size); static void grabbuttons(Client *c, int focused); static void grabkeys(void); @@ -191,13 +213,16 @@ static void pop(Client *c); static void propertynotify(XEvent *e); static void quit(const Arg *arg); static Monitor *recttomon(int x, int y, int w, int h); +static void removesystrayicon(Client *i); static void resize(Client *c, int x, int y, int w, int h, int interact); +static void resizebarwin(Monitor *m); static void resizeclient(Client *c, int x, int y, int w, int h); static void resizemouse(const Arg *arg); +static void resizerequest(XEvent *e); static void restack(Monitor *m); static void run(void); static void scan(void); -static int sendevent(Client *c, Atom proto); +static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, long d3, long d4); static void sendmon(Client *c, Monitor *m); static void setclientstate(Client *c, long state); static void setfocus(Client *c); @@ -209,6 +234,7 @@ static void setup(void); static void seturgent(Client *c, int urg); static void showhide(Client *c); static void spawn(const Arg *arg); +static Monitor *systraytomon(Monitor *m); static void tag(const Arg *arg); static void tagmon(const Arg *arg); static void tile(Monitor *m); @@ -226,18 +252,23 @@ static int updategeom(void); static void updatenumlockmask(void); static void updatesizehints(Client *c); static void updatestatus(void); +static void updatesystray(void); +static void updatesystrayicongeom(Client *i, int w, int h); +static void updatesystrayiconstate(Client *i, XPropertyEvent *ev); static void updatetitle(Client *c); static void updatewindowtype(Client *c); static void updatewmhints(Client *c); static void view(const Arg *arg); static Client *wintoclient(Window w); static Monitor *wintomon(Window w); +static Client *wintosystrayicon(Window w); static int xerror(Display *dpy, XErrorEvent *ee); static int xerrordummy(Display *dpy, XErrorEvent *ee); static int xerrorstart(Display *dpy, XErrorEvent *ee); static void zoom(const Arg *arg); /* variables */ +static Systray *systray = NULL; static const char broken[] = "broken"; static char stext[256]; static int screen; @@ -260,9 +291,10 @@ static void (*handler[LASTEvent]) (XEvent *) = { [MapRequest] = maprequest, [MotionNotify] = motionnotify, [PropertyNotify] = propertynotify, + [ResizeRequest] = resizerequest, [UnmapNotify] = unmapnotify }; -static Atom wmatom[WMLast], netatom[NetLast]; +static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast]; static int running = 1; static Cur *cursor[CurLast]; static Clr **scheme; @@ -453,7 +485,7 @@ buttonpress(XEvent *e) arg.ui = 1 << i; } else if (ev->x < x + TEXTW(selmon->ltsymbol)) click = ClkLtSymbol; - else if (ev->x > selmon->ww - (int)TEXTW(stext)) + else if (ev->x > selmon->ww - (int)TEXTW(stext) - getsystraywidth()) click = ClkStatusText; else click = ClkWinTitle; @@ -496,6 +528,13 @@ cleanup(void) XUngrabKey(dpy, AnyKey, AnyModifier, root); while (mons) cleanupmon(mons); + + if (showsystray) { + XUnmapWindow(dpy, systray->win); + XDestroyWindow(dpy, systray->win); + free(systray); + } + for (i = 0; i < CurLast; i++) drw_cur_free(drw, cursor[i]); for (i = 0; i < LENGTH(colors); i++) @@ -527,9 +566,58 @@ cleanupmon(Monitor *mon) void clientmessage(XEvent *e) { + XWindowAttributes wa; + XSetWindowAttributes swa; XClientMessageEvent *cme = &e->xclient; Client *c = wintoclient(cme->window); + if (showsystray && cme->window == systray->win && cme->message_type == netatom[NetSystemTrayOP]) { + /* add systray icons */ + if (cme->data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) { + if (!(c = (Client *)calloc(1, sizeof(Client)))) + die("fatal: could not malloc() %u bytes\n", sizeof(Client)); + if (!(c->win = cme->data.l[2])) { + free(c); + return; + } + c->mon = selmon; + c->next = systray->icons; + systray->icons = c; + if (!XGetWindowAttributes(dpy, c->win, &wa)) { + /* use sane defaults */ + wa.width = bh; + wa.height = bh; + wa.border_width = 0; + } + c->x = c->oldx = c->y = c->oldy = 0; + c->w = c->oldw = wa.width; + c->h = c->oldh = wa.height; + c->oldbw = wa.border_width; + c->bw = 0; + c->isfloating = True; + /* reuse tags field as mapped status */ + c->tags = 1; + updatesizehints(c); + updatesystrayicongeom(c, wa.width, wa.height); + XAddToSaveSet(dpy, c->win); + XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask); + XReparentWindow(dpy, c->win, systray->win, 0, 0); + /* use parents background color */ + swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + XChangeWindowAttributes(dpy, c->win, CWBackPixel, &swa); + sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_EMBEDDED_NOTIFY, 0 , systray->win, XEMBED_EMBEDDED_VERSION); + /* FIXME not sure if I have to send these events, too */ + sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_FOCUS_IN, 0 , systray->win, XEMBED_EMBEDDED_VERSION); + sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0 , systray->win, XEMBED_EMBEDDED_VERSION); + sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_MODALITY_ON, 0 , systray->win, XEMBED_EMBEDDED_VERSION); + XSync(dpy, False); + resizebarwin(selmon); + updatesystray(); + setclientstate(c, NormalState); + } + return; + } + if (!c) return; if (cme->message_type == netatom[NetWMState]) { @@ -582,7 +670,7 @@ configurenotify(XEvent *e) for (c = m->clients; c; c = c->next) if (c->isfullscreen) resizeclient(c, m->mx, m->my, m->mw, m->mh); - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); + resizebarwin(m); } focus(NULL); arrange(NULL); @@ -668,6 +756,11 @@ destroynotify(XEvent *e) if ((c = wintoclient(ev->window))) unmanage(c, 1); + else if ((c = wintosystrayicon(ev->window))) { + removesystrayicon(c); + resizebarwin(selmon); + updatesystray(); + } } void @@ -711,7 +804,7 @@ dirtomon(int dir) void drawbar(Monitor *m) { - int x, w, tw = 0; + int x, w, tw = 0, stw = 0; int boxs = drw->fonts->h / 9; int boxw = drw->fonts->h / 6 + 2; unsigned int i, occ = 0, urg = 0; @@ -720,13 +813,17 @@ drawbar(Monitor *m) if (!m->showbar) return; + if(showsystray && m == systraytomon(m) && !systrayonleft) + stw = getsystraywidth(); + /* 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 = TEXTW(stext) - lrpad / 2 + 2; /* 2px extra right padding */ + drw_text(drw, m->ww - tw - stw, 0, tw, bh, lrpad / 2 - 2, stext, 0); } + resizebarwin(m); for (c = m->clients; c; c = c->next) { occ |= c->tags; if (c->isurgent) @@ -747,7 +844,7 @@ drawbar(Monitor *m) drw_setscheme(drw, scheme[SchemeNorm]); x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - if ((w = m->ww - tw - x) > bh) { + if ((w = m->ww - tw - stw - 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); @@ -758,7 +855,7 @@ drawbar(Monitor *m) drw_rect(drw, x, 0, w, bh, 1, 1); } } - drw_map(drw, m->barwin, 0, 0, m->ww, bh); + drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh); } void @@ -795,8 +892,11 @@ expose(XEvent *e) Monitor *m; XExposeEvent *ev = &e->xexpose; - if (ev->count == 0 && (m = wintomon(ev->window))) + if (ev->count == 0 && (m = wintomon(ev->window))) { drawbar(m); + if (m == selmon) + updatesystray(); + } } void @@ -882,14 +982,32 @@ getatomprop(Client *c, Atom prop) unsigned char *p = NULL; Atom da, atom = None; - if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, + /* FIXME getatomprop should return the number of items and a pointer to + * the stored data instead of this workaround */ + Atom req = XA_ATOM; + if (prop == xatom[XembedInfo]) + req = xatom[XembedInfo]; + + if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, req, &da, &di, &dl, &dl, &p) == Success && p) { atom = *(Atom *)p; + if (da == xatom[XembedInfo] && dl == 2) + atom = ((Atom *)p)[1]; XFree(p); } return atom; } +unsigned int +getsystraywidth() +{ + unsigned int w = 0; + Client *i; + if(showsystray) + for(i = systray->icons; i; w += i->w + systrayspacing, i = i->next) ; + return w ? w + systrayspacing : 1; +} + int getrootptr(int *x, int *y) { @@ -1030,7 +1148,8 @@ killclient(const Arg *arg) { if (!selmon->sel) return; - if (!sendevent(selmon->sel, wmatom[WMDelete])) { + + if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0 , 0, 0)) { XGrabServer(dpy); XSetErrorHandler(xerrordummy); XSetCloseDownMode(dpy, DestroyAll); @@ -1119,6 +1238,13 @@ maprequest(XEvent *e) static XWindowAttributes wa; XMapRequestEvent *ev = &e->xmaprequest; + Client *i; + if ((i = wintosystrayicon(ev->window))) { + sendevent(i->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION); + resizebarwin(selmon); + updatesystray(); + } + if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect) return; if (!wintoclient(ev->window)) @@ -1240,6 +1366,17 @@ propertynotify(XEvent *e) Window trans; XPropertyEvent *ev = &e->xproperty; + if ((c = wintosystrayicon(ev->window))) { + if (ev->atom == XA_WM_NORMAL_HINTS) { + updatesizehints(c); + updatesystrayicongeom(c, c->w, c->h); + } + else + updatesystrayiconstate(c, ev); + resizebarwin(selmon); + updatesystray(); + } + if ((ev->window == root) && (ev->atom == XA_WM_NAME)) updatestatus(); else if (ev->state == PropertyDelete) @@ -1290,6 +1427,19 @@ recttomon(int x, int y, int w, int h) return r; } +void +removesystrayicon(Client *i) +{ + Client **ii; + + if (!showsystray || !i) + return; + for (ii = &systray->icons; *ii && *ii != i; ii = &(*ii)->next); + if (ii) + *ii = i->next; + free(i); +} + void resize(Client *c, int x, int y, int w, int h, int interact) { @@ -1297,6 +1447,14 @@ resize(Client *c, int x, int y, int w, int h, int interact) resizeclient(c, x, y, w, h); } +void +resizebarwin(Monitor *m) { + unsigned int w = m->ww; + if (showsystray && m == systraytomon(m) && !systrayonleft) + w -= getsystraywidth(); + XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh); +} + void resizeclient(Client *c, int x, int y, int w, int h) { @@ -1312,6 +1470,19 @@ resizeclient(Client *c, int x, int y, int w, int h) XSync(dpy, False); } +void +resizerequest(XEvent *e) +{ + XResizeRequestEvent *ev = &e->xresizerequest; + Client *i; + + if ((i = wintosystrayicon(ev->window))) { + updatesystrayicongeom(i, ev->width, ev->height); + resizebarwin(selmon); + updatesystray(); + } +} + void resizemouse(const Arg *arg) { @@ -1458,26 +1629,37 @@ setclientstate(Client *c, long state) } int -sendevent(Client *c, Atom proto) +sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4) { int n; - Atom *protocols; + Atom *protocols, mt; int exists = 0; XEvent ev; - if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { - while (!exists && n--) - exists = protocols[n] == proto; - XFree(protocols); + if (proto == wmatom[WMTakeFocus] || proto == wmatom[WMDelete]) { + mt = wmatom[WMProtocols]; + if (XGetWMProtocols(dpy, w, &protocols, &n)) { + while (!exists && n--) + exists = protocols[n] == proto; + XFree(protocols); + } } + else { + exists = True; + mt = proto; + } + if (exists) { ev.type = ClientMessage; - ev.xclient.window = c->win; - ev.xclient.message_type = wmatom[WMProtocols]; + ev.xclient.window = w; + ev.xclient.message_type = mt; ev.xclient.format = 32; - ev.xclient.data.l[0] = proto; - ev.xclient.data.l[1] = CurrentTime; - XSendEvent(dpy, c->win, False, NoEventMask, &ev); + ev.xclient.data.l[0] = d0; + ev.xclient.data.l[1] = d1; + ev.xclient.data.l[2] = d2; + ev.xclient.data.l[3] = d3; + ev.xclient.data.l[4] = d4; + XSendEvent(dpy, w, False, mask, &ev); } return exists; } @@ -1491,7 +1673,7 @@ setfocus(Client *c) XA_WINDOW, 32, PropModeReplace, (unsigned char *) &(c->win), 1); } - sendevent(c, wmatom[WMTakeFocus]); + sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0); } void @@ -1597,6 +1779,10 @@ setup(void) wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); + netatom[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", False); + netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False); + netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False); + netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION_HORZ", False); netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); @@ -1604,6 +1790,9 @@ setup(void) netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); + xatom[Manager] = XInternAtom(dpy, "MANAGER", False); + xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); + xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); /* init cursors */ cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); cursor[CurResize] = drw_cur_create(drw, XC_sizing); @@ -1612,6 +1801,8 @@ setup(void) scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); for (i = 0; i < LENGTH(colors); i++) scheme[i] = drw_scm_create(drw, colors[i], 3); + /* init system tray */ + updatesystray(); /* init bars */ updatebars(); updatestatus(); @@ -1742,7 +1933,18 @@ togglebar(const Arg *arg) { selmon->showbar = !selmon->showbar; updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); + resizebarwin(selmon); + if (showsystray) { + XWindowChanges wc; + if (!selmon->showbar) + wc.y = -bh; + else if (selmon->showbar) { + wc.y = 0; + if (!selmon->topbar) + wc.y = selmon->mh - bh; + } + XConfigureWindow(dpy, systray->win, CWY, &wc); + } arrange(selmon); } @@ -1838,11 +2040,18 @@ unmapnotify(XEvent *e) else unmanage(c, 0); } + else if ((c = wintosystrayicon(ev->window))) { + /* KLUDGE! sometimes icons occasionally unmap their windows, but do + * _not_ destroy them. We map those windows back */ + XMapRaised(dpy, c->win); + updatesystray(); + } } void updatebars(void) { + unsigned int w; Monitor *m; XSetWindowAttributes wa = { .override_redirect = True, @@ -1853,10 +2062,15 @@ updatebars(void) for (m = mons; m; m = m->next) { if (m->barwin) continue; - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), + w = m->ww; + if (showsystray && m == systraytomon(m)) + w -= getsystraywidth(); + m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); + if (showsystray && m == systraytomon(m)) + XMapRaised(dpy, systray->win); XMapRaised(dpy, m->barwin); XSetClassHint(dpy, m->barwin, &ch); } @@ -2033,6 +2247,125 @@ updatestatus(void) if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) strcpy(stext, "dwm-"VERSION); drawbar(selmon); + updatesystray(); +} + + +void +updatesystrayicongeom(Client *i, int w, int h) +{ + if (i) { + i->h = bh; + if (w == h) + i->w = bh; + else if (h == bh) + i->w = w; + else + i->w = (int) ((float)bh * ((float)w / (float)h)); + applysizehints(i, &(i->x), &(i->y), &(i->w), &(i->h), False); + /* force icons into the systray dimensions if they don't want to */ + if (i->h > bh) { + if (i->w == i->h) + i->w = bh; + else + i->w = (int) ((float)bh * ((float)i->w / (float)i->h)); + i->h = bh; + } + } +} + +void +updatesystrayiconstate(Client *i, XPropertyEvent *ev) +{ + long flags; + int code = 0; + + if (!showsystray || !i || ev->atom != xatom[XembedInfo] || + !(flags = getatomprop(i, xatom[XembedInfo]))) + return; + + if (flags & XEMBED_MAPPED && !i->tags) { + i->tags = 1; + code = XEMBED_WINDOW_ACTIVATE; + XMapRaised(dpy, i->win); + setclientstate(i, NormalState); + } + else if (!(flags & XEMBED_MAPPED) && i->tags) { + i->tags = 0; + code = XEMBED_WINDOW_DEACTIVATE; + XUnmapWindow(dpy, i->win); + setclientstate(i, WithdrawnState); + } + else + return; + sendevent(i->win, xatom[Xembed], StructureNotifyMask, CurrentTime, code, 0, + systray->win, XEMBED_EMBEDDED_VERSION); +} + +void +updatesystray(void) +{ + XSetWindowAttributes wa; + XWindowChanges wc; + Client *i; + Monitor *m = systraytomon(NULL); + unsigned int x = m->mx + m->mw; + unsigned int sw = TEXTW(stext) - lrpad + systrayspacing; + unsigned int w = 1; + + if (!showsystray) + return; + if (systrayonleft) + x -= sw + lrpad / 2; + if (!systray) { + /* init systray */ + if (!(systray = (Systray *)calloc(1, sizeof(Systray)))) + die("fatal: could not malloc() %u bytes\n", sizeof(Systray)); + systray->win = XCreateSimpleWindow(dpy, root, x, m->by, w, bh, 0, 0, scheme[SchemeSel][ColBg].pixel); + wa.event_mask = ButtonPressMask | ExposureMask; + wa.override_redirect = True; + wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + XSelectInput(dpy, systray->win, SubstructureNotifyMask); + XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32, + PropModeReplace, (unsigned char *)&netatom[NetSystemTrayOrientationHorz], 1); + XChangeWindowAttributes(dpy, systray->win, CWEventMask|CWOverrideRedirect|CWBackPixel, &wa); + XMapRaised(dpy, systray->win); + XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win, CurrentTime); + if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) { + sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0); + XSync(dpy, False); + } + else { + fprintf(stderr, "dwm: unable to obtain system tray.\n"); + free(systray); + systray = NULL; + return; + } + } + for (w = 0, i = systray->icons; i; i = i->next) { + /* make sure the background color stays the same */ + wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; + XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa); + XMapRaised(dpy, i->win); + w += systrayspacing; + i->x = w; + XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h); + w += i->w; + if (i->mon != m) + i->mon = m; + } + w = w ? w + systrayspacing : 1; + x -= w; + XMoveResizeWindow(dpy, systray->win, x, m->by, w, bh); + wc.x = x; wc.y = m->by; wc.width = w; wc.height = bh; + wc.stack_mode = Above; wc.sibling = m->barwin; + XConfigureWindow(dpy, systray->win, CWX|CWY|CWWidth|CWHeight|CWSibling|CWStackMode, &wc); + XMapWindow(dpy, systray->win); + XMapSubwindows(dpy, systray->win); + /* redraw background */ + XSetForeground(dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel); + XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh); + XSync(dpy, False); } void @@ -2100,6 +2433,16 @@ wintoclient(Window w) return NULL; } +Client * +wintosystrayicon(Window w) { + Client *i = NULL; + + if (!showsystray || !w) + return i; + for (i = systray->icons; i && i->win != w; i = i->next) ; + return i; +} + Monitor * wintomon(Window w) { @@ -2153,6 +2496,22 @@ xerrorstart(Display *dpy, XErrorEvent *ee) return -1; } +Monitor * +systraytomon(Monitor *m) { + Monitor *t; + int i, n; + if(!systraypinning) { + if(!m) + return selmon; + return m == selmon ? m : NULL; + } + for(n = 1, t = mons; t && t->next; n++, t = t->next) ; + for(i = 1, t = mons; t && t->next && i < systraypinning; i++, t = t->next) ; + if(systraypinningfailfirst && n < systraypinning) + return mons; + return t; +} + void zoom(const Arg *arg) { diff --git a/dwm.c.orig b/dwm.c.orig index ed57711..1618486 100644 --- a/dwm.c.orig +++ b/dwm.c.orig @@ -36,6 +36,7 @@ #include #include #include +#include /* multimedya tuşları için */ #ifdef XINERAMA #include #endif /* XINERAMA */ @@ -147,6 +148,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 attachbottom(Client *c); static void attachstack(Client *c); static void buttonpress(XEvent *e); static void checkotherwm(void); @@ -409,6 +411,15 @@ attach(Client *c) c->mon->clients = c; } +void +attachbottom(Client *c) +{ + Client **tc; + c->next = NULL; + for (tc = &c->mon->clients; *tc; tc = &(*tc)->next); + *tc = c; +} + void attachstack(Client *c) { @@ -1078,7 +1089,7 @@ manage(Window w, XWindowAttributes *wa) c->isfloating = c->oldstate = trans != None || c->isfixed; if (c->isfloating) XRaiseWindow(dpy, c->win); - attach(c); + attachbottom(c); attachstack(c); XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, (unsigned char *) &(c->win), 1); @@ -1431,7 +1442,7 @@ sendmon(Client *c, Monitor *m) detachstack(c); c->mon = m; c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ - attach(c); + attachbottom(c); attachstack(c); focus(NULL); arrange(NULL); @@ -1929,7 +1940,7 @@ updategeom(void) m->clients = c->next; detachstack(c); c->mon = mons; - attach(c); + attachbottom(c); attachstack(c); } if (m == selmon) diff --git a/dwm.o b/dwm.o index 1e46135509f67ee780fbdf6e8b6804b3d3e3533f..adf4decb4f898eed1f459ebb4d3c87e8284b8c93 100644 GIT binary patch literal 69520 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

KH1fJ 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 diff --git a/patches/dwm-systray-20230922-9f88553.diff b/patches/dwm-systray-20230922-9f88553.diff new file mode 100644 index 0000000..9356ec1 --- /dev/null +++ b/patches/dwm-systray-20230922-9f88553.diff @@ -0,0 +1,735 @@ +diff --git a/config.def.h b/config.def.h +index 9efa774..fed4fb9 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -3,6 +3,11 @@ + /* appearance */ + static const unsigned int borderpx = 1; /* border pixel of windows */ + static const unsigned int snap = 32; /* snap pixel */ ++static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ ++static const unsigned int systrayonleft = 0; /* 0: systray in the right corner, >0: systray on left of status text */ ++static const unsigned int systrayspacing = 2; /* systray spacing */ ++static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ ++static const int showsystray = 1; /* 0 means no systray */ + 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" }; +diff --git a/dwm.c b/dwm.c +index f1d86b2..f9e7e4a 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -57,12 +57,27 @@ + #define TAGMASK ((1 << LENGTH(tags)) - 1) + #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + ++#define SYSTEM_TRAY_REQUEST_DOCK 0 ++/* XEMBED messages */ ++#define XEMBED_EMBEDDED_NOTIFY 0 ++#define XEMBED_WINDOW_ACTIVATE 1 ++#define XEMBED_FOCUS_IN 4 ++#define XEMBED_MODALITY_ON 10 ++#define XEMBED_MAPPED (1 << 0) ++#define XEMBED_WINDOW_ACTIVATE 1 ++#define XEMBED_WINDOW_DEACTIVATE 2 ++#define VERSION_MAJOR 0 ++#define VERSION_MINOR 0 ++#define XEMBED_EMBEDDED_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR ++ + /* enums */ + enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ + enum { SchemeNorm, SchemeSel }; /* color schemes */ + enum { NetSupported, NetWMName, NetWMState, NetWMCheck, ++ NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, + NetWMFullscreen, NetActiveWindow, NetWMWindowType, + NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ ++enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ + enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ + enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, + ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ +@@ -141,6 +156,12 @@ typedef struct { + int monitor; + } Rule; + ++typedef struct Systray Systray; ++struct Systray { ++ Window win; ++ Client *icons; ++}; ++ + /* function declarations */ + static void applyrules(Client *c); + static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); +@@ -172,6 +193,7 @@ static void focusstack(const Arg *arg); + static Atom getatomprop(Client *c, Atom prop); + static int getrootptr(int *x, int *y); + static long getstate(Window w); ++static unsigned int getsystraywidth(); + static int gettextprop(Window w, Atom atom, char *text, unsigned int size); + static void grabbuttons(Client *c, int focused); + static void grabkeys(void); +@@ -189,13 +211,16 @@ static void pop(Client *c); + static void propertynotify(XEvent *e); + static void quit(const Arg *arg); + static Monitor *recttomon(int x, int y, int w, int h); ++static void removesystrayicon(Client *i); + static void resize(Client *c, int x, int y, int w, int h, int interact); ++static void resizebarwin(Monitor *m); + static void resizeclient(Client *c, int x, int y, int w, int h); + static void resizemouse(const Arg *arg); ++static void resizerequest(XEvent *e); + static void restack(Monitor *m); + static void run(void); + static void scan(void); +-static int sendevent(Client *c, Atom proto); ++static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, long d3, long d4); + static void sendmon(Client *c, Monitor *m); + static void setclientstate(Client *c, long state); + static void setfocus(Client *c); +@@ -206,6 +231,7 @@ static void setup(void); + static void seturgent(Client *c, int urg); + static void showhide(Client *c); + static void spawn(const Arg *arg); ++static Monitor *systraytomon(Monitor *m); + static void tag(const Arg *arg); + static void tagmon(const Arg *arg); + static void tile(Monitor *m); +@@ -223,18 +249,23 @@ static int updategeom(void); + static void updatenumlockmask(void); + static void updatesizehints(Client *c); + static void updatestatus(void); ++static void updatesystray(void); ++static void updatesystrayicongeom(Client *i, int w, int h); ++static void updatesystrayiconstate(Client *i, XPropertyEvent *ev); + static void updatetitle(Client *c); + static void updatewindowtype(Client *c); + static void updatewmhints(Client *c); + static void view(const Arg *arg); + static Client *wintoclient(Window w); + static Monitor *wintomon(Window w); ++static Client *wintosystrayicon(Window w); + static int xerror(Display *dpy, XErrorEvent *ee); + static int xerrordummy(Display *dpy, XErrorEvent *ee); + static int xerrorstart(Display *dpy, XErrorEvent *ee); + static void zoom(const Arg *arg); + + /* variables */ ++static Systray *systray = NULL; + static const char broken[] = "broken"; + static char stext[256]; + static int screen; +@@ -257,9 +288,10 @@ static void (*handler[LASTEvent]) (XEvent *) = { + [MapRequest] = maprequest, + [MotionNotify] = motionnotify, + [PropertyNotify] = propertynotify, ++ [ResizeRequest] = resizerequest, + [UnmapNotify] = unmapnotify + }; +-static Atom wmatom[WMLast], netatom[NetLast]; ++static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast]; + static int running = 1; + static Cur *cursor[CurLast]; + static Clr **scheme; +@@ -441,7 +473,7 @@ buttonpress(XEvent *e) + arg.ui = 1 << i; + } else if (ev->x < x + TEXTW(selmon->ltsymbol)) + click = ClkLtSymbol; +- else if (ev->x > selmon->ww - (int)TEXTW(stext)) ++ else if (ev->x > selmon->ww - (int)TEXTW(stext) - getsystraywidth()) + click = ClkStatusText; + else + click = ClkWinTitle; +@@ -484,6 +516,13 @@ cleanup(void) + XUngrabKey(dpy, AnyKey, AnyModifier, root); + while (mons) + cleanupmon(mons); ++ ++ if (showsystray) { ++ XUnmapWindow(dpy, systray->win); ++ XDestroyWindow(dpy, systray->win); ++ free(systray); ++ } ++ + for (i = 0; i < CurLast; i++) + drw_cur_free(drw, cursor[i]); + for (i = 0; i < LENGTH(colors); i++) +@@ -515,9 +554,58 @@ cleanupmon(Monitor *mon) + void + clientmessage(XEvent *e) + { ++ XWindowAttributes wa; ++ XSetWindowAttributes swa; + XClientMessageEvent *cme = &e->xclient; + Client *c = wintoclient(cme->window); + ++ if (showsystray && cme->window == systray->win && cme->message_type == netatom[NetSystemTrayOP]) { ++ /* add systray icons */ ++ if (cme->data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) { ++ if (!(c = (Client *)calloc(1, sizeof(Client)))) ++ die("fatal: could not malloc() %u bytes\n", sizeof(Client)); ++ if (!(c->win = cme->data.l[2])) { ++ free(c); ++ return; ++ } ++ c->mon = selmon; ++ c->next = systray->icons; ++ systray->icons = c; ++ if (!XGetWindowAttributes(dpy, c->win, &wa)) { ++ /* use sane defaults */ ++ wa.width = bh; ++ wa.height = bh; ++ wa.border_width = 0; ++ } ++ c->x = c->oldx = c->y = c->oldy = 0; ++ c->w = c->oldw = wa.width; ++ c->h = c->oldh = wa.height; ++ c->oldbw = wa.border_width; ++ c->bw = 0; ++ c->isfloating = True; ++ /* reuse tags field as mapped status */ ++ c->tags = 1; ++ updatesizehints(c); ++ updatesystrayicongeom(c, wa.width, wa.height); ++ XAddToSaveSet(dpy, c->win); ++ XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask); ++ XReparentWindow(dpy, c->win, systray->win, 0, 0); ++ /* use parents background color */ ++ swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; ++ XChangeWindowAttributes(dpy, c->win, CWBackPixel, &swa); ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_EMBEDDED_NOTIFY, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ /* FIXME not sure if I have to send these events, too */ ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_FOCUS_IN, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_MODALITY_ON, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ XSync(dpy, False); ++ resizebarwin(selmon); ++ updatesystray(); ++ setclientstate(c, NormalState); ++ } ++ return; ++ } ++ + if (!c) + return; + if (cme->message_type == netatom[NetWMState]) { +@@ -570,7 +658,7 @@ configurenotify(XEvent *e) + for (c = m->clients; c; c = c->next) + if (c->isfullscreen) + resizeclient(c, m->mx, m->my, m->mw, m->mh); +- XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); ++ resizebarwin(m); + } + focus(NULL); + arrange(NULL); +@@ -655,6 +743,11 @@ destroynotify(XEvent *e) + + if ((c = wintoclient(ev->window))) + unmanage(c, 1); ++ else if ((c = wintosystrayicon(ev->window))) { ++ removesystrayicon(c); ++ resizebarwin(selmon); ++ updatesystray(); ++ } + } + + void +@@ -698,7 +791,7 @@ dirtomon(int dir) + void + drawbar(Monitor *m) + { +- int x, w, tw = 0; ++ int x, w, tw = 0, stw = 0; + int boxs = drw->fonts->h / 9; + int boxw = drw->fonts->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; +@@ -707,13 +800,17 @@ drawbar(Monitor *m) + if (!m->showbar) + return; + ++ if(showsystray && m == systraytomon(m) && !systrayonleft) ++ stw = getsystraywidth(); ++ + /* 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 = TEXTW(stext) - lrpad / 2 + 2; /* 2px extra right padding */ ++ drw_text(drw, m->ww - tw - stw, 0, tw, bh, lrpad / 2 - 2, stext, 0); + } + ++ resizebarwin(m); + for (c = m->clients; c; c = c->next) { + occ |= c->tags; + if (c->isurgent) +@@ -734,7 +831,7 @@ drawbar(Monitor *m) + drw_setscheme(drw, scheme[SchemeNorm]); + x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); + +- if ((w = m->ww - tw - x) > bh) { ++ if ((w = m->ww - tw - stw - 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); +@@ -745,7 +842,7 @@ drawbar(Monitor *m) + drw_rect(drw, x, 0, w, bh, 1, 1); + } + } +- drw_map(drw, m->barwin, 0, 0, m->ww, bh); ++ drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh); + } + + void +@@ -782,8 +879,11 @@ expose(XEvent *e) + Monitor *m; + XExposeEvent *ev = &e->xexpose; + +- if (ev->count == 0 && (m = wintomon(ev->window))) ++ if (ev->count == 0 && (m = wintomon(ev->window))) { + drawbar(m); ++ if (m == selmon) ++ updatesystray(); ++ } + } + + void +@@ -869,14 +969,32 @@ getatomprop(Client *c, Atom prop) + unsigned char *p = NULL; + Atom da, atom = None; + +- if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, ++ /* FIXME getatomprop should return the number of items and a pointer to ++ * the stored data instead of this workaround */ ++ Atom req = XA_ATOM; ++ if (prop == xatom[XembedInfo]) ++ req = xatom[XembedInfo]; ++ ++ if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, req, + &da, &di, &dl, &dl, &p) == Success && p) { + atom = *(Atom *)p; ++ if (da == xatom[XembedInfo] && dl == 2) ++ atom = ((Atom *)p)[1]; + XFree(p); + } + return atom; + } + ++unsigned int ++getsystraywidth() ++{ ++ unsigned int w = 0; ++ Client *i; ++ if(showsystray) ++ for(i = systray->icons; i; w += i->w + systrayspacing, i = i->next) ; ++ return w ? w + systrayspacing : 1; ++} ++ + int + getrootptr(int *x, int *y) + { +@@ -1017,7 +1135,8 @@ killclient(const Arg *arg) + { + if (!selmon->sel) + return; +- if (!sendevent(selmon->sel, wmatom[WMDelete])) { ++ ++ if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0 , 0, 0)) { + XGrabServer(dpy); + XSetErrorHandler(xerrordummy); + XSetCloseDownMode(dpy, DestroyAll); +@@ -1104,6 +1223,13 @@ maprequest(XEvent *e) + static XWindowAttributes wa; + XMapRequestEvent *ev = &e->xmaprequest; + ++ Client *i; ++ if ((i = wintosystrayicon(ev->window))) { ++ sendevent(i->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION); ++ resizebarwin(selmon); ++ updatesystray(); ++ } ++ + if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect) + return; + if (!wintoclient(ev->window)) +@@ -1225,6 +1351,17 @@ propertynotify(XEvent *e) + Window trans; + XPropertyEvent *ev = &e->xproperty; + ++ if ((c = wintosystrayicon(ev->window))) { ++ if (ev->atom == XA_WM_NORMAL_HINTS) { ++ updatesizehints(c); ++ updatesystrayicongeom(c, c->w, c->h); ++ } ++ else ++ updatesystrayiconstate(c, ev); ++ resizebarwin(selmon); ++ updatesystray(); ++ } ++ + if ((ev->window == root) && (ev->atom == XA_WM_NAME)) + updatestatus(); + else if (ev->state == PropertyDelete) +@@ -1275,6 +1412,19 @@ recttomon(int x, int y, int w, int h) + return r; + } + ++void ++removesystrayicon(Client *i) ++{ ++ Client **ii; ++ ++ if (!showsystray || !i) ++ return; ++ for (ii = &systray->icons; *ii && *ii != i; ii = &(*ii)->next); ++ if (ii) ++ *ii = i->next; ++ free(i); ++} ++ + void + resize(Client *c, int x, int y, int w, int h, int interact) + { +@@ -1282,6 +1432,14 @@ resize(Client *c, int x, int y, int w, int h, int interact) + resizeclient(c, x, y, w, h); + } + ++void ++resizebarwin(Monitor *m) { ++ unsigned int w = m->ww; ++ if (showsystray && m == systraytomon(m) && !systrayonleft) ++ w -= getsystraywidth(); ++ XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh); ++} ++ + void + resizeclient(Client *c, int x, int y, int w, int h) + { +@@ -1297,6 +1455,19 @@ resizeclient(Client *c, int x, int y, int w, int h) + XSync(dpy, False); + } + ++void ++resizerequest(XEvent *e) ++{ ++ XResizeRequestEvent *ev = &e->xresizerequest; ++ Client *i; ++ ++ if ((i = wintosystrayicon(ev->window))) { ++ updatesystrayicongeom(i, ev->width, ev->height); ++ resizebarwin(selmon); ++ updatesystray(); ++ } ++} ++ + void + resizemouse(const Arg *arg) + { +@@ -1443,26 +1614,37 @@ setclientstate(Client *c, long state) + } + + int +-sendevent(Client *c, Atom proto) ++sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4) + { + int n; +- Atom *protocols; ++ Atom *protocols, mt; + int exists = 0; + XEvent ev; + +- if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { +- while (!exists && n--) +- exists = protocols[n] == proto; +- XFree(protocols); ++ if (proto == wmatom[WMTakeFocus] || proto == wmatom[WMDelete]) { ++ mt = wmatom[WMProtocols]; ++ if (XGetWMProtocols(dpy, w, &protocols, &n)) { ++ while (!exists && n--) ++ exists = protocols[n] == proto; ++ XFree(protocols); ++ } ++ } ++ else { ++ exists = True; ++ mt = proto; + } ++ + if (exists) { + ev.type = ClientMessage; +- ev.xclient.window = c->win; +- ev.xclient.message_type = wmatom[WMProtocols]; ++ ev.xclient.window = w; ++ ev.xclient.message_type = mt; + ev.xclient.format = 32; +- ev.xclient.data.l[0] = proto; +- ev.xclient.data.l[1] = CurrentTime; +- XSendEvent(dpy, c->win, False, NoEventMask, &ev); ++ ev.xclient.data.l[0] = d0; ++ ev.xclient.data.l[1] = d1; ++ ev.xclient.data.l[2] = d2; ++ ev.xclient.data.l[3] = d3; ++ ev.xclient.data.l[4] = d4; ++ XSendEvent(dpy, w, False, mask, &ev); + } + return exists; + } +@@ -1476,7 +1658,7 @@ setfocus(Client *c) + XA_WINDOW, 32, PropModeReplace, + (unsigned char *) &(c->win), 1); + } +- sendevent(c, wmatom[WMTakeFocus]); ++ sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0); + } + + void +@@ -1572,6 +1754,10 @@ setup(void) + wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); + netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); + netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); ++ netatom[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", False); ++ netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False); ++ netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False); ++ netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION_HORZ", False); + netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); + netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); + netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); +@@ -1579,6 +1765,9 @@ setup(void) + netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); + netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); + netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); ++ xatom[Manager] = XInternAtom(dpy, "MANAGER", False); ++ xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); ++ xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); + /* init cursors */ + cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); + cursor[CurResize] = drw_cur_create(drw, XC_sizing); +@@ -1587,6 +1776,8 @@ setup(void) + scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); + for (i = 0; i < LENGTH(colors); i++) + scheme[i] = drw_scm_create(drw, colors[i], 3); ++ /* init system tray */ ++ updatesystray(); + /* init bars */ + updatebars(); + updatestatus(); +@@ -1717,7 +1908,18 @@ togglebar(const Arg *arg) + { + selmon->showbar = !selmon->showbar; + updatebarpos(selmon); +- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); ++ resizebarwin(selmon); ++ if (showsystray) { ++ XWindowChanges wc; ++ if (!selmon->showbar) ++ wc.y = -bh; ++ else if (selmon->showbar) { ++ wc.y = 0; ++ if (!selmon->topbar) ++ wc.y = selmon->mh - bh; ++ } ++ XConfigureWindow(dpy, systray->win, CWY, &wc); ++ } + arrange(selmon); + } + +@@ -1813,11 +2015,18 @@ unmapnotify(XEvent *e) + else + unmanage(c, 0); + } ++ else if ((c = wintosystrayicon(ev->window))) { ++ /* KLUDGE! sometimes icons occasionally unmap their windows, but do ++ * _not_ destroy them. We map those windows back */ ++ XMapRaised(dpy, c->win); ++ updatesystray(); ++ } + } + + void + updatebars(void) + { ++ unsigned int w; + Monitor *m; + XSetWindowAttributes wa = { + .override_redirect = True, +@@ -1828,10 +2037,15 @@ updatebars(void) + for (m = mons; m; m = m->next) { + if (m->barwin) + continue; +- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), ++ w = m->ww; ++ if (showsystray && m == systraytomon(m)) ++ w -= getsystraywidth(); ++ m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, DefaultDepth(dpy, screen), + CopyFromParent, DefaultVisual(dpy, screen), + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); + XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); ++ if (showsystray && m == systraytomon(m)) ++ XMapRaised(dpy, systray->win); + XMapRaised(dpy, m->barwin); + XSetClassHint(dpy, m->barwin, &ch); + } +@@ -2008,6 +2222,125 @@ updatestatus(void) + if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) + strcpy(stext, "dwm-"VERSION); + drawbar(selmon); ++ updatesystray(); ++} ++ ++ ++void ++updatesystrayicongeom(Client *i, int w, int h) ++{ ++ if (i) { ++ i->h = bh; ++ if (w == h) ++ i->w = bh; ++ else if (h == bh) ++ i->w = w; ++ else ++ i->w = (int) ((float)bh * ((float)w / (float)h)); ++ applysizehints(i, &(i->x), &(i->y), &(i->w), &(i->h), False); ++ /* force icons into the systray dimensions if they don't want to */ ++ if (i->h > bh) { ++ if (i->w == i->h) ++ i->w = bh; ++ else ++ i->w = (int) ((float)bh * ((float)i->w / (float)i->h)); ++ i->h = bh; ++ } ++ } ++} ++ ++void ++updatesystrayiconstate(Client *i, XPropertyEvent *ev) ++{ ++ long flags; ++ int code = 0; ++ ++ if (!showsystray || !i || ev->atom != xatom[XembedInfo] || ++ !(flags = getatomprop(i, xatom[XembedInfo]))) ++ return; ++ ++ if (flags & XEMBED_MAPPED && !i->tags) { ++ i->tags = 1; ++ code = XEMBED_WINDOW_ACTIVATE; ++ XMapRaised(dpy, i->win); ++ setclientstate(i, NormalState); ++ } ++ else if (!(flags & XEMBED_MAPPED) && i->tags) { ++ i->tags = 0; ++ code = XEMBED_WINDOW_DEACTIVATE; ++ XUnmapWindow(dpy, i->win); ++ setclientstate(i, WithdrawnState); ++ } ++ else ++ return; ++ sendevent(i->win, xatom[Xembed], StructureNotifyMask, CurrentTime, code, 0, ++ systray->win, XEMBED_EMBEDDED_VERSION); ++} ++ ++void ++updatesystray(void) ++{ ++ XSetWindowAttributes wa; ++ XWindowChanges wc; ++ Client *i; ++ Monitor *m = systraytomon(NULL); ++ unsigned int x = m->mx + m->mw; ++ unsigned int sw = TEXTW(stext) - lrpad + systrayspacing; ++ unsigned int w = 1; ++ ++ if (!showsystray) ++ return; ++ if (systrayonleft) ++ x -= sw + lrpad / 2; ++ if (!systray) { ++ /* init systray */ ++ if (!(systray = (Systray *)calloc(1, sizeof(Systray)))) ++ die("fatal: could not malloc() %u bytes\n", sizeof(Systray)); ++ systray->win = XCreateSimpleWindow(dpy, root, x, m->by, w, bh, 0, 0, scheme[SchemeSel][ColBg].pixel); ++ wa.event_mask = ButtonPressMask | ExposureMask; ++ wa.override_redirect = True; ++ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; ++ XSelectInput(dpy, systray->win, SubstructureNotifyMask); ++ XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32, ++ PropModeReplace, (unsigned char *)&netatom[NetSystemTrayOrientationHorz], 1); ++ XChangeWindowAttributes(dpy, systray->win, CWEventMask|CWOverrideRedirect|CWBackPixel, &wa); ++ XMapRaised(dpy, systray->win); ++ XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win, CurrentTime); ++ if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) { ++ sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0); ++ XSync(dpy, False); ++ } ++ else { ++ fprintf(stderr, "dwm: unable to obtain system tray.\n"); ++ free(systray); ++ systray = NULL; ++ return; ++ } ++ } ++ for (w = 0, i = systray->icons; i; i = i->next) { ++ /* make sure the background color stays the same */ ++ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; ++ XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa); ++ XMapRaised(dpy, i->win); ++ w += systrayspacing; ++ i->x = w; ++ XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h); ++ w += i->w; ++ if (i->mon != m) ++ i->mon = m; ++ } ++ w = w ? w + systrayspacing : 1; ++ x -= w; ++ XMoveResizeWindow(dpy, systray->win, x, m->by, w, bh); ++ wc.x = x; wc.y = m->by; wc.width = w; wc.height = bh; ++ wc.stack_mode = Above; wc.sibling = m->barwin; ++ XConfigureWindow(dpy, systray->win, CWX|CWY|CWWidth|CWHeight|CWSibling|CWStackMode, &wc); ++ XMapWindow(dpy, systray->win); ++ XMapSubwindows(dpy, systray->win); ++ /* redraw background */ ++ XSetForeground(dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel); ++ XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh); ++ XSync(dpy, False); + } + + void +@@ -2075,6 +2408,16 @@ wintoclient(Window w) + return NULL; + } + ++Client * ++wintosystrayicon(Window w) { ++ Client *i = NULL; ++ ++ if (!showsystray || !w) ++ return i; ++ for (i = systray->icons; i && i->win != w; i = i->next) ; ++ return i; ++} ++ + Monitor * + wintomon(Window w) + { +@@ -2128,6 +2471,22 @@ xerrorstart(Display *dpy, XErrorEvent *ee) + return -1; + } + ++Monitor * ++systraytomon(Monitor *m) { ++ Monitor *t; ++ int i, n; ++ if(!systraypinning) { ++ if(!m) ++ return selmon; ++ return m == selmon ? m : NULL; ++ } ++ for(n = 1, t = mons; t && t->next; n++, t = t->next) ; ++ for(i = 1, t = mons; t && t->next && i < systraypinning; i++, t = t->next) ; ++ if(systraypinningfailfirst && n < systraypinning) ++ return mons; ++ return t; ++} ++ + void + zoom(const Arg *arg) + {