From 03f276da6464b5a5d95cd86c936b37dca6202fd7 Mon Sep 17 00:00:00 2001 From: Clay Gomera Date: Sat, 3 Aug 2024 03:06:52 -0400 Subject: [PATCH] Switched to dunst --- README.md | 4 +- config/.config/dunst/critical.png | Bin 0 -> 35927 bytes config/.config/dunst/dunstrc | 358 ++++++++++++++++++ config/.config/dunst/normal.png | Bin 0 -> 3895 bytes source/dwm/autostart | 2 +- source/herbe/LICENSE | 22 -- source/herbe/Makefile | 38 -- source/herbe/README-tiramisu.md | 68 ---- source/herbe/README.md | 139 ------- source/herbe/config.h | 19 - source/herbe/herbe.c | 258 ------------- source/herbe/herbed | 14 - .../patches/herbe-vertical-stacking.diff | 100 ----- source/herbe/patches/herbe-wm-class.diff | 21 - source/herbe/src/dbus.vala | 49 --- source/herbe/src/notification.vala | 144 ------- source/herbe/src/tiramisu.vala | 56 --- 17 files changed, 360 insertions(+), 932 deletions(-) create mode 100644 config/.config/dunst/critical.png create mode 100644 config/.config/dunst/dunstrc create mode 100644 config/.config/dunst/normal.png delete mode 100644 source/herbe/LICENSE delete mode 100644 source/herbe/Makefile delete mode 100644 source/herbe/README-tiramisu.md delete mode 100644 source/herbe/README.md delete mode 100644 source/herbe/config.h delete mode 100644 source/herbe/herbe.c delete mode 100755 source/herbe/herbed delete mode 100644 source/herbe/patches/herbe-vertical-stacking.diff delete mode 100644 source/herbe/patches/herbe-wm-class.diff delete mode 100644 source/herbe/src/dbus.vala delete mode 100644 source/herbe/src/notification.vala delete mode 100644 source/herbe/src/tiramisu.vala diff --git a/README.md b/README.md index fc0446e31..120d43266 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,6 @@ ### Other suckless utilities included * *dmenu:* the best run launcher. This build includes some very useful scripts for things like wifi, bluetooth and wallpaper configuration, drive mounting, etc. - * *herbe & tiramisu:* a minimal and fast notification daemon (tiramisu is the daemon, herbe is the notification window, I bundled them together). * *st:* the fastest terminal emulator ever, [siduck's build](https://github.com/siduck/st). * *slock:* simple and efficient lock screen with fingerprint reader support. * *dwbmlocks:* what enables you to customize dwm's status area in the bar. This build includes some cool & customizable status scripts. @@ -57,6 +56,7 @@ Other configuration files included in this project are available at the config f * `.config/mpv`: Mpv config files, mainly just for vim-like keybindings. * `.config/newsboat`: [Newsboat](https://github.com/newsboat/newsboat) is an awesome RSS/Atom feeds reader for the terminal. Also accesible from dwm via a scratchpad. The config file is for vim-like keybindings and also my collection of RSS & YouTube subscriptions feeds (you can open any video in mpv hitting first comma and then v). * `.config/picom`: The only X compositor that actually works, responsible of transparency and some animations. +* `.config/dunst`: A cool, minimal and fast notification daemon. Best one out there. * `.config/qutebrowser`: Sometimes I like using a minimal browser, and qutebrowser is the best one. * `.config/X11`: This is where I put the xinitrc file, responsible of starting up dwm properly. * `.config/vifm`: [vifm](https://vifm.info/) is the best terminal file manager with everything you will and may need, with vim-like keybindings and image previews (with ueberzug). @@ -234,8 +234,6 @@ These are the patches I applied to this dwm build (some of them I modified): ## Credits - dwm and the suckless tools available here are made by the suckless guys at [https://suckless.org](https://suckless.org). -- herbe is made by dudik and available [here](https://github.com/dudik/herbe). -- tiramisu is made by Sweets and available [here](https://github.com/Sweets/tiramisu). - dwmblocks is made by torrinfail and available [here](https://github.com/torrinfail/dwmblocks) ## License diff --git a/config/.config/dunst/critical.png b/config/.config/dunst/critical.png new file mode 100644 index 0000000000000000000000000000000000000000..b36d5b22a20e64ebccc255f41e6a4fc5114c7482 GIT binary patch literal 35927 zcmV*aKvlnqP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3>vmK-;-rT=3Uy#&m|asUHxPVe9?zrTw}QWQy* zr0Pc&GgFZf?tsDU4uE;N^FROhy8pwU5o2_@v|dN8o5)kiRZ8&gX|Zdi!yx>+3@H^~N`puYdXbus+}P-|kN@G@`T%H%c*{6q0{m^JfI< z^KbGm@HM6$^;3O6C-=U^uZt0oKTYr3ckh1;(4T_*?I-th^w0brqdx^d&aZc*pJG|R zty=y4FGBh0_4NJz@y8pd?<0zT{>An&{xY4ffA{Ww@A=Gb=1N5CS4O>Hhi{kRjf;?{ z_p!>~#=pYP?fo76?S6V=$+tJZ_-kQ=$f{fya@b*p8_xS~!5CtWCpNyvXfeIldTMb* zdn=apH{96LNIP{F%i?h<@pAk=mhkR7-u*0e?z{tUje&~=t?ys`b^qy?|K_i|*A$|l zV4lwsGp-kKhM|?ySKh^fg!{E_>EOKO`2Z$_kbj=FSACU!O~?68^}o^wv4? zzQXrU2?f{o*98a>_bv=3Bv!!JkV>e*w-{Rp#IdtLlaa@i<6;FuDRDE%m{Y3JwMfZu zZ$8t)dv7eUM!gI+u@Hr7YOKvjlf}xpkUuSVa%h%Raw(;jR=O*r%$jPhrPkW2KyJ3w zax1O2)_NOl_SADPz4q37AAOEE5*S!U9c}b6#+=bjZZx^p8t+(BN$DQ9-?Q2zk z`TH+cEqtw7d@H5*wePFOtFE-d1*7(VelvUX##_xX41Py4t=YEo!KbgRHPTY)oJK5%Sm8N6xA3#7EOUEJOl- z-6-uO+gZc$T;TXPhQGG@VRjIHwY!1u0~v6Eyi%^D3RE6_3nK>jdRtpAkoGrQpSQPW zDNVbq1b4Y7#uXuOt2dJ9v6c;T&r!?iq-1Hkj1v^toOW>ybb>`!+j+*pBAhUYBFPtS zjm&aVbRl%}b|3?i-rBh>SSd;;{d^0FOE-@mISiLo3zNP__X@QbuDhLItJB1b-QOYqy7Bttm zimQ#}v)V3+w$9iT@}=NMXql+hy{lQP1d3!-h_XLv?7c!u`^IhIjuy&I&Pc>$H{})> z2uh1oCbh#hX}NiNvNld6jG^96mabAElGf)wr3Ui1-kl#po<=?7Qa{UX*P{X`{mJq& z+negDOm!@z;f>^NKimAte7v-D(qgjLZwG#q1qD&%x=M|tx@fu`bdItEUh~a z$k#%H8{4VDCf5}|+tqXB|p<;iO$r_}@H0h-3VgjirK07?m%Yc|0`hF>o^ z)aKp>QG&>cvLiWr@vZybN$SbUBRJ14h;{CE6YujIhC%VVvq>JMO5PwqoJDg3FWc~Y znxBO{E*4=k=wMzr1ZWQj-MliBAc{bBwCa|I2m1C4=@6=m=%%)geuDp?ntEzVr?BE{ zEj(TGw!smKd+0M8ifCuKLlSl>lI58bf-mshzKl*hwg_`h1GHcekP)hxM9viHv{_+6 z6-r5DQgt4gKq;NN;Ji98a-Be-4F+Rd?VMr9YD`BE(%S`EXFW^VAJ^^m9$1k@aw}DX z3n$64B&ROH8E0K$eDfPPFhT8*;vpQH;LxTTS&eI*B|&#FnQ?KDg!*KFf@m5L#!9iS zSp%IyH;7E-X?Ikh7P&Y4IaFFYwJM8Sd`##zr4G9v6naPQK;C(TgIdGA z2a->rrX)KcP7SXNL&rm{?tIAX5>}!F8i~E}RRmtt7X8h_(bMZ9=tQG1_IcJOSwYNR zbF9R)1j-=#?(SIiJc@usx!!-les_FsQ5#N!ld0T<)Q z9aI67GAH>_5E?meO4U!m{y?T^ClifTd6s>TqyUoyeBr@_HKVvl2uI+mlorwwdNAA3 zNY{}u2BhbTh^r}O%w-XcNVU2VZK;zJK*IoJQ=B*@2loK#{YK)+Ey#DmhZv#)D6yUq zo~4Ze%Vx9GYRQA8Lx#k~+8(e6F?O1{sYFi#+EsvWi8e1BI`WOElnKN5rLqEZsoF?T z0H~4CaJC_; zxGDu^TQak;P6ZO!8P|24fh`Clk^sgXvGxHOX6fHfuKAKXY5~wfMR%=30u8xzNdjg} zw#+4B>blXPCVy)}rMAh)57Nh<3UE)5YzLOAqH@5j0Ng06XA4QYdEFO)1p$SH&kol~ zS=V{ERiM(D!+aDK0r(uL60S-Tl0(EEZfOzeesa}q5%c6;<%Se3s#2Q*k@v5S=Jd}2 zP5&>yyTABFMD@U|;h|qAjB$%RttD+X;BfGJm9QXFaWA_k2hN~%sYS%G#36bE(VI@g z@-3(n(%89CQ(*HTi;$%q9{?|HzF{>3EXD1dc50B%=obhR4oiY|Y6a?Namj`xddin@ zG+Z585P$7EnS|jX+fy$%&w$VZA%v@*agE&(ejs*~#DmMD;dIhk0n9vyprX#?o5*FD zFP~Za!*0x^E5>9udazUf0jeT5$;OG|j~^Ce9pgsaM?O%uHr-ap%rBJOsz=PJ=o3t9 zs2Dsq5QfCz*ZAs%=A+JcK!uU$fXGvn-#&*SC$ST0^+87$WvG>1`&msnE%Hzj`4 z@wdP(2tv8aLn4I`=R=o$^*8r0GK`!xB>rZZs*43#)F@(4cmOWMB~k*LhHY;G(h3@| z3Ka99=80m5%KgDG2&Q)7J5bl1whc?c^3BnuRw*g?dgEk57))4}Xi)DRs{^^qm;?w> z@k4A^+|=db6Bfama%l!15R8;vMB$H8K%M| zt#y*pCrsF2=7X!bm>#fkWibO8WfZ(=G~By{GI8z5C$a-J;reizgA#xUboG(Rxj+QB z&Y&o&GE%d^0mX=i1&%;5c!H4-4Rja60GvQD96sdGr^r-oIxI{?>pk8A+VC>Q4jRX= zV0Sx447dGKZITX$)XZ{-NxKQ4(86W`RLD7`98MA|czU1^?|fDb3nmgmIAH4wzg<+N zC(+^Ug-SLgO2-gw@9=Mlw?Pl+#!AjEftTF6$J6juZTf;SD8GejF}@FdziCL?AYn=4 z>y3nLssh*t^^7hpSScx;+RMe30Z2I#R)4T6ETg*R-DN z>B=Fgj-i?oHVGmk4M`~_iMB)V)e}7JU+7i8NfY<)wG6(2V3DTa0-|@;C^&bGBnp`K zlBCqJ7bJi3!beatz@&X?cSdT?EKkr&R9p5EHhQ>Cd+#i)1Kl96(E1+mHQ@ul&@o^S zl9?3&L@E|U;_xC;C>1b+vO#z=lq0*0sYu;va}sjU)&vN=$+FZ)B&;qmYl)%crLY0z zsH?24F!BzCgQ~)XFy@wU6xb}U6ixEKZK2axCeI2FY`x>>WypEThL z@)f)S8j(CLF2vG=CF*1{$x6) zYLb$e_ZS{QPFXBNA^_M>fG8o7F5|$nyuH0>c|Z!(Lo?wTVQe@MFoX)>A_NM{-wX2m zEEW_e2cm*({U|38GQd3YJkHOC5DBdPp+-J1tq-9va>P@wr#KNdwlh-t5$0cT;~R;% z5f|SBqPh|^0+z@`2A{JH7@vz5s&-HftWa_Y$j{Crh769t%f3w~ZYo6_+d|NSIoR@? z#Bf`i#r#s?Lf zgRnQ3+IS!49gSybcEFcZ#QU#&78+9|_x3t}LMrzUA+6^FYH~MJ95R{EK`2|BDGVKz zfL%uw#~kI>^lborxR+3f^R=RVlB{*qU`F@k5#DSp8B8K>AQnto4<||u-%}gaA-9T#C zZY}9hIFVx484-!pT7KJxOWy7vpq2&gO*#ny*!pM~Cw9a9z!tLL#{!j2CSdU(_H$dY zXT@~^SO*Zv8*7R`01cdC@6$cVKe3MR6x3x@n<;a7CT)>{pn-MplETQ^AplG(C`S4& zrA2JAqEKV!W%zoNUA;z1lC|&=I&X3y-HY zPsUn0M8@WjLYUnC&P%|8OiC7L9nG_%*a0^|1;F;0+dk`M`KcKu2gb0Tw#j}#AE61= zA=?)ayuk%TVTV8XAyn*oz7XGXNYq=O5;E-r z|A*tUzc^nbxQlQjW3cFzB?SFIBJx!y4v>!E56)PS!H2xw&-?3{nQL zH+Jz##A7q@Yeyaolt$QtNt^w=)=dFvtOeYPuZi` zfjLtdf;J#>;jal0Al@cf(QC&aA~^0AK~`WIDSKrnx`3})dNs&oX-P!~{TjQi=Qb`jbsoo*Vi~0^GFBSxxfkJd>X*!1z|518O zVMcIhYW=mP0@^ZZs&ak=VjIqyJpNlxARCu9;?DTk%`^$Hr#J#di_0RrQQs8%*;4Yn zO-D>!d!4>#sXJ*ae+RuP{j_l|L@r6g)Dn;v}c=2(o zV2Qg?Nw}tTwYxEN;-}p}RtSYp%1npG8~>m?q+x|IgjvTcM=B^J~~DYLvScs0WkKCV+R4^>_sm4j;!+93k5$Amht?Oj`An`L`simMyi5+{of zLRFlNh*p~(@`F`;8<6U(G+(q`r-Q_z!;0B_b6ZCzC9sfXcgz^lT=RYWw+gDN_L97q?G3@~!+`Y5RSsOo_a0aLIPL>iPW31H9fDHj8rqgxgD}qqFt3BlTPi-}yz#{ZN@ z_&8;9MOtXH8c|gi-aKgY92pf4{KM$>I%Ev0Ab0KFq5yHb;8j6Oo$a(~h|jJlZ}Url zaJ)ABV-^NBo#g|K`{3?&k)~F6kBs21+#7`dZ1|cG*aJF<)(f-EU z<&dF7_+Y8)7rg^sKY2X&eo!kUfN&;8r)LUA?Nn%~@dR14pUN?0chK%fCzPmj z5)Z+len=>YRH}w!!KQffAmdn8jRSo+u*Xqn**h$>Z&jzCzZVG(Z*9`0NgzS3Xvke& z=@?da0bh_R!cqO>Uc1b%EfnTtHQzP@1(3NXZhZk-k!cR8AG`<#vLZumX&(kpqk-a` zKvXzH2Rj6{srh4z+2pxbW3pS^1T>-Yt~P=}$P(u$gaG=ZSV(H#qz=B=`Hyi1?^U)V zD#2WE3vMHj@IWW#r!R^5KxW@8ZlNHUBH0tQRkASEcC=ey#2E91v;ceL3T-LOGTsY~ zyU_Wc4^J~?9 zOw;2mI&OejKk?~wSz}(be-@Y;D|~` zy{oCe`=pbY)1qVmR2;Bw#6*4Slu6(3z&Gm*`cgM3jscr%*AUN%hYxGb0Mft1oM7q( z*O}#dY805zE;9Ou0(A9^$g=Bz1{rDUDDNK|2;E6W?q>sGXtgQf30NedPE$W1f*uE? zos{G(27p36vKO3PLSbU!Q4;4U*L~ALp0=!&eTkA$OGJrLN9-8j{@Q{8e}Ed9oUFaW zlQ7W-Y!DdCbVRO@c@)-IP}W2uta~j zdi8|p)N!H7sRl?W5Bv;{(ttZ1@$wlWByzv+$da$>lSD(lMkAmY-mDQJ^O_*Lj$@le zt}t{ynAX?6y1b43t{cZaS*Av-rM6g|FQL1rEdX$7(Kf;oQ;OzNha_uoL9&f=(~->- zYJe5RSBI@qCtYhnP0d*y(rT&v$Wo%cH4Kpj5&A&oEZTilTlLh@KbbwFsb}<(p+|dQ z(9q79p9+KSTN1kEzJ`4PKi5%1#Q>iutgmu{sprn zb5L*nwu{`CZoepw;3 z!$F9HQqU4;01L%N@eZB!z^?E&{!pj#=#+Y@=D9!{N2s6miS z{_2%ye)%`2C6z)!t)R4$9&-5{*{i}Qyav<)HRzQ6OcX?3Yn0MAWCu2cG)37WWy$-B z&7QB@EO#{@UdWOx2oQ>^t#_{jR~A`&PxJMl!P9EP!e|(F7j}ldO3-s-Q`uAT_{cuc z0>lk6?ajfQS|y5Am&-6(*D;u%+#1%QE4*20F(@I@H5z(M=#6R4x-8k{;g!7w7;C9!-)?@Uu7MeNr0V)~0>R*9Ue z(`O1fswHNrCG{QOBj=|(Vo&(9*QurpwNX<7dh|q(zLGAWjJBvG`A?5}jHZ{t{6GLi zi#n(q0{%G6mvr|axwLyN1C8ej+Ne{PK9CDHabYl! z`9K94Sx;a_sPMq5l<`z}@qt#=?1J9HeL2#?qrL=VIO1Wqoo3UY{0+smSP+mar8Dh?&1XEL?dqjpQg z3WNpIgoX9N8~m`(%!IqX>cHQZH=_y>6Nb-fReOpWxq8W}b`SOJ8C9ke zX&7$l`6L1rdXmj56#e`Xx^kS;{x)in$-kp$HC5c zgUs%la7@}z@0o&1v&YvsDnxm>Mj4v6>X#0O0~{kKMJ>IDEiSrxnOY3G4y5Y)-P1nB7>S{A& z1S%A#U1=%t@!Eff8ih(jdYOoToYxj{)_y;t3xw#;8mb4&gSJT>pHSZo!^wYb#-axC zp(h;XR^y`7p{YX>ouuadgL%WQS0qy~)Z@@*fCsQM!mLwxPBT_ZaHfu)jKuh>#ZFCr zTMv{92Tn6FVM~=fU|C=k@FP&6C?9caK8_a(SI7VA30wdLKLatSJ2S$T45(S^O~+YH z4z+)6*kG%@ir-*8~mZbv=})yuDe^NE4-rn3_=jt~>Z8U;l@{MIr>nD0(l3$BudTdkYu%)bH_|MrH%G&K z?Qlvh(2_!-D*drwcGuv}+|&JT0z~ZV`hu5thp+3)h)}6SpF}_~+1JFnn&JQb#L`yl z8JwT=4C-g>?l*%EUpLV`bcfIN0|`Rz{1lw;BX@ru`foz>mx0m$55XU!c0UaJkI?)a z`o9j%_ffmAVW)73Ymo>kR-u-u3^Xu3h zFQ&qvo3}6<<_^D!>xdYY;dKg(XViFu%-32K?TCN?^gF&#y{LLFYMFNhTHRU5I#Eoq zAl94CUi2`IPPLJMsmL+v;a8v@k+`{}Hox^Sxab8*dKMSrW<*kt(T6_O2dzeITopV~ ziOv(S=r$}75&{cc)H8x$l;CMzkGP^0m)jsM!V5F7hx>m_uzfDqBoQtE00D(*LqkwW zLqi~Na&Km7Y-Iodc$|HaJxIe)6opS)OGPRUb`a^1p*mR*E25iLp$HX1tfkB}f)O&;^Mfxh}i>#<}FMpJzslY-XM~LM)WJSngt0HdNwC;+Udp zl<&{EtZ?4qtXAu+eNXkM+H?_h|{i-Vj@H5Ne}<9;}^*# zldA$ojs?`9LUR1zfAD*@W-&40CWVtg@Wr-2Mu5;R&}!KB_pxoaPJqBOaHVzpwI(qA zNqVEB#g2f1ZQ$a%qse=~ba+AOJ~3K~#9!?7exIZdYCB z`}wW4r+2F9%qJ)FKqd%7AOr#=i~$4%%n=C?KthBNW<(SW5gSC?*|u9Q-9FgEwUfSA zz1@%3r?nfk6)t^aKi5ZFyTwKYfrR7?HNC^$d#&I7W3OH3&5`6BtU9SWRqLDQGWXY0Ui?tREBHFcbcJ26!j10-%rri8R)ZSM=Gy6GMzB z?yrbQKoRTXAOKaZ5G2FioFJE{h)ibYMyhk$S!mYh`%#=k7C?eui z@TyubGJY*^5Lgy)0%hZNkpi`Xk>+(*iNEzQdwU|1hGNE($;SZE3W^p`Jb)rj%Mv=@ zAion%t=Ulf(^@?ykWoUDmd^l}V}5X1>wh~{Ka|nb2l+ruv1KD#KoJqA<%YclC}>je zj)s7000E~B>3D6brJX{z#J{;EsSwOARn<4F70D+e5>Ujc$;SXs1YQS>fmC3m(4BIj z48aYfi47Tnk%uRW$gQgCg4JWgdlum}x?qujA|f6g!D4wuuztG0V)&MCEudfpO#=D2 zsqcBH8}Np`(k{#$~2-elk@pMI_0P|5M=!3Uh76a|k*+1uLg+xA1^G zh5pmN$kNfqtU_a@bVRg(BA^Knx31CZ)YmL zF9FtKLJ^UGB6hYF+$tRwfru)apz;S4=4c8IE1IBlqMUj>#+nNj zETY4}A)p)FEjwlT*wA`mIX%4}Pm?7}fMQJj)bAUeGf-~%%iUb{#$HBjffUdB%HQ7x!ntgX$l70fU}+2Ctjcq zaiO;G@KkW2CTJO$34h)WB(V}YA`;LJhoT-qKE{pasWRA;ARkTf@YKpymhhAHx* zIg;y@CJQ!Ql-LqsEL4mH6tP2aDZ2)D^EvnD4BsCroIAAL?m8~DB%4fFa#XISN{16h zb&YW>XFq-$^$*^%^7}>lce|*^E3RgujJ$GeCQZgAC;G%(h#iSSI>g`p3tXCoPWg7~ zh7CPqNf5P@)`C4JmaJA7hmE5=LTc!a?1{kG=Ic_3snJ z%0wg&0}vlE{wLm~XaPlRQ#^~$1HHCf|BAAI+`*8(O%BrgWt_V z?fd-KkHd_mo6@(=B^^nqjcY2WY0~vJ5KlksyL^ayKT~4&ZB{IhPZG%|5>Ui8$LIO# zxJ!DyM_(4=YARRdYlu z$@a~%|2ICw@Z|UT;xBP=Y9Hu=U9Mc$S58c@s#>=z7g!9bd?RoSc>AWeHKlcJPRG~X&@j`*RwYD6O-0`q2n^2`SW(Mc;P-~zt#I4elgZEno-h` z$yKG98`idNBs3OQ8eA~}E&y&0u3Fn4=BBNph)6&Y+Y}Z4t$}a`!TM=M<`qz(Gf4{; z(k^2moi`ZwnRl#-lKnmW>|5xI85tnSI`j$i!e|1~sF+*Rjt;bZ;IfA<5}d1|||vM_XoW)zAfnivF&^#)0;)!DpIO_3@=F705x zS5cHl%#@EQ+DJeVXFFPpVnQtdhxsSn|G*JD#(&^cKl|`9i)zL_sVB>YjJjX^XKN~m zkBS#RjXm?TtC`dz^`-b~jMTM=N9)GG@(JKwMX3$pX^q}-fWhu?y;VrTM*@lj6mgc5 zkBW#Dk?iw)b$pns(|h^m>QD03*8u08>gR{di^SjK7 z8HKUrP0NS%n3TkOoOh`YR?dpT+!2P~6Rfs8rr>vog&q%?o#BS5sv^iW?C)AuyMM;& z7lT;XV?O9rZ%@JM!w+9F@2~jMr}?(pBc6CCOMm^%?jl%MIJ49tgALHc}u%A#_LsBX>Q4nKLQ6wR=G!@b=?8W{fleb3li55`A_97t*B#M^v zbk194^1C#?PjMN&o^~JJ&(Q=_)EZ@q}Uh{Eue_A5J_9uw?g?=h1rk}KV_Vy=SY9*ZEGWWzHNN! zHXfKA&@<3x5%~Q$#L}f#^s;5od>sl{~6` zjv)8RVT&LY^_y&v#IT4O#2UoU^|cse+B5WR)#(;?uXeMZ<~{Zf9=Ml->%G3;{2<2+ zlG0n5LEWmU=oA@7$sCPd(3nOqXk=hEMV2zm$C1VYnwI5=Izf?uBDNO!Sc1fI`+$bD zyKM^)Z{c3wCA-d}FA2R_O7l7aU$~mGu5n5=q!t}7F-(QDlRmh(5!ZPBKKAUJug9{Q zEG9;0Yvtk5sL+z7ajQ8U_M#8dRIQ>H&62#dbs?vU6D782L;{M~QXbZtvS2%}%d4tW z)%qqb%mGT=yA<|J-SZmARH(*dsht<6OblMsj0f5`WeBDPz9qW;ypgNWfzRmHw3bAQyDQ6U9#ff4CRZi;o^J%YN zS`AZH&D6D}iarIneyTTYji5Loa262>C}NXcu$GKkizRJcu$#CrFY)gNMhd;~;F=RI z7}jGf*cxytH64!G`#!w!eOO=o8S)O~7C-6Fy1x3N&2+V+dqhu+`x(*%rN3W9x+0Rb zgd4^Ox#)^T0*crI9CQ*PJ;DY1JYW4TMXw8lzy1Oj&-Lk! z9%iXSola>5Sx#sN*>KJ62ndCWQ^e>`+LsgH>A>6SBFUfgkN{jx??8>-E~g=B>Qhr$ z=FPr2?SJ^YIrs6p=6Ai6%dXtV0TnS`L@KPS5LNMFtQSBsiZ&KhDeQ9Sd(UBJSI`S8 z4Hs;eq4#S)ym>= zKKXpc1+`=(22G__yjrNKl;$&dnl$|a&HS?O6Ol`aQ!^p~MQkoYV`ibM;}ZW)U=Uod z6+Mmnd+YQ0(q?~#_kJgn96w31T~X@=N)?Q!Cd?>niFT1@mRJwCJ*p)}0*W~EE|yHc zhQFIB`$rU=%uD)QgFe+j9V9I>fwIbanPoni9jIB@t9z<+&Q)eMS(wrM++1fq^u22Z zew&8tFK5@>MI2Z%U8hjaq%0&88H%V0g_9|u7E%jUg4h&!%^@i+Yu&I`u0upjbj>0G zMQogfqwQ;WxDrmvZr#B-ogx11dZInSYZE&uq;yNl#4aymhZ9z?$8zgash3Fp=oi^C zy;Q&QHXg|R*ApcJWLG?Crhf<*;jJ>k&|qkzBZsSs5)Y;}91{NryCieZm8SVBswT*NMn8fog61 zP$25KZ6X0hY=HIiEgq(}4Pjw||8bgl&)ih}r|pwcPiZ_VVyTUDuFtshsW)+8tA5_! z{{-ehF_|%Ale)|kES~l=n?S5?N=sUSy9gRcamPdgia1kdP)IvZ=_9{RVMgGaKoQ(8 z2@_9^LONk}LZ*JWoQ=Eq{;O|VTHVT@aiLG|J!4|1)oMi4=|)k;IOIgMrX z9N^{QEnEoJON;}Z1qW=jRL{CtP%FxQ5cvHRNfmN|)$l-?HcKQh%5&|F1>?v2+$_h+ zqxY2;Z1vCS6?f?H?uQ-Ezp;MSE=gCRCTzGR#CKo zBGySd?TN0a-ojM|L2}G{QzQ)*Pf63X*^aeILhv?o2K-pYT^4));)CVPS+OYvd&AQo z?)a77s*n{arp_TNL^TW2vJO&j)TW3@5lN7%bCMfgCYR=ceDX*>(E^HCKLNF;d8#y0 zt9!|we4P5T3iGFu+>k_#)B}5He%b%kr#a_r`P`F=@%eW$dFWX7aDwj%z6S4%rQ>4cq)Ybnn)T4W}s!cHiKL`SQQmx|y%X!mc-QWTj-Kl#anWTWC2> zl{x2SaZH+6s!6B^^1iVKS3G)?s(wB0oM-_>Yz)>&ro_EJJaDJgM$w_}|Mrh@)>;Br zoXdl|X4!*ODJF61jD$>>grhSTn1ndkDorNvHG#N`xOE}{MXb~MY41~q^m&RtJ3MTO zoW^v}gL8|M%MNb*jIYNFfB12(+&iF~_*$s5I-%$#UdCcH)6{tytEUQ6H99m|vbTxI zp0-6JA`(!?Zv8lso-Pfd|Yxm~bE$`Fww#yp*`bS~H!+x0ulQJ2XG8t&LoH?30s0t7R z-hw7bks_lU^Y*EAO;1{L6Dy@70Y&l&v)oT6p%Zh@@76vae;sfr6d87DtRJh8IqI@< ztWmhny0R|sW+n%TNz)H z`c2q7XIz~sVw!}gnU?{lRt7`RSMy~}f5m*WCh6d{=2QY@TR3kn$fM^FX?|8}9Q99g6 zTz4t^ch9K98j}{JjmOojNBHAH_k1U;)dYBrh&+W>#-p(=T`)f5{*MF{AtGrjyCEV; zkQkka$U=?2CDi>GJ>h;yXvS=aM$#dejCygkZyrkC^K!b|b*=9E5Dyh*b(b}aDx8}# zX9`Y~Ca6LdWJ&tKyMhZgT@NKu)IJhWBp(q8@)~x^C2Q+f-l4D%gtrLfqag*4!oVpN zkWuPr@4z4W@!Q$ffz@YR#??>QgP4k}Wa4OC(y^Sdel)mXlMtL90WT1d=cwugFk#K> zxcedjMFiJiO5>*v#B>dCTX={(Q`w#nj8>p@6}2e2)zs~qN8kKH_HXwE`-4wHIw6zJ z+Q^uJqr_j72>DNa7M~dJM>mNT#agROfpacp1>u6M|em zxM6LUrz0I zX;NLWd+E^s^G`R39*0?`0-kU7ZARw#vi*x}4pw{4@RLN+^FwA_+woEOJmdjqm1j?l4!U zN2q@=%=oI6QfUIts3Ub1bv0qtR}AZt5w)5mTbloOALsZ+UC<}~4|v7LxvZYZx`Wv^ zSvv61UuDlNpW67kr1!p>hm{)e!@8DH?V!d^8q;1q>e{*T6Pg&&1z+Om3qyucffxsh z7SN7oAH&+n8Kpz|T!;IYH1VE9L{ng_DgePiKEDE3A(@)EEK(*#_OuI+_wN4${qk8xpmonZa0t(9z@mcYb*NMRmtkSbo|Ek^lZcGCs!4sKSgCpRN1Dxt^U+t{!8! z_~n(Ne$qQx{ZD_w-)_|6oxh)BgC6rhg6(LHQH3NiB$-h&CEbw$D+*5oZfr{*;`WOK zw4*UC8~S;^db2hYPFF+CPfbGU1uw_LHSQVj#ee1D zVyWsB$F+aFlXREol<~UVCZ(+M!DNswOlDj!O^#0X>FfUy#qrfsONpEg{@+h=;W-PC z=)@qVst`QRi6BPTh}qK+Q3f0Z-VN-EbwH7TB0>;IL}ncR4o+$-P{4T{*jliu!5c&6 zvZU-6-FooHKfQi;=6OGad+2!gn5Vab8SWp$%@pY<@)S{Iaoc9g!1m(yfO?ut~R|2n%J1-JYBp;D91VnFC zcw%^92I0gO@7F}vo#Irft0bw4UXT8+Io2&ZdesMc;IAI!nM8mp5V!Uw9333k9XP(zJV86{osZlW93I zEq0csu=9-~azWgIk$`qOoQNy{?+d51mlKmujVjK0G}J44i#nT86a|yJUe2Gc_m}_q z-{#{Z!%S*cmlDRE9{t>}&OS657PfY>?ktg;9IV9kO@WsV)qIA@g_+|=hW*J`7V{0O zL)+Eip%li5udt*FBG{zOf~~or>>A z0kJ10evTC~N?|sKlq9c^y6jei@r22no{PEj#T;JGHSKvVf0b%!5-JDej>&4ts@5ze z%A^Wb!@5xO4PUeBDsUA{924(ZHkMVFYDsY`f3*?o`}v>dimUfb&g+0(IzEl@zflGD(pi*(1FJ$UO!@+RA8o*0~)4k^2tYxN{=`Z3~2o=Okpj%20sl zucWuXMsHUbNFz4Z6<7)*mshM+JDC*JOiITvEr;3a!VH~{9A1Cyr*y_{{<^SX?GV5E zVHOi5r%H3jSVm4x=|Uc7{9d?QuVH_8ttjy&mo%@p+#7?`k$|=p(nlIaB7ej9dud`m zb#TEd8Ve`^jQ9AO0?n&5DbRv!@ZHbm*m^JI3;&a&j&8Qu3sP5N|NR#?rik*Yb6MCo zi!I0jUyeETEHsb4WY$`xti^cN2P!LQkiX zI~`MhU$`%i9OHA};rM(+0y^tsKhr{3KDb`(3H!Za!o@&fC}F%z5S%X*a!cRz=lqO- z%N_k+c`u`lxUO$JYJW>_Q-NE8)=%5*K0WP11y&u-iIQ4ReP}nkU-IOQneSea*N$q_ zd!Z6US7G?ohxz74z31=#1QaX|e05sIjs;*#+yQwds86SKkWWHvCg5QKjaBP{7 zjxYLUKjUDX8S*Dz!2CvB%s>Af)Tb3Bx&;KeoRy5ugU2?mK^5RPeh6|FPRD{7(+o0H z;H?1Mac$JeiUhQ+te~-o2;rX$`Dlu)q)2AEnoFjYh$bnfmqS$`y&RhsSU<8?C%bq5 z&7Qye73MbTdVc$UGR?_~;pUGn&PYWZesOtY=hyF>VQ}LUzj~m@?rt&ALB3nlO0q0x zfdb9)TuntGDIzIS8?Y(ztOZGL&`;lAt293FG-L{KS4RRmYY;@{^*#=poaD6%mjt~Z z?`jZ_F$QtC(qoLnN=@Qx5*U7Mad&@%l`Ex@FWo}---~QabLupH^G85m1WE=VB)9!rA3cu9>zDvx@X>1MhB03ZNKL_t(#Vt(?CSbie9Qc=&zVOsudW=Acc{ zp;{W*joQ`XjTX{{bk7X)&wRp}u?oUmG2KE0Wb_P%1AhG@oWEy&aVDeo)oNObCRlN4 zf+{Cwt)-!Bz5^^d{Clope|PFW>U2CPx?hoi&L%hP5b$=I^mK5tDE=uE(# zD!dtXDP;d42?EW5{g0Rf^y<6;6aD}aQMDG$*PS+6bWcc z5ey=dOnt4_{{0;Ci&NxX2}01L(Wz744wy-M1%`rISIi|ts`0{px9`rEZ){=SG>VGS z8nUt7d{Oq5)VZ>xO3G~ZO#iMAzYbF-Uv|e0b~Kus%q8R=RgYFQ4Zss1w=lNQvEVzH zHz`^nHzf#iSgy`uJSY;-R*Lbofl4=Js;{=9V@IfN3xn|<5zh(#olKbMs6xt#9HAPU zgd@qnc=!6HRv!!94wd(7BcC@J4qsCxQl9ZKIq!QVd*=(R@%6Z3Xpbz(kyHIljox_? zo%3Li0^G|jb-2&5ATbiq*0F+uN$#hJsT7fG9ePVx=PJCahPo34S!Os{nNU&|g>@_S z#fR8^-6b46lh?a2&&ZXO;@qaEf{ z;9h^2tJBaUCMUJlL_`AGH1cUh7Bs z?>@-zOkeZ6UPG=GPH>xkf+q%>klI&1@A27-?|uarU9eZ@@X1&^`6-7v3M@PH)^jK> zyO&$)`#5X>FCwOuaE*urw3#kgo64o#kg7Tok?Voy3M|WsjFW_a)ot2YGt&W+YY>S$euU~y zxLa@GULULjV60*{?A9%cUEM@n=Zs->q+VAz4uw>qBfm$FdSWD)Ll*iSb`M>U_ zoNZFE5 z90SFAq5 z@O27T35*051xkZ6300k0m)lHn#wI0MRgw6Fq-)+2_zZXf&QXH2q$MQkuj#GD{9P(jukEEL1L&k-z7A=x)YEpSOomO10?(WO14$ zn^%#2aGqV)U(V4S-vcI+kvZxFP_5eTnMOR0Mz4EO(HG@>{8fQy^aSTLF`?jw#VYAY zK#z|Tp{f($HkzVCktX|<3XE!T&LrfCq4qT?#wg-+_l)kp@&X>%tc!l}HH?JPZ2{QiPFOKMFK~%Z{YVeY)BVGr;K`eH%}>7+Nhmix4WCfU zOP;p=QPb;;fbZbu{i>~up{%9U3Av*w7?qICOyq=I$3_2xhhH2{po&M9G}KdW zTSO$FGi&|;ucr~22WXorCkm;z)~ZsA+9aoNl&UiYyV2`BpaBvh|YfW0)*t#^vZt~TZ~W%0)u7pmnre1Wc^m4nH{N9glh0lbH{l<^N`F7!bU-vI? z?pCaevjjCxtqV9Ou6Ng7=Vrhv|-jy$Y`|nAmgb< z#5)w`X!^P;nixS6nopayi;CK1RWibiVKVrScW<4*WS*?Wtu~JY8E>ik{quKl>0D>I zXP7G|r{_Ys8om8Wdi$sLjD*7~K3|c5*6$^>`>HjoLnGp=fMeGSenw;@1dB zWs>A%UMk%)@b#fxXI^gObTR1A+3ag5avf~78~(PJG0M@*i8-D1QHA|~&GTY3y$qZRBhvb=2>!1+wq{FOv5|h1O z{Wm;uD}J_a&Ok)HCzqO{t|T>*Ym#)dn_}vM*<}42ED=NEMHCS=-l$Y)T_IIXYOlMT ztG4RB|JQf((nF~hy-cahOi|?`dk*S38R;bD+{DglPntt$PGD$21^wOyNuRBJY=R(< zW(fuDAR7rN;xTbIpL5r+zx#Q{P{cB%p{#w}C#wbH{UZE^z1@ zrq)dXmAb~F&ZAjHqBW@}N%~1r+B_eb7d>U`#eSyI$w({}1~sBcAPMhq;;D55*vC8S z(4rttypV|6M4V*ew|ti9@@pr;a_FGs!Sy<>uK#_n>jsL+zD+BT?Jo;S%$ERGB zW(>2V5+(QOiVLDuoz%H=c9DJI6FhUPf4+W!Pg63%tAKNL<1&dQsj1fOB6y?XLBXiO zS};B_XqJ+7QqBs=(td~jdAraa#R6v8B{{v}C^5ot6!w7?7)#TRlK>Ns-Z;x2zA%J) z?9>p$X%)pR5>Uh`F`|Aajc#$56C;-E=EO4{gyS{Z^XM2~n}vcs|NC8x&xX&|?QlFd z7>lNgCrZ?p;70Vm)oZd9AoHO14GSa51l6~7VtBLuU>2vz`Zgd{O&H{_|C z9zZw_Bq`2(>J3{z_S53F=i!aTE6y0C4X%4mOmSV`1{1_L29N=RZQe354FNrPHtmH^ zznk+CUzA$m2lLE2Qqd-+!R3&|SxqOk)aprkTC6(=olQC>%Tb?=#b!&LNw%s>y00FuF#6-4m3J~v`mJ%@=wl^G*`WlZ=HV>%xd3tv4 zy^nkk{XyZoLcThzPive~I>P^xd$=(FI?HmHtJBb5SVwm(5)f0Tko#rsudn5t4#1x? ze7?e!r~2Wlm?=o83Qf9~?B?iPZ}Zz5zFp)QnK@B>2x_EpKkJQXC2*l#MSY{dXhoe% z?AfcAeDNWUfXgOzb~=fMA&`BFue|k_d4;=|KdXYmLN})3BLNY_##-@l?&oWx!|d&q z_%{ltA)k@c(K0_imyBn=@Y7pETJ+mRQIHsF60=4MsvC4Rdz^a3dyk4k4T#_*-GpI` z8-+jkB$v+3t;~rIPT8y)VnK^F`u@xL#oj&KWW&B2#u!i}Ag0V=*KUsgz>&9v492NX zC_8o?&1b&j`mNd3eLCnBObnGZimHkapIbd{-4;;8IaFX!FGf6GaJE-)RzG|{_Bw_g zPMztLMm0eI`7%duyPMCssotilo- z;=tMZ!EbpUtAev)QPb$Fsh72i==CnEafm|_LvY1XoayBpKbtqpTW(^{?&QcRr;3Eq z4GVaO{_rlk=d@OLbipD4O_#){_i@-f#PF30^I-(bDTSqq)r6mX+vZP~SPyQvlG;#- zC=P6^XDt|A_x{i|LqHS^MiEf|h8Jw^Fv5+%fB597^}Rz~P)p{z#N^Gb)g4{1NI+{@ zFjXzTkKer1;qPhYe}}nVr*dDI)z>|jeP{C;oVSN=F!mHwNKC?svV--maN8@@))$Gv z`=?%f_D>Cc;sxwJoduY(B$qvU7jUkK*mjnDB%mEYGLNQCr>JY|e@g1_x6Rny%pwzm zSc4?9eeL&C6~nAnonFE&ok=>H_Sm04aNm&wXZ!l>o#Q|km5GD?-g=>^`o@k2zE0L3 zqww^Tw8UpjteJ7i*zNLNO7o1%c+z&*TmSQybkIi^stlhU)V(#?q{}W_pf){eGOC4+ zh2Q(FSk39qu#tRk}m$j1_fSxntz8~!A4kNh(C*FCZ)d-Nr3oPwspwFc_C zWaJzjWeg6jR?K25*xY<$xLwvMNicv@M+rEPw#{JOPHyvWK@6QI=KeyreXa%!$#ps&Z|52`35zk3M%d*)!mCZ3)OY9FVQ*CR5F;k$}$rFwa`` zX&c}0s_Ldq;0f;S3bQn&^mQPg%%ha0bXE zm9m}ovCbG!?V62dO=AVrl4ski0Ppuc$zWFKGaih|G#fLn9l4bzkZ))zqbCYofw98A zW!zou0U3rKv?>cN+)mJxHamcQ{FEgme?RkZw{}RMqv*|3F&`TUC~=@dr%=+7u~lZg zt9s=9gEN$`d^#6wmvx%$V+5>Lcx|MuK{sN5)V_HD6EWa~N_sil%FUSR(mQvKx^RiH zsYmm=cG$!RNme~Eq`&~H6688|kzEI9E6qA({g|DSA=@b~SW8Cj36r)i*gf22EBrfX zw0--WsN5|Gqn160U=zS5l#+8)e*L3tE5Y%7yE$%wx@H32A+>X|{yAoj(lzP@&qtQlGIEpk5eJj znF01UKeGKc$1^TvUKA|W0+J+T8?ir3(n#0}i5Ml#Qh3$%TWdn>M&a{6MUhWfHD#)K zr_3O2-7leu{S*Qtns`tzSlD-o$ieUy{^Za>B%rfD2BeP?6Y2v`SGX)}kZ;lqn5(9S z3tC{9W?F!zLelB?Sv+Uq>}xnZ6$S;fRw=>O;GJpoN7mihZ=}htg;+?M7`Xa;7PjTX zWH5zKRx@l}6buw25(Mmm3$`3w{Cxr|Vc%T~JUKL{u1R(5l#x9s6$3Iy=H_tx#ZPXZ!1Kw--ELdYma>}o#5)qH)*t8U zWTZlpt{Cg9KFX-jJ+mCzu50)=_tjVLqUw!~ox5DkPf{UML#766gd_)2BRUpQMYNkD z;}rR!`*~V*Sgy{(EHM}2LM9T>*>3^0Gu=mUkKD&$^EB?S|0NIHK{Mg>F;R(*myR<| z7-#1n94~L@weqY~;z@A6tp{4StLYtH0P(6?<3+~X-nBUQV7+8GmT1}a;KLuhHW|S- zHLoESgu(?k^8bD3z5H2q2iGQ{S1ejU+lhyom%A0<8U}l6^v$7B@DxXQlB%2WduM$1 z#h>Hi?Yu~Hvtw|GDC!-R+ki+{S-0BR4jj6$z_y|sZr`ySwI2j z8?BQL%`CA@U^2nK`)c;~ewq7g5lMH-(88VIf(b!D{$*U6-NL>8OAOzja3BN(9~+4? z1zG1EFXPB|U#stY9%>X75La)EvZFQ%iz-yO3Dwgs-x-JAJHLaKzBh%4rXrde(L_Wu zX{JApRi#oDFHnYq@SMNo$nC*uuS6u@34!RH5`<0x-po_#8H&ql^sQ3@^N$@D(b{x5 z;(qWo+uQm9c<0NR&pcIzwUAgz*1tbm3n)d!OsMYq4t7L~!4JHWJ-d=4)~2XU@y1XE zm$tP4y^yqB@)oEaddD7m2iQT_DK3~35pxUo`VrOJ6z0~#9;d*p(Ea4?I@$?~bZCKD zDk_UeLbf4wKtg6LUJQ=J7yjv&tgZdF$GsmTGlt9<3bA-&nt_&0A)-w|Q*AP@M-+Ag z-Q$d38xGD%Y{l3nE?DrVO`q%oM+~Kv!XbrWov$v&j$Nz*lydNo*y!2f6_SH2og7A+;Ta#PZ*4%2D`x3X^S6T0(*1 z5SRxJ0`E}O@lNQ7KkEtTl=>-xC|b@-dZR&~Z<`ZnrByqu3N@Dbq_FB|cj=xg>-#E6 z(}fxB>?i4e^bK6UlOC8uJ&I+9e#JVv<@)P@`Z6*@Gq9^9ZXsQo-Dw2$(5LyX`4M?N zPRHXivsU|VenxjGHKjFeI(`MnEQ~Cyq{yuYB)?KwtJp85#z&>o)_o+P&9`vs>6;-U z=39}{5PuuZ_*_dEE+|l%lFBo5mFw8ygcX}D4@{j;+!EFA{X(^}(;k>>uHZ;!6Vv8L33vUn>{=AVaW?}QB8D1g2qPiwG;(~$j%)_{K9KE zG;5BpWcVt{#(iJSt@e84Q`Wc-WTZ3-iYp#{sfgUDs>7*gwcX>g9SRkBykAe z=YEdfe5cx%Lz&RENh8^+L8^5Uh{y$NC<(83wM*IV@n8jQi;UuSO2g|EDYb=zw<E8Pr z&e{Frcdm4;fF&$FJw5sNSxf6ZT@CNv-|w9L+k2nAzneiAjF5!T?B<~8;KHd`84g>T z5bOlV0gdV-QUtkz(_;i_VYbJJq1N9WhMPH(Tb1Ai#gm(v8q9Zx9hmqJZ>8OA5%|g- zoV$^3H;8urq>J(FbU%#`_?iRE(eWEe&ku4Nhn0R<*vB#y(d@*a zeBqN%PNlv_wlMMn=Z^ZA*C-Ny$+r|z*He22`2I$1_f?5ClMx%2|hjS6ME2F?!`s> z*IwP^C?1jr>gEPLdPN|u&`#H-%@utpPkjP;%e%}J9kD*sh{#&JS6r!7Uco6wg17#l zhx7I^czRgx=42V`e6l2=3xGShchDm}-=WtC+{Y1Ail%gA^E&ipPd$01Rv!uL=SUMd zdhxJGk#*}Hoi$Yt$Bwr$+cOJdNU%f_LM|_&^)Li93Eoda-Ln`u{7t7ZH8qy+T=QP# zNl^zBl5-irfa(pQ*|a>8X48zt-p5|YaaWU*v0k|E~3Ng0YFGRZHS43*5(T{p83( z!uer0(c{+Z?AJd+r`Zk<#VdaOb=Bh?MI2!v-RIu> z=@U`rtqu!R_PNlF@;rpvK8Vw-`hRkb=9 ziV;tS5X`7*2|Pv7r`8W|qL6?-Y@NjBlW@k@FwkLMG&GH7>kCZb($ z#wZqSED=!@lW46@>h9_Q03ZNKL_t)bm`J^rEwCH-Wf7S?tQ1XSfR2rU8T&pt^z{#O zR=iU#NMhty3`DlB`H914lUAx}hK<|In5d;$vQgWP^~nrTR_xSMn=SC;`Te&rV~8qg zYsYsrDv=^3i!(He618P2_|Pt9h=?&Z2I5GKi8a$i?c1*_oBE%J;k?aU^6^)(uUhW9 zWiy~K`-f?|oOKgg{e|wb)a^rs)@!>m(25bsFt;joVdB`HXpMcJHU{X}8lre4KQKNq z;Pu>7yozuAEO07yabX(zYEbGU28YQDax*MgUfxd?G2cJqlybgV{twU7EAoMdWd#?Gg6NNFme$t}#HzCj7FY-X|xV zZUrxBqC#(0=u#UV6P^@tNZQ3!Nuk03Tqf0UvBN(9f$Oo&l0P!GZc&#|8AFT;UM*HJ zR)`GhoP}E1*diXpktm3Z7?|maqB&vw3HUE>M>Dr(i8UO*hZ|EUn6eZ_%9d4MOr^#8 z_rBT}%~C&dK5-k}RyIs5)&Ncg5mIA`Bu$7Er(!_`Eh|wWQHwWIQ%t_%SxtfGPr?OT zS$Eo8Rkf{aSpiGShV`Dx!4Qm*c96g#@FL*JKWghVIiO=?gTmMH5Et_z;I#t#Lbv;< zac`t{C<2wC9YDTGZOwb)H!~-ZtqnjgwP+9QyH5|`RQ4ch{PDCb0avcY9 zMNJOqnB;(};05_Ht)CWf6|fOV!)$FIinhGeE^E7fdcg-;I)fC&xkR$~cVP(-iUG)nxi ztII>gw^*b@Z%`8ZvNcGQeBI<=^B=sW3B8V%Kfj$*A2YQySAv#M#Tl*w(IR8yvOux#7?B^GVjDLW+Xby+_5q1UkI!qe$CSM2DB zEy;&oi72`8sCP)|B{mogmPo)SWD=^QmqLR2G2h_+=LX~B*Mem0nvmldUC>OTYfAh_ zY^Zn^$fK6VuEbJBYKWa+#o$$`Dua*DSYP$N{*k8P^jLB49v-;zt@P&m?3I+vMnDPE zZStMJf<1R@6M7v>Hr~kM;v$QKs#U0XW8>UrF$n{5<2wxLyE+wt^-u_W*P+j@Upnz? zf!2xv5+Je24uwl?o%6AP+LoF!2kTQ`dp_P9%ECrvCrU`Z^HI`n*60zh1b5%ZgOx+h zJB8WiYOD+|{5S0WySwQ=xVN=;K;pewpp|N5a=i6zGhnc+&=pv4^~rDS(Ko5;AFYMY zw^njM3S6V`Bo6947YfGv1M`%e;#8^1C@Ql~hwkhYKWvQ8%5lyn)-}dwW%=}5nA<#w zWcVl}vEmcFqf&$MI6@EPQm6?s)GbMOh{)`?dPHM@j?M#W12z~IrnkC$@*17)a6fqSRYYefdj(WVD3yrCrP!qHq9>yKur6cu-#sEFM zafuH3eKI!pC_<19c6*GRY9O_>=aYtBFViiuIBnw!(Qb+Rt@)V&)KA~Eu|%VlbMtavvb`#x$6(82Jk z8XvT#szs>%v8q~K!o*C0zfECUU_oJ>z?dNhTI!Rx^Srw_n=$*P_b}Zo z-G-BecV5G8Q|z)z;T8%h`VN(Pd`}$OHR9m?NN7zmf5YMp2a0&>X{zqfhkX-*J@kE; zks%6}oxAA2D8#pUa4}25gi{6MTi6y!5{YwVYNeu;Jm&)TG)uPOWa8&8XYR4<-5e}e zKAX&zhU7>Yg~1DhV0gkvA4DOk(AS8_ndAFv^k5GU{jxDY5A}vd7sROQKtxV2@$U+~ zFlp#~uM~QOzOTNIJS-Qn&_c2zVvqj8o0=J44JRM}`EB&O?ZrtX$$iu|CZQHW33J27 z42lW;kaNImgBO&9JvQ=!(i7o`{zS+D*>Hi(SbRFF;QaX@EEWkY2n+>EsV#o(KKi!w zrnMtVB*US3?qzIR7zDL~&JlfM5MEYJLB4+~!LNF2O zsp{}V=oLE=JRm*fy||DAx)8WF95J@W=Dgd7yzi2-GFTC+Qz!EDQ*Y+nW~nxutbFP= zme)o3sp6_K4~8c^l!w6+GSqS%qwm|m>kjdD24j1vF+jmJtio3f?&6E7Wj0#jh;ig@ zjx>KNKod962j{b;q=otH9VgAG>4t_M$r&4%JZqBq78RAXi5?8UjMll)DuiN=`lNUX z_?IGbsfd_EazO4;Z-BRkn>m*CH|?a1VH3n8=bqA>d^Mc> zeD2rL7}p|8T`)Kr_C*zp%IHLFM#8+bxsdS^wbgH5IuHj}9ig%$~Z5Y4*=l-l!VH#KcKL zOC!3*5nFGxvMp`JNEIU{MxNM~_$fPOyFKt=52LLf)dpx(6eS|*4(=*5qUR|*5$G!< zRDjnCyi@U|LpAryD&P|Xv%d+9o#HZiEu9p5FavoPAX@!&}-Z}~kE*CJ) zu^b|Wp+dXBzkVA#MqW^SB7BY$r4TVy)%*h1cPjjwsP%7W1uElXV-SsEH5x+>z97L7 zyNa08CicyK_U$x6^9_$G&fLhU7oE+VK@u-47eZd*O+}@VI4fQfSI8(Vi|T0_dU=cZ zsxeAZt;B0qIuu&w6iAdBC5htQH_9{4~&=0(vc;j>velEwM|TkgiJHn?$7hqbj2xts&T`4k&Z@*HX_tYExHr zss*tIF&66-i;q3dyUY}=xf!OfyS$n4)$r)$^bI^PJ;6rAr9ff9+Bzw%4pHhM4a0C+ z=0kepc_+&IKM_K(krlpH;issl0L&{)0!Hu}rYm@L*5jl_QyFZ_cq;HQiNqngaAR#61@Ou+S*9^Sp*CSN@K)-|O%p<}Tp{)p&L*VZ zQQ;z&k(vyRHcn7};a!c=VMD_&zL14pN`f2Q7HE*nT!uza5jTo#+ftO#wFt+rX<#+t})K_@$J^zW$-XZ-yk>NB?kr6@$HM;M zMtthivo=4l{+~bWDq1f@-XBu4|{B1gnYcO?l;Fo?9He) zXlx|<+77`+A8O3_j7q`Vs#^Y#{6>ZL*t}~OV%8ym;Nn3=f4(493TMj)irb#U-e$?I zEc=(~U-kxumE$5;G80_*@u!uHz2-Pr`tPXQ0;arj%9DP9{tx!B*j&+-C96C}htVW?$ z==GBNYgH}f;F5_7mZNhwvHr%Zm}!>W%JI9OV|d}s?78Q@4S89Rd1c@|{qQ`r^?lI@ zT%;-{7$W0+Slpfx#iC4n_x>&Om%M@K?VmuKE4#8h^(^*9bX(CBX=OFBWD#{&yoQH@ z5WFC2Dc5P>y09Phkjm)ea=(se2&SWs+)?47h`c{SUM+QIz8VX|vfv46V$>{0Jx7$L z)AqscU%wAMYg3c^St%}lJ$t{iYhu{P#zX1vZ^d~FP<7yaXa-g(YHu|%N+k#Hvl2qF zk#{6RIvTr7+ql-L>-TrQ{t?>ERbDw}w%L34Wv(#LO@^()G4xvZiH*F}QQ1lXNQo{3 z*Q)Bb#`bHXszp#zTu}pYyiUPJT0as#R4yV{Qp;`hgN8{IE{+6)1W;BHiX&#QSe~(g ztT8?-$7Q$S?%CC`^R)ZJWZ2Kvk4)`hVOaP(aUmeCG8>Y7>T_>zCY-JmPrikFzxmzH z{36x;ba%B{oxwU=vR73~RVlqnr7DH0ppc1ZETRU~3eo7Ps$NAyI40f$IeXJ|aaOv! z%0+zt@4wsgPq>-;n=8ID+;9btnI$)|$4jDd*l%SpLNQ~K9pOR01iT11Yt$h>Qm8no zlF%W}biomNHgE|rA1;Usv1%FO)R>_AqiND@dQpK^CS=RFZcm$Y^7SOz;1} zo=N%L&#t~6@yW^`zh_X{zAapAk|5-lj2R&t@^~XHAqQ*d ze@tC;*ru*YAQ+ob?T-(Zx)R7qvns~T{>l5Bj`x+~{eMI(w#got?k^#A@>UOyx z`LBHIYQ_I%2(uDPCLX22mr!P@)q#b!QA!6an>cyL^UL^s*Ec6$D?zeN{%JLTez8+e zZSKOcXK_IPg16Cr;D@ar49NlSQ*d3<7T^{rT-ml++;_{NK4{?K8x{T~C>p#VS!vCn zEX_U7c|WF;?~P;4dW zwP!N);PKD0LW$6o(2Og>zfPKOIiNl;fZoeY}#;R#p99@J}}= zJT@f13W1@al-QImjkRrKszR+TNPI<7MnvsfpG_-`oB8f5!HzGlz9#S;pKL-!uiO^(h!%f;BOCDh%R6 z{>KM{lTx=p{SuHKkJGT@;Q@(=oC>^wI`oREj|F3ZLMfahCTGF;w1u~o6wBr2Sth^w zAuei`(8};vce86qZ`Jjbmc962-Pt^7R*G{^;hcB8kl{qk6fV-LlDu>%Ml(}K;97e= zjB17|;8NgO$76Ep@yG!g;N{eE04ep6pAFTR##?J#MPW3xDIF-hpKOu+``0nwET5I* zGyj)~A$HZnpEA<;Pydps=8mi!ue^$>sR$>Pf+o%@DnjHa4$T1#spVS>;MF2BcQP2D zQ-L=E_l6JJ<)A{F$4Kf`29~&EiI=T6rWF%E>8wUjogjydg&RM97qd!i1`4 zLT^fDDlfEpCB=ecAxrF@^o#F1A%xOSYQFk^*z411)vt3EO;cK0%^g`;?))uIJ7;pa z*Jh?Y)M-;Hz8hhKK9Hf-UpE$fgt!=4ijntREL++;WxKsv&Q8O=&ICkuZnts_1{)r= z0SbL1osekuhZv!!d-OR9>*QdcR}_A3-5BSvCFOEK)D;+>Hb?8Mxu)TCrD?Shs(kfl zLsdv*R{u2a(ZHKt#*$@!F5dd0ND3E`PN z*}1*88+Tl3SKR;wM#;5dW}L)YOUvy;8;N|yILzFmQ*e&%>XlmeDbsJYzotk z2b*SDHZEUU?e`%=EqVz{%^g{JUiAz%ZkS!3%1A_LCsl-uyr1yPggvTS=V{vx{e`Ve zPG8O0iK^C3;@ft3w(anoH>ay^fP!@6$Y_k-P$?om4Loh6bO^LUBiu-nWTY+QqLjo- zS*`2&^7Qph%f<2FT|Y~!BgLwRU@dHP{gw2aJ92z@&&w%V4B8P1WnBz>!1yS{VUPOI zE9QaO`&qjFGu%^z{eDcl5{`ujG|B-*!TT8{wBAAefkqv<8jMjC8c%CWg%De0s*}%t z<~_|qJYGEGUobn7tbXpLO~EbCVXnC&$A_0ajoG>OK8fl3Jf|GkzEPL+2AgW^GbYefa}yY?j9HWinlTk8}Oh>i45P z+PLU3%x>L`$+UZD2tM+JMkx}gb)$EC^pzrV9ssvr;o)|zzpj1`Xe759hs5*Mz`5bW zM8V*=;PvFAFpN~5CD@#hWO`TnYh1kd0fn>%s*`M@jK7tULAG(eTrIN`G4iis#HSdOVr`v$|0(j#k|O-OlITm7J08;I8ru?0;=YFjoh>A9ahp^)fUTQcPZ$bS zFPfh>`-&kV430X5)FJPx&Vy)QYKxh6_-t_$(GG z^{53ADP(uPpNVD(oH(3*6T=_uZSPf*VZ?w|ocH>r9MzL9F`DMSv*2hW z6zewj=JWse+q9-SO|$Wd!js;};G6f#{Y9*83rg8tEGW}#Dv$hr;{fkb(Yi`{$w4o{ zUO%AxB6@U!a>wKten|CdV3PW{J*959NC4wi@PeyEoeF|;(M+4(e|%k|gmNKw08$Jt0D{jQANIeJ-##8m$xlUk_MAQhGNkXi~xDtZT7&?kUY8Jke;U zwC?^mt@F+pZtk`Qi-pUM`jjJgiR-odoO@b-{XHLN!%Vl){yEX;wPM#Fwb6rnl{`eP>m?(=$<1B+DW+J5%aZoy^1R{aO z5bcx>f75X_Kv&DzDT2INwzd#tM&ip2dbx$6t+izx_1Ds))}vJhZKu6umql48Ez)y( zY<%AQP61 zu%tk2p|lVgcuY^Cmm$bbxgbH1o8;o3C^3CRN$3N;UV_}j#nDH(v$~S$$-iKJCveWg zTe!C7GVFleJrfsO?)i84nO@_DuQmSmJ1oEP_ek&CO}>AT`NEm9LL|a?i_c=?bgD;Z zdWMN#dlkc{pWBR5T8nIW1q-`}=`Jz(Ozc_m$l;unZ$FjEmwcXQE&^pnWhG$yv@A;;>C@mZt1;8GU;=u7$Rz)C~m!~K)T{56X&h8@5E zY_2SW!(u~I`Z4o>3=nVQeBHra%7qXS+suUn=J2wI|RM`i0j9WGzTQAn(yGQ65xNa z@1?+&AgOVfpU{_wI%E@={IK3hICPr%9>W*buhb2yBGNjN zxnhU)fX20c5M({w4g2YTUPFiMn10BQwm&^hW(%@=KhflU8XDFLTdrs6hn4J&597;( zt_Lr$)FXT58@OcGyZOQqk99s056A^WlwQdh={&=$6efds(P5j>;>8xX-$2pa(uRh$ z!-sEWvEvWlE)yhn3WZIJ+yM0t0K zAVZ3qOx^31Tf`WIxT~o*>Vz~FQUq&Dq$yw>lySRq$oCPzXqcdmELE80Zo{t#;3<4Oog_QU zp)U^Z)(o}xlT<_0S|VqLWkr=&m@2_WEjwsUWcy6k%)D%9ShK9_E!vLFJ2A4XSnu#1 z$FLMpbwkSF#CU~{)J?0`Opu-3A{u!nP7a}Sj;AXS5-GkKEH{}iazD5 z71qH4oS7O3000C0NklIIf1ceN zrkII|Cxp0kCLbgnjjW*^Yjy)jXlOg$)gBmzO=2$Io_I zieRFG%p}B7N*6E@nGXi0Lme5#0t+5}Nr&W#+c?jusvp^u;ONNs^yG)kb02v^Ks+9T z)dEDMVZK+b^HUG7Uj%XCwSsyA>Of#ogi^JU+-PW6%c!EU<$ghSf#hQz%`kMv55oR8 zQhPvcKy%z%wz0#9NjY{Dh8;3NN1{XGvQeVQkBm`E;-@M4)Zk`~I%A_SZrM}}hN85J z0ZvOWxS0}P?OtN?(sv^N@NK^Dq&8gMQ;o*H0v6BE6Pe~VH#DpcmWX-`b5+&lJc!^c z04qeNpT_3JB~B^PeuOW}0$w>-a3dBZ0 zPJ|*p6;Z`tbg0cN_=bknBGCx1Lx?P1z-5Yr^(--8;D13x{!Uf2l?hty)Ss^>LUa9|>btH6n)q@pOqXwniI52&GGm2e5h zI|f>kh#C*Jut*9HgXj`%6>={W#6%)>*`KKx61Oz=1G5BlJUS1w6~qTUcp&xYb->@M zYF|W*s`~N6E&&c0o}1+2_@mreJ(HPkv z((w??D5_U-Mw+v?eJ6`wP*`_3xs8T~hK3(Ukn6bng{-?~2eF+IMdJ3 z*;Ju73oJl0Jg%Xk;ix>IO@JHX-?xtT<~z7@R0-`w#EPnp8pE8T#MnDPZwghhACdsbZ z$Kd;fwl5P(q9au;hg7ei?(2vJmYQqV(9m#{Ay_o39R#*4Q9NT@Bk2DF9mGy0KV~5r P00000NkvXXu0mjf^B0Xh literal 0 HcmV?d00001 diff --git a/config/.config/dunst/dunstrc b/config/.config/dunst/dunstrc new file mode 100644 index 000000000..aa61669a6 --- /dev/null +++ b/config/.config/dunst/dunstrc @@ -0,0 +1,358 @@ +[global] + ### Display ### + + # Which monitor should the notifications be displayed on. + monitor = 0 + + # Display notification on focused monitor. Possible modes are: + # mouse: follow mouse pointer + # keyboard: follow window with keyboard focus + # none: don't follow anything + # + # "keyboard" needs a window manager that exports the + # _NET_ACTIVE_WINDOW property. + # This should be the case for almost all modern window managers. + # + # If this option is set to mouse or keyboard, the monitor option + # will be ignored. + follow = mouse + + # Show how many messages are currently hidden (because of geometry). + indicate_hidden = yes + + # Shrink window if it's smaller than the width. Will be ignored if + # width is 0. + shrink = no + + # The transparency of the window. Range: [0; 100]. + # This option will only work if a compositing window manager is + # present (e.g. xcompmgr, compiz, etc.). + transparency = 30 + + # Draw a line of "separator_height" pixel height between two + # notifications. + # Set to 0 to disable. + separator_height = 2 + + # Padding between text and separator. + padding = 8 + + # Horizontal padding. + horizontal_padding = 8 + + # Defines width in pixels of frame around the notification window. + # Set to 0 to disable. + frame_width = 1 + + # Defines color of the frame around the notification window. + frame_color = "#fb4934" + + # Define a color for the separator. + # possible values are: + # * auto: dunst tries to find a color fitting to the background; + # * foreground: use the same color as the foreground; + # * frame: use the same color as the frame; + # * anything else will be interpreted as a X color. + separator_color = auto + + # Sort messages by urgency. + sort = yes + + # Don't remove messages, if the user is idle (no mouse or keyboard input) + # for longer than idle_threshold seconds. + # Set to 0 to disable. + # A client can set the 'transient' hint to bypass this. See the rules + # section for how to disable this if necessary + idle_threshold = 120 + + ### Text ### + font = mononoki Nerd Font 10 + + # The spacing between lines. If the height is smaller than the + # font height, it will get raised to the font height. + line_height = 0 + + # Possible values are: + # full: Allow a small subset of html markup in notifications: + # bold + # italic + # strikethrough + # underline + # + # For a complete reference see + # . + # + # strip: This setting is provided for compatibility with some broken + # clients that send markup even though it's not enabled on the + # server. Dunst will try to strip the markup but the parsing is + # simplistic so using this option outside of matching rules for + # specific applications *IS GREATLY DISCOURAGED*. + # + # no: Disable markup parsing, incoming notifications will be treated as + # plain text. Dunst will not advertise that it has the body-markup + # capability if this is set as a global setting. + # + # It's important to note that markup inside the format option will be parsed + # regardless of what this is set to. + markup = full + + # The format of the message. Possible variables are: + # %a appname + # %s summary + # %b body + # %i iconname (including its path) + # %I iconname (without its path) + # %p progress value if set ([ 0%] to [100%]) or nothing + # %n progress value if set without any extra characters + # %% Literal % + # Markup is allowed + format = "%s\n%b" + + # Alignment of message text. + # Possible values are "left", "center" and "right". + alignment = center + + # Show age of message if message is older than show_age_threshold + # seconds. + # Set to -1 to disable. + show_age_threshold = 60 + + # Split notifications into multiple lines if they don't fit into + # geometry. + word_wrap = yes + + # When word_wrap is set to no, specify where to make an ellipsis in long lines. + # Possible values are "start", "middle" and "end". + ellipsize = middle + + # Ignore newlines '\n' in notifications. + ignore_newline = no + + # Stack together notifications with the same content + stack_duplicates = true + + # Hide the count of stacked notifications with the same content + hide_duplicate_count = false + + # Display indicators for URLs (U) and actions (A). + show_indicators = yes + + ### Icons ### + + # Align icons left/right/off + icon_position = left + + # Scale larger icons down to this size, set to 0 to disable + max_icon_size = 32 + + # Paths to default icons. + icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/ + + ### History ### + + # Should a notification popped up from history be sticky or timeout + # as if it would normally do. + sticky_history = yes + + # Maximum amount of notifications kept in history + history_length = 20 + + ### Misc/Advanced ### + + # dmenu path. + dmenu = /usr/bin/dmenu -p dunst: + + # Browser for opening urls in context menu. + browser = /usr/bin/qutebrowser + + # Always run rule-defined scripts, even if the notification is suppressed + always_run_script = true + + # Define the title of the windows spawned by dunst + title = Dunst + + # Define the class of the windows spawned by dunst + class = Dunst + + # Define the corner radius of the notification window + # in pixel size. If the radius is 0, you have no rounded + # corners. + # The radius will be automatically lowered if it exceeds half of the + # notification height to avoid clipping text and/or icons. + corner_radius = 0 + + ### Legacy + + # Use the Xinerama extension instead of RandR for multi-monitor support. + # This setting is provided for compatibility with older nVidia drivers that + # do not support RandR and using it on systems that support RandR is highly + # discouraged. + # + # By enabling this setting dunst will not be able to detect when a monitor + # is connected or disconnected which might break follow mode if the screen + # layout changes. + force_xinerama = false + + ### mouse + + # Defines action of mouse event + # Possible values are: + # * none: Don't do anything. + # * do_action: If the notification has exactly one action, or one is marked as default, + # invoke it. If there are multiple and no default, open the context menu. + # * close_current: Close current notification. + # * close_all: Close all notifications. + mouse_left_click = do_action + mouse_middle_click = close_all + mouse_right_click = close_current + +# Experimental features that may or may not work correctly. Do not expect them +# to have a consistent behaviour across releases. +[experimental] + # Calculate the dpi to use on a per-monitor basis. + # If this setting is enabled the Xft.dpi value will be ignored and instead + # dunst will attempt to calculate an appropriate dpi value for each monitor + # using the resolution and physical size. This might be useful in setups + # where there are multiple screens with very different dpi values. + per_monitor_dpi = false + +[urgency_low] + # IMPORTANT: colors have to be defined in quotation marks. + # Otherwise the "#" and following would be interpreted as a comment. + background = "#282828" + foreground = "#ebdbd2" + timeout = 5 + # Icon for notifications with low urgency, uncomment to enable + icon = /home/drk/.config/dunst/normal.png + +[urgency_normal] + background = "#282828" + foreground = "#ebdbd2" + timeout = 5 + # Icon for notifications with normal urgency, uncomment to enable + icon = /home/drk/.config/dunst/normal.png + +[urgency_critical] + background = "#900000" + foreground = "#ebdbd2" + frame_color = "#ff0000" + timeout = 5 + # Icon for notifications with critical urgency, uncomment to enable + icon = /home/drk/.config/dunst/critical.png + +# Every section that isn't one of the above is interpreted as a rules to +# override settings for certain messages. +# +# Messages can be matched by +# appname (discouraged, see desktop_entry) +# body +# category +# desktop_entry +# icon +# match_transient +# msg_urgency +# stack_tag +# summary +# +# and you can override the +# background +# foreground +# format +# frame_color +# fullscreen +# new_icon +# set_stack_tag +# set_transient +# timeout +# urgency +# +# Shell-like globbing will get expanded. +# +# Instead of the appname filter, it's recommended to use the desktop_entry filter. +# GLib based applications export their desktop-entry name. In comparison to the appname, +# the desktop-entry won't get localized. +# +# SCRIPTING +# You can specify a script that gets run when the rule matches by +# setting the "script" option. +# The script will be called as follows: +# script appname summary body icon urgency +# where urgency can be "LOW", "NORMAL" or "CRITICAL". +# +# NOTE: if you don't want a notification to be displayed, set the format +# to "". +# NOTE: It might be helpful to run dunst -print in a terminal in order +# to find fitting options for rules. + +# Disable the transient hint so that idle_threshold cannot be bypassed from the +# client +#[transient_disable] +# match_transient = yes +# set_transient = no +# +# Make the handling of transient notifications more strict by making them not +# be placed in history. +#[transient_history_ignore] +# match_transient = yes +# history_ignore = yes + +# fullscreen values +# show: show the notifications, regardless if there is a fullscreen window opened +# delay: displays the new notification, if there is no fullscreen window active +# If the notification is already drawn, it won't get undrawn. +# pushback: same as delay, but when switching into fullscreen, the notification will get +# withdrawn from screen again and will get delayed like a new notification +#[fullscreen_delay_everything] +# fullscreen = delay +#[fullscreen_show_critical] +# msg_urgency = critical +# fullscreen = show + +#[espeak] +# summary = "*" +# script = dunst_espeak.sh + +#[script-test] +# summary = "*script*" +# script = dunst_test.sh + +#[ignore] +# # This notification will not be displayed +# summary = "foobar" +# format = "" + +#[history-ignore] +# # This notification will not be saved in history +# summary = "foobar" +# history_ignore = yes + +#[skip-display] +# # This notification will not be displayed, but will be included in the history +# summary = "foobar" +# skip_display = yes + +#[signed_on] +# appname = Pidgin +# summary = "*signed on*" +# urgency = low +# +#[signed_off] +# appname = Pidgin +# summary = *signed off* +# urgency = low +# +#[says] +# appname = Pidgin +# summary = *says* +# urgency = critical +# +#[twitter] +# appname = Pidgin +# summary = *twitter.com* +# urgency = normal +# +#[stack-volumes] +# appname = "some_volume_notifiers" +# set_stack_tag = "volume" +# +# vim: ft=cfg diff --git a/config/.config/dunst/normal.png b/config/.config/dunst/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..505e12c93392262f693add945b7fdf9e671f7dd7 GIT binary patch literal 3895 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 literal 0 HcmV?d00001 diff --git a/source/dwm/autostart b/source/dwm/autostart index 73bbd2503..ae3baf373 100755 --- a/source/dwm/autostart +++ b/source/dwm/autostart @@ -10,7 +10,7 @@ pidof pipewire || pipewire & pidof polkit-gnome-authentication-agent-1 || /usr/libexec/polkit-gnome-authentication-agent-1 & pidof dwmblocks || dwmblocks & pidof unclutter || unclutter --hide-on-touch & -pidof tiramisu || herbed & +pidof dunst || dunst --config $HOME/.config/dunst/dunstrc & pidof picom || picom & gsettings set org.gnome.desktop.interface cursor-theme 'Simp1e-Gruvbox-Dark' diff --git a/source/herbe/LICENSE b/source/herbe/LICENSE deleted file mode 100644 index 7ad12289f..000000000 --- a/source/herbe/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -MIT License - -Copyright (c) 2020 Samuel Dudík -Copyright (c) 2020 Sweets - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/source/herbe/Makefile b/source/herbe/Makefile deleted file mode 100644 index feb0ab2b1..000000000 --- a/source/herbe/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -TARGETC = herbe -TARGETV = tiramisu -CFLAGS += -Wall -Wno-unused-value -Wextra -pedantic -lX11 -lXft -I/usr/include/freetype2 -pthread -IFLAGS = --pkg gio-2.0 -SRCC := herbe.c config.h -SRCV := src/notification.vala src/dbus.vala src/tiramisu.vala - -PREFIX ?= /usr/local -CC ?= cc -VALAC ?= valac -PKG_CONFIG ?= pkg-config - -all: $(TARGETC) - -$(TARGETC): $(SRCC) - $(CC) herbe.c $(CFLAGS) -o $(TARGETC) - -all: $(TARGETV) - -$(TARGETV): $(SRCV) - $(VALAC) $(IFLAGS) $(SRCV) -o $(TARGETV) - -install: $(TARGETC) $(TARGETV) - mkdir -p ${DESTDIR}${PREFIX}/bin - cp -f $(TARGETC) ${DESTDIR}${PREFIX}/bin - cp -f $(TARGETV) ${DESTDIR}${PREFIX}/bin - cp -f herbed ${DESTDIR}${PREFIX}/bin - -uninstall: - rm -f ${DESTDIR}${PREFIX}/bin/$(TARGETC) - rm -f ${DESTDIR}${PREFIX}/bin/$(TARGETV) - rm -f ${DESTDIR}${PREFIX}/bin/herbed - -clean: - rm -f $(TARGETC) - rm -f $(TARGETV) - -.PHONY: all install uninstall clean diff --git a/source/herbe/README-tiramisu.md b/source/herbe/README-tiramisu.md deleted file mode 100644 index 26a4e3931..000000000 --- a/source/herbe/README-tiramisu.md +++ /dev/null @@ -1,68 +0,0 @@ -

