From d9619dd7700bddb83c954653c1cf631c004e7548 Mon Sep 17 00:00:00 2001 From: Mitchell Livingston Date: Sun, 4 Nov 2007 00:53:51 +0000 Subject: [PATCH] remove old growl 1.1.1 --- macosx/Growl.framework/Growl | 1 - macosx/Growl.framework/Headers | 1 - macosx/Growl.framework/Resources | 1 - macosx/Growl.framework/Versions/A/Growl | Bin 134672 -> 0 bytes .../Versions/A/Headers/Growl.h | 6 - .../A/Headers/GrowlApplicationBridge-Carbon.h | 780 ------------------ .../A/Headers/GrowlApplicationBridge.h | 609 -------------- .../Versions/A/Headers/GrowlDefines.h | 348 -------- .../Versions/A/Resources/Info.plist | 24 - macosx/Growl.framework/Versions/Current | 1 - 10 files changed, 1771 deletions(-) delete mode 120000 macosx/Growl.framework/Growl delete mode 120000 macosx/Growl.framework/Headers delete mode 120000 macosx/Growl.framework/Resources delete mode 100755 macosx/Growl.framework/Versions/A/Growl delete mode 100644 macosx/Growl.framework/Versions/A/Headers/Growl.h delete mode 100644 macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge-Carbon.h delete mode 100644 macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h delete mode 100644 macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h delete mode 100644 macosx/Growl.framework/Versions/A/Resources/Info.plist delete mode 120000 macosx/Growl.framework/Versions/Current diff --git a/macosx/Growl.framework/Growl b/macosx/Growl.framework/Growl deleted file mode 120000 index 85956e2d2..000000000 --- a/macosx/Growl.framework/Growl +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Growl \ No newline at end of file diff --git a/macosx/Growl.framework/Headers b/macosx/Growl.framework/Headers deleted file mode 120000 index a177d2a6b..000000000 --- a/macosx/Growl.framework/Headers +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Headers \ No newline at end of file diff --git a/macosx/Growl.framework/Resources b/macosx/Growl.framework/Resources deleted file mode 120000 index 953ee36f3..000000000 --- a/macosx/Growl.framework/Resources +++ /dev/null @@ -1 +0,0 @@ -Versions/Current/Resources \ No newline at end of file diff --git a/macosx/Growl.framework/Versions/A/Growl b/macosx/Growl.framework/Versions/A/Growl deleted file mode 100755 index 1330c78f91474f50a0a8d6ed7eb554e2908bc28e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134672 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