- tiramisu
- desktop notifications, the UNIX way -

- ---- - -tiramisu is a notification daemon for \*nix desktops that implement notifications using dbus. - -Unlike other daemons, tiramisu does not have any sort of window or pop-up, but rather sends all notifications to STDOUT. Doing so enables endless customization from the end-user. - ---- - -

- Crafted with ♡ -

- -- [anufrievroman/polytiramisu](https://github.com/anufrievroman/polytiramisu) - ---- - -

- Installation -

- -Tiramisu depends upon Vala, gio, and glib. - -|Distribution|Repository|Package name| -|-|-|-| -|Arch Linux|AUR|`tiramisu-git`| -|Alpine Linux|v3.15+|`tiramisu`| -|NixOS|stable|`nixos.tiramisu`| - -Don't see your distribution? Check to make sure it wasn't forgotten at [repology](https://repology.org/projects/?search=tiramisu). -Alternatively, build from source. - -```sh -$ git clone https://github.com/Sweets/tiramisu -$ cd ./tiramisu -$ make && make install -``` - ---- - -

- Usage -

- -By default, tiramisu outputs all information from a notification to standard output. You can change this with `-o`, or if you wish to use JSON format, `-j`. If you need the output format to be sanitized (quotes to be escaped), you can do so with `-s`. - -Using `-o` will interpolate your desired format. - -Appropriate keys are `#source`, `#icon`, `#id`, `#summary`, `#body`, `#actions`, `#hints`, and `#timeout`. - -Using `-j` implies `-s`. - -Below is an example of the default output of tiramisu with no flags. - -``` -evolution-mail-notification -evolution -0 -New email in Evolution -You have received 4 new messages. -desktop-entry=org.gnome.Evolution|urgency=1 -Show INBOX=default --1 -``` diff --git a/source/herbe/README.md b/source/herbe/README.md deleted file mode 100644 index 25eb20c8c..000000000 --- a/source/herbe/README.md +++ /dev/null @@ -1,139 +0,0 @@ -# 🌱 herbe -> Daemon-less notifications without D-Bus. Minimal and lightweight. - -

- -

- -## Features -* Under 200 lines of code -* Doesn't run in the background, just displays the notification and exits -* No external dependencies except Xlib and Xft -* Configurable through `config.h` or Xresources ([using this patch](https://github.com/dudik/herbe/pull/11)) -* [Actions support](#actions) -* Extensible through [patches](https://github.com/dudik/herbe/pulls?q=is%3Aopen+is%3Apr+label%3Apatch) - -## Table of contents - -* [Usage](#usage) - * [Patches](#patches) - * [Dismiss a notification](#dismiss-a-notification) - * [Actions](#actions) - * [Newlines](#newlines) - * [Multiple notifications](#multiple-notifications) - * [Notifications don't show up](#notifications-dont-show-up) -* [Installation](#installation) - * [Packages](#packages) - * [Dependencies](#dependencies) - * [Build](#build) -* [Configuration](#configuration) -* [Contribute](#contribute) - -## Usage - -### Patches -[List of available patches](https://github.com/dudik/herbe/pulls?q=is%3Aopen+is%3Apr+label%3Apatch) - -To create a new patch you'll have to open a pull request with your changes. Append `.diff` to the pull request URL to get a downloadable diff file. Don't forget to prefix the title with `patch:` and to apply the `patch` label to it. For inspiration, look at [my Xresources patch](https://github.com/dudik/herbe/pull/11). Thank you. - -_Note: This patching method was heavily inspired by [dylan's sowm](https://github.com/dylanaraps/sowm)._ - -### Dismiss a notification -A notification can be dismissed either by clicking on it with `DISMISS_BUTTON` (set in config.h, defaults to left mouse button) or sending a `SIGUSR1` signal to it: -```shell -$ pkill -SIGUSR1 herbe -``` -Dismissed notifications return exit code 2. - -### Actions -Action is a piece of shell code that runs when a notification gets accepted. Accepting a notification is the same as dismissing it, but you have to use either `ACTION_BUTTON` (defaults to right mouse button) or the `SIGUSR2` signal. -An accepted notification always returns exit code 0. To specify an action: -```shell -$ herbe "Notification body" && echo "This is an action" -``` -Where everything after `&&` is the action and will get executed after the notification gets accepted. - -### Newlines -Every command line argument gets printed on a separate line by default e.g.: -```shell -$ herbe "First line" "Second line" "Third line" ... -``` -You can also use `\n` e.g. in `bash`: -```shell -$ herbe $'First line\nSecond line\nThird line' -``` -But by default `herbe` prints `\n` literally: -```shell -$ herbe "First line\nStill the first line" -``` -Output of other programs will get printed correctly, just make sure to escape it (so you don't end up with every word on a separate line): -```shell -$ herbe "$(ps axch -o cmd:15,%cpu --sort=-%cpu | head)" -``` - -### Multiple notifications -Notifications are put in a queue and shown one after another in order of creation (first in, first out). They don't overlap and each one is shown for its entire duration. - -### Notifications don't show up -Most likely a running notification got terminated forcefully (SIGKILL or any uncaught signal) which caused the semaphore not getting unlocked. First, kill any `herbe` instance that is stuck: -```shell -$ pkill -SIGKILL herbe -``` -Then just call `herbe` without any arguments: -```shell -$ herbe -``` -Notifications should now show up as expected. - -Don't ever send any signals to `herbe` except these: -```shell -# same as pkill -SIGTERM herbe, terminates every running herbe process -$ pkill herbe - -$ pkill -SIGUSR1 herbe -$ pkill -SIGUSR2 herbe -``` -And you should be fine. That's all you really need to interact with `herbe`. - -## Installation -### Packages -[![Packaging status](https://repology.org/badge/vertical-allrepos/herbe.svg)](https://repology.org/project/herbe/versions) - -[OpenBSD patch](https://github.com/dudik/herbe/pull/4) - -[FreeBSD patch](https://github.com/dudik/herbe/pull/16) - -[Wayland port](https://github.com/muevoid/Wayherb) by [muevoid](https://github.com/muevoid) - -**Only the [herbe-git AUR package](https://aur.archlinux.org/packages/herbe-git/) is maintained by me.** - -### Dependencies -* X11 (Xlib) -* Xft - -The names of packages are different depending on which distribution you use. -For example, if you use [Void Linux](https://voidlinux.org/) you will have to install these dependencies: -```shell -sudo xbps-install base-devel libX11-devel libXft-devel -``` - -### Build -```shell -git clone https://github.com/dudik/herbe -cd herbe -sudo make install -``` -`make install` requires root privileges because it copies the resulting binary to `/usr/local/bin`. This makes `herbe` accessible globally. - -You can also use `make clean` to remove the binary from the build folder, `sudo make uninstall` to remove the binary from `/usr/local/bin` or just `make` to build the binary locally. - -## Configuration -herbe is configured at compile-time by editing `config.h`. Every option should be self-explanatory. There is no `height` option because height is determined by font size and text padding. - -[Xresources patch](https://github.com/dudik/herbe/pull/11) - -## Contribute -If you want to report a bug or you have a feature request, feel free to [open an issue](https://github.com/dudik/herbe/issues). - -## Projects with herbe integration -- [qutebrowser](https://qutebrowser.org/) supports showing web notifications via herbe, via the `content.notifications.presenter` setting. diff --git a/source/herbe/config.h b/source/herbe/config.h deleted file mode 100644 index ed63834ac..000000000 --- a/source/herbe/config.h +++ /dev/null @@ -1,19 +0,0 @@ -static const char *background_color = "#1d2021"; -static const char *border_color = "#cc241d"; -static const char *font_color = "#fbf1c7"; -static const char *font_pattern = "mononoki Nerd Font Mono:size=12"; -static const unsigned line_spacing = 5; -static const unsigned int padding = 10; - -static const unsigned int width = 400; -static const unsigned int border_size = 1; -static const unsigned int pos_x = 30; -static const unsigned int pos_y = 60; - -enum corners { TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT }; -enum corners corner = TOP_RIGHT; - -static unsigned int duration = 5; /* in seconds */ - -#define DISMISS_BUTTON Button1 -#define ACTION_BUTTON Button3 diff --git a/source/herbe/herbe.c b/source/herbe/herbe.c deleted file mode 100644 index 221a7f034..000000000 --- a/source/herbe/herbe.c +++ /dev/null @@ -1,258 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "config.h" - -#define EXIT_ACTION 0 -#define EXIT_FAIL 1 -#define EXIT_DISMISS 2 - -Display *display; -Window window; -int exit_code = EXIT_DISMISS; - -static void die(const char *format, ...) -{ - va_list ap; - va_start(ap, format); - vfprintf(stderr, format, ap); - fprintf(stderr, "\n"); - va_end(ap); - exit(EXIT_FAIL); -} - -int get_max_len(char *string, XftFont *font, int max_text_width) -{ - int eol = strlen(string); - XGlyphInfo info; - XftTextExtentsUtf8(display, font, (FcChar8 *)string, eol, &info); - - if (info.width > max_text_width) - { - eol = max_text_width / font->max_advance_width; - info.width = 0; - - while (info.width < max_text_width) - { - eol++; - XftTextExtentsUtf8(display, font, (FcChar8 *)string, eol, &info); - } - - eol--; - } - - for (int i = 0; i < eol; i++) - if (string[i] == '\n') - { - string[i] = ' '; - return ++i; - } - - if (info.width <= max_text_width) - return eol; - - int temp = eol; - - while (string[eol] != ' ' && eol) - --eol; - - if (eol == 0) - return temp; - else - return ++eol; -} - -void expire(int sig) -{ - XEvent event; - event.type = ButtonPress; - event.xbutton.button = (sig == SIGUSR2) ? (ACTION_BUTTON) : (DISMISS_BUTTON); - XSendEvent(display, window, 0, 0, &event); - XFlush(display); -} - -void read_y_offset(unsigned int **offset, int *id) { - int shm_id = shmget(8432, sizeof(unsigned int), IPC_CREAT | 0660); - if (shm_id == -1) die("shmget failed"); - - *offset = (unsigned int *)shmat(shm_id, 0, 0); - if (*offset == (unsigned int *)-1) die("shmat failed\n"); - *id = shm_id; -} - -void free_y_offset(int id) { - shmctl(id, IPC_RMID, NULL); -} - -int main(int argc, char *argv[]) -{ - if (argc == 1) - die("Usage: %s body", argv[0]); - - struct sigaction act_expire, act_ignore; - - act_expire.sa_handler = expire; - act_expire.sa_flags = SA_RESTART; - sigemptyset(&act_expire.sa_mask); - - act_ignore.sa_handler = SIG_IGN; - act_ignore.sa_flags = 0; - sigemptyset(&act_ignore.sa_mask); - - sigaction(SIGALRM, &act_expire, 0); - sigaction(SIGTERM, &act_expire, 0); - sigaction(SIGINT, &act_expire, 0); - - sigaction(SIGUSR1, &act_ignore, 0); - sigaction(SIGUSR2, &act_ignore, 0); - - int opt; - while ((opt = getopt(argc, argv, "d:")) != -1) - { - switch (opt) - { - case 'd': - duration = atoi(optarg); // Parse the duration from the command line - break; - default: - die("Usage: %s [-d duration] body", argv[0]); - } - } - - if (optind >= argc) - { - die("Usage: %s [-d duration] body", argv[0]); - } - - if (!(display = XOpenDisplay(0))) - { - die("Cannot open display"); - } - - int screen = DefaultScreen(display); - Visual *visual = DefaultVisual(display, screen); - Colormap colormap = DefaultColormap(display, screen); - - int screen_width = DisplayWidth(display, screen); - int screen_height = DisplayHeight(display, screen); - - XSetWindowAttributes attributes; - attributes.override_redirect = True; - XftColor color; - XftColorAllocName(display, visual, colormap, background_color, &color); - attributes.background_pixel = color.pixel; - XftColorAllocName(display, visual, colormap, border_color, &color); - attributes.border_pixel = color.pixel; - - int num_of_lines = 0; - int max_text_width = width - 2 * padding; - int lines_size = 5; - char **lines = malloc(lines_size * sizeof(char *)); - if (!lines) - die("malloc failed"); - - XftFont *font = XftFontOpenName(display, screen, font_pattern); - - for (int i = optind; i < argc; i++) - { - for (unsigned int eol = get_max_len(argv[i], font, max_text_width); eol; argv[i] += eol, num_of_lines++, eol = get_max_len(argv[i], font, max_text_width)) - { - if (lines_size <= num_of_lines) - { - lines = realloc(lines, (lines_size += 5) * sizeof(char *)); - if (!lines) - die("realloc failed"); - } - - lines[num_of_lines] = malloc((eol + 1) * sizeof(char)); - if (!lines[num_of_lines]) - die("malloc failed"); - - strncpy(lines[num_of_lines], argv[i], eol); - lines[num_of_lines][eol] = '\0'; - } - } - - int y_offset_id; - unsigned int *y_offset; - read_y_offset(&y_offset, &y_offset_id); - - unsigned int text_height = font->ascent - font->descent; - unsigned int height = (num_of_lines - 1) * line_spacing + num_of_lines * text_height + 2 * padding; - unsigned int x = pos_x; - unsigned int y = pos_y + *y_offset; - - unsigned int used_y_offset = (*y_offset) += height + padding; - - if (corner == TOP_RIGHT || corner == BOTTOM_RIGHT) - x = screen_width - width - border_size * 2 - x; - - if (corner == BOTTOM_LEFT || corner == BOTTOM_RIGHT) - y = screen_height - height - border_size * 2 - y; - - window = XCreateWindow(display, RootWindow(display, screen), x, y, width, height, border_size, DefaultDepth(display, screen), - CopyFromParent, visual, CWOverrideRedirect | CWBackPixel | CWBorderPixel, &attributes); - - XftDraw *draw = XftDrawCreate(display, window, visual, colormap); - XftColorAllocName(display, visual, colormap, font_color, &color); - - XClassHint classhint = { "herbe", "herbe" }; - XSetClassHint(display, window, &classhint); - - XSelectInput(display, window, ExposureMask | ButtonPress); - XMapWindow(display, window); - - sigaction(SIGUSR1, &act_expire, 0); - sigaction(SIGUSR2, &act_expire, 0); - - if (duration > 0) - { - alarm(duration); - } - - for (;;) - { - XEvent event; - XNextEvent(display, &event); - - if (event.type == Expose) - { - XClearWindow(display, window); - for (int i = 0; i < num_of_lines; i++) - XftDrawStringUtf8(draw, &color, font, padding, line_spacing * i + text_height * (i + 1) + padding, - (FcChar8 *)lines[i], strlen(lines[i])); - } - else if (event.type == ButtonPress) - { - if (event.xbutton.button == DISMISS_BUTTON) - break; - else if (event.xbutton.button == ACTION_BUTTON) - { - exit_code = EXIT_ACTION; - break; - } - } - } - - - for (int i = 0; i < num_of_lines; i++) - free(lines[i]); - - if (used_y_offset == *y_offset) free_y_offset(y_offset_id); - free(lines); - XftDrawDestroy(draw); - XftColorFree(display, visual, colormap, &color); - XftFontClose(display, font); - XCloseDisplay(display); - - return exit_code; -} diff --git a/source/herbe/herbed b/source/herbe/herbed deleted file mode 100755 index 4b2291231..000000000 --- a/source/herbe/herbed +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -#thanks to anufrievroman for style (https://github.com/anufrievroman/polytiramisu/blob/9c0a039d8cd8b7066bccbbd237cd8939da66e1fb/polytiramisu.sh#L18) -tiramisu -o "#source;#summary;#body;#timeout" | while read line -do - source=$(cut -d ';' -f 1 <<< "$line") - summary=$(cut -d ';' -f 2 <<< "$line") - body=$(cut -d ';' -f 3 <<< "$line") - timeout=$(expr $(cut -d ';' -f 4 <<< "$line") / 1000) - if [ "$timeout" -lt 1 ]; then - timeout=5 - fi - herbe "$summary" " " "$body" -d "$timeout" -done diff --git a/source/herbe/patches/herbe-vertical-stacking.diff b/source/herbe/patches/herbe-vertical-stacking.diff deleted file mode 100644 index 2ece3fbd7..000000000 --- a/source/herbe/patches/herbe-vertical-stacking.diff +++ /dev/null @@ -1,100 +0,0 @@ -diff --git a/herbe.c b/herbe.c -index 51d3990..8bfdbc1 100644 ---- a/herbe.c -+++ b/herbe.c -@@ -7,7 +7,8 @@ - #include - #include - #include --#include -+#include -+#include - - #include "config.h" - -@@ -79,13 +80,23 @@ void expire(int sig) - XFlush(display); - } - -+void read_y_offset(unsigned int **offset, int *id) { -+ int shm_id = shmget(8432, sizeof(unsigned int), IPC_CREAT | 0660); -+ if (shm_id == -1) die("shmget failed"); -+ -+ *offset = (unsigned int *)shmat(shm_id, 0, 0); -+ if (*offset == (unsigned int *)-1) die("shmat failed\n"); -+ *id = shm_id; -+} -+ -+void free_y_offset(int id) { -+ shmctl(id, IPC_RMID, NULL); -+} -+ - int main(int argc, char *argv[]) - { - if (argc == 1) -- { -- sem_unlink("/herbe"); -- die("Usage: %s body", argv[0]); -- } -+ die("Usage: %s body", argv[0]); - - struct sigaction act_expire, act_ignore; - -@@ -151,16 +162,22 @@ int main(int argc, char *argv[]) - } - } - -- unsigned int x = pos_x; -- unsigned int y = pos_y; -+ int y_offset_id; -+ unsigned int *y_offset; -+ read_y_offset(&y_offset, &y_offset_id); -+ - unsigned int text_height = font->ascent - font->descent; - unsigned int height = (num_of_lines - 1) * line_spacing + num_of_lines * text_height + 2 * padding; -+ unsigned int x = pos_x; -+ unsigned int y = pos_y + *y_offset; -+ -+ unsigned int used_y_offset = (*y_offset) += height + padding; - - if (corner == TOP_RIGHT || corner == BOTTOM_RIGHT) -- x = screen_width - width - border_size * 2 - pos_x; -+ x = screen_width - width - border_size * 2 - x; - - if (corner == BOTTOM_LEFT || corner == BOTTOM_RIGHT) -- y = screen_height - height - border_size * 2 - pos_y; -+ y = screen_height - height - border_size * 2 - y; - - window = XCreateWindow(display, RootWindow(display, screen), x, y, width, height, border_size, DefaultDepth(display, screen), - CopyFromParent, visual, CWOverrideRedirect | CWBackPixel | CWBorderPixel, &attributes); -@@ -171,9 +188,6 @@ int main(int argc, char *argv[]) - XSelectInput(display, window, ExposureMask | ButtonPress); - XMapWindow(display, window); - -- sem_t *mutex = sem_open("/herbe", O_CREAT, 0644, 1); -- sem_wait(mutex); -- - sigaction(SIGUSR1, &act_expire, 0); - sigaction(SIGUSR2, &act_expire, 0); - -@@ -204,12 +218,11 @@ int main(int argc, char *argv[]) - } - } - -- sem_post(mutex); -- sem_close(mutex); - - for (int i = 0; i < num_of_lines; i++) - free(lines[i]); - -+ if (used_y_offset == *y_offset) free_y_offset(y_offset_id); - free(lines); - XftDrawDestroy(draw); - XftColorFree(display, visual, colormap, &color); -@@ -217,4 +230,4 @@ int main(int argc, char *argv[]) - XCloseDisplay(display); - - return exit_code; --} -\ No newline at end of file -+} diff --git a/source/herbe/patches/herbe-wm-class.diff b/source/herbe/patches/herbe-wm-class.diff deleted file mode 100644 index f7fd92173..000000000 --- a/source/herbe/patches/herbe-wm-class.diff +++ /dev/null @@ -1,21 +0,0 @@ -diff --git a/herbe.c b/herbe.c -index 51d3990..fd66078 100644 ---- a/herbe.c -+++ b/herbe.c -@@ -168,6 +168,9 @@ int main(int argc, char *argv[]) - XftDraw *draw = XftDrawCreate(display, window, visual, colormap); - XftColorAllocName(display, visual, colormap, font_color, &color); - -+ XClassHint classhint = { "herbe", "herbe" }; -+ XSetClassHint(display, window, &classhint); -+ - XSelectInput(display, window, ExposureMask | ButtonPress); - XMapWindow(display, window); - -@@ -217,4 +220,4 @@ int main(int argc, char *argv[]) - XCloseDisplay(display); - - return exit_code; --} -\ No newline at end of file -+} diff --git a/source/herbe/src/dbus.vala b/source/herbe/src/dbus.vala deleted file mode 100644 index 6fa0f8053..000000000 --- a/source/herbe/src/dbus.vala +++ /dev/null @@ -1,49 +0,0 @@ -[DBus (name = "org.freedesktop.Notifications")] -public class NotificationDaemon : Object { - public static uint notification_id = 1; - - [DBus (name = "GetServerInformation")] - public void get_server_information(out string name, - out string vendor, out string version, out string spec_version) - throws DBusError, IOError { - name = "tiramisu"; - vendor = "Sweets"; - version = "2.0"; - spec_version = "1.2"; - } - - [DBus (name = "GetCapabilities")] - public string[] get_capabilities() throws DBusError, IOError { - return {"body", "actions", "icon-static"}; - } - - [DBus (name = "Notify")] - public uint Notify(string app_name, uint replaces_id, string app_icon, - string summary, string body, string[] actions, - GLib.HashTable hints, - int expire_timeout) throws DBusError, IOError { - - Notification.output(app_name, replaces_id, app_icon, summary, - body, actions, hints, expire_timeout); - - if (replaces_id == 0) - return notification_id++; - - return replaces_id; - } - - [DBus (name = "CloseNotification")] - public void close_notification(uint id) throws DBusError, IOError { - // close notification - } - - [DBus (name = "NotificationClosed")] - public void notification_closed(uint id, - uint reason) throws DBusError, IOError { - // notification was closed - } - - - // action_invoked -} - diff --git a/source/herbe/src/notification.vala b/source/herbe/src/notification.vala deleted file mode 100644 index d69e35136..000000000 --- a/source/herbe/src/notification.vala +++ /dev/null @@ -1,144 +0,0 @@ -string sanitize(string subj) { - return subj - .replace("\"", "\\\"") - .replace("\r", "\\r") - .replace("\n", "\\n"); // ideally all control sequences \u0000 to \u001f -} - -public class Notification : Object { - public static string image_get_base64_representation(GLib.Variant image) { - uint width = 0, height = 0, row_stride = 0, bits_per_sample = 0, - channels = 0; - bool alpha = false; - - uint8[] pixels = {}; - GLib.Variant pixel_data = null; - - image.get("(iiibii@ay)", - out width, out height, out row_stride, out alpha, - out bits_per_sample, out channels, out pixel_data); - - pixels = pixel_data.get_data_as_bytes().get_data(); - string encoded_image = GLib.Base64.encode((uchar[])pixels); - - return "".concat(@"$(width):$(height):$(row_stride):", - @"$(alpha):$(bits_per_sample):$(channels):", encoded_image); - } - - public static string create_hint_json_string( - GLib.HashTable hints) { - // Only if Tiramisu.json is true. Implies Tiramisu.sanitize. - - string output = ""; - string buffer = ""; - string separator = ""; - - GLib.VariantType image_type = new GLib.VariantType("(iiibiiay)"); - - hints.foreach((key, value) => { - string _key = key; - string _value = ""; - - _key = sanitize(_key); - buffer = buffer.concat(separator, @"\"$(_key)\": "); - - if (value.is_of_type(GLib.VariantType.STRING)) { - _value = value.print(false); - _value = _value.substring(1, _value.length - 2); - _value = sanitize(_value); - _value = @"\"$(_value)\""; - } else if (value.is_of_type(image_type)) { - _value = @"\"$(image_get_base64_representation(value))\""; - } else { - _value = @"\"$(value.print(false))\""; - } - - buffer = buffer.concat(@"$(_value)"); - output = output.concat(buffer); - - buffer = ""; - separator = ", "; - }); - - return @"{$(output)}"; - } - - public static string create_hint_csv_string( - GLib.HashTable hints) { - - string output = ""; - string buffer = ""; - string separator = ""; - - GLib.VariantType image_type = new GLib.VariantType("(iiibiiay)"); - - hints.foreach((key, value) => { - string _key = key; - string _value = ""; - - if (value.is_of_type(GLib.VariantType.STRING)) { - _value = value.print(false); - _value = _value.substring(1, _value.length - 2); - _value = sanitize(_value); - _value = @"'$(_value)'"; - } else if (value.is_of_type(image_type)) { - _value = image_get_base64_representation(value); - } else { - _value = value.print(false); - } - - if (Tiramisu.sanitize) { - _key = sanitize(_key); - _value = sanitize(_value); - } - - buffer = buffer.concat(separator, @"$(_key)=$(_value)"); - output = output.concat(buffer); - - buffer = ""; - separator = ","; - }); - - return output; - } - - public static void output(string source, uint replaces_id, string icon, - string summary, string body, string[] actions, - GLib.HashTable hints, int timeout) { - - string app_name = source; - string app_icon = icon; - string _summary = summary; - string _body = body; - - string hint_string = ""; - string fmt = Tiramisu.format; - - if (Tiramisu.json) { - fmt = Tiramisu.json_format; - hint_string = create_hint_json_string(hints); - } else { - hint_string = create_hint_csv_string(hints); - } - - if (Tiramisu.sanitize) { - app_name = sanitize(app_name); - app_icon = sanitize(app_icon); - _summary = sanitize(_summary); - _body = sanitize(_body); - } - - fmt = fmt - .replace("#source", app_name) - .replace("#id", replaces_id.to_string()) - .replace("#icon", app_icon) - .replace("#summary", _summary) - .replace("#body", _body) - .replace("#actions", string.joinv(",", actions)) - .replace("#hints", hint_string) - .replace("#timeout", timeout.to_string()); - - stdout.printf(fmt + "\n"); - stdout.flush(); - } -} diff --git a/source/herbe/src/tiramisu.vala b/source/herbe/src/tiramisu.vala deleted file mode 100644 index dc82b5199..000000000 --- a/source/herbe/src/tiramisu.vala +++ /dev/null @@ -1,56 +0,0 @@ -public class Tiramisu : Application { - public static string format = "#source\n#icon\n#id\n#summary\n" + - "#body\n#actions\n#hints\n#timeout"; - public static string json_format = "{\"source\": \"#source\", " + - "\"id\": #id, \"summary\": \"#summary\", \"body\": \"#body\", " + - "\"icon\": \"#icon\", \"actions\": \"#actions\", \"hints\": #hints, " + - "\"timeout\": #timeout}"; - - public static bool sanitize = false; - public static bool json = false; - - private const OptionEntry[] options = { - {"format", 'o', OptionFlags.NONE, OptionArg.STRING, ref format, - "Output format specifier", "FORMAT"}, - - {"json", 'j', OptionFlags.NONE, OptionArg.NONE, ref json, - "Output using JSON (implies --sanitize)", null}, - - {"sanitize", 's', OptionFlags.NONE, OptionArg.NONE, ref sanitize, - "Sanitize output; escapes quotes", null}, - {null} - }; - - private Tiramisu() { - this.add_main_option_entries(options); - } - - public override void activate() { - this.hold(); - - if (json) - sanitize = true; - - Bus.own_name(BusType.SESSION, "org.freedesktop.Notifications", - BusNameOwnerFlags.DO_NOT_QUEUE, - (connection) => { - try { - connection.register_object("/org/freedesktop/Notifications", - new NotificationDaemon()); - } catch (IOError _error) { - error("Unable to register object path."); - } - }, // Bus acquired - () => { - }, // Name acquired - () => { - error("Unable to acquired DBus name."); - } // Unable to acquire - ); - } - - public static int main(string[] arguments) { - Tiramisu tiramisu = new Tiramisu(); - return tiramisu.run(arguments); - } -}