S_CfaSd6o7w{V+MLZ8i`ulp`qi=^-e~o|V;0B+? zeG^JlH|3n5az2A!L*;Byj@rv+JdL6$o}PyTjskp=uI+8xNoW4+-` zipnPWRq#~A@rEvTK^J#8Y=!9HrHhR(qSCA_i^5{dXL9|)-f|y!wrD%pH>ZuHZfah& zFTJRP?Q8wyemZ)V*5y@~>HRv1==*{cMd=K zqr-i*AD!-N{CPs3_4A2+?LW`$>-f2^uk+`veO*7_*0=lThx_*a{B+;`k8y7C@x;EP zALl|ZeSIfCZtd&&cw65Y>Zq-kl=Zuy_b%xD6!d-ydOrodpMu^`LGP!a_fydODd@ci zdhdbWd!Y9o=)DJe?|~lW;T&Ik{PdbpF=E%82jMqkTpxcXJBQyUv%g0cC*L(pe&W#i zx1AX#|JX43dxy#2JWPJ$F!`&7$@dJCKWUi!q@nX~Jv&VP@nQ1!4U^wFOn&n)`DMf8 z=MR&gF-(5)(D^gY4U@0Gtv9&-&e%Up{Vl`fTf^j+50md5CO>nS{FI^dv(68be{z`o z1HJa#$obT4U_K~CV$c}`AI|P-*R@C{Nuyq z?;9q+bC~?*Ve-p{$@CAbbeD%CEe#SkOp^9aJwUxLMMSt}@ zztYc-zvHXuW4arFbHl6s-uaz4|Q<`8NYm8fVa^2L&Y_B z2Ab+;sXwGH<+U31|83MQ=H|M^|e7?lW4HkO=wg3&Kuf zT2rp9fIH( z>kG8AlF2Y42^Dz)L)#&RiRo}4M6e+GLs4fpQvh84?dM&OMieGm@V<=F~ zdqhw-miBU;pk=oPjGL<&mIZ1tSHI0F~K)G(C0u7^vX$lvXNL!>mg!ziivrUt# zt*gQPBlRThEW>!DOl5T?CRwPWfWpSFE>KnTaNsW8Srmftm_?pLK3tV!QfH~vdX{sb zaN$M7pp%ML)ap?EU2C*rfFAFC0i9)m`kID1e_&S4n&PHfScobRG}dBJdm`33vMvPH z6#1$HQt3;LQF$O(`7p+-3d=+#Ob!(kKa7)fWsUR@2kHe27shHrmASiSeobu?Y{8wC z)#Z1sna@j{B4cDr2;(Z3JH_%9YZ+{L8wTogtIKWsY~+q12gkFjX%=dX%3)0EF&)b5 zi))s{cKSm#nEo~$aKNdhF#Br!l(!l4f{3MXr18ckUwQdmtEG{8n_9otplc0i0(rjr z0NUozbBs*9Jg~;s5Dd-7dCoAYJS#BmjX)js6*o@yenucJxPF@{wl?O0pRh89x-7AD8b}bILme-)}@`km(y4kJ* zS8kPSCFZbeNuY9V#p;^6iE6TE>g4jNi<4URK{k`r3G4UOI|p zIPef0Jy$_KO~*}>JvYHn!qLS_#F@(JVp9NL%%3tFb|SJ#a@DMH8ULr>5W~MQZXm?2 z=ELb(?epVlByh7uQnaCK^~HiLSqq0TIH+#UkF0=e;M-}waIIf$4KMXWr|Pt;)#RcJ zo5@@dgkR+H_g{Lasp)8c8p2>Q{c`gtRO4E)tPrCUod?sRy&a6UPA@Hr*|C5}9?Q5M zflrPBTC$?Bu;0owIIly}Gpj*$4F*bVG{&~F+7(!{2C{OY2ez%QcCG-%37P5&fSW)a zmdX&7Mo473U}NaH#BaI3^N7aaT>4-r|0sDx_=n}Qz0;_Nw1#&RvO82zn?35*&}}Ub zgd&sFi2aXg2F?1h&zRp(R|nTxd{?eIWN7|E!$NsEOfhcAg!>m!-L;S=%nDsy(-qqj z#yP3AgVQ1o!NtD$;o zb*QG67nG8p`zF`l&s^l)5t~;n%B%CLp|T_p?F0P*IZ_-{h*5*gF{?xkuwADoJY+@+ z%K~e7cEY_gw=MlRhr~o)e_~tG5YAK3;zD0lWw0rxA+`fc9SWc;c}tIpjssL#tdcD_VX2^UZ1##^;06c@u%=m&8dSmBx=TColLK|AZd&E zWmx%BWf2{8X?)>wjItj10b(-C>zCmQFYM;c*W!tc%Zlnse@!{gw5t8Is6}}gw}5WU znd6*;v-K)L*KYnojF6$H^^Yt=zwXb0rHP8r&+Fr%j1i{ z!D6t|HM}_Od4;2t2jd%_qP)9sI>~%3-V8a*a!szE(yuX*2Mq5}v@qG{WZ|GC?8jDg)C=1@^y0ZyZ^{&2AB^#pO+E%K!OA#!6*40RbK4|J5i z1g$?^mi_r~@~RDee~CJ5Cfu{g(VvW6d;=8Oa`+LiA z*mEH~EYyeW{SJ%p%z@>>lG%^gdk#D9Xw97aL<{h_KHe#)bQhTS1n?3-B<`Pahmz)& z8?qmA@_=MPBMw(>LX}Y&k*I!-qn}8EpL)AHTm+&G`|9d^`th)XQTSWc zRHFI^D{J#{+=63katj&@9%}Ff@rWtneX8c%2N@F_|&+7@NA1iQarAW{r* zdES#tfiPd<*t(N$5e{~6xKr(i`d8y2PgJ+-m6-|kswmj77AmF|EL(QhvRP*RVNdvI zNIzfk)#FtYZ9pTc;L2*8+-MF1a306AXr7xrSY7i7&cfjAM+=4+t*nndogTP3;xUu+ zj2Mq+^fZ~SO$+j(yknmqY%tFTSYk=`WX zxZh+s)~$Fooo5o-ykY&ub0(Lr@2bENJx=`enlib;wYn*UgL!PvOl~<_&d~qMdG3_R zR=y}yS6t)e3BPk))#tsDHDfq_@BpRr)YYse67gL$vXnTLv!=_`K#ivuI@pzC~( zgCqEb90^;5Rwqr+~{?>ijc^k8$Mp0>3;OuVdL1M?4+)m5z88@M|4$FK}o1 zRfwlK@*9DtI^rF`zv77R06xwU?*{IP#_JP-U*(9Cwu7JgOvD}S)svsGj`BP{PIkoU zL*TD2`J+5SfjINGAU=}0lHUa+fia0w-t%?T)F=OoqVb2xkG6TH z{BZJonEW(2>VE<}HyVE=19+7q-UIeJhh}SXh)VCOYtY@BMzWu@Wp%L{R^P#Q-ap(N^BA$YPANvzK-|MKa4*S4Ar&mi@ z+LUkV1ae46b^S+6fOE|7BfUqD0P*Xnjz4q?c#vtddih(%R&u7TLgWqQ? z#2xgX*@*aD1pIV;j`wpqs^c410pH+=_W*b3$Fq|VPmJb2n+cpcj34PeTLC0lM@_sD zxPzZ(+YwKR=EwR+&u&3pVYk}c+pS(q0<7p(-%3NsKyV{?5lRr4-iR`107>)W@1g`Q zO5mad{$G>8$Zl2B)2-GX=vLL|0FNN9p$KABw|Wlta&1w!x_2LN*vx0o0#5?oVepdu z!1o{|cB_&!K+t$@Qny+`TE`KNB6N4FN|dVsjS9po+7Z$b2aTFALM=iCLJ86d^AR$D z!X$`QN>ISAPZXrEVrRwZ_;;8}!I2>U?446qXcb%Lu9 ziV-{ru5R@pczp0=w|Ww7=>CBQ&^RTEGkh@YtS>c1{4MBb+hqw==%a@IYC!-yD;6 zv`5~b-(tq{`7rPh0@JdQhPIvu-RBws)1v%7*Ne2X2%z;4`uh<2SBtb-q}856IF4`t z0d3UoM%avyiqMYGh=6*!9O6$S?`gEl@=u2VSr;;Set)-m#cl9f@wN1xN&JX`Qx@eb zO!+72-|&}!0N!@(L!eI#`Qa0s@oHuK;y4B>P&|Bu^bgN0H%=}sF z?N&EVGWyK)8^XW~O_>`|mUEEl6Cp3oRnC8x1st@9PdI{klL#DiCScq+ADKR$IO(kF zR%0&!m%3xm0>?PA{8*IZykq&aEx>zCdK%>O0O@2P9q@r1;6dOiW{$0G1P=K=06y5S zYrBB6pGdzJbRIZh>RxjW_%Xrv0Pg_~T34aX2iO+seQ1D!lRoNx9sF>96Zd9we4#tqKkimtjOriimD{*L`uHg*TMRu)0`82b z#l$mW;+j6vwAOd4?YlJ|ji2lve}(kzUjo`YB@y5|_t_bMmvpNqPNFZ6xoUyQBxv_ep}6qmQY;8@tuQv%o3ORlwPAtXWTVBXj~!H1(e#&q=0@C&)uG z?8XkrV;|&}j=24E;&$3acu@iuC2&y!7bS2}0v9E4Q3C%DNuUFLP4IkQb--V`A_EXU zq=xXlG)xl+|4YZ=A8QCdO~VXa$3k4PlEEZTI5Wb%- zS0=DrV1>Y-z*>PJf$$%7y=H-yz_7q}fg1&O2;3~NQ{WbXT>^Iq+%0gAz`X+Z3EVI6 zfWU5nM+6=fcue4NfhPo>6nIKtkHAj^o)LIf;5mWk1@;QOVBjVtFi~KVz+{0b0#gO1 z2}~F05;#dkHB*Vep3ld5$F<_CD0?VNMM=3T7j0p4uM?)_X_M5cwAtQz;gz^ zpaiA}bP3E7=n+^XuuNdBKuchUz%GG%1$GNOF0e=7IRiH=Ag*Kt8(Uc)ge+&?PWSAo6s6k-##6wE``H9Rj-q?iJWA@VLMp zf#(eTmJ*mE&?PWSphsYlz%qfg0xf|Z0=oq671%BCxWFEP=M4O|5||>;B``~%M_`e_ zGJ&-MErA^Zy9DkP*e&q5z#f6;4CI!Y^6g9!=n|ME5P3SkNMM=3T7j0p4uM?)_X_M5 zcwAtQz;gz^qy(l2bP3E7=n+^XuuNdBKuchUz%GG%1$GNOF0e=7IRn3=1f~dd3Ct4c z5m+R!Okk}*OJIkFJSXtHz+QnD4CJd$ zr1RZG1G@k@UR_B7@oZJcQv{|8OcOXsV1~d<`Uj|=CGl*5Zb{FPILc_c`I7FHc%i@| zNiUXoiNIBoUMBH!ffWLS0&4|^1U3q67HA0!3v3s-QDBF_%>p|GZV}ieaEHL%0`~~q zD{!B{{Q?gN>=t-L;8B6c1RfW7Lf}b(rv&y0{6ydxfoBDt6L?-=ufPiiZc_pi1ttkh z7MLP1RbZOHbb&5`lLTf6%oLamfi8iQ1ZD`# z6qqG2TcBHDjzEvVe1Tqpg#wEN77Hv9xJqD|z;b~V0)ql;1%?DR3Tzf=2@DHt7r0Si zhrrDOI|XhL*d=g>z}(GZH^5@SLQdmw2y0^ow*LCe81TM1kn1PM3b}NRjkZNl%k_xjME^NoccK5BN4shTh9n*R*Xh##U6!PWC0+Wz3;ox0 zIwXCwK=fayqyL&tm%ts8zFXpuhtA(C=^~e12PFN7z@q|>3p^q4l)xT=pBVX$`PKCa ze0Iv;nBN+l=K+^rez{KPv)#*Q8T>0Q;Hw4C1pbeLLl##oHuzO&?}~K>zXm*Cv0LzS zz&|kfwdiZg7{R-M&og)$cu09z@D$*$3Z4%9jNoYZ%E^L*&Xqock1YcJEy2$M|ApWe zVCQc$_;|?tD~}p{0`Wb9Lv~;3Gq}rw9^7s4iTi**Yw#Pu!&Pqy9tQqD4SwS!yw-Y^ z!6%&po@4OI7>CrS44#28PW`dLr$e@>9~pcG>Rz2}@UQg%zuDmKV&Dr6o*M$b!i-BE z)2jpr{j0+UpI-=ki{RbBUo&`qGVpf|z90+uCx#}U4PP@!aLDSKIR;`}gS(Hy#!WQ% z%)P+xHTbl0;4c{b7RVvtl)*E01OGRJXP?KPk&KY?LEu*zd}ayoOoPwe0=(AXyiR*W zyTNB41O7uP1AayvGx$8#{b#|;fPZfAj3cn6X@d6v&lwYW6>8+&4m{+*zv;l=cHlh@ zyl;%MC7O7H1D_o&lX#y4w;cG(4*ZA%|7Qo@8^uRm>%j9J_&3I=(HJHEM%6j+Cmi^T z4*ahj_yGrg!h!!LivLBT15b6}ZU?^7f!8|lXB_x;2mXcwf7gM3?7+`Q@k^2%xXXb< z&UW7~xz~X^c(~+ANBUL={fZ!OfLPKF)Bgy_EPA7l8yh&fuDBZkX5A2g(!a6Wl=hp-RQt?bKv09u6tRr z1Ha!<26M;e=d#BgcxQC3T?V-&3ZIv~cAmSyUZBso0K0jF-m{Tlrd_Q@G~aYfkVe4 z=~WIK^DB~$@r~d=bl``h_@+*!J}AQTE35???iYx)M8{7GJR`8zz;7lAOcR(P&@Ip_ zutZ>mz(#@X0y_on7Pw#FQGq7~o)Oq<;0s9t(*$M+bPMzfED=~Cuu)*Uz)pd?1@0Gk zRNzU0X9V^dxH(B+n!pT!Zh>BbB?2o1HVSMP*eP(g!2JS`3Op(BjKE$4UrZ91CNM*w zTcB59iNFehjRM;Rb_(1raKFH#0#6D&Be2)NZzTy#6PO{;Ezm2lL|}!$MuF`DI|c3* zxL@E=fhPr?5!h?sx03{>3Cs}a7U&gNBCtYWqri57odS0Y+%NE`z>@;c2<$bmGf7~Y zzzl(IfnI?n0xJYI3TzkHDR8&I{Q{2)JSp&uz+MAiN)nhRFhihQpjTjtzzTtl0^0?4 z3fwJlzrdpcPYOIEu-CxvBneCtm?6+D&?~S+V1>X&f$ai21@0EOU*J&#_22rn!7zpq z9!Gcr;YkG4S5F~4jqnV@MucY(og18R3@*JqV`}{srMz2%jK)im(CU zqOAXGWc?9j{ZoX0LO6x+F~ZLg{y&712=^iIx5@x@zrb$@l)oWXWfJ!ZTrJQquv}n3 z;2MEz1y%^G6!?I^2L%QN%HJsC4};9FMqsUhW2j@~`5H;*oaE2$2j^eR@4gY}9>Vyo9wCI#fbcNF zBM6NMO$d)7JciJWunu88LJNY0(2B4j0aF1XjPN+Z69`Wtv?Dx)@HE0R2pbWeMR*S3 zc?8^Mt~Mcj6X6Af%?K|dd<)^*2%QKoA$$kny9iqlwj#WY@I8bsgl!1h5ne&qfv^){ z7s6j6>_+%L!e1f$HNqZ*A0Ye?;lCm5MR*nAM+kp|un*xigug}j?+E)5UPt&b!W#$& z5Dp?7LU96|UA!aE3mhj0|(T?DG`dw|Cf-beU*gnvLdj_?8U{t@tJ z2qzFeM4+16s!i3Ws(*|?)&B+Z{~6(z2t5d=5&i|?R|uaVe2Rc??BkQ&<;re9=%Y9*SQs^8Lj4+4jfZ%)LOS{ZfAH%Xx!B z^ox-T@gXPqyx^BA8)@Axtv~phH~6i5{mMDN92w;y?oENJU&Z*$|9LCo3sm^Vpda@( znac@n4)8VF*j^Xl`X>8|N#PUst;v0Sl2E8`q;y_JDH&P_(d+RXA2`#Wti;#P?TdlT zML_+o5E2@(7c1Dj#-{U=X;DGjrHnLjx#1wW=HsIHl%ceS?-9mI07*mLfoRtpvdjPl zj$C3DCkLPVvahF#lk4bX++2?AU{`X*sSv$$D^8~KBaU&hW4})pr-(KUw%Lf9fynnC z&G#VVR2+Ce*x-dQLh+h#PC>boEDjC1Ff2}vdtm|NF$^6qXML z;_HE07O;)@AgB>b|FpY(!G-|8BB(RxYikq}6`@5^`JHq9wNbkk5;Ph4$|(yPlSs2^ zFn&p}UoyYO$cqE}XGEHp`o=iwYYFRVX(QiSjS@rSrZ6XC^n0QG3JjKv&$K%fKf)hK zE{5Wt&v0CT1MIv`w1MeEn^D z{qbGNT!wF2o1*$N^DOU3(&I}-rj6{M$FKOC6mwytuBh*D1co876)Z9o#su)nReZ;n zH6=l}k=KNb)%f6X^;(l$A6vrKA!jYkSq(3yWNA!Y79y+W##Opbj*R903Vg@YPSDM= zys<^{`DL=FZ-nhvjPleUuZn}eq6GlC z>a~Eymf#c0(xfgYxUqcpO+2d93-m#N71g*&2Z)e!-U*{h3zxGSYywOyuMPN}Nf=a< zv;<$cwLJ!NRkw4JDmdtRu9I`<&XVPYHERjXo!jgszQ1alYuvDjFNvFvd9zUDW+1x& zY@+mtJ*I-;IwUGf)cmN@W%z72t}c~6snSvmCU}G&SsfBBr7wU^nU6lBM13IiKvk_O z^#>}0koTHkO-&u(+CZqbvRsuuh-HuWtMb#=a=D*Q%&VzEQ@BJYh?`PbN)n3exK=W* zm!#;jqOCg8X-&;Siccly;R-W|Mv|jFLE-sBWa|m+C{Pus@^dxOo21C~l%-Gzexr6k zI%Ma^EQ~1~s=&9`2c}}Tg-_|yQH?FnoJM?>-egqOuU!rYqJIpZsE*W>0;TnsS0Po8 z*^RG4SJjj^a6Xh)Rg{)D1uIvVR>1n94kG0!+OWD5CWx03AcJ>es$1@hzm;=gAa#!I zM$fu`@Um<9nR&b55ap_QrDt>>@#ne9`@g!q%E*PlLy08X)u?W!N5A?VpqTdtvG#&3v6Hij{`-Vf2DVbgqe zI@&c_=P#kcgI6{dYAAlqm#itH*v9{0ZsVRK4ApjgzT=a@=f3r^f;m(eimKLfTv*S= zBPz=HREOweh&)wa<& z8Se4b%XPCuaWkNreFOARmHaXO!%$^)18@Nvn}!mzE`@_4tRhWAQ7aAVv!g{^2pk7U zv>t!>NW`agKbAE=z1d)}|1}e4;$hwYgPA~;0dkHGPrO`v6zn_^4g4K&Ht@>HcfxJu8r%Qx)su-;Z_k&UA;@| z3H6Q_n;4CY%$xotWA4Biq|_gJyUrg=W{`TiJFyo74N?{tRSdXXXpo|@cM}a#Y~Zy< zU%H_4exyMv{UMhy!Kk2jcn%V|--9O0F}vbl=%KjJG3ScVb-fos0&kDNbvlj|ds}15 zOubK@v1Dk~)Mu)Zdm^T|zRcwqROcay407|vu=V2JvcavUo^C@n+5Z9#xgccN28X_O zL7 zrw`?F_7Be`V%$$5q}Nwf8uHa)16*HRqm6HqoC<$wDp7Xq<^sIR(L80rzLqz4 zWBH3QJgO9TvpCEZpZi_>U6jB@30#!GMG0J#z(omMl)yy^T$I2?3H;w7fxrLH&whUi zSRIM*7YJ7&6kcXtDTD+j77?J4D{7EO{c#E6$MK1WQ#et-+^KP#%JI0k+I|T(mWQkg)xG~Fd~h9a$Kr+3$j^!6=ngl^ z*ZG3kCOekKnden^60!jM(V#5sA5RDIXwr@jki|LBNI@=Or2mn^f<)z*pIe;k$nC&8 z>rFZ3heZHLv*d=o80`8FGlH%-a0nXgix#Km zC6Wf(n~|H)r@`R&2l2Ar|s5_%>j^C*A}Z_vKM!z_n3Ww2cw_mqFUDm!iJ z^qaheQ{5IsU<=nGBLeXODLZN1zfS_89~gq5)A@gzRp49ds|+fU${X+;Vf3g`qo*|D zIpvc2#zjr~it$mgr=Fv4h63;ewQ2N3xqbWs;d%FsZ@qu;p<4ehiXSWa&f2f2J4>foqxG9$qo>u(Z>(r+Hrr%8t--spyq&ozbqiAvs`^|#>iSw# z&HdCjxuS7?eO>A*bRIac9SM9d9gkV*vg5SlrkX%1zLQ5obmR%&d4MtfT=+SNotM^+ zyi@Q3FBS>t=G467`NDsk$zT1n4Ehf?HIBw>Jq&z*Xw<|}>NOvbs*5Req^xAC_9ybu z_G$82SXo)#G-_;&5p`ykIr$`NFtKiJ2BRjqg;<93a!eoU8qt33WpaI^uYW@^DZra` z(4J#;3~fMT9_X(x$sw-SRC=E{I*|ta2mS^$Fra|}4Gd^tKm!9B7|_6g1_m@Rpn(Am z3~1p0PYp!btl7t&d3-UxLecUh{y)}L7W%`in@d#At#;1@Cz$OlAMDuwg)@^-VQz+F zpBe&|ksGaBheGYY#n&#b`XJ=p7r4~1-zQN{F6p8(m~H=sDdTj?HAo5BEa2FGWBLT0 zKAh>^F30{ytd9Q#5$pH_nRvUv5F(^~C0^$J2U)q|UYeUh(%&GZEfTU>Gw%eQPFj3Rn1n2L#rLFB2F z-tEgldbs@$i$6}Yy4LDuUDi*twt=R1vs8(HzF7;wG_hG_OmU5NEaeeHpMZ>&_AjAi zF~*nGFuMgq&ROv#d_v~cmw}epJ>wkjNIe3xUM$OnW^={7JdW3cUK|RG8sc~favbjv zfNaN`1CZ%>vjL#|%{J;)RxboBU&o~`sAa}Vpz z2nCOXmLF|-p`0HV%4)T7yz1CLTj6pXOpfp0&!%K^c!%1S9y@l-v0qQ5cpVfWZ>ytn zA#!y%xEdlyzshvL2LRh5!O@QW3lwz9T9vgZYQ+_mtO7~cyPEY?0zLRQ96CyTI=P@v z!uBzICW#amk>X8IIQE;aB=((bGBPJ2lU1y(hNzq&+Li$c+fTD_o1clwYTuEP(KDm~ zNOy$otVWVG^d|e`eQ3moq0T_Aqc}>RIQDN`Mms^V!+Td+Yb2Nf2-^egTGlQ^7@Jfg z?Q6ZFwT0HUVD5K)!fR)>{tzAE*uMu)N4EgfbZLuFpk?`8kSzd)f$@(09_tnNR)kz< zt!f;Gfo@>8$mOUKRLuy*!?t3j#aU#j(yGnqcl6^%r}qFs*q(`}q9O0z?m3Vq1I;)F zml=HrZ!0+MSKf=P9ZtHd)gK@ZbH3Cm+Y92sEbof>k;)2Y(Y(8W^CMMO_qmL|K`!8V z6L>B_@dw93Hnkw2%T-OXd*D*DLvxR~qwuH`91K$Fxi8|=Ufm~S<$%w8xw0$*w~!Z8 z<9{F%L))2q#0eh70DtvhF|z2)-B#zg!aDXy5>sDZHIzRCO3{-dz6G;^H+$uZddz>X z#%GAEXIIQoDG6Mi_DM*DN1Nc-zoKMn7~M?_LkE>aJJE7XdP61Oi!}+0guGZ0p>qyC ziF{yVBf6vPo{{iBSoOu-(ek5h9|q5N?11KvevYyQu-!$}D#qtC_^R7j+8&l$5#U;i zrG};^f)cu%qH~tTI2{m9!&H8#GnnhxEk?OhSp%98ws(^+>U=f~cqGvpDRj(xEB?5jk)yO8U&zrl1_o;6Sm zCD_mHP#D%F*-jaqCFZy)Qj3wz2c^?KTUVf#`an;O0e zw3Ig!j)*H3r3R=@DVoeKRdr^y{TdC5mW`nBTxPYthB*6i%~d*ScUCKG0sXv8)aKaJ zI7&eB-aXXcN>)q>N41F&m!@>d+Bc^>M;6cG!8C2Iy|F-nJiH zqFRNSVLy3hvKY63e`Wf(-0=!>Ri1S(Nv`|x#JaBl zWn$gKRN0U!*;n2FfQrNRFBYP1)$?Y%e~Ub7uSW(kel&UJ6WH)NIWGm9uxaBePBYT}3wb zSII^Sj8G{LGX>KY_Xc@tZ;*xbgsDDkcP{`Dq%7y2%bmX~5CL8M$R?XdHtnP8pb)hz z`0pU7m7I;l#A82$vlhK9ko*kCW*PEdgFG0~jIce4HL9}TU|A74p!2bHxJ~m$*_mtr z%Faff)BXX|%QBUa*|*;I>cNRfwmXO>ng39yy`@%(>c>hlCLo+-hn_1kqJvNtq9Td; z-FfhRx>|z>s|IkP0B=GcpvHVBR1nV1djWayu${r-VSA$w^r~rxq#~I+9}uFzjgH;p zX4z}FW&-=A$c?#!!>)+)k%~%-9Q!DfWH3$>PQm|(HV;Gc4l=MmMFp)VnHbV=vV>|e zlvle9&p?{pF*J09wm_9(b(*j=wa*8sv-w8t2jMZ)y#ID9%)kA=@jeQeV-f#6x296f zi^x-p)q9wjuvmQ@S*hxH7L?BBcNc*k?p5kotm?QYR>#do9ba(kxV%>#*XcUqcIt8L z`?=d7XZvn89NIaL3@`w{!1D1r)0wQS4~y-~?}Aj!#c7AEMP3s|(YLV4aqI_TeD9^~ z;QJENJ8j1JXLoqS5?A!#gb`bBW6|#%xgA#WYF672%-XP%N+k(wZ6~-I>orK-Ln*<% z65P4C%xXOVZZLu`sxqKBBoq@VSNr-ENDr=oYsd))H#ldaEP4l{br%Iz)AwNAaYJ=N zMpPXdU<0!cjfMuIzX8P9oQ=(v+eq&k%D@b+#kX=GD!blG0vWO|QD=6Bk@7U@ZMHS+ z-9QE{Na!9Rkvir=|6#jzJ}_ioicDs{bg;vI6rMOui}OAv z1+sMP@6tVkWgb{!)C_TK5+~+mBM+--lnHNMF)x>KI71>{>crvKDq26JuEOFHd9&JU> zQKg{f+9(k<;Zi|Rf^FCQ&ow(=7DZ)t`-n(>Dw$P zi_#IGP;x{sW6k#Wm?yeE4SClbv+&vN63L+bv?)f=Xb%cJ&uq|NvfZ(Npv9q2$cVm9 zZhh3b8F``3XpkiB&$5)!_YW`=E=UO?!{;ufUBjPFq!y$S+0Qc@4e2Gw6xPy*AeXAT z!fJ_zBV4r|+{p&10sK5AQzPaHv7x_XKS~=4T^A~(V6#cqBD8k}~`3fqsdqXPQz z$el>-p3KD{6Tm)f|A5(0V->Qns|?%Qbpm@dI)jP!i|l+#fO4R`LnSIh6vfmaCA>Bd zJsUGbv4=g_pYRLekT;M%_Eo2i_9>*^eMraY&wlH)G=MI~uU9Jb;IHTa3LBrYETDATZg# z$9C^QIdR94$|=!rbK3-;{q4C*&FGWofyFu%>^M>@K!r~C?haNkTBM_xZ1^F0Q$1NY zJ^*27@Drr_J(+hB+shKivRY?>K5YM#l`Yd&QNsfV9E<$`6bHv68|UUG#~~4hPw((z`NxP52XfEt7hr0^GUl4#slrpsSV~{3atv;Z&L`ci-MgP*C>VJ zbRB0+F4-T2>?PzKYyo>5zq8m&I2wnqS`Tp5j==5FcE*u@8)2sqF_(!`2|2)bFhg%^ zFxW(rze^Rjv0+fwlca`99sv|aYk+oocd>aa29|fJOr?+|K)X+gW$%jZ^2{R}x6^T6 zlck*bL~JXSL z_DAO{Tg-DNWk7}JYLmRkElN6YJDtM+RN*)ZJ1x5M9Az;(V8Ti@gI)TYDFd|e5TLU> zGu%F$qL%H&@wvw-!_*MffKD(o z{K9`gdXQcSW$K9A&X++!xnH5&akUQD$!(7!Ir`(Xm6E(Tgt-rK3UPFVO4=T%3EN(3 zhP!kxbyn7e&g6Ly{U#2_r!o;IGGV!4m6echkd^T1nHzB{S*9zw!l>kT*f62rJyG>|8qN705_CV&E?7nM z5R<&|A)~fAaKY|)psKeVJ$6j5FvlK?ZyqK=k~Qm)r& zf1kU?ak+Su0D|c4s2e%k0~dttYi`lER>Ty+lXeK7jzev9fZF>VK^%vlduh{yz?DxC zR^u5$=K zwZbQ4qHN5e*5O+`A@7>bjNCyj$Bsp7Aswm@E^xf9kWV#dgl#0-?MEse=91lMBGpNKN|oVC zHMJk9KGK!qn|5m=CFfln%P81$4Y?R&=oI-F1m!5$oBx-c_Npm7${6 z=xhHtb_^QuuE}aWh$(@cQv-(K_HW&c82Zq=ZfvA`BKtACG!1-7!AIFjZ6g@tgKJpf z1?X{h&>->`SIT`SvTg|-x!SvK+4G%VR!-?yt^=7)(R%E0TkAL*m8}okKSHfzKV;v8 z?N@<=VJ3^Pej3Jp?42m?hTxe8M^Iigd`b=?FnL|^i4X5NLK5gSy@3I zQ7)sR7l1O{{uWyXdkeQ;o2_cd!JdRQA*OO-`>%IV8;q0XpF);nKdKl9M>_WB!3st6 znh@f`?;=IJ(ob`Pr)b0WK~%;^&fa}t`){n6FEp$S7wtpg993W0mT=iKY$v4%d7p9Y zB5>lM2~AUGinE3|?{l>RcHndpwQGr}%x`jO4rSCUkynjHr)IVCnw;nyG>a`VJRVkr1uC~%N>{={nWwlLk#M(j|P=!AJpz}V@Gp2j-LHiqp>$iurOY+t32 zZRo!;rbM)ULS@f5Wi6rQThTgg7HDPI`;7Lx8PN~1b6o~nhzHBqV#HVh8a@XJ>1}6!Kk)3n^>-FL)hC9TE0_Obe-Pa+@yrcIy$|3rTww}$OWoV z8z4G5eGTUDXbo6kjl{=)(YZ>D^{i$l(9j2%C-laJgE57Jpx+34*Xb8JAaJiaz?}g6 zUcJ{% zDr{A^HP%S%?1Ti^qzi`1-dO!EYT*M#K$^M<;I#O{g(?$-K;3Z zJcgC7IvsMm@YC^@bpmyQtFRizYE5y ze`o)5cJr>m%;i<1lrz_AQrr&;8e`zIj6J4efr~M5P)p{_b*0p{8}lP)uQkh_b=33on=?PPY1x+$kHvNyoZ16g-O4VmLjhMLoDt`CZvWhjcNEkcUXJ~c<~GbJ;Q4_}ELY)>T2E)+ z0tTIR2G7J;V2h$#{-hQSoq?gSQ)o_kqUe3^s~2YAe*TCOp}+QiJz|J{r!2}>gs@%U zGyEOV+t8Kj~0ctK;jhjV-x1+k)DjF(B^me6{?Q-F*V5yr8aLR5{>yD6tW!Po&bZ2Ofs9j-Xz zlsH*!4?@c^khWb`Mj% zJKaW=tBl|c(HBvM)^aLZhlyHmLa}m+i+L|dDQ4gTt+k!51VzZ81gimYv|&Dwf<4C{ zo3y;}+ULO?Z?WljS6<}s-4Xp1iiO+%bDF9@8w50-*u18;321#9sEmPUteH2V1Rf`} z;a$PCU=qNR?2D)eo)c@TZz6?l4cmXX2^bhX1V#r3VP?(wysu zK)H(^x~D?_rl)y$T0f5g(Sh7o$4*d8H1fA8O|)cK(HpnHGL?!&bdA_RJN(p z`waEn>D@vQ@^0Yr$GcTWHgfCeeJXG&&LOiyMeDjxbG+;En83RO3wkHG0m-MLd8)x1 zw9f72o6?*cGSAy%Z$AYm4QD#KCDYb!!!QXIu3a<9xqc{y%bD_SV<9rG$1BPz0}CXU z;2I^w64zsNGQ&Qb?d4)jotB)(m^v*{JJPUs8)6twRH62Xs~3Pmttgk$!l1Daks`}Y zJ|O49B?s^S0bS9t39WS(T6WJ3JYo0l9*M+G?;$Fp(|eczX9qM}zU+)=*4QWLm!OAW ztc;DcEFa35=B2KSL*A%*C%PxBJ;~=Gf%|Zl<&{@wLtW2IlRVsg>{$1p=->Z#?AX{> z$L_&``rVkjzM4Y5dkhlby~@xbIA52Y>+m0e!jfGvev^T*I~Qa9szZTGQD3H0JQBw; zgHYYEJ@6u@J5#9dQ=pw=yP>Sjqy_t>8Ewac*E+?6K|CaEzj3`%wpymm@u|_!8N4`b zkHxT|+CgyxFtmZM0gR0ttfOPcl{T>E&y%LCE8ISj2!4Ekl?I2kyDh`{Y8QAw&VN*) zb!vuKggUrQ7^65;NI|}6WtN3!=MD@;5Y1-+JQb(-XiuQ!g-T#nR@;y9f3y>fQDY9P z1k}z2{`3Hvjp8_?JRdrz5C|F3c97%MG9>jXgz8-~8Wb+;!4p1KmDYW;)EOv>&O$O? zlSAoD)TsA~IJ=ih)N#jTvkpyVyxu-M#uxUgHXK(Yg&zD0K)1)g3!_?T&qwW9&qj=Q zRAWxj?#YY(tdgDZ7mlVG=)Y`a#vZdA2-_Q`Ae|fI zXB4u(`#RlS7-{6dBEOpt2yM!1@)^;5@StX~S=z4@dI=L?ac>^u4+aigpw ztWt5KvRYo42fkL|EVq@NIMv%>t3=}|YV6rcZrFR6m4v-Lo!%aDz<`BYj}2HzI2Sd* zD$Y}M_PsP_q&~=c^{95dhwYAB_qEogn61LzLs2s0$`B9W<4%CA-HG8c&G#J5cY^S} z4yjnx;zW0Ag{Ia1=xON5n7ZtqYI9Z$2cL51JB%GQ2RGnzRM0{i5ArsmF!ymk+0CCr zyvNRv^PAns(bbhCR9BE(oviGz`~5PkK~3T3!$dRKOzPt!7H79bUn7P$dt>i#%exPJ z+jp?}`YfLop968j%U7xW1BS#eP?pE!bX8&RyHL&0gq{2lj;WJ$3)Mh$M+x9yiV_nE z*3QR_=s2~~2;29w)v}Fw8#xF02qCO&3_H~>J|vX#Xx}k5>0wZb*3QR6PAQMWEBX!O zuR(q{_NVF{x++8j^#XFE++w0Bi#T)faxQoxsiZ!!6%qn<;F zFZ8O3#n52z2)beUQ7$StzPc~v+@PwPQx0b1IpRMDwrW{86l-z3G|fink&K@F1u_pl zYat1>o{0z+%0t0Ky`VQ&t1|84imA}p5(hfTVZx>S8M*c!1zTASEqu+uI zsJW9IwTsr$h3zh3TRM+T&PEqORR{PhlXQ?GdX7_+gPH#nrz|Iw-mP@q3~uz9^99xr zCcT{H z!h1Rc+nH=oBMq+>bdw1*8GW6SOv%8jKA}VMvX3bUrqG*V0OylDhx0{7^y?_$+>9y9 zOkAlF@fM$%*u+HpSx6Z!I}{2YA_wnbyg(<7i_QW;{3Ro_6`LD1jVpAp%<>~)C45(X z?qU7Pz4lGctie}(z}JeGam6UIrKuWQn1aDfY5#N^@ayrD1M_DYihbsB*k@|?7aHsz z12g=<&tSh=vCm9o4@-|b3cZKj{9AMaJVx6u(xDCel0ry@)sdR|-zPt1_-|0n=+Jy{ zWq0FepeUBr_6-zr?7zh522p{aI}>zt9ck!mx{kjd1H{u0cD;9h^f^AW#hT6jn_E)v zqTXRT77YJjvf2RR_YX)zm3Zyu=O~R6Q%b1B`#GsZzmI|{+&-0g%8XQ=9+1&CazzQa z2YZlfquNp2jx21w!uZuEGXi?8;n;3_Z`76J2yP*q7k&*&D(S#cIuC-~#60!jJyW$% z$pkw*Ln@1&q)4;cK1C0xG=8uOs_ET+oRZ_c*MpxyW?wCRPSMEw(Pt+%=V6t1;9w^- zg&&?WQ?$4OIpOwOV*0s|d7>XaLFD9cpDIPoIh&ONWbGqAeZ7{^hM5r^X?R?cG%2rf% z7cFm{&fbo*Rj};s>|;w5tOR~DNmbsqN*UIoiD;iPtUq&UOP2O8WM4W-b5$jR^Bj9d zjN(n9@PH!Reg}ELV~5)vjlrW;l2(=lfB%A8$7w8=P{*&Cr)toW*~V|L)NeiIcOzNP z28Ud83;4JSrcn2DEO&Y%47P$OQ&o%srTVNjb6}GdXS(21oS{@W+M1PBC#G+*QFsj^b+DWXjm$Lth&y=ZAIKr4l_aQM{ z_FkwAQ+)SrJTr2=iQACq4_OcL^{!jFwN`1Q9Fety0-C?LW%+yR{YUDbkG_r0X&{pX z{ojTZI@;hp&hotpM@9IlaV{FEr#HBBwL(ObGqK9hNgW1WBy^9NWF^Qk?5fQxhR;DTa;rH)I!&+t-UZB;fx~Q%{`j9H2 z7GIi`SrG>fsg;w4w5TRpouZ0TT}5N+Dy~FsxV`FH)L6m z0d3Dfj??}C(_w+J_DkE}#Q{G&RpDQIugg!Q=^Xlw-Hzpm(e(TIG!;$1lgZNbFRKR$ zy6F$9?seZ2BXK%)GjwYWhc4t9sD%iw)MFmg=r|3)-{TSTy}q`4N2|e>Z8J?qAipNd71@Z%fXbjhE&N8S5_o6CpuT`<%Ii8z6~zx?Dt{jJX@m3- zA7<|8{w#h>!_*wTD1O_0#A#PDRoSxI(Y=HWNMUe&T0M4vyZUjs{Vep#i*zUWtt8$b z@^(=d_~8!bcg>@VZCtK-#9ERiE%C9^0M3w>;Z=V14GxUz&yq}L?Lrc`=V6b#<@E}3 zB=X>DKWXnsv){xa-LNAC!8W66{3Z`mVY;gNG#14Vc)^Ol{?Xqvc@GcW)NeON#=WHe z0WW-|{p(m0)OPE6KB4Oj+qYc>s1*Gf5{RPLBNyib>PI4%GaVm(!S(`2ll(>Vmvu!e zdR9_VNOwOTq0c?3p>;T#r@<*z;%w|XU5z>$yA64)s59yXhSyQso}!YygTv|v5$Z9t zA30of+>0FSWaZUT3JU#ZxMxRAppyMRo|o{Q5w*Pz+cQ`l#ApXWcag03DiIO15U6T3 zcD1@=?M2wb=>vd~+;ghqLvXkvUg#sFr{49CSGzW2Tr1Yk4>%g&pC{IkW@6@LlWu%_qFS$!gtz5{|tPJ0z$$ z<0Qn;7Hmux=}jjFUL`Qym;lpYCRoA+t_|C>L?BuY7v+#BND9nfTLHuNk~o3uFi3>q zg6|vr#=>qCi)VC0*j^Z?Bn5Z8qTM=$b|vl@Up<(K;;g9wI z%*_Z!b!Mmt$NSm%x%+Z(fjF_#RQ;mfpR=;P+4!$0=g(PZcq90)2#eU~ufr#yku#Jz z{K^V_CkghFU?ZqMd zvY59kYm|3y*4^FEHnWjYv}^GsqLBTzqTPSax}|7W*2tIsoHa+c?td7F&bQ`99D6&O z74skQp3eZKWAAX=Y~NUb)e_HO%6rH~pCvL@JroP+ChQ@uOU^4*I^v0-TC8D5HK z->(|RHr)?eN*;M@?lv^F2>+c?1R2pgD7Z@(+{J=Wlv(f=DcJGW+^sB#|6n$u64)I+T6unvgJo?Ks|C)(N#{dn4${JUm!p@f@a7Wol(S5?g1ck_CGRB7qk6vY)A4 zB!jJ?Z;{I5JSK3Qdh~F`qFb-8-ERZQmx5?z*uK8zDpW7Jzkw6_Xy)JyulX@lRt|@K>3#a|7Oq7n8iWFKTei+Z6m-7i5f9|c`Kv1Us9TLmzJ(R_9 z7zPbu&VdH;Q35<$kf&l8vI(Cof;4<=hXjE7N1SIT5cIBKm77xlA zwR_2gmgVnQ!Oya1_J{5NyaX&q{xqv}a8{|6HR`1$XR3nR7oW{y`!PTlpN6`ioxh@5 z82WO(Mubw;DaOgV4Lh>b<7GU-`&6el8?6E5Sc=63!Cti>&>t206*g-L+pn0fvwMa* z_6PYW6CYboackE;g^8kq2atlj;}{qSQ>E2v3!b4Y3Uo9DF@mTE^l)nU72l1dmxW(3 zQla@B!L9rmD^6hDpRpQia&G3bWfJAbI+{eZ=vfru12DxY=+BTC#xp|LNKnsSm>umU zF6nk(FCSBL`MAo<#}{02dBGJ|T8poU7f;HzW)x^9Hw#Kv+`7aIkzI1Mz`~8W3u|x(&ckL*Ql;r zHtnHFY6n|f_nfG}s+y(-e?{|DUe4n8D>dR8-`a-2)CJRhzAD@bT+^f&&J5Po@!Bhi zN&)1n9&1kK98WE+3HW`udL0*Q*EFzO^UXe{-Q?H6s0(qWRDMHaO?_icpgF&$sf4#{ zH|JO4QuIZW>v3z!(m;Mqm9LKG;cHZV|36ZP9y75{f!=P1?Ov$()y`&RlcS9mfu&mFi?%6smpqo27GnATLop+C1nQh5|xl|Er8tmLW`L` zT$$X2npCfYXG48cV7f8>RNvs@4PRv-KiK4JoB-Y5KMGi+$z=<@u~PP=PClbZWjeANP^?eN?bj74snEplquy&@^L#>QRdq z*r3XpzNY$MW2G;@enDw-gD>Bz1vfpM`x?uxoC_Q4m-vg5ZlgXS-Qteyn#Is_ZLP1W z23H-?te|0O11t%CE8i-eI%P^y-_`2dcP7_2G-H6?R8vo|PtwTVD4O)%Xm-27dFE5j=T^%$lu9|*u(;S~$nu^pZl(H#PHv0T{6{SVV~FC7`C6at?byc3q z`k=o`CC~SHs(k2)+L}7d3%IWlUd>bF^OV%1Y)NooMdQ_;sh)|oo?9@qJkxzO3#;eX zHxAPZQ1`q0s)kv^3oaX8b=mL&o$Rho-UqGG{Ue&tvx|Lx78up1t|*(bGZ6cI3*o>#Rj3E5(iYR)pNupmF}lPC zR@M8o+|?C}eI87WA4gQ!$V9*2?3*UeNwuRE(n;(8W2;dR_t7?v&LtJioSHPn4L(0q zf&RhuT78ts_jozyd$?Yp#pof{t9Nua{yTUmGwf@eCm31WHarXJ;gFX!eF7HTrws1e z=YOO(`_y^9=Xw~9S~o#=6>8Kan5@>EYW2Tec8rz;zvi#6z*^X|0INF=_P*=uQ_plB zdci_uoz#4Nw zaYda^QRq>}qy{AUp~uNs5X`TrTx4M)b8qME%Z4Y%W|{?9;V3->d{`~>ay}@rQ7t)| zJzT-%F&EX~N;FSp;uJRuGmJIb8r63np4hkz)O*TiPJ=aw1q z_LdhXt-c|*-;cgsf<-EfWO~`OX$iB=Kgmze26gpu9}WAesq^?2EP(zzXqB4X;j8P+ z89*-pF7x;xjjs{YV1R}zZa&WgKgU%=>Xsxfyii$F0OR>zmA@jsvWu@y7VzFdHiv`6 z6)$l$p!TB))3vcJOGq!4-6;FcG=4Qyj@zFlzCg@z>aL8b{$q%arc`28KRMXgh*hqv zEjf1C$jMXmP^qfI6oVTzv7Czyk%j0XxJxcYwR+r@9XAOkpGIFG*oXz2XSg3frAb*I z?fe9)Gn<7~zFK*r&9b7rUTqaAk6zoljt0&>F2E_!#U~i{RSinORW~Y!0$q{AOy2^YCvaoR?L>ma(3I%u zU#v?i!WjcINzFwSi?Ez2blvU508%-^`!>pk3fivWp_NLS zv`ZV=kg)EIuOMZ)*>p+FCjJ!}>NsRDC&s4sy-^qWsrX6BeUhK5@nPBNnTaDBz7mF_nBBY{JZo%iwC)JX8j9y0&Sh_ zuW$MvCr!o466PRwSd$tgrthLmYAr-*^qHliL2|0$dt6@HIYU#En*Yi6CCXvS zs+@hIMh(A-rCIC@Px>yk6N+tXDr8?Odjtq=+QW(Si!B{><2^X$^i|Xv9*2mOE~`Sc49;?$YBxu4-fc+%?)s=I0FYkwBcH?;-z;dy)ShwnAx zYw++LkJkC5T}3L#UI|(eqXcJqT-ZZ9`s9-<$)pDAXMK47R|0Fp^R4Ro0Nc$+!Q#>K zt-4;>RzRJkHpPf6oQ+6vBXJ?m0ZVY6UEdgpld>Nw8Y`Z zK|E)28^&qIt+1l8u|hozj*EvSU0uLxT2#|ei1R6&pHn~-_kJ;0;m5Ngc`(_K&`Muj zu$KP5zR~53Q(Lb5^6S-cJOtOr;Km`oPM`(p#`kIpG(|(vEr{7*QAHgd!!!y%7LW5( zwl}@RErDk&Y^+-%_EcvgTa8S4$b+pvW-J^(;Rvd(5(Zv}XF6(xkBS|KS#fJ_vb60t zS;hX~LKqk1^v;|)V^TkDV z^-FMOh)qPCFu-U{Q}PLV?@iYz%NT@scB96}Xzirpg5$^lA2L)!$bD`xYvRo5Q>R~_ zFEazR1(&NvwZEpKi7qtZU`uVh@Hj$e8S`MOlIHn_@^gH|z;h~=_f+E%0!~HM95p=X zncp11g9B{&bZ!-E9;yD9Gw(}c#{$KH#?ty5_yoe7r`4HwYz{h}Jb3t7@5ciQUE4^b z(q7eZeWi#eD!I)%J(uCUj}KsQqR9bqA~Im#gT;p8m3T@Z3j*>{r@1gIcn|3rMbGYl z>qQT7`!wCRL`y{L!lNZqFsodx4)tJ_NQ^~7CLfm@^%T}uF5{;blhkt6pXbUi89yT$pv3I1^`^*AOYL zuc-^Lyh*xzJYM`-a5-NZYxLoDm`YzQe3TyaP){-DhRN7V<8d~!(b33Mo2wZMC=EOj z_C|?M zHB&*UD=73WuE7fm?A3bZlf5yYnIvZumlawb)+;q~p!8Wa3aF>kc)`Ng*if(E48m&_ z`W#YCGfUyr!Iq6^npN#XGn&xMDy&few7XL*Cc4Ly7ChwjjTH^mHI+>+2MGTYgzNCb z%sbf<<1b=mcYSp*0@HS$0+0GdEAmAlV0_L}E0S)+JCHxZi1#4=NhAJu#0MMklNzna z=|=oa#MNt-NF)F0U$P=+82R%MKi7z_M%<+T49X8N@|Pk%$A}jo|4buZg7^hSyaDk7 zBmRBF&obh#Aa2U@%#y_V_8~vhp#KBn=NWOU$%;H|#MdMKZ6l6v0Y|co_=2SPV#H4~ z^6x_YR3p9$akITQ1`_r281l{j*pB`)^*;ynrv84Aln;Z8Txity0OBVZ@vk9n^7|Iz z{9OwF*q@sapRA)Qj$2?N*BkNiK`Ww$lh7Yep8?PZjq*K+Pc-6V7F&^8BfbIg9~$xh z)A~-fmsimr=6Jx@rxWb$c=}BqZ_y-v?;{Sit3T@hDB|TtJbC<R^&w^egJXxavsts&&TyA z$MYA-{wCQ!B>R(%@IRG?d>_{z4!*;R)EVWMBHm)eaRpq2YgPWSy^YJP$RHh6@ui5H z{xO6&$kZR{?@P*m4Dqv#{H=)JZp3q!TakrEd==s?Mm+n=R^%&2d>!Izjrf>5tw@Ct zUxT>Eh;K#wWh1_<#fsovbM;4gcOs78`u0??U`WgZ~)V{~{y49`Obvp51CiE;iz05I4uiGQ`dK^AO@i27N(WqJB0aZjRTC zyA%D{@%(+VKiQ7)XwEOm<1^VGCHt%6`J>-~zd1ksH{$3v^~e7EFe#4Ti6z+23dGI% z@?peHdB20W$$u;2_)T|={}IIRHR3B*S&_SpI4<{0u#aNIGmQM%h;t3fKQ%rOH|O(j zAa2U@J;crNg$qw3Jp1Dx%bWgHrw;r-pn(Am3}|3L0|OfPzgq(*LA)y(tjHtPR%Bki z6?qb{0C7TBa;`O(-fKm+e8q}%F0>*K0zVz$YT(}$Jbi%`*$F%sA>gwjxFkMOh%jTm z6&VhGhgVvWivaJt-HJqkZ>+H*RS3sW&r#HS2;tWV`w(^_OhMijz;y_p1-=V(Sd>Lt z5dSvd=}0?*K$&MDOhw2?7=>^F!l?+m>#WEN2vw+aI?AjEejh?J!mS9!2)mKD31K8c z0pfWG7b9%P8tg2_*s$a31R22KXex*AM~-W5NFxzybsh!Z`>T2nYOV z2g2778lXS6k8PknK8HAU(sU1GL>To|D>569WpJ@`WE{e$5za)g5IzW5k>4V`fxvdL z9X|uU72z?22N9YPHiGxpvgxDB_fXx@NoCCzB8;`!>kIzI+1k zL4+2B*$C|G8B7Db4$zhNbl`&!Xd_qP?B_EGXYdRNVI$i3ztF~Rgx@2)j!=oP17Rz| zIt0=%z6EXkCIV?61Z25YfWHE7*A|mu%j24cJekLRt-ID^{CIy6DIbIkq-A-o^$MPZ z4L_mNb_!&EufL7De#*?ek6S<6$KcA(bG9*LgueptR!Bepx#eB?&GK%s{^WPdyYidm zH+=K>^|Owl2%D>|$QT6AI6YQB2mFySdVGHk<7dNYJ!UropEXL4A*S!VOpkBkRlqs! ziQ|2L#;fAlGg7mVf41Ah-V$Mvnip94-G!gkFEUM=Z!f!_n1Wq&fviaaFv zSAo+{u`T;AvXt+t0?mvI;Uh7=ZQy?#YDK;ToHD!x95>A?djENedgqIIU65I|zg&-J z;_8HsJIVuK~Y$mKFJ>@L74Y z_AR7uE75Y`zViq~u&fPnxmr<9rOAKX|8d;#>}cf^dOzsK*CoZDN{VkqT-d1b6L~B# zZefg?`2|LtBd+>MozJm1&fw*ip=?L)*18>wHoXm;?fVSyA!rBtXwOXT^O@cWoO1>7 zZNTZLX#<783xLzcUiiGOlk?|yKo>xu-`Nh>ioo+e*0UOcd&`&L!+sAvdN#z{!f`Y3 zH=uz54Gd^tKm!9B7|_6g2L4~uz~O=p~6j&;-N?<@>tH3n^HwxS$utVTp zfd>R07MQU{>KB+RaGbzGfu#bg1O^1Q3S1*_qrfc!I|S|(ctGG`ff;yln0A*VFjwF> zfrSD~1y%_R2y7L&M&L$)TLg9p+$->az{3JF9+3J4<_a7quux#Bz$$?Ofvp192;3-e zi@*+ndj%d4cvxV@gHpf1T!G^R778pCSS2tZuvOq1fg1&G5!fMcufPKW4-3p#C-n== z6*x{{p}=p~6qvC=(+w7wDKJ}L zj=&)TM+(dnI0g{Uhcm`We7wL3l3pP3LV-6(`ZS3b3oMoN*%F^4aGs=BNxWL1Utoj4 zfWV~!mkDeU*eYb{w+W00>=3w9;4Xo? z1@0BNPvCxmT>=jXj0)@#cu3%3fky-$6=*%G`!_@2V1bzevjye|93pV2K##y&fg=Ux z2^=GEoWSt{CkQMMSSauYfzt#Q3oI2lTi_gl^8{82tQP1O*dQ<jbVBxIy4X zff2w@!rygBe5XLXOQX^=0Mn5_Sl|%A9K?qLo&}f-cqSm;wNdnifTX`cV2i+3fhz^B z2Rt2g5s7yQ+$rz?Ao*GwrN0FZ7C01;O5s{~d{x?kcA z0t1r1RN~77wn%!b#8(PjCF!drzDD3WNnbDV4FWex`co3$B=8wY-y-p?0=G$eMB*I+ zcS`y$iSHJ;SJL-Me80dhNk1U*sK6dcKP2(P0*^@gQHfjMl>Pvuo(D@jQ((5F=SX~r zz@d`vk$A4ak&>P#@i79&N&0w+PY_rj>4g%%LEtn=FP3MN8~pdW*zc1+J9zRT5tBtxb=keFQDpQiDwGTmh>En4-q(2(sL!A2Y4#% zW4y$R1(pJyf%JJ2uabC!!~+s{rM&_N1Cl;d;@JXoBz=g)hYIvadalGr3e1!AF%lmqaJ-}!O8f?a z#R5wO&Jj3IAl_Y6?eYt30Hl5w!+Bo>f$xY_^xS};Cu%)8;WE)-%Y(*aK5uzB{<(@-5@yMaor<0-+etbTbJcKv4w*3UD-PX z=R34p1?Ri9hXv<5x0k>$STEnjZ4jLA=Uv()(LobS@7Y7 zR^-QmHvxZ3@U$YlGY_17^atQHR^r!9$F~ave-ij;!Oxk2_wfZU0X|3Yhl{Pq65y1F z@030#INvqhEjZsnwa(Erd^hzH!S?{aS#Z9~Y75SHT(=0$cX)p-IN$BfI9K!GJHIyx z&Ub-r!TFBx(}MHe;kO0nJH=^3bXmS@e5v4k2f18u58h3F3^?@=0{*<<_szra4g`O$ z0{tjBek2_ENbvLK!v@aN{P~-anS%4TB=-oOzQBsSA~=70@{!>DO-laxC_4zFWi@`A zNgOZWPJ0ON?FwEDyjt*5;9nGcHt;(Hp96fY;PZe#DtHy}=LD|?{*vH+;O_`t3;d6Q z*8x8TADo~J4Zw#89sr&J5l`Z%#@{%EEI2=`)gp5Q$NDUChu~OyMIIpzeZB-+{h8oj z0sc2P9X2@(`J@SYt;iPyfA1is!WkUTNSf4E#w0f62h#G4Q_|_z2jSEAvE!r@>X@ z(n|xcG4Q1Zey@Q)V&Kmi_-h9Ko`L_>z%MwNGU$3I7E>+Q7FO_$vnfu7PJ`Jh^SZ(!k3N+&1ub1K(`m zyAAyJ27b)I&p^+*bqzJ}&lq^Vf!}1{wFbVzz#lg7Ee8IIf%h1AI)3=!$}r5p#~Apv z20qik7Z|v0;16gVW^7qcY8 zzzYnTG6SzR@H-T){lmjL9V5}QzGdLg82B#@yj$Z+o=?KRy0TrUamD8{11~c0c?#ze z%(Cv%>99at*U0+yj3VL3kbEmk4_ieu1zX;SGeP2+aszLg0FL z8NzaeFC*NE(1Nf6;VuLl0e=Op_^%D&ZiKHOtV9SQ+=JjCtU?GQ+>7v41pF1iU0HA$ z7KW{bp<}^(EtrsnZnU6E3(c`0vh_8DhY|2supa+?9pM`YTz_vscog9=gvSv!B776! z34|vR@K^8@{`(ffw-LUBunFP22;W0^8sQm)?<4#GVKc%OgdZY2i|`!6R)ilRJdf}K z!Zw5-Bk;RdKS97>!AtmWJHpEd9SE-=>_F&5*op8e!p{(PA^aQxe+94Mzh5D|i7*p^ zejxw+iH*g@1E3ux=ArE^wZ}3W4(lRtl^V=o7d=;6j1b znC~d_ITB~T^UrMu`!e|tdFg0hI@*?wcBP|D>1a^$ea#& z)8`>T&UDC_4*Aj{TRP;zmeWdyJn7Y_s0QJ7ghdE`gj$3;gnEPqgfAjAA~Ycc5P}Gc z5tbk<#q{2c@Fj#h5SAeNghvq` zLwFovBf>Wkor@_9{VBcxqMSy*$!M@XA-)XS#v>zaBM%aSzLxg7$ zoTy&1Uh>obwa)@-^!d zqK(z=QmYThPf{OHO?kO;0-gEQ^0*8sZ-=%L3Z@qR-&+vhKgFl4D{(KVzF^vw05>Wm zw|XkB2UQm?`>I?j+^8!zEQ{dNDuQ*D)l(PrqEt#y-`G}HSs5SKRi8!2Ek5qWRr=yf zbupRyy;WhJeA$>QMRGbn*Be)~OQp4$e4TVWSAP-T*XX9;d)UbuKvIAAS-U0srRinB zv1?OPnt8)0hJ%SFoQ0JS0mt}=%kETo8zKrmMNGhTBARbi%3@Ql4hU9 z3n5iED^VmQ$IK#5JX2jHo+1MSC6=nLEg-i9*1g9JK6~xnVomDa1SoIZB`pIjC1tW# zPR&nC@5Qy;xB*9BpWPo}0*$(3I^NCZg)Takril@U3t`C9%vaYascRf0bEdDNN|UM^ zkw|YOss5!Q(?=%e@xm#cqVK~{1=U60z|aM*fyKH)yMW31VhEO$1XTxb?x~%Rdrj&V z>g1+m3fG3rQcALV-c?R&3|$gY)RJc0T3O50k&#hSS&dJ{y9ugV(raHNH+N7x+**t) zFodBZqdwI=O9`p2UV2pqTZvPbO)ZRfRaq>in?Zi6OAtke#Ja#tQxdp!B^8iPKr6&q zb5UWH!%`b?y%jG>V7HkUDKh3>9YCBq;$?HZG_D+i>oWZOyo&Np8)PX3K(A^pAlY=> z%pp}OI>EK)b1#du%5MO=2%xMEmpuXzcINekR{69NHiK25rjiCMXtMQ}D7WnJy8vz&k0u41-pDx18iA$ofKdEn&tAJJFr22Y{Q(PJ8 z$K5rgl7!MmPPdG!SuH*@sfhvUbjW%x#w8w;aQQE^E6H(XfOv90*~$kP1ZoRa+qAF* zivX+KjN$SUtVEkI8gV&DZGBac_FGSy^a2dSo3K_iO z+xqOSsdrZ%Xiep~E8G0JebX-FH7+h;KXi4xRX)D7$7M~iJ2CQAUX8w0m18o$1_O!n zaejl`Q=4DYq*wg;mAH9o5qh0BD)%SX|44l`yx^y1K@IN9IH9J-`@BE;nkJ>~*lwsF z)80m*_oT{od%?{U)nIV}$$H;no+@4Kmq{L5L+J~<`%2eqauzVG zQWL9%F8VNbsz4{ktjqMQ?)o#&$Ga|ZZm;rk?_%$a)NaKcjlJpn7`D9$F)d)5k?Mv? zm|=4B46cTblri=uPUM_SA2;%ZlVXpu6WSebyVDjIb5DtsNw*;OL3P{<7?Unn{Abzp zQBE}{`CiCAXt74?b+Ke0q{)|3_CePBI?EF#G_S?%qtM5>dlOCtt;3^<*kx~YS;pu} zeZQNKoO<9|^on3^y&p`rQ-}Gn OQ?Sb2i!!w -#include - -#ifndef GROWL_EXPORT -#define GROWL_EXPORT __attribute__((visibility("default"))) -#endif - -/*! @header GrowlApplicationBridge-Carbon.h - * @abstract Declares an API that Carbon applications can use to interact with Growl. - * @discussion GrowlApplicationBridge uses a delegate to provide information //XXX - * to Growl (such as your application's name and what notifications it may - * post) and to provide information to your application (such as that Growl - * is listening for notifications or that a notification has been clicked). - * - * You can set the Growldelegate with Growl_SetDelegate and find out the - * current delegate with Growl_GetDelegate. See struct Growl_Delegate for more - * information about the delegate. - */ - -__BEGIN_DECLS - -/*! @struct Growl_Delegate - * @abstract Delegate to supply GrowlApplicationBridge with information and respond to events. - * @discussion The Growl delegate provides your interface to - * GrowlApplicationBridge. When GrowlApplicationBridge needs information about - * your application, it looks for it in the delegate; when Growl or the user - * does something that you might be interested in, GrowlApplicationBridge - * looks for a callback in the delegate and calls it if present - * (meaning, if it is not NULL). - * XXX on all of that - * @field size The size of the delegate structure. - * @field applicationName The name of your application. - * @field registrationDictionary A dictionary describing your application and the notifications it can send out. - * @field applicationIconData Your application's icon. - * @field growlInstallationWindowTitle The title of the installation window. - * @field growlInstallationInformation Text to display in the installation window. - * @field growlUpdateWindowTitle The title of the update window. - * @field growlUpdateInformation Text to display in the update window. - * @field referenceCount A count of owners of the delegate. - * @field retain Called when GrowlApplicationBridge receives this delegate. - * @field release Called when GrowlApplicationBridge no longer needs this delegate. - * @field growlIsReady Called when GrowlHelperApp is listening for notifications. - * @field growlNotificationWasClicked Called when a Growl notification is clicked. - * @field growlNotificationTimedOut Called when a Growl notification timed out. - */ -struct Growl_Delegate { - /* @discussion This should be sizeof(struct Growl_Delegate). - */ - size_t size; - - /*All of these attributes are optional. - *Optional attributes can be NULL; required attributes that - * are NULL cause setting the Growl delegate to fail. - *XXX - move optional/required status into the discussion for each field - */ - - /* This name is used both internally and in the Growl preferences. - * - * This should remain stable between different versions and incarnations of - * your application. - * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and - * "SurfWriter Lite" are not. - * - * This can be NULL if it is provided elsewhere, namely in an - * auto-discoverable plist file in your app bundle - * (XXX refer to more information on that) or in registrationDictionary. - */ - CFStringRef applicationName; - - /* - * Must contain at least these keys: - * GROWL_NOTIFICATIONS_ALL (CFArray): - * Contains the names of all notifications your application may post. - * - * Can also contain these keys: - * GROWL_NOTIFICATIONS_DEFAULT (CFArray): - * Names of notifications that should be enabled by default. - * If omitted, GROWL_NOTIFICATIONS_ALL will be used. - * GROWL_APP_NAME (CFString): - * Same as the applicationName member of this structure. - * If both are present, the applicationName member shall prevail. - * If this key is present, you may omit applicationName (set it to NULL). - * GROWL_APP_ICON (CFData): - * Same as the iconData member of this structure. - * If both are present, the iconData member shall prevail. - * If this key is present, you may omit iconData (set it to NULL). - * - * If you change the contents of this dictionary after setting the delegate, - * be sure to call Growl_Reregister. - * - * This can be NULL if you have an auto-discoverable plist file in your app - * bundle. (XXX refer to more information on that) - */ - CFDictionaryRef registrationDictionary; - - /* The data can be in any format supported by NSImage. As of - * Mac OS X 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and - * PICT formats. - * - * If this is not supplied, Growl will look up your application's icon by - * its application name. - */ - CFDataRef applicationIconData; - - /* Installer display attributes - * - * These four attributes are used by the Growl installer, if this framework - * supports it. - * For any of these being NULL, a localised default will be - * supplied. - */ - - /* If this is NULL, Growl will use a default, - * localized title. - * - * Only used if you're using Growl-WithInstaller.framework. Otherwise, - * this member is ignored. - */ - CFStringRef growlInstallationWindowTitle; - /* This information may be as long or short as desired (the - * window will be sized to fit it). If Growl is not installed, it will - * be displayed to the user as an explanation of what Growl is and what - * it can do in your application. - * It should probably note that no download is required to install. - * - * If this is NULL, Growl will use a default, localized - * explanation. - * - * Only used if you're using Growl-WithInstaller.framework. Otherwise, - * this member is ignored. - */ - CFStringRef growlInstallationInformation; - /* If this is NULL, Growl will use a default, - * localized title. - * - * Only used if you're using Growl-WithInstaller.framework. Otherwise, - * this member is ignored. - */ - CFStringRef growlUpdateWindowTitle; - /* This information may be as long or short as desired (the - * window will be sized to fit it). If an older version of Growl is - * installed, it will be displayed to the user as an explanation that an - * updated version of Growl is included in your application and - * no download is required. - * - * If this is NULL, Growl will use a default, localized - * explanation. - * - * Only used if you're using Growl-WithInstaller.framework. Otherwise, - * this member is ignored. - */ - CFStringRef growlUpdateInformation; - - /* This member is provided for use by your retain and release - * callbacks (see below). - * - * GrowlApplicationBridge never directly uses this member. Instead, it - * calls your retain callback (if non-NULL) and your release - * callback (if non-NULL). - */ - unsigned referenceCount; - - //Functions. Currently all of these are optional (any of them can be NULL). - - /* When you call Growl_SetDelegate(newDelegate), it will call - * oldDelegate->release(oldDelegate), and then it will call - * newDelegate->retain(newDelegate), and the return value from retain - * is what will be set as the delegate. - * (This means that this member works like CFRetain and -[NSObject retain].) - * This member is optional (it can be NULL). - * For a delegate allocated with malloc, this member would be - * NULL. - * @result A delegate to which GrowlApplicationBridge holds a reference. - */ - void *(*retain)(void *); - /* When you call Growl_SetDelegate(newDelegate), it will call - * oldDelegate->release(oldDelegate), and then it will call - * newDelegate->retain(newDelegate), and the return value from retain - * is what will be set as the delegate. - * (This means that this member works like CFRelease and - * -[NSObject release].) - * This member is optional (it can be NULL). - * For a delegate allocated with malloc, this member might be - * free(3). - */ - void (*release)(void *); - - /* Informs the delegate that Growl (specifically, the GrowlHelperApp) was - * launched successfully (or was already running). The application can - * take actions with the knowledge that Growl is installed and functional. - */ - void (*growlIsReady)(void); - - /* Informs the delegate that a Growl notification was clicked. It is only - * sent for notifications sent with a non-NULL clickContext, - * so if you want to receive a message when a notification is clicked, - * clickContext must not be NULL when calling - * Growl_PostNotification or - * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext. - */ - void (*growlNotificationWasClicked)(CFPropertyListRef clickContext); - - /* Informs the delegate that a Growl notification timed out. It is only - * sent for notifications sent with a non-NULL clickContext, - * so if you want to receive a message when a notification is clicked, - * clickContext must not be NULL when calling - * Growl_PostNotification or - * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext. - */ - void (*growlNotificationTimedOut)(CFPropertyListRef clickContext); -}; - -/*! @struct Growl_Notification - * @abstract Structure describing a Growl notification. - * @discussion XXX - * @field size The size of the notification structure. - * @field name Identifies the notification. - * @field title Short synopsis of the notification. - * @field description Additional text. - * @field iconData An icon for the notification. - * @field priority An indicator of the notification's importance. - * @field reserved Bits reserved for future usage. - * @field isSticky Requests that a notification stay on-screen until dismissed explicitly. - * @field clickContext An identifier to be passed to your click callback when a notification is clicked. - * @field clickCallback A callback to call when the notification is clicked. - */ -struct Growl_Notification { - /* This should be sizeof(struct Growl_Notification). - */ - size_t size; - - /* The notification name distinguishes one type of - * notification from another. The name should be human-readable, as it - * will be displayed in the Growl preference pane. - * - * The name is used in the GROWL_NOTIFICATIONS_ALL and - * GROWL_NOTIFICATIONS_DEFAULT arrays in the registration dictionary, and - * in this member of the Growl_Notification structure. - */ - CFStringRef name; - - /* A notification's title describes the notification briefly. - * It should be easy to read quickly by the user. - */ - CFStringRef title; - - /* The description supplements the title with more - * information. It is usually longer and sometimes involves a list of - * subjects. For example, for a 'Download complete' notification, the - * description might have one filename per line. GrowlMail in Growl 0.6 - * uses a description of '%d new mail(s)' (formatted with the number of - * messages). - */ - CFStringRef description; - - /* The notification icon usually indicates either what - * happened (it may have the same icon as e.g. a toolbar item that - * started the process that led to the notification), or what it happened - * to (e.g. a document icon). - * - * The icon data is optional, so it can be NULL. In that - * case, the application icon is used alone. Not all displays support - * icons. - * - * The data can be in any format supported by NSImage. As of Mac OS X - * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT form - * ats. - */ - CFDataRef iconData; - - /* Priority is new in Growl 0.6, and is represented as a - * signed integer from -2 to +2. 0 is Normal priority, -2 is Very Low - * priority, and +2 is Very High priority. - * - * Not all displays support priority. If you do not wish to assign a - * priority to your notification, assign 0. - */ - signed int priority; - - /* These bits are not used in Growl 0.6. Set them to 0. - */ - unsigned reserved: 31; - - /* When the sticky bit is clear, in most displays, - * notifications disappear after a certain amount of time. Sticky - * notifications, however, remain on-screen until the user dismisses them - * explicitly, usually by clicking them. - * - * Sticky notifications were introduced in Growl 0.6. Most notifications - * should not be sticky. Not all displays support sticky notifications, - * and the user may choose in Growl's preference pane to force the - * notification to be sticky or non-sticky, in which case the sticky bit - * in the notification will be ignored. - */ - unsigned isSticky: 1; - - /* If this is not NULL, and your click callback - * is not NULL either, this will be passed to the callback - * when your notification is clicked by the user. - * - * Click feedback was introduced in Growl 0.6, and it is optional. Not - * all displays support click feedback. - */ - CFPropertyListRef clickContext; - - /* If this is not NULL, it will be called instead - * of the Growl delegate's click callback when clickContext is - * non-NULL and the notification is clicked on by the user. - * - * Click feedback was introduced in Growl 0.6, and it is optional. Not - * all displays support click feedback. - * - * The per-notification click callback is not yet supported as of Growl - * 0.7. - */ - void (*clickCallback)(CFPropertyListRef clickContext); - - CFStringRef identifier; -}; - -#pragma mark - -#pragma mark Easy initialisers - -/*! @defined InitGrowlDelegate - * @abstract Callable macro. Initializes a Growl delegate structure to defaults. - * @discussion Call with a pointer to a struct Growl_Delegate. All of the - * members of the structure will be set to 0 or NULL, except for - * size (which will be set to sizeof(struct Growl_Delegate)) and - * referenceCount (which will be set to 1). - */ -#define InitGrowlDelegate(delegate) \ - do { \ - if (delegate) { \ - (delegate)->size = sizeof(struct Growl_Delegate); \ - (delegate)->applicationName = NULL; \ - (delegate)->registrationDictionary = NULL; \ - (delegate)->applicationIconData = NULL; \ - (delegate)->growlInstallationWindowTitle = NULL; \ - (delegate)->growlInstallationInformation = NULL; \ - (delegate)->growlUpdateWindowTitle = NULL; \ - (delegate)->growlUpdateInformation = NULL; \ - (delegate)->referenceCount = 1U; \ - (delegate)->retain = NULL; \ - (delegate)->release = NULL; \ - (delegate)->growlIsReady = NULL; \ - (delegate)->growlNotificationWasClicked = NULL; \ - (delegate)->growlNotificationTimedOut = NULL; \ - } \ - } while(0) - -/*! @defined InitGrowlNotification - * @abstract Callable macro. Initializes a Growl notification structure to defaults. - * @discussion Call with a pointer to a struct Growl_Notification. All of - * the members of the structure will be set to 0 or NULL, except - * for size (which will be set to - * sizeof(struct Growl_Notification)). - */ -#define InitGrowlNotification(notification) \ - do { \ - if (notification) { \ - (notification)->size = sizeof(struct Growl_Notification); \ - (notification)->name = NULL; \ - (notification)->title = NULL; \ - (notification)->description = NULL; \ - (notification)->iconData = NULL; \ - (notification)->priority = 0; \ - (notification)->reserved = 0U; \ - (notification)->isSticky = false; \ - (notification)->clickContext = NULL; \ - (notification)->clickCallback = NULL; \ - (notification)->identifier = NULL; \ - } \ - } while(0) - -#pragma mark - -#pragma mark Public API - -// @functiongroup Managing the Growl delegate - -/*! @function Growl_SetDelegate - * @abstract Replaces the current Growl delegate with a new one, or removes - * the Growl delegate. - * @param newDelegate - * @result Returns false and does nothing else if a pointer that was passed in - * is unsatisfactory (because it is non-NULL, but at least one - * required member of it is NULL). Otherwise, sets or unsets the - * delegate and returns true. - * @discussion When newDelegate is non-NULL, sets - * the delegate to newDelegate. When it is NULL, - * the current delegate will be unset, and no delegate will be in place. - * - * It is legal for newDelegate to be the current delegate; - * nothing will happen, and Growl_SetDelegate will return true. It is also - * legal for it to be NULL, as described above; again, it will - * return true. - * - * If there was a delegate in place before the call, Growl_SetDelegate will - * call the old delegate's release member if it was non-NULL. If - * newDelegate is non-NULL, Growl_SetDelegate will - * call newDelegate->retain, and set the delegate to its return - * value. - * - * If you are using Growl-WithInstaller.framework, and an older version of - * Growl is installed on the user's system, the user will automatically be - * prompted to update. - * - * GrowlApplicationBridge currently does not copy this structure, nor does it - * retain any of the CF objects in the structure (it regards the structure as - * a container that retains the objects when they are added and releases them - * when they are removed or the structure is destroyed). Also, - * GrowlApplicationBridge currently does not modify any member of the - * structure, except possibly the referenceCount by calling the retain and - * release members. - */ -GROWL_EXPORT Boolean Growl_SetDelegate(struct Growl_Delegate *newDelegate); - -/*! @function Growl_GetDelegate - * @abstract Returns the current Growl delegate, if any. - * @result The current Growl delegate. - * @discussion Returns the last pointer passed into Growl_SetDelegate, or - * NULL if no such call has been made. - * - * This function follows standard Core Foundation reference-counting rules. - * Because it is a Get function, not a Copy function, it will not retain the - * delegate on your behalf. You are responsible for retaining and releasing - * the delegate as needed. - */ -GROWL_EXPORT struct Growl_Delegate *Growl_GetDelegate(void); - -#pragma mark - - -// @functiongroup Posting Growl notifications - -/*! @function Growl_PostNotification - * @abstract Posts a Growl notification. - * @param notification The notification to post. - * @discussion This is the preferred means for sending a Growl notification. - * The notification name and at least one of the title and description are - * required (all three are preferred). All other parameters may be - * NULL (or 0 or false as appropriate) to accept default values. - * - * If using the Growl-WithInstaller framework, if Growl is not installed the - * user will be prompted to install Growl. - * If the user cancels, this function will have no effect until the next - * application session, at which time when it is called the user will be - * prompted again. The user is also given the option to not be prompted again. - * If the user does choose to install Growl, the requested notification will - * be displayed once Growl is installed and running. - */ -GROWL_EXPORT void Growl_PostNotification(const struct Growl_Notification *notification); - -/*! @function Growl_PostNotificationWithDictionary -* @abstract Notifies using a userInfo dictionary suitable for passing to -* CFDistributedNotificationCenter. -* @param userInfo The dictionary to notify with. -* @discussion Before Growl 0.6, your application would have posted -* notifications using CFDistributedNotificationCenter by creating a userInfo -* dictionary with the notification data. This had the advantage of allowing -* you to add other data to the dictionary for programs besides Growl that -* might be listening. -* -* This function allows you to use such dictionaries without being restricted -* to using CFDistributedNotificationCenter. The keys for this dictionary - * can be found in GrowlDefines.h. -*/ -GROWL_EXPORT void Growl_PostNotificationWithDictionary(CFDictionaryRef userInfo); - -/*! @function Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext - * @abstract Posts a Growl notification using parameter values. - * @param title The title of the notification. - * @param description The description of the notification. - * @param notificationName The name of the notification as listed in the - * registration dictionary. - * @param iconData Data representing a notification icon. Can be NULL. - * @param priority The priority of the notification (-2 to +2, with -2 - * being Very Low and +2 being Very High). - * @param isSticky If true, requests that this notification wait for a - * response from the user. - * @param clickContext An object to pass to the clickCallback, if any. Can - * be NULL, in which case the clickCallback is not called. - * @discussion Creates a temporary Growl_Notification, fills it out with the - * supplied information, and calls Growl_PostNotification on it. - * See struct Growl_Notification and Growl_PostNotification for more - * information. - * - * The icon data can be in any format supported by NSImage. As of Mac OS X - * 10.3, this includes the .icns, TIFF, JPEG, GIF, PNG, PDF, and PICT formats. - */ -GROWL_EXPORT void Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext( - /*inhale*/ - CFStringRef title, - CFStringRef description, - CFStringRef notificationName, - CFDataRef iconData, - signed int priority, - Boolean isSticky, - CFPropertyListRef clickContext); - -#pragma mark - - -// @functiongroup Registering - -/*! @function Growl_RegisterWithDictionary - * @abstract Register your application with Growl without setting a delegate. - * @discussion When you call this function with a dictionary, - * GrowlApplicationBridge registers your application using that dictionary. - * If you pass NULL, GrowlApplicationBridge will ask the delegate - * (if there is one) for a dictionary, and if that doesn't work, it will look - * in your application's bundle for an auto-discoverable plist. - * (XXX refer to more information on that) - * - * If you pass a dictionary to this function, it must include the - * GROWL_APP_NAME key, unless a delegate is set. - * - * This function is mainly an alternative to the delegate system introduced - * with Growl 0.6. Without a delegate, you cannot receive callbacks such as - * growlIsReady (since they are sent to the delegate). You can, - * however, set a delegate after registering without one. - * - * This function was introduced in Growl.framework 0.7. - * @result false if registration failed (e.g. if Growl isn't installed). - */ -GROWL_EXPORT Boolean Growl_RegisterWithDictionary(CFDictionaryRef regDict); - -/*! @function Growl_Reregister - * @abstract Updates your registration with Growl. - * @discussion If your application changes the contents of the - * GROWL_NOTIFICATIONS_ALL key in the registrationDictionary member of the - * Growl delegate, or if it changes the value of that member, or if it - * changes the contents of its auto-discoverable plist, call this function - * to have Growl update its registration information for your application. - * - * Otherwise, this function does not normally need to be called. If you're - * using a delegate, your application will be registered when you set the - * delegate if both the delegate and its registrationDictionary member are - * non-NULL. - * - * This function is now implemented using - * Growl_RegisterWithDictionary. - */ -GROWL_EXPORT void Growl_Reregister(void); - -#pragma mark - - -/*! @function Growl_SetWillRegisterWhenGrowlIsReady - * @abstract Tells GrowlApplicationBridge to register with Growl when Growl - * launches (or not). - * @discussion When Growl has started listening for notifications, it posts a - * GROWL_IS_READY notification on the Distributed Notification - * Center. GrowlApplicationBridge listens for this notification, using it to - * perform various tasks (such as calling your delegate's - * growlIsReady callback, if it has one). If this function is - * called with true, one of those tasks will be to reregister - * with Growl (in the manner of Growl_Reregister). - * - * This attribute is automatically set back to false - * (the default) after every GROWL_IS_READY notification. - * @param flag true if you want GrowlApplicationBridge to register with - * Growl when next it is ready; false if not. - */ -GROWL_EXPORT void Growl_SetWillRegisterWhenGrowlIsReady(Boolean flag); -/*! @function Growl_WillRegisterWhenGrowlIsReady - * @abstract Reports whether GrowlApplicationBridge will register with Growl - * when Growl next launches. - * @result true if GrowlApplicationBridge will register with - * Growl when next it posts GROWL_IS_READY; false if not. - */ -GROWL_EXPORT Boolean Growl_WillRegisterWhenGrowlIsReady(void); - -#pragma mark - - -// @functiongroup Obtaining registration dictionaries - -/*! @function Growl_CopyRegistrationDictionaryFromDelegate - * @abstract Asks the delegate for a registration dictionary. - * @discussion If no delegate is set, or if the delegate's - * registrationDictionary member is NULL, this - * function returns NULL. - * - * This function does not attempt to clean up the dictionary in any way - for - * example, if it is missing the GROWL_APP_NAME key, the result - * will be missing it too. Use - * Growl_CreateRegistrationDictionaryByFillingInDictionary or - * Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys - * to try to fill in missing keys. - * - * This function was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromDelegate(void); - -/*! @function Growl_CopyRegistrationDictionaryFromBundle - * @abstract Looks in a bundle for a registration dictionary. - * @discussion This function looks in a bundle for an auto-discoverable - * registration dictionary file using CFBundleCopyResourceURL. - * If it finds one, it loads the file using CFPropertyList and - * returns the result. - * - * If you pass NULL as the bundle, the main bundle is examined. - * - * This function does not attempt to clean up the dictionary in any way - for - * example, if it is missing the GROWL_APP_NAME key, the result - * will be missing it too. Use - * Growl_CreateRegistrationDictionaryByFillingInDictionary: or - * Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys - * to try to fill in missing keys. - * - * This function was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -GROWL_EXPORT CFDictionaryRef Growl_CopyRegistrationDictionaryFromBundle(CFBundleRef bundle); - -/*! @function Growl_CreateBestRegistrationDictionary - * @abstract Obtains a registration dictionary, filled out to the best of - * GrowlApplicationBridge's knowledge. - * @discussion This function creates a registration dictionary as best - * GrowlApplicationBridge knows how. - * - * First, GrowlApplicationBridge examines the Growl delegate (if there is - * one) and gets the registration dictionary from that. If no such dictionary - * was obtained, GrowlApplicationBridge looks in your application's main - * bundle for an auto-discoverable registration dictionary file. If that - * doesn't exist either, this function returns NULL. - * - * Second, GrowlApplicationBridge calls - * Growl_CreateRegistrationDictionaryByFillingInDictionary with - * whatever dictionary was obtained. The result of that function is the - * result of this function. - * - * GrowlApplicationBridge uses this function when you call - * Growl_SetDelegate, or when you call - * Growl_RegisterWithDictionary with NULL. - * - * This function was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -GROWL_EXPORT CFDictionaryRef Growl_CreateBestRegistrationDictionary(void); - -#pragma mark - - -// @functiongroup Filling in registration dictionaries - -/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionary - * @abstract Tries to fill in missing keys in a registration dictionary. - * @param regDict The dictionary to fill in. - * @result The dictionary with the keys filled in. - * @discussion This function examines the passed-in dictionary for missing keys, - * and tries to work out correct values for them. As of 0.7, it uses: - * - * Key Value - * --- ----- - * GROWL_APP_NAME CFBundleExecutableName - * GROWL_APP_ICON The icon of the application. - * GROWL_APP_LOCATION The location of the application. - * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL - * - * Keys are only filled in if missing; if a key is present in the dictionary, - * its value will not be changed. - * - * This function was introduced in Growl.framework 0.7. - */ -GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionary(CFDictionaryRef regDict); -/*! @function Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys - * @abstract Tries to fill in missing keys in a registration dictionary. - * @param regDict The dictionary to fill in. - * @param keys The keys to fill in. If NULL, any missing keys are filled in. - * @result The dictionary with the keys filled in. - * @discussion This function examines the passed-in dictionary for missing keys, - * and tries to work out correct values for them. As of 0.7, it uses: - * - * Key Value - * --- ----- - * GROWL_APP_NAME CFBundleExecutableName - * GROWL_APP_ICON The icon of the application. - * GROWL_APP_LOCATION The location of the application. - * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL - * - * Only those keys that are listed in keys will be filled in. - * Other missing keys are ignored. Also, keys are only filled in if missing; - * if a key is present in the dictionary, its value will not be changed. - * - * This function was introduced in Growl.framework 0.7. - */ -GROWL_EXPORT CFDictionaryRef Growl_CreateRegistrationDictionaryByFillingInDictionaryRestrictedToKeys(CFDictionaryRef regDict, CFSetRef keys); - -/*! @brief Tries to fill in missing keys in a notification dictionary. - * @param notifDict The dictionary to fill in. - * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict. - * @discussion This function examines the \a notifDict for missing keys, and - * tries to get them from the last known registration dictionary. As of 1.1, - * the keys that it will look for are: - * - * \li GROWL_APP_NAME - * \li GROWL_APP_ICON - * - * @since Growl.framework 1.1 - */ -GROWL_EXPORT CFDictionaryRef Growl_CreateNotificationDictionaryByFillingInDictionary(CFDictionaryRef notifDict); - -#pragma mark - - -// @functiongroup Querying Growl's status - -/*! @function Growl_IsInstalled - * @abstract Determines whether the Growl prefpane and its helper app are - * installed. - * @result Returns true if Growl is installed, false otherwise. - */ -GROWL_EXPORT Boolean Growl_IsInstalled(void); - -/*! @function Growl_IsRunning - * @abstract Cycles through the process list to find whether GrowlHelperApp - * is running. - * @result Returns true if Growl is running, false otherwise. - */ -GROWL_EXPORT Boolean Growl_IsRunning(void); - -#pragma mark - - -// @functiongroup Launching Growl - -/*! @typedef GrowlLaunchCallback - * @abstract Callback to notify you that Growl is running. - * @param context The context pointer passed to Growl_LaunchIfInstalled. - * @discussion Growl_LaunchIfInstalled calls this callback function if Growl - * was already running or if it launched Growl successfully. - */ -typedef void (*GrowlLaunchCallback)(void *context); - -/*! @function Growl_LaunchIfInstalled - * @abstract Launches GrowlHelperApp if it is not already running. - * @param callback A callback function which will be called if Growl was successfully - * launched or was already running. Can be NULL. - * @param context The context pointer to pass to the callback. Can be NULL. - * @result Returns true if Growl was successfully launched or was already - * running; returns false and does not call the callback otherwise. - * @discussion Returns true and calls the callback (if the callback is not - * NULL) if the Growl helper app began launching or was already - * running. Returns false and performs no other action if Growl could not be - * launched (e.g. because the Growl preference pane is not properly installed). - * - * If Growl_CreateBestRegistrationDictionary returns - * non-NULL, this function will register with Growl atomically. - * - * The callback should take a single argument; this is to allow applications - * to have context-relevant information passed back. It is perfectly - * acceptable for context to be NULL. The callback itself can be - * NULL if you don't want one. - */ -GROWL_EXPORT Boolean Growl_LaunchIfInstalled(GrowlLaunchCallback callback, void *context); - -#pragma mark - -#pragma mark Constants - -/*! @defined GROWL_PREFPANE_BUNDLE_IDENTIFIER - * @abstract The CFBundleIdentifier of the Growl preference pane bundle. - * @discussion GrowlApplicationBridge uses this to determine whether Growl is - * currently installed, by searching for the Growl preference pane. Your - * application probably does not need to use this macro itself. - */ -#ifndef GROWL_PREFPANE_BUNDLE_IDENTIFIER -#define GROWL_PREFPANE_BUNDLE_IDENTIFIER CFSTR("com.growl.prefpanel") -#endif - -__END_DECLS - -#endif /* _GROWLAPPLICATIONBRIDGE_CARBON_H_ */ diff --git a/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h b/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h deleted file mode 100644 index 4341f3fbd..000000000 --- a/macosx/Growl.framework/Versions/A/Headers/GrowlApplicationBridge.h +++ /dev/null @@ -1,609 +0,0 @@ -// -// GrowlApplicationBridge.h -// Growl -// -// Created by Evan Schoenberg on Wed Jun 16 2004. -// Copyright 2004-2006 The Growl Project. All rights reserved. -// - -/*! - * @header GrowlApplicationBridge.h - * @abstract Defines the GrowlApplicationBridge class. - * @discussion This header defines the GrowlApplicationBridge class as well as - * the GROWL_PREFPANE_BUNDLE_IDENTIFIER constant. - */ - -#ifndef __GrowlApplicationBridge_h__ -#define __GrowlApplicationBridge_h__ - -#import -#import -#import "GrowlDefines.h" - -//Forward declarations -@protocol GrowlApplicationBridgeDelegate; - -//Internal notification when the user chooses not to install (to avoid continuing to cache notifications awaiting installation) -#define GROWL_USER_CHOSE_NOT_TO_INSTALL_NOTIFICATION @"User chose not to install" - -//------------------------------------------------------------------------------ -#pragma mark - - -/*! - * @class GrowlApplicationBridge - * @abstract A class used to interface with Growl. - * @discussion This class provides a means to interface with Growl. - * - * Currently it provides a way to detect if Growl is installed and launch the - * GrowlHelperApp if it's not already running. - */ -@interface GrowlApplicationBridge : NSObject { - -} - -/*! - * @method isGrowlInstalled - * @abstract Detects whether Growl is installed. - * @discussion Determines if the Growl prefpane and its helper app are installed. - * @result Returns YES if Growl is installed, NO otherwise. - */ -+ (BOOL) isGrowlInstalled; - -/*! - * @method isGrowlRunning - * @abstract Detects whether GrowlHelperApp is currently running. - * @discussion Cycles through the process list to find whether GrowlHelperApp is running and returns its findings. - * @result Returns YES if GrowlHelperApp is running, NO otherwise. - */ -+ (BOOL) isGrowlRunning; - -#pragma mark - - -/*! - * @method setGrowlDelegate: - * @abstract Set the object which will be responsible for providing and receiving Growl information. - * @discussion This must be called before using GrowlApplicationBridge. - * - * The methods in the GrowlApplicationBridgeDelegate protocol are required - * and return the basic information needed to register with Growl. - * - * The methods in the GrowlApplicationBridgeDelegate_InformalProtocol - * informal protocol are individually optional. They provide a greater - * degree of interaction between the application and growl such as informing - * the application when one of its Growl notifications is clicked by the user. - * - * The methods in the GrowlApplicationBridgeDelegate_Installation_InformalProtocol - * informal protocol are individually optional and are only applicable when - * using the Growl-WithInstaller.framework which allows for automated Growl - * installation. - * - * When this method is called, data will be collected from inDelegate, Growl - * will be launched if it is not already running, and the application will be - * registered with Growl. - * - * If using the Growl-WithInstaller framework, if Growl is already installed - * but this copy of the framework has an updated version of Growl, the user - * will be prompted to update automatically. - * - * @param inDelegate The delegate for the GrowlApplicationBridge. It must conform to the GrowlApplicationBridgeDelegate protocol. - */ -+ (void) setGrowlDelegate:(NSObject *)inDelegate; - -/*! - * @method growlDelegate - * @abstract Return the object responsible for providing and receiving Growl information. - * @discussion See setGrowlDelegate: for details. - * @result The Growl delegate. - */ -+ (NSObject *) growlDelegate; - -#pragma mark - - -/*! - * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext: - * @abstract Send a Growl notification. - * @discussion This is the preferred means for sending a Growl notification. - * The notification name and at least one of the title and description are - * required (all three are preferred). All other parameters may be - * nil (or 0 or NO as appropriate) to accept default values. - * - * If using the Growl-WithInstaller framework, if Growl is not installed the - * user will be prompted to install Growl. If the user cancels, this method - * will have no effect until the next application session, at which time when - * it is called the user will be prompted again. The user is also given the - * option to not be prompted again. If the user does choose to install Growl, - * the requested notification will be displayed once Growl is installed and - * running. - * - * @param title The title of the notification displayed to the user. - * @param description The full description of the notification displayed to the user. - * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane. - * @param iconData NSData object to show with the notification as its icon. If nil, the application's icon will be used instead. - * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority. - * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications. - * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of NSString, NSArray, NSNumber, NSDictionary, and NSData types). - */ -+ (void) notifyWithTitle:(NSString *)title - description:(NSString *)description - notificationName:(NSString *)notifName - iconData:(NSData *)iconData - priority:(signed int)priority - isSticky:(BOOL)isSticky - clickContext:(id)clickContext; - -/*! - * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier: - * @abstract Send a Growl notification. - * @discussion This is the preferred means for sending a Growl notification. - * The notification name and at least one of the title and description are - * required (all three are preferred). All other parameters may be - * nil (or 0 or NO as appropriate) to accept default values. - * - * If using the Growl-WithInstaller framework, if Growl is not installed the - * user will be prompted to install Growl. If the user cancels, this method - * will have no effect until the next application session, at which time when - * it is called the user will be prompted again. The user is also given the - * option to not be prompted again. If the user does choose to install Growl, - * the requested notification will be displayed once Growl is installed and - * running. - * - * @param title The title of the notification displayed to the user. - * @param description The full description of the notification displayed to the user. - * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane. - * @param iconData NSData object to show with the notification as its icon. If nil, the application's icon will be used instead. - * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority. - * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications. - * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of NSString, NSArray, NSNumber, NSDictionary, and NSData types). - * @param identifier An identifier for this notification. Notifications with equal identifiers are coalesced. - */ -+ (void) notifyWithTitle:(NSString *)title - description:(NSString *)description - notificationName:(NSString *)notifName - iconData:(NSData *)iconData - priority:(signed int)priority - isSticky:(BOOL)isSticky - clickContext:(id)clickContext - identifier:(NSString *)identifier; - -/*! - * @method notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:identifier: - * @abstract Send a Growl notification. - * @discussion This is the preferred means for sending a Growl notification. - * The notification name and at least one of the title and description are - * required (all three are preferred). All other parameters may be - * nil (or 0 or NO as appropriate) to accept default values. - * - * If using the Growl-WithInstaller framework, if Growl is not installed the - * user will be prompted to install Growl. If the user cancels, this method - * will have no effect until the next application session, at which time when - * it is called the user will be prompted again. The user is also given the - * option to not be prompted again. If the user does choose to install Growl, - * the requested notification will be displayed once Growl is installed and - * running. - * - * @param title The title of the notification displayed to the user. - * @param description The full description of the notification displayed to the user. - * @param notifName The internal name of the notification. Should be human-readable, as it will be displayed in the Growl preference pane. - * @param iconData NSData object to show with the notification as its icon. If nil, the application's icon will be used instead. - * @param priority The priority of the notification. The default value is 0; positive values are higher priority and negative values are lower priority. Not all Growl displays support priority. - * @param isSticky If YES, the notification will remain on screen until clicked. Not all Growl displays support sticky notifications. - * @param clickContext A context passed back to the Growl delegate if it implements -(void)growlNotificationWasClicked: and the notification is clicked. Not all display plugins support clicking. The clickContext must be plist-encodable (completely of NSString, NSArray, NSNumber, NSDictionary, and NSData types). - * @param identifier An identifier for this notification. Notifications with equal identifiers are coalesced. - */ -+ (void) notifyWithTitle:(NSString *)title - description:(NSString *)description - notificationName:(NSString *)notifName - iconData:(NSData *)iconData - priority:(signed int)priority - isSticky:(BOOL)isSticky - clickContext:(id)clickContext - identifier:(NSString *)identifier; - -/*! @method notifyWithDictionary: - * @abstract Notifies using a userInfo dictionary suitable for passing to - * NSDistributedNotificationCenter. - * @param userInfo The dictionary to notify with. - * @discussion Before Growl 0.6, your application would have posted - * notifications using NSDistributedNotificationCenter by - * creating a userInfo dictionary with the notification data. This had the - * advantage of allowing you to add other data to the dictionary for programs - * besides Growl that might be listening. - * - * This method allows you to use such dictionaries without being restricted - * to using NSDistributedNotificationCenter. The keys for this dictionary - * can be found in GrowlDefines.h. - */ -+ (void) notifyWithDictionary:(NSDictionary *)userInfo; - -#pragma mark - - -/*! @method registerWithDictionary: - * @abstract Register your application with Growl without setting a delegate. - * @discussion When you call this method with a dictionary, - * GrowlApplicationBridge registers your application using that dictionary. - * If you pass nil, GrowlApplicationBridge will ask the delegate - * (if there is one) for a dictionary, and if that doesn't work, it will look - * in your application's bundle for an auto-discoverable plist. - * (XXX refer to more information on that) - * - * If you pass a dictionary to this method, it must include the - * GROWL_APP_NAME key, unless a delegate is set. - * - * This method is mainly an alternative to the delegate system introduced - * with Growl 0.6. Without a delegate, you cannot receive callbacks such as - * -growlIsReady (since they are sent to the delegate). You can, - * however, set a delegate after registering without one. - * - * This method was introduced in Growl.framework 0.7. - */ -+ (BOOL) registerWithDictionary:(NSDictionary *)regDict; - -/*! @method reregisterGrowlNotifications - * @abstract Reregister the notifications for this application. - * @discussion This method does not normally need to be called. If your - * application changes what notifications it is registering with Growl, call - * this method to have the Growl delegate's - * -registrationDictionaryForGrowl method called again and the - * Growl registration information updated. - * - * This method is now implemented using -registerWithDictionary:. - */ -+ (void) reregisterGrowlNotifications; - -#pragma mark - - -/*! @method setWillRegisterWhenGrowlIsReady: - * @abstract Tells GrowlApplicationBridge to register with Growl when Growl - * launches (or not). - * @discussion When Growl has started listening for notifications, it posts a - * GROWL_IS_READY notification on the Distributed Notification - * Center. GrowlApplicationBridge listens for this notification, using it to - * perform various tasks (such as calling your delegate's - * -growlIsReady method, if it has one). If this method is - * called with YES, one of those tasks will be to reregister - * with Growl (in the manner of -reregisterGrowlNotifications). - * - * This attribute is automatically set back to NO (the default) - * after every GROWL_IS_READY notification. - * @param flag YES if you want GrowlApplicationBridge to register with - * Growl when next it is ready; NO if not. - */ -+ (void) setWillRegisterWhenGrowlIsReady:(BOOL)flag; -/*! @method willRegisterWhenGrowlIsReady - * @abstract Reports whether GrowlApplicationBridge will register with Growl - * when Growl next launches. - * @result YES if GrowlApplicationBridge will register with Growl - * when next it posts GROWL_IS_READY; NO if not. - */ -+ (BOOL) willRegisterWhenGrowlIsReady; - -#pragma mark - - -/*! @method registrationDictionaryFromDelegate - * @abstract Asks the delegate for a registration dictionary. - * @discussion If no delegate is set, or if the delegate's - * -registrationDictionaryForGrowl method returns - * nil, this method returns nil. - * - * This method does not attempt to clean up the dictionary in any way - for - * example, if it is missing the GROWL_APP_NAME key, the result - * will be missing it too. Use +[GrowlApplicationBridge - * registrationDictionaryByFillingInDictionary:] or - * +[GrowlApplicationBridge - * registrationDictionaryByFillingInDictionary:restrictToKeys:] to try - * to fill in missing keys. - * - * This method was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -+ (NSDictionary *) registrationDictionaryFromDelegate; - -/*! @method registrationDictionaryFromBundle: - * @abstract Looks in a bundle for a registration dictionary. - * @discussion This method looks in a bundle for an auto-discoverable - * registration dictionary file using -[NSBundle - * pathForResource:ofType:]. If it finds one, it loads the file using - * +[NSDictionary dictionaryWithContentsOfFile:] and returns the - * result. - * - * If you pass nil as the bundle, the main bundle is examined. - * - * This method does not attempt to clean up the dictionary in any way - for - * example, if it is missing the GROWL_APP_NAME key, the result - * will be missing it too. Use +[GrowlApplicationBridge - * registrationDictionaryByFillingInDictionary:] or - * +[GrowlApplicationBridge - * registrationDictionaryByFillingInDictionary:restrictToKeys:] to try - * to fill in missing keys. - * - * This method was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -+ (NSDictionary *) registrationDictionaryFromBundle:(NSBundle *)bundle; - -/*! @method bestRegistrationDictionary - * @abstract Obtains a registration dictionary, filled out to the best of - * GrowlApplicationBridge's knowledge. - * @discussion This method creates a registration dictionary as best - * GrowlApplicationBridge knows how. - * - * First, GrowlApplicationBridge contacts the Growl delegate (if there is - * one) and gets the registration dictionary from that. If no such dictionary - * was obtained, GrowlApplicationBridge looks in your application's main - * bundle for an auto-discoverable registration dictionary file. If that - * doesn't exist either, this method returns nil. - * - * Second, GrowlApplicationBridge calls - * +registrationDictionaryByFillingInDictionary: with whatever - * dictionary was obtained. The result of that method is the result of this - * method. - * - * GrowlApplicationBridge uses this method when you call - * +setGrowlDelegate:, or when you call - * +registerWithDictionary: with nil. - * - * This method was introduced in Growl.framework 0.7. - * @result A registration dictionary. - */ -+ (NSDictionary *) bestRegistrationDictionary; - -#pragma mark - - -/*! @method registrationDictionaryByFillingInDictionary: - * @abstract Tries to fill in missing keys in a registration dictionary. - * @discussion This method examines the passed-in dictionary for missing keys, - * and tries to work out correct values for them. As of 0.7, it uses: - * - * Key Value - * --- ----- - * GROWL_APP_NAME CFBundleExecutableName - * GROWL_APP_ICON The icon of the application. - * GROWL_APP_LOCATION The location of the application. - * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL - * - * Keys are only filled in if missing; if a key is present in the dictionary, - * its value will not be changed. - * - * This method was introduced in Growl.framework 0.7. - * @param regDict The dictionary to fill in. - * @result The dictionary with the keys filled in. This is an autoreleased - * copy of regDict. - */ -+ (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict; -/*! @method registrationDictionaryByFillingInDictionary:restrictToKeys: - * @abstract Tries to fill in missing keys in a registration dictionary. - * @discussion This method examines the passed-in dictionary for missing keys, - * and tries to work out correct values for them. As of 0.7, it uses: - * - * Key Value - * --- ----- - * GROWL_APP_NAME CFBundleExecutableName - * GROWL_APP_ICON The icon of the application. - * GROWL_APP_LOCATION The location of the application. - * GROWL_NOTIFICATIONS_DEFAULT GROWL_NOTIFICATIONS_ALL - * - * Only those keys that are listed in keys will be filled in. - * Other missing keys are ignored. Also, keys are only filled in if missing; - * if a key is present in the dictionary, its value will not be changed. - * - * This method was introduced in Growl.framework 0.7. - * @param regDict The dictionary to fill in. - * @param keys The keys to fill in. If nil, any missing keys are filled in. - * @result The dictionary with the keys filled in. This is an autoreleased - * copy of regDict. - */ -+ (NSDictionary *) registrationDictionaryByFillingInDictionary:(NSDictionary *)regDict restrictToKeys:(NSSet *)keys; - -/*! @brief Tries to fill in missing keys in a notification dictionary. - * @param notifDict The dictionary to fill in. - * @return The dictionary with the keys filled in. This will be a separate instance from \a notifDict. - * @discussion This function examines the \a notifDict for missing keys, and - * tries to get them from the last known registration dictionary. As of 1.1, - * the keys that it will look for are: - * - * \li GROWL_APP_NAME - * \li GROWL_APP_ICON - * - * @since Growl.framework 1.1 - */ -+ (NSDictionary *) notificationDictionaryByFillingInDictionary:(NSDictionary *)regDict; - -+ (NSDictionary *) frameworkInfoDictionary; -@end - -//------------------------------------------------------------------------------ -#pragma mark - - -/*! - * @protocol GrowlApplicationBridgeDelegate - * @abstract Required protocol for the Growl delegate. - * @discussion The methods in this protocol are required and are called - * automatically as needed by GrowlApplicationBridge. See - * +[GrowlApplicationBridge setGrowlDelegate:]. - * See also GrowlApplicationBridgeDelegate_InformalProtocol. - */ - -@protocol GrowlApplicationBridgeDelegate - -// -registrationDictionaryForGrowl has moved to the informal protocol as of 0.7. - -@end - -//------------------------------------------------------------------------------ -#pragma mark - - -/*! - * @category NSObject(GrowlApplicationBridgeDelegate_InformalProtocol) - * @abstract Methods which may be optionally implemented by the GrowlDelegate. - * @discussion The methods in this informal protocol will only be called if implemented by the delegate. - */ -@interface NSObject (GrowlApplicationBridgeDelegate_InformalProtocol) - -/*! - * @method registrationDictionaryForGrowl - * @abstract Return the dictionary used to register this application with Growl. - * @discussion The returned dictionary gives Growl the complete list of - * notifications this application will ever send, and it also specifies which - * notifications should be enabled by default. Each is specified by an array - * of NSString objects. - * - * For most applications, these two arrays can be the same (if all sent - * notifications should be displayed by default). - * - * The NSString objects of these arrays will correspond to the - * notificationName: parameter passed in - * +[GrowlApplicationBridge - * notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:] calls. - * - * The dictionary should have the required key object pairs: - * key: GROWL_NOTIFICATIONS_ALL object: NSArray of NSString objects - * key: GROWL_NOTIFICATIONS_DEFAULT object: NSArray of NSString objects - * - * The dictionary may have the following key object pairs: - * key: GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES object: NSDictionary of key: notification name object: human-readable notification name - * - * You do not need to implement this method if you have an auto-discoverable - * plist file in your app bundle. (XXX refer to more information on that) - * - * @result The NSDictionary to use for registration. - */ -- (NSDictionary *) registrationDictionaryForGrowl; - -/*! - * @method applicationNameForGrowl - * @abstract Return the name of this application which will be used for Growl bookkeeping. - * @discussion This name is used both internally and in the Growl preferences. - * - * This should remain stable between different versions and incarnations of - * your application. - * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and - * "SurfWriter Lite" are not. - * - * You do not need to implement this method if you are providing the - * application name elsewhere, meaning in an auto-discoverable plist file in - * your app bundle (XXX refer to more information on that) or in the result - * of -registrationDictionaryForGrowl. - * - * @result The name of the application using Growl. - */ -- (NSString *) applicationNameForGrowl; - -/*! - * @method applicationIconForGrowl - * @abstract Return the NSImage to treat as the application icon. - * @discussion The delegate may optionally return an NSImage - * object to use as the application icon. If this method is not implemented, - * {{{-applicationIconDataForGrowl}}} is tried. If that method is not - * implemented, the application's own icon is used. Neither method is - * generally needed. - * @result The NSImage to treat as the application icon. - */ -- (NSImage *) applicationIconForGrowl; - -/*! - * @method applicationIconDataForGrowl - * @abstract Return the NSData to treat as the application icon. - * @discussion The delegate may optionally return an NSData - * object to use as the application icon; if this is not implemented, the - * application's own icon is used. This is not generally needed. - * @result The NSData to treat as the application icon. - * @deprecated In version 1.1, in favor of {{{-applicationIconForGrowl}}}. - */ -- (NSData *) applicationIconDataForGrowl; - -/*! - * @method growlIsReady - * @abstract Informs the delegate that Growl has launched. - * @discussion Informs the delegate that Growl (specifically, the - * GrowlHelperApp) was launched successfully. The application can take actions - * with the knowledge that Growl is installed and functional. - */ -- (void) growlIsReady; - -/*! - * @method growlNotificationWasClicked: - * @abstract Informs the delegate that a Growl notification was clicked. - * @discussion Informs the delegate that a Growl notification was clicked. It - * is only sent for notifications sent with a non-nil - * clickContext, so if you want to receive a message when a notification is - * clicked, clickContext must not be nil when calling - * +[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]. - * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]. - */ -- (void) growlNotificationWasClicked:(id)clickContext; - -/*! - * @method growlNotificationTimedOut: - * @abstract Informs the delegate that a Growl notification timed out. - * @discussion Informs the delegate that a Growl notification timed out. It - * is only sent for notifications sent with a non-nil - * clickContext, so if you want to receive a message when a notification is - * clicked, clickContext must not be nil when calling - * +[GrowlApplicationBridge notifyWithTitle: description:notificationName:iconData:priority:isSticky:clickContext:]. - * @param clickContext The clickContext passed when displaying the notification originally via +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:]. - */ -- (void) growlNotificationTimedOut:(id)clickContext; - -@end - -#pragma mark - -/*! - * @category NSObject(GrowlApplicationBridgeDelegate_Installation_InformalProtocol) - * @abstract Methods which may be optionally implemented by the Growl delegate when used with Growl-WithInstaller.framework. - * @discussion The methods in this informal protocol will only be called if - * implemented by the delegate. They allow greater control of the information - * presented to the user when installing or upgrading Growl from within your - * application when using Growl-WithInstaller.framework. - */ -@interface NSObject (GrowlApplicationBridgeDelegate_Installation_InformalProtocol) - -/*! - * @method growlInstallationWindowTitle - * @abstract Return the title of the installation window. - * @discussion If not implemented, Growl will use a default, localized title. - * @result An NSString object to use as the title. - */ -- (NSString *)growlInstallationWindowTitle; - -/*! - * @method growlUpdateWindowTitle - * @abstract Return the title of the upgrade window. - * @discussion If not implemented, Growl will use a default, localized title. - * @result An NSString object to use as the title. - */ -- (NSString *)growlUpdateWindowTitle; - -/*! - * @method growlInstallationInformation - * @abstract Return the information to display when installing. - * @discussion This information may be as long or short as desired (the window - * will be sized to fit it). It will be displayed to the user as an - * explanation of what Growl is and what it can do in your application. It - * should probably note that no download is required to install. - * - * If this is not implemented, Growl will use a default, localized explanation. - * @result An NSAttributedString object to display. - */ -- (NSAttributedString *)growlInstallationInformation; - -/*! - * @method growlUpdateInformation - * @abstract Return the information to display when upgrading. - * @discussion This information may be as long or short as desired (the window - * will be sized to fit it). It will be displayed to the user as an - * explanation that an updated version of Growl is included in your - * application and no download is required. - * - * If this is not implemented, Growl will use a default, localized explanation. - * @result An NSAttributedString object to display. - */ -- (NSAttributedString *)growlUpdateInformation; - -@end - -//private -@interface GrowlApplicationBridge (GrowlInstallationPrompt_private) -+ (void) _userChoseNotToInstallGrowl; -@end - -#endif /* __GrowlApplicationBridge_h__ */ diff --git a/macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h b/macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h deleted file mode 100644 index a332a6beb..000000000 --- a/macosx/Growl.framework/Versions/A/Headers/GrowlDefines.h +++ /dev/null @@ -1,348 +0,0 @@ -// -// GrowlDefines.h -// - -#ifndef _GROWLDEFINES_H -#define _GROWLDEFINES_H - -#ifdef __OBJC__ -#define XSTR(x) (@x) -#define STRING NSString * -#else -#define XSTR CFSTR -#define STRING CFStringRef -#endif - -/*! @header GrowlDefines.h - * @abstract Defines all the notification keys. - * @discussion Defines all the keys used for registration with Growl and for - * Growl notifications. - * - * Most applications should use the functions or methods of Growl.framework - * instead of posting notifications such as those described here. - * @updated 2004-01-25 - */ - -// UserInfo Keys for Registration -#pragma mark UserInfo Keys for Registration - -/*! @group Registration userInfo keys */ -/* @abstract Keys for the userInfo dictionary of a GROWL_APP_REGISTRATION distributed notification. - * @discussion The values of these keys describe the application and the - * notifications it may post. - * - * Your application must register with Growl before it can post Growl - * notifications (and have them not be ignored). However, as of Growl 0.6, - * posting GROWL_APP_REGISTRATION notifications directly is no longer the - * preferred way to register your application. Your application should instead - * use Growl.framework's delegate system. - * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for - * more information. - */ - -/*! @defined GROWL_APP_NAME - * @abstract The name of your application. - * @discussion The name of your application. This should remain stable between - * different versions and incarnations of your application. - * For example, "SurfWriter" is a good app name, whereas "SurfWriter 2.0" and - * "SurfWriter Lite" are not. - */ -#define GROWL_APP_NAME XSTR("ApplicationName") -/*! @defined GROWL_APP_ID - * @abstract The bundle identifier of your application. - * @discussion The bundle identifier of your application. This key should - * be unique for your application while there may be several applications - * with the same GROWL_APP_NAME. - * This key is optional. - */ -#define GROWL_APP_ID XSTR("ApplicationId") -/*! @defined GROWL_APP_ICON - * @abstract The image data for your application's icon. - * @discussion Image data representing your application's icon. This may be - * superimposed on a notification icon as a badge, used as the notification - * icon when a notification-specific icon is not supplied, or ignored - * altogether, depending on the display. Must be in a format supported by - * NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. - * - * Optional. Not supported by all display plugins. - */ -#define GROWL_APP_ICON XSTR("ApplicationIcon") -/*! @defined GROWL_NOTIFICATIONS_DEFAULT - * @abstract The array of notifications to turn on by default. - * @discussion These are the names of the notifications that should be enabled - * by default when your application registers for the first time. If your - * application reregisters, Growl will look here for any new notification - * names found in GROWL_NOTIFICATIONS_ALL, but ignore any others. - */ -#define GROWL_NOTIFICATIONS_DEFAULT XSTR("DefaultNotifications") -/*! @defined GROWL_NOTIFICATIONS_ALL - * @abstract The array of all notifications your application can send. - * @discussion These are the names of all of the notifications that your - * application may post. See GROWL_NOTIFICATION_NAME for a discussion of good - * notification names. - */ -#define GROWL_NOTIFICATIONS_ALL XSTR("AllNotifications") -/*! @defined GROWL_NOTIFICATIONS_HUMAN_READABLE_DESCRIPTIONS - * @abstract A dictionary of human-readable names for your notifications. - * @discussion By default, the Growl UI will display notifications by the names given in GROWL_NOTIFICATIONS_ALL - * which correspond to the GROWL_NOTIFICATION_NAME. This dictionary specifies the human-readable name to display. - * The keys of the dictionary are GROWL_NOTIFICATION_NAME strings; the objects are the human-readable versions. - * For any GROWL_NOTIFICATION_NAME not specific in this dictionary, the GROWL_NOTIFICATION_NAME will be displayed. - * - * This key is optional. - */ -#define GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES XSTR("HumanReadableNames") -/*! @defined GROWL_NOTIFICATIONS_DESCRIPTIONS -* @abstract A dictionary of descriptions of _when_ each notification occurs -* @discussion This is an NSDictionary whose keys are GROWL_NOTIFICATION_NAME strings and whose objects are -* descriptions of _when_ each notification occurs, such as "You received a new mail message" or -* "A file finished downloading". -* -* This key is optional. -*/ -#define GROWL_NOTIFICATIONS_DESCRIPTIONS XSTR("NotificationDescriptions") - -/*! @defined GROWL_TICKET_VERSION - * @abstract The version of your registration ticket. - * @discussion Include this key in a ticket plist file that you put in your - * application bundle for auto-discovery. The current ticket version is 1. - */ -#define GROWL_TICKET_VERSION XSTR("TicketVersion") -// UserInfo Keys for Notifications -#pragma mark UserInfo Keys for Notifications - -/*! @group Notification userInfo keys */ -/* @abstract Keys for the userInfo dictionary of a GROWL_NOTIFICATION distributed notification. - * @discussion The values of these keys describe the content of a Growl - * notification. - * - * Not all of these keys are supported by all displays. Only the name, title, - * and description of a notification are universal. Most of the built-in - * displays do support all of these keys, and most other visual displays - * probably will also. But, as of 0.6, the Log, MailMe, and Speech displays - * support only textual data. - */ - -/*! @defined GROWL_NOTIFICATION_NAME - * @abstract The name of the notification. - * @discussion The name of the notification. Note that if you do not define - * GROWL_NOTIFICATIONS_HUMAN_READABLE_NAMES when registering your ticket originally this name - * will the one displayed within the Growl preference pane and should be human-readable. - */ -#define GROWL_NOTIFICATION_NAME XSTR("NotificationName") -/*! @defined GROWL_NOTIFICATION_TITLE - * @abstract The title to display in the notification. - * @discussion The title of the notification. Should be very brief. - * The title usually says what happened, e.g. "Download complete". - */ -#define GROWL_NOTIFICATION_TITLE XSTR("NotificationTitle") -/*! @defined GROWL_NOTIFICATION_DESCRIPTION - * @abstract The description to display in the notification. - * @discussion The description should be longer and more verbose than the title. - * The description usually tells the subject of the action, - * e.g. "Growl-0.6.dmg downloaded in 5.02 minutes". - */ -#define GROWL_NOTIFICATION_DESCRIPTION XSTR("NotificationDescription") -/*! @defined GROWL_NOTIFICATION_ICON - * @discussion Image data for the notification icon. Must be in a format - * supported by NSImage, such as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. - * - * Optional. Not supported by all display plugins. - */ -#define GROWL_NOTIFICATION_ICON XSTR("NotificationIcon") -/*! @defined GROWL_NOTIFICATION_APP_ICON - * @discussion Image data for the application icon, in case GROWL_APP_ICON does - * not apply for some reason. Must be in a format supported by NSImage, such - * as TIFF, PNG, GIF, JPEG, BMP, PICT, or PDF. - * - * Optional. Not supported by all display plugins. - */ -#define GROWL_NOTIFICATION_APP_ICON XSTR("NotificationAppIcon") -/*! @defined GROWL_NOTIFICATION_PRIORITY - * @discussion The priority of the notification as an integer number from - * -2 to +2 (+2 being highest). - * - * Optional. Not supported by all display plugins. - */ -#define GROWL_NOTIFICATION_PRIORITY XSTR("NotificationPriority") -/*! @defined GROWL_NOTIFICATION_STICKY - * @discussion A Boolean number controlling whether the notification is sticky. - * - * Optional. Not supported by all display plugins. - */ -#define GROWL_NOTIFICATION_STICKY XSTR("NotificationSticky") -/*! @defined GROWL_NOTIFICATION_CLICK_CONTEXT - * @abstract Identifies which notification was clicked. - * @discussion An identifier for the notification for clicking purposes. - * - * This will be passed back to the application when the notification is - * clicked. It must be plist-encodable (a data, dictionary, array, number, or - * string object), and it should be unique for each notification you post. - * A good click context would be a UUID string returned by NSProcessInfo or - * CFUUID. - * - * Optional. Not supported by all display plugins. - */ -#define GROWL_NOTIFICATION_CLICK_CONTEXT XSTR("NotificationClickContext") - -/*! @defined GROWL_DISPLAY_PLUGIN - * @discussion The name of a display plugin which should be used for this notification. - * Optional. If this key is not set or the specified display plugin does not - * exist, the display plugin stored in the application ticket is used. This key - * allows applications to use different default display plugins for their - * notifications. The user can still override those settings in the preference - * pane. - */ -#define GROWL_DISPLAY_PLUGIN XSTR("NotificationDisplayPlugin") - -/*! @defined GROWL_NOTIFICATION_IDENTIFIER - * @abstract An identifier for the notification for coalescing purposes. - * Notifications with the same identifier fall into the same class; only - * the last notification of a class is displayed on the screen. If a - * notification of the same class is currently being displayed, it is - * replaced by this notification. - * - * Optional. Not supported by all display plugins. - */ -#define GROWL_NOTIFICATION_IDENTIFIER XSTR("GrowlNotificationIdentifier") - -/*! @defined GROWL_APP_PID - * @abstract The process identifier of the process which sends this - * notification. If this field is set, the application will only receive - * clicked and timed out notifications which originate from this process. - * - * Optional. - */ -#define GROWL_APP_PID XSTR("ApplicationPID") - -/*! @defined GROWL_NOTIFICATION_PROGRESS -* @abstract If this key is set, it should contain a double value wrapped -* in a NSNumber which describes some sort of progress (from 0.0 to 100.0). -* If this is key is not set, no progress bar is shown. -* -* Optional. Not supported by all display plugins. -*/ -#define GROWL_NOTIFICATION_PROGRESS XSTR("NotificationProgress") - -// Notifications -#pragma mark Notifications - -/*! @group Notification names */ -/* @abstract Names of distributed notifications used by Growl. - * @discussion These are notifications used by applications (directly or - * indirectly) to interact with Growl, and by Growl for interaction between - * its components. - * - * Most of these should no longer be used in Growl 0.6 and later, in favor of - * Growl.framework's GrowlApplicationBridge APIs. - */ - -/*! @defined GROWL_APP_REGISTRATION - * @abstract The distributed notification for registering your application. - * @discussion This is the name of the distributed notification that can be - * used to register applications with Growl. - * - * The userInfo dictionary for this notification can contain these keys: - *

    - *
  • GROWL_APP_NAME
  • - *
  • GROWL_APP_ICON
  • - *
  • GROWL_NOTIFICATIONS_ALL
  • - *
  • GROWL_NOTIFICATIONS_DEFAULT
  • - *
- * - * No longer recommended as of Growl 0.6. An alternate method of registering - * is to use Growl.framework's delegate system. - * See +[GrowlApplicationBridge setGrowlDelegate:] or Growl_SetDelegate for - * more information. - */ -#define GROWL_APP_REGISTRATION XSTR("GrowlApplicationRegistrationNotification") -/*! @defined GROWL_APP_REGISTRATION_CONF - * @abstract The distributed notification for confirming registration. - * @discussion The name of the distributed notification sent to confirm the - * registration. Used by the Growl preference pane. Your application probably - * does not need to use this notification. - */ -#define GROWL_APP_REGISTRATION_CONF XSTR("GrowlApplicationRegistrationConfirmationNotification") -/*! @defined GROWL_NOTIFICATION - * @abstract The distributed notification for Growl notifications. - * @discussion This is what it all comes down to. This is the name of the - * distributed notification that your application posts to actually send a - * Growl notification. - * - * The userInfo dictionary for this notification can contain these keys: - *
    - *
  • GROWL_NOTIFICATION_NAME (required)
  • - *
  • GROWL_NOTIFICATION_TITLE (required)
  • - *
  • GROWL_NOTIFICATION_DESCRIPTION (required)
  • - *
  • GROWL_NOTIFICATION_ICON
  • - *
  • GROWL_NOTIFICATION_APP_ICON
  • - *
  • GROWL_NOTIFICATION_PRIORITY
  • - *
  • GROWL_NOTIFICATION_STICKY
  • - *
  • GROWL_NOTIFICATION_CLICK_CONTEXT
  • - *
  • GROWL_APP_NAME (required)
  • - *
- * - * No longer recommended as of Growl 0.6. Three alternate methods of posting - * notifications are +[GrowlApplicationBridge notifyWithTitle:description:notificationName:iconData:priority:isSticky:clickContext:], - * Growl_NotifyWithTitleDescriptionNameIconPriorityStickyClickContext, and - * Growl_PostNotification. - */ -#define GROWL_NOTIFICATION XSTR("GrowlNotification") -/*! @defined GROWL_SHUTDOWN -* @abstract The distributed notification name that tells Growl to shutdown. -* @discussion The Growl preference pane posts this notification when the -* "Stop Growl" button is clicked. -*/ -#define GROWL_SHUTDOWN XSTR("GrowlShutdown") -/*! @defined GROWL_PING - * @abstract A distributed notification to check whether Growl is running. - * @discussion This is used by the Growl preference pane. If it receives a - * GROWL_PONG, the preference pane takes this to mean that Growl is running. - */ -#define GROWL_PING XSTR("Honey, Mind Taking Out The Trash") -/*! @defined GROWL_PONG - * @abstract The distributed notification sent in reply to GROWL_PING. - * @discussion GrowlHelperApp posts this in reply to GROWL_PING. - */ -#define GROWL_PONG XSTR("What Do You Want From Me, Woman") -/*! @defined GROWL_IS_READY - * @abstract The distributed notification sent when Growl starts up. - * @discussion GrowlHelperApp posts this when it has begin listening on all of - * its sources for new notifications. GrowlApplicationBridge (in - * Growl.framework), upon receiving this notification, reregisters using the - * registration dictionary supplied by its delegate. - */ -#define GROWL_IS_READY XSTR("Lend Me Some Sugar; I Am Your Neighbor!") -/*! @defined GROWL_NOTIFICATION_CLICKED - * @abstract The distributed notification sent when a supported notification is clicked. - * @discussion When a Growl notification with a click context is clicked on by - * the user, Growl posts this distributed notification. - * The GrowlApplicationBridge responds to this notification by calling a - * callback in its delegate. - */ -#define GROWL_NOTIFICATION_CLICKED XSTR("GrowlClicked!") -#define GROWL_NOTIFICATION_TIMED_OUT XSTR("GrowlTimedOut!") - -/*! @group Other symbols */ -/* Symbols which don't fit into any of the other categories. */ - -/*! @defined GROWL_KEY_CLICKED_CONTEXT - * @abstract Used internally as the key for the clickedContext passed over DNC. - * @discussion This key is used in GROWL_NOTIFICATION_CLICKED, and contains the - * click context that was supplied in the original notification. - */ -#define GROWL_KEY_CLICKED_CONTEXT XSTR("ClickedContext") -/*! @defined GROWL_REG_DICT_EXTENSION - * @abstract The filename extension for registration dictionaries. - * @discussion The GrowlApplicationBridge in Growl.framework registers with - * Growl by creating a file with the extension of .(GROWL_REG_DICT_EXTENSION) - * and opening it in the GrowlHelperApp. This happens whether or not Growl is - * running; if it was stopped, it quits immediately without listening for - * notifications. - */ -#define GROWL_REG_DICT_EXTENSION XSTR("growlRegDict") - - -#define GROWL_POSITION_PREFERENCE_KEY @"GrowlSelectedPosition" - -#endif //ndef _GROWLDEFINES_H diff --git a/macosx/Growl.framework/Versions/A/Resources/Info.plist b/macosx/Growl.framework/Versions/A/Resources/Info.plist deleted file mode 100644 index c63bd7941..000000000 --- a/macosx/Growl.framework/Versions/A/Resources/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - Growl - CFBundleIdentifier - com.growl.growlframework - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.1.1 - CFBundleSignature - GRRR - CFBundleVersion - 1.1.1 - NSPrincipalClass - GrowlApplicationBridge - - diff --git a/macosx/Growl.framework/Versions/Current b/macosx/Growl.framework/Versions/Current deleted file mode 120000 index 8c7e5a667..000000000 --- a/macosx/Growl.framework/Versions/Current +++ /dev/null @@ -1 +0,0 @@ -A \ No newline at end of file