From a927af03d37dd470fc3ee0b729606a72e6b6a97f Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Mon, 10 Jun 2013 13:30:10 +0200 Subject: [PATCH 1/5] Add hi-res icons (http://sourceforge.net/p/xchat/bugs/1504/) --- hicolor_apps_16x16_xchat.png | Bin 0 -> 1064 bytes hicolor_apps_22x22_xchat.png | Bin 0 -> 1536 bytes hicolor_apps_24x24_xchat.png | Bin 0 -> 1724 bytes hicolor_apps_256x256_xchat.png | Bin 0 -> 28634 bytes hicolor_apps_32x32_xchat.png | Bin 0 -> 2418 bytes hicolor_apps_48x48_xchat.png | Bin 0 -> 4018 bytes xchat-2.8.8-hires-icons.patch | 85 ++ xchat.spec | 51 +- xchat.svg | 1802 ++++++++++++++++++++++++++++++++ 9 files changed, 1924 insertions(+), 14 deletions(-) create mode 100644 hicolor_apps_16x16_xchat.png create mode 100644 hicolor_apps_22x22_xchat.png create mode 100644 hicolor_apps_24x24_xchat.png create mode 100644 hicolor_apps_256x256_xchat.png create mode 100644 hicolor_apps_32x32_xchat.png create mode 100644 hicolor_apps_48x48_xchat.png create mode 100644 xchat-2.8.8-hires-icons.patch create mode 100644 xchat.svg diff --git a/hicolor_apps_16x16_xchat.png b/hicolor_apps_16x16_xchat.png new file mode 100644 index 0000000000000000000000000000000000000000..b29fc17a74f5a070fe1d0bb5a124dfd3056ceb68 GIT binary patch literal 1064 zcmV+@1lRkCP)P{QzDxiB02FjZSad;kbZBpK07_wN zbz&e>bY*F7Wpd{G_b&hd03mcmSaefwb#h~60BCe{a5^t9YH4k4VPh_Bb#rNBXklz@ zE@OIWX5(G}00TftL_t(Ijg3=ZOj~srJ@-%Py#?E~6qp5Z!;Yqd5eka3IH#ET1GA}1 z_9si0xEYiApnLH_j4!Ce?a2pBj4m-gXd(pNP_vBd07a5Ei#SKKO2ILyFe-(6xwkF7 zx8?T!e3%-tWXVo)lJ7j6^X1Ez!w^CM0B84)bZu>ZbttbU7Uh}Y$KSa^Ru3x6>Ey`lLw{iOeg3)BuV*%Bs*lnsfzo&*wX_L(^YW?X z;U0K~d*GS-;q;27O;9>rPw7+%rKyjoI{TS9cCM80He1cdUU8O3ydR(i05`y-PhfjX zU!_$PW*C;kw&o5m6F&|Zi97dbZ^G$l;#}Ug^UT+8?>t++>)GxVE&$!M<9@)i7JNbq ztFe(jUJbnA72MU<{-+5m3MKayP%K&)9Ur5a+NuDb&8{D*+Y@5dToGzczo&`brR#Py zF|pWh9c*rW{hO=dv4WP?P_*bhX>FQUR+bT-xMCWHG011s)wj~=b$xm|deSNu#k)6G zxm|ev@F`pzI1g1*0RSa7n_^MsOEYivGK3JcrzKDD$B@Q#fwIQsWDC0WSV)5RTX_hOPSF8odCRm3cx5ur1&81m9F-`J97Q2UlbeNwXF#s z$PrlSEatX%;Z|CNrsyV@m(|NR*^*a+iY&5^gy2|Qf|M8OhwxP=Y{w^$ucb^w4t2*JN?6`m=> zK!3nxeP3Tj54a#Vh^QrmfCqq>j)fe}g}T>rgNB9hwLH2BA;y27AcPo_B)zQ7Ye|8{ i?j*(GKMgF@0Qd(|vyx5+2zDX>0000jqIBM literal 0 HcmV?d00001 diff --git a/hicolor_apps_22x22_xchat.png b/hicolor_apps_22x22_xchat.png new file mode 100644 index 0000000000000000000000000000000000000000..5f4a083e4cbfc08cd1065d318e8b854dcbd1c7f8 GIT binary patch literal 1536 zcmV+b2LJhqP)P{QzDxiB02FjZSad;kbZBpK07_wN zbz&e>bY*F7Wpd{G_b&hd03mcmSaefwb#h~60BCe{a5^t9YH4k4VPh_Bb#rNBXklz@ zE@OIWX5(G}00kIHL_t(Ijg^&YY*bYg$A9;|>B5vw+o8i!+CtlDOIezV3au1DP)2IO zB_>8cxW$CHBof6)6os+`BqYYT1Y(FLYD^S_x?x4d5`}6M+6HPXowfs|Ez@P%na*@( z-n@JL(1IY8sajQ&nU-DJkYD+pU8o*HeOo5T=LplHJxoSKAXePyO+eUpk$BfX!t!nbUICG|sQwWf#4# zgZ~@AguwU2JMI*zIcrM`0{fH1#cwL2S;foZxV!^ocw%bF<;Yo8G=96+*WFfA43Lpm z(O7)XOKGBO8~AG{;14n<>1X&WSl39{omj1i*F+GP{cUWBUgY8YOEtq-vfj z@c%Yxh+nRj;_xPW_uWgU%(Nz4o)k#(LZovWprN_9gTH=KXxLK5@n5@p#BwK#pRSmB zyrR@$pCa6olUp+Y4MH~@5&$CBQjVSM7FQrl= zk*GRUeJCo`+D2<56?sL=Xl<^ebzIQ+)mgNR3(a+0Xs#R0dhF~f-joVcDLOkn zh*w^JHG0?D2jjBlI!Ajj`CR;`Ty10Lr8Z8~9EpkB%9nnfo0Gd-A#MMcY?|H9qZ?l4 z+Km!OdD=*_na1wEhNvDp83a;Bui?duVWGl0SQ(R8bpGiBmi{@1zgFviLyH? zID70<%6m_#+F>;`7z!*EyVuV3J~JyJ-R5n%aTSCHDGt20ED|CCQY;F*9xx&d$KVa$ z4C>QM2pb05Ee+)AhI+?qUeOQUGGkAop=*hjco+(R!M|$ikmR5z&cV(GPv~TKz_>NV z7H6HF1HM7xBT>pNL3(=oxi~cgcic?MEHRN5@+ayGa%XSJ_H^ixf-;hX4!wP&q%i?; z$#jy;j+UOl;lG9+IoBIG)EyqFyxF2BBWGUko+^qm$g1#0k8l$OROB-GH0rJ zHZM+Hn4hE`uxtKwopnGGAY3jNWB;Q7lG1h7txv&!CO=V~%864?O~YJbQP{QzDxiB02FjZSad;kbZBpK07_wN zbz&e>bY*F7Wpd{G_b&hd03mcmSaefwb#h~60BCe{a5^t9YH4k4VPh_Bb#rNBXklz@ zE@OIWX5(G}00q=ZL_t(YiLI4eY#e75$A2@kyY_l_eOY_$b$qLxb)1X4i4!NSNs~39 z>CieM?L!bk6>7^vLyI6(g|@aJq&1}oq!uBFXdemzAt4Z{nv`Vg*wnabXe!JvlISW0EeH+g4P$ zXJpI$KduxPzYpQlprs+=CeMCIEUI?3H!3eD2d>p$5KedUx!cyL(L1!Um49@JbU8vxvXS zc6#l%7;_`W;%q8);onYOrC(Y{`cbY}-aag>#Hk*c&)gbW@e^|L}DSSyuwx=jfPw7>*_?K$pRW!ZFN{}b!f}+ z%2iuYU!Bu5$ZD`KKTGeqQ|hS4b6VKCb!$~gS@CbHYpU;%1i>f@0RI~Gzp312=Sz<~ z!S7yuiN*ODvKnMHEji=+WN_yC?ALU5yWMA+a6eR#s2to{Y{@tJKNi+>5(LoafgnOE zexq$*Xu64?&dsuG&pj+n46}Xl1MTmjL`d^157lm#y~5FL6x+(HhmX`2)mUdoZ(%M% zVJU&a8VqR#laPglDafP=WuQAy&4jI)STe;6x(_Kgpq-dYOvMxN7Rgz{kt6lhhb_sh zm?ugQS@pZfh)__*VqQ7Vdp=2Cn2V{qiY&UkvfIG#CqI>8k1ovQe1Pi~JCg=G?P5YO zD~fqInpuzFOW)$oJ9IOif6F8d;>;Ymd~*qV;(ElsVk6hO4qQN67V<9mHv4Ej}1 zl;5A4;b#(%y&TmBLjixYzSvq{^3kx6s@+IYL}5B9&^ecgo%6-NGLz&@APS_z8K!4r zs%JbLKCmOSq%Uc7GOaIUyze}Hp-A?9h2HaijsgLe4}Bf5zRkq>AJkja!S#9CWV1y( zTqZ?r1`Y!jK#*lQ#|wbPX5jDxB}B(Jo3w#?gZ5Y{YMY7kz||l};s=?(T(+ z=luT9dEP!R?wgr==6=ro-Z^t;&LkK;)g~imCI$ciWV$*UCIA2s@Si~l006)X-%2L{ z008z=(=~%YAdoP~>v#YFK;*4si@~tk&gIJV&IDV4)>F?t5 z;__nGV#lH|N0(NpwbS;e;QaBO`|$4Zn_w+}e}9Q2t3NND)IJ@8{=B4b%u)D5+#}-j zAo_tYpfP8V^yfFgpO^Fx85=?W`Pu(}CtWga;0ZtPt`0QY?*0A!htC9li~J% zh5x;)Q7DfEe3+0p54Y1(7c|?$XX*F%5XemUd&j1%9}E$L;xfwUdwgBfD_t7pXz0Idt_AhT8xf~4qKw7_K`^YqsueFCS0K=cD%{6dXts2*D6 zCR{MNcr#9tjd?`lRdWPCxv3acWxP41ENsV9FW-`Pqf6j4`1pov95s9qSbsiN3~)LK zeEFaZTnNtoZp1A(CxbQ+Jq`Yv%zLxM{V|kYw$d9zU$vt*<0ZJ2Pn{zPl2F@V91(i` zIPOJpHB-UY;BN6bd%b3Q)3$Vd@Xw+Mzk^49EV^K=Dx@p-xv3gJ&xIB1UZiC*{Exw% zrz}yG^9gXeH2uBwuW!hgV&Q^UxhLVAR5{mI)>j}2;&TRWcd<4pl^fd&kJy324`M2| z**-##GtM;f?~QkDvrLA{X1uoV)r#$&GI;6Ddzq8;2rT!7CG%Kfqy}?*i06sXNio6RX3d(ds0gK(|+8kf4E}G>b^Te9Q zl=mF51d$s$U%J`97$BBWDRm0B<=UzIp@5`At&FyhQ%3*AP1Z7T{h)&lyUIjGck=5G+emUaysEuPM=F;!2pL_Qr# zzAn;lQEu_sZ1?#jR)oYoGa}gUo^O%7JpmZwcVr0cU1iGQCpp`o>qPjcn?~t!1ko-s@zhf z2p=%}{rWOTt{*0Jr3gPNr(Cs%)Sj6j zHiD%ooLtyEVV+&l5sH-@QLefRU(LFv5U~oq;yCd8ED?|lFLKxy3XzDhU4(Oi6W8-C z#;nb7&6;{c7?wa>r~K9eZ7nj)arB*_CBmE+5PE$mIHQs%m7=Cv^e3(eFH#$a?c(t0 z#9p_s6hX?rzWQA5jtQWv@#Ana0B9N;(c-TaIAAkA=PqtGrM_9dNZN>Yr5YBsR?^Sa zG9h{&iRPU@5noxj#?rC5BMbNtUmaYS+sg~_qbi%41QJ!KKxt6kAL3OV9<7kgtoj@W zp%_79ggG}rlUe6$a>)c`8W8*#wsxHQs0(|oJb}ll-w&mP*zd}<*A`b1yUjn0e@3cF z1p%r-S^%KUPF^XmFT(N>h=3bh-Y|XSlJE9Q3vgxpmN@O6;r}?^jwhxxolLVZ6EVt_ z7rk^5YA!wQyyEDYWxuY*5#4Ve!RmHh(ww`1D_X(P*whHuOS99@}fw{ z&c2db;p0IR?gl%Q{sk>}cs`6$)t}~}lz8x-^IUkSK!bECMF&ikP6t`DBC4y`0sD6I zgABLmB9|n0?iCmws)2qJlqc_rvE6ddh~w<1lE* zI@x~W=pAOm5vahjN5AjjZ!Ulbd1OIamw{`EJ!sx~>1H`L3gwTy zAXHq4(+|jdJk+~3%+2!B+nc`!b4wn7T;E2A+xB?Hqr)K=%DqZ!c^2(lX*oN=Am3q{ zG-#Q||K;*n4$p1Suotamj@!`JztY14hK|eDcT0|bUV+erL1CIh88E8%` zoZl=1`#>G?9Z*@W)gf?NH~)8@w@<1Y$7mwWe%7{;Icg>LXr$p*au<)4oR>d$T*(@M zNk@-vb~2PtX}q6C{i)^ZrH>z12XAwhvYvy{cOH3m7tOqP|Lz|jbtC4F$Xn&fwPm@C zJ_g7Of+UVNap*h_kIwC8X{KIiq{?HIxp^V$V&X1>Fa|Vt*6B!lO_Nrsu94No4(A8; ziSI}8*5_Iu1yFb`-}ij|d#u8|p@9`?`449$^txT@L`rhFfczG&4mCTfESz-KUi=DEzw2xD746@8QTl8 zxqPzoTQu=o4xfGo<}(BQv_~bSD=*7D4qqEfef+KKik_R2$DSGNHv(H199S)gVvZho z!u#>>6_}Yaz08U$?I)VIK6gj%fc;sF!w;~*&a(8gWj*Dkq@c$Tcr@7MR;<@H?Pr`do_!>R= z^#MP7kH+0tSr9=(L;LfcDEf!Ar%Mrd(=!)oF!F%{(dxs#2-XZg%C$8v30lS<^J8XI zjN0cFiX8>ZGjHc*4{G%~Fsi18nRdoty*HFp%bU-!n@U=I2ns{+x(8(XfLw<%qL`BU z^Umy2^P`2e1bE(mvW)#FOQv}X4HsbJDOP;>s{T$Gd8@_E2({k_ta3PZwn$H zGZ3_->@&w)$?&jHt?|loL6^D2pD~B3CpBHKRoLbmb4ieIjBWNwcA=4=A8 z|1K!do<215pH12uSdZVem_O%#Ya)jV*NHg?la6WTTo}j9vz=C1>Jfha_tMLnez(=@ zBHwkEjWH0&7h}-tUU;eVD3ON9lPX2Z7rFaW&e7{Uc1!~F zb#MVMvIkZsQvqQa0W(jg^%Z<$CGHb8%4Qr4f_}P_DdtU*c)`f(SGiVJ%LS&GNS|$W1RHZ zNxCwMp->ziIi%_|_jeciO*HKnCD7}lJ;hVMa5n#%OTu_lxniSAK3UcPY_J?~?>A!C zLUXtwamw?GDv+TY@`L;GtvH{GoEVfX;mw<*w*-HtS{w9SqjMDCTTSR;d4AZ0C@ANW z7~7OS9fn=ES06uOAxTrt(s*=8cpz};_407@hLdWa##6t?CGZtUhnDunS};A??^TN^ zh52)ELw7-CI~xO#(d%6Kylhd~Din3#C5abF+G01P(}6MMHsQbzS0Yuy_x-*;FYs*$ zI-4O1YF$yug1pJK<&pqyO52><1y@Y&wqsP)`R(2QZq_NUr{f%iv?DmEineyQ~ zWVcMwPt~6sdi?HZqfn^dVOSnXjPLn=mlxk&(+YSmjgk)ATP~>TI=o{Ug(G(Yxv_CY zZ8V`z6_Rzr{~TQmwJ_*_zmmpWG4fbbQdxpOuu`R6FbsK$*@5-;#GfWY^l4F+-@4YH zHh$$bh?w@ixHmU1oZ+GJ8-s_FhQNp<9}3v%>cm`^vM|mpQcmfP^Z3sLeKl7_e{;_( zoDSsQS5!gF%m6?0&~{-r6>b(bfzeD5%1bbmQbOT(UE!B7=5%x`%aLK{Bay*Ch1C#H zjjLe~1Mub-zAtutf#vx(L2(d`Di#-kS?aKS5k8pbWcsiOo?n1Y#?)?|w0W_PoTzjC zs8Q!iOBdk*>u9gfv}hn3M8Zb#3{&bL?=3MF`T)M3bDY6pLki0uxUPgfHSs4fNUpuS z*tN7zq>=O+@#6e!B8KX~IfI5z)Vciaz}w_Dh5iV2y)Sp$yERX^=apnq zxBwfC`6`;=|CN3q&fqe@-OlSXUy=U#ffA~~M-(AP_>J2>kM%<8BZ(#WUtAJ=$WeCu z3e5hu*^7q?E<_!fzz3U{f#8#Z+BUuD#ZVm)GLiok-kqt01Vd3%hEx*eI8CK{O1ES1 z=0C!MC2K({#%oLv1f7F#zl0ZI7dBt^Pon5I;oXE6)5b;Lgr4_%`C(>Yh|PP5f=FW<$ZfvVj;@N+Rrn} zUorAu+^%(&c3r6V!Ea>_Rq(Ig*7%-Ed}u{FEf-Ae?4k|bzkT6#ciy2y(;jpc;H1J& zD@hdGA0F|;PO*)R3I~CV9#ND(HS+M*gf7wyKY#gVWqmg}dF~(CxS3_3eep12vuZYw z;PZ3hG^FZ}CiQ&?D^86r9r;d!aa;xVX$jAwSFxr?HZpj(4Tsix@T5Vy&a2gffwrTm)Q=18$RAl-=%SI0= z6hJF)ZJvpaW-|9ns=Y1>l?E{s1= zHrW{7xuy`^KKmFL_Sk>2%H3f4=;WQc?51)(+a%5*#(QbG##5*O-$GRfz;{L7Oo0N!$)3-8Zn2u+r`PK8-qk2|NbU2zWswW(S#y* zxUtPfuRcM}akqDK9Sn9psJzIZ^lGZ9=xs{W?DK?Y-repf3d|NQ6hV;yQ6RxHD16-U z5P}a8#MITlx=Ods9<0S}HD{mvriz>-Rvl~yIg+R(%ptvKqxygd(%-l-1X<^KhC2ut z?H#x1#T+MHfRoig7I5pdcE}5sgHho+2|Bd&z?dFaYuXNnr*20-k9ZSQ#C}mnF4YXz z3#nl_Z0AG9r-a1=@6k-22-nvcxR0LDn;t@8IUo0zP^#^>11dCX9$Gr-5j~_q`6@q@ zd=JhSt`1s`I;6Sz(oQ0aQ5u{VjSc~d^y2m+AR|wN^2xV4GP{VO9lW}rQK|B;G~}OS zFiMD`qOZj31LPl85E{c8a)gV^IWKcHcpgV92#bRD6o5GX3;ID@W&WnOrV&&EgP3tm z&N_!u3wN}%GL;SGGsiX+G3f?#f_77 zf`~9#g;e$3VD@;?bXupd>V0 zfZ!!uI-QrWJYy43EkWj4!drk;wgSAe< zVec)#TKi&V@6kzh&jYl-%jTlhfyxQ(r;^ehq2nDkzm-MP)`%*T)h&!e_K$SFdE0D` z3cK0i4xF!%iyw!nBVXD?h83sP{+@h`rzH$1dxm@Q`@}0U*)Dh}`-h+1!l&Uln=KIH_`j%EplGIB_)l${)>kjr-}64 z0Mea-^yuLV$1tbpk)6AHYbQJ+&%1qjL~(7Ww++<3e1wBIgyPu9eBf-yxLx@{_{d2~ z8f3MMELs>u_O&UuKv)1YXe7{@eR4sZfk5T+TE2LzU0DA~XW085<5a#y7_i1$yNI}7 zo=!t6@o=3gyeyo&0)wp%h;#&X@!k7czEyVZ1ujyce>_~{VLAt~#)X16g9~DP=-|{# zIJIPrK@ZlSsmec&=RVKBxMT01AbN+V(Fg1+QhAK(Z~~yhbqF7PCn^%ridnRwGJ2P< zv>8a47~i8a%+Pp-6U)BkO^2PijUQ3$Yeey>PTO=Ko6w+uUQN#)uX(oV;UjUdA$Teu z9_SaFE%`>C2ULHW>^G>1yWU*8AK~lHRMKf?q&*}~DQA&j1`2FrcMd?i@FMly=)f-Q z{eat*(J&7)QOKtBgcP06o49nOHait1v4GkLgjDRk&2-xH`-NT2!n9fOIixt>e((sw z<*G^^G&&j+UAsj=aQO%|%WSk$aFUMmEFY7>J>#T`WT3?OO+5etj|U`%I6pPS3;$cv z3?~d!2z%7Vk$wBPe~4-LLXLEU3&5>`BWc5Z!r)eKu;)LeHL~hnIDeK~^G?$lw)tZ^ zZ}wqBywHD4<@`R4yckBK7NDs@rI!VfG2vQd7_6-^tOEpti+b4kFyMiUE!`@0YaV(w+`&dCF|fD=@!c1#kWT4 zuxakyqyO+CC|o&H!pUP()iHyNyT?OQ0Sv%R^Z8Ls^9SXy69gJdVSCu{G~3U=VfmN- zd!F6F5kxsEJjv4TI$y<)>bylXYCv`2-tu7@T8Xt1C8)QPEP%N%%Ao&cPwfbeoR*H) z_(YMj>fDhoi&yo<-ph)y2B2~V&BO&h2jsWj;B3PJN_@ig7)te3rzm$ntGF5#+2;9+ z2bZfqkAGFb#s}J~YY1AVze7G@#wt)emtY7Ls{VQYD;h8c3~) zEY3a;fxb{cx%bs`P(!%Gj}oya&)*k>NrT|?K~G7%=2%e6;GDYzqT_#n&#vcP=YLVWy%yx}PZS0#!gCrA5D zseot|Vrlv`amHP*;0I!=Jyc*Q5&}QDyH|&+Lc?4pWJ9bJW38nj*0r zIv`XXoJCI`*&I6=(3B96itrw00OH0_WTgwkqdNWJC`p;o6WhPH-Gi3jLJWuf?n~HF z1~!`WW;4u$j!zlWWx#~pa!(?N=EO2z^Pxm_?ewOcb*Yy=VVV)Rkt>bF4t(htf4cMo(#jMKO8Bom z9cUL7XT96n3tEZ1N-xG@k+I(*+Q|{2W$q|-(NPU`r-<|UgZKeencMNk&20Ol$GVevrFo=FN3hN^+>i>zM3OK7 zPbEW;2N2s1ZX*-M{JGibILvS5?ij0{&3a;U zY+x^@9kUbS+W%|f*F*RldEtM?xqoOQ)44Dxjh>Tc$2JT*%8R1u2Q?9shC1Kci}U#b zsxv(AO~TcMOxQS|PiBfXR{Pzsa@yK8#j}i^_QM_QRjuFVSyqU07eFq*4nNF?2nY!PUjTE|NFvRsr?mV% zVtR-_kWx`59w_R98!+E?+n@O!ZHTizhsizA2PdW@>9$}8G zVakx4T;>-a&=Ni%qur)waPMb5d$FD!Ey#?#ojJGPrSoh6ox0E2DMT`mS%B!iRW{SU zZ3+~W0{$Ce;qM{R{q}d#yN8<4#*{?IH%?b5L|6M7CdtC?ZD?y*tj_SI2!iEkUW!i2 zsU+@c+orM-)%bq3rw-AaZRTxB><9w$9)o_De~8F_bABU13((JC16;PeoKwd9ZH4q? z@IFZ##UDm@7==L#C?P7rlXQ`_eg{9wOxlBq_CA?{c1??ZYvfU=&8pV<4SmRC`fSGK zp|PU{$xo*C9Hj;V0)@`3CIjjRX02@%(ACq&X47h1U&Mcp1O9l`dIljgge|({XQtK( z(7q!a0Y=f_;d)uA zEgtUNTK3Upfo(qtoJ@KyUwJ1s(DU2dX+s3XTYCL@pyhQYV%)a|@g(A45E0~7NQnxc zNAkmJ50o?R3$(PgwI@$597I5AsL%IS4^-1+>s$@j%Gf(vkmU!R&jS*WY%1-Ms`v?q z`dsVAGjB(eiE=z@0nadww%3m$e^BM6s!Y%U2kp#w`f0rXjV0D54bCfEFBRDZmY0qi zc|UGB@ru|ukL$>K5wR!FT~nj(iO`N%=0}{fzO)zjSA6gUOL|_xsyh`IQ8$jv%piT9 zabz=>1Uqx1OV4hr&aLye4EXy9yjgWqPMsZGRl zN$H^o`5DVJbXV)9p#<$E%gCL2>@tk;zPPYW!0|P-fM4ZjbwlIO@m}MeT%DGUNLjWB z&(b6iKSALy;akz?p*_h&;BgQ?`N&vCo#S)WfAJ4lpg(+bAaLoBf6dVL$IJ-dietdiFk z#9||QJm9%FW~;f^E{*NBitzrzMUumYvIZ#lHiieHA;LP`$R6IEQ&S!i^=2%$pC=}MDj8mXw17^pni_sN6mfrQ_8#!_wR z*gAbLQn(Q(&82ubcCDqydBU}=m(9CN7H)l!=uJb#sNF>}jJTv7HF zXp@v|4Vg~i&QY8o;K&fqB~{8dz_O1Y zodhmpv$6YoQCTqfo8JYp2X#4H91I5(j>LcuNBBM7>BBcGh@PdCvWCWan#kvl^_P+a zbShMZtI*VZuyNAky18T`jjZTb!DMd13>rIQWqfa_ zlfYAx5!q4CUR=RCh380SS4>{$+Y}G%J3Vm5L-}ns@1u= zuU*9XeHM}%hf6oWipBjz`Q4-6=GQRpkq`j*FV_ks{*b`e=9Dik(pPpmzV~q%m54Q$ zNe9B;ANTZfLrU0dYIcww2ELL}UTLU6ECG+`re`EV<%#yHq^k}2 z3!T#t_ple|<1-r7q_>+K!<;a~$Ed)F%TK*HZuzN`Oy!4z(k)24;qz?t3wZrA7-JcL z_6$T!)%`3@f&+bKi1Rwt?0KsQ95Q72Ne84$Xv6{fD%IV+{4--;3ajo;+?%vz%P6MN zM_x?l!^^98KgX>EB*M$>_p5Fu$Y*(B^M+K4;(u-(l!l?WOfl4kY&bTO^ZZ^t{8Knq z|My8IBJE0i@Mv6`R)+6@qJ$P8u#10N$4%8qi4I4Tj0uCHA209BkS4&@;vk2M?<5W; z|5;NdlGppGlBvz7thc;v_e_bEX#>98DbaXgsA5X@A#-TbJhHs1GEpT}t};(q(_dK` z2ctUzriWkk$@P6ZnK)VJU%GL!Qg>v>@4CaivF1$E{;q=8in$Et1MKGpRs z*uXemQ3DWA$M?jW_YwMB5~~y8Z{N7YQ?6~XkR){7^J+-MHQQ6EooPTPNclNL*M60A zexY5z7gK_lG$d*WeexQ!T=`N~sX7iLvL~!60GI z8FK!|lH8`x6{(E496of9dT+Olh)r&)3+V9btizuoH{`M&YGB#N{|lDaHJyYu;snB} zqN7ko!Bp`=>P*q3HIENFf8bFO7v(ke(MA6A;|!x`4Gr2(R5^Jf5%jX*i6n}W*o3TO z6IpC8OCBv7jT!qFS(V?i~wQ!&5!{_!=ABAu(vkh zAw#|<*}hAX-5NR7+!ws2ot`4XPi!~&4wOPBb(}sb6@f_uzK0^`75C__>oLQprsw@K z5P-g?{RBfK9ThLPl}@Q|tNcC_ph6c9r(OQtne$&U`8EEsFAhZ*}EEW^p$R*)X#HiDlzRCG9e>C9{DpXWA(6@3NQ61=%#_`h%U~i%U z?J5ulJ>h<-d;LqzGaugcils^}{_V9;Akn!I%cIV|WTHPajzbl~w0KM|T){?Vp%;KG zj|XY5Q1>1qW46va$Ul_l{a^?{zZLR&MWMcW{#aLUvWcfyM0bY>A}+QX3`*S9R1T#B z5k`$poa)K^h_C>clbF#kx$yevl!f|vJw`ngg(2fN$MY5*mW@!*@Bk!=xYBafMc-ci zQxp_z&(iw9OD^k98u9?B`L?JaTu|*FWzI$j=pF1p31&}k%HRfIdc*CbQxs}SA^4kl zWhZb1aWFlesuKY_!X{=SN=nq9(lR`J-~a-cLqVj$pfqlfxTkjg(~<(rbMRxvfLaJ^ zIOE~p;4@R|=afvJwb#EFhMF=63U6JbOf%S@Onve%!F1dm+7v`6`6y>IKhUc%C&N2+{&Xwj9+d_7EI!!lMn zf^=@PKuouwG1s-@`jROAe@Ej3F(d%}XAMT%NbJc+oA9?STk*%5#=P!A^*AtB=*<&} zAky%`>ZM75A}JX|PyJ9&qG3dT{<7A}4~S$Ze1K~ApSMsFI!{+OdwvIL%8m-3GGsZ& zi%&^O(UnKtT^%GPz=!|p1($abGm>P95ZMI(-EaPP_cJbti=CB~6*5Rj*nbwJkfG00 z{MAe{teML0_Va4bK~$m<7qdoys!nX7kOZyju6Z3->$U-8$d^Mw(i?1xRw@m-u+!(Y zRLe=Iq$T@7DY>9`UaEf5{P0<`W?v-m#K)#fP}j~-TAWR>`F`3kaEBX4ff_0BB03Q? zh{$;jgg;1t6T4Wx@G-bF#2uPlY#FI^n#rqB)k4LCvV6+vk(g2 zzWl@=ag%F@Ip9~uW~V;9T&P{Ty05@T6%m60dh|eiBiL;wPSN>qqMs5C(YrchGjo@! zsB%{UHB|v(H34oCm9N8o@n3o9r-8wrOn`T!MDS>TR@OaxEBdUX)rDq-@ViTO#4QSk z#q22Ge`R2zjxrfG%tuUD@|~-HgaF2z8QKO3w2D_=c}O^O2r+J&A&kXjf?~; z16}^5adZkc&cYR>wb#>e{Tx`c<#CSNW!%r=dJ1MO6=?$+Q|U=5JoEovOA`<9Uqe)% zQ^t90E}vr`jh|^PY28|W2b3(IGjyVB`nH(QkS@m_R)b?$hwcs3k(RlcnYsErss8f7 zBLn@1g-t(xtXyIjZylP*D(Z?N%M)e7`z^jx;6~MkbY!> z{Rf$F z0X9Pt;n{W{G&}{LAb-+qy{>Jyb-ErT0w+pde_L={{z>!k4W1gj7-D8VC=uXqQ_)>} zoL`6CkQRR}@W4YagQIE~?{v5hu$}mEC*tXJfPwTfyugT-vajQJLyVHIt7ngkMqviK z)?H5gnkId>fc~duGh+qZQsYv~H+XD};omA}QxNuO``psiZ4FluMBevy7lP0=H zOC+{uR;zqVop66m1Kx9WIwHWa!3=f_88Jgeu37uYpGJM&n0A&oiuG=GIIxvAeONKT zwX$?ag8iil8RLN>wF+0h{Y`D2RY8GLFo-je4RJ}6jefG1ty?G{6jz%$Wx%zzONYE$ zfz@{0U$@{u(#k4NrOwp@h~S`{3kDIipTYD5S>Suvvx&L^YmwhvmTggMuilVevov(5 z=w2I@Q@&Jd7cwW}G&YaJ4>dRUsqolo6LdtDO9q}sM^)`N8yHN>xUa2K;2{VOQ&Lg{ z+e-b-2LR}9oM=mDjVvSNMd_a0=UT@$tm6&$@58i|TJZyHwMN~u`2f;>9k2G?>?z((b>Wj#Bu@eTeq3_7qS2q(jG>RW=|8XsCEBiR#?MYYv`LppCPL^)MG}MYXdMw-a z^~s72tE_(-_d5zI;#k)=Zrf3owgV`J&X<37#A1TN(wy`E{la4IWdhE@6^41GEfw#6 zmOK618LbFk0sY$<-S`%pBrJ)lYH7)KZuZcG$h3NS&0zpC5tocC?7@&BCff?(F{_a; zvdOQ+)alP3vwFE0%^J~uY?t+ugP*KD<;eF<&Hn5UJY9zMkb?jC(P?TLfAl|oyCOGy z;jpqT9rrkR|56aU(Sh8qP)1QDXmqZgJTllYXRzy=J*eHd@@mC5_}yJrM&BzzM*6U^ z_eu8|h22^&;mJ-9HXQ%Py7M&?2X1pm2G?hq6;!?+w1(QbJ*wk)eL!O!(w8`L>KGRYLnRF zQ>qsW&4Vq7GpUHXOb)743J__dMq7~E!3L|s_tad^U_V*S;X8v`Ldw)36!xZDaUDg$ zzA$uu62cF=*{bu~s}g=9W9&M;Z-`i4g+sgOU=85~>uzBso<$A7h!!Um* z^Q_^uRlIrP9Ha(5L+g_5j<2+_CAV$B<;Ljt*JlxgN|VT$clFaI_yxRUgp?4;1!-JvUjx2kOo zBpBJR9>h>~9ydHe^&()-X7_cl(+CTj2)b+=pV?vMF;k#hLR2P2)&99*%EDu@G$ zmrpLu=$rb{oCSU93cbnDAr)mj94S9Qetql7( zU;8|{xYDsei4xM_|5p;6rq3tqyQwpGQ~&J!-QAtTy)KkFDJt#5Lr=MNaS{x)BDq%K zqz@kvvKq;d6BXH0MFs!tf?;J;y3S?bo_Qhra&2Q^vVZA*n!|zlZ@-swUI4vU_yLFa zXw!Vqoca2gwzrJ$t%NwDGkfQ)!jP=+IKRVI5_h%*Kz+V(tVV!1+pha_b?x*1vg{fz z=47rimYmR#MbohJ%!0z|YT*M$!#9729W8AY_m_a$?fvN-w>=!jc9uhE{0mpF0>kj| zuH4L3n_QKN<>f&J#A$E@=D^O8t)%+m5q~O2SzA+Aj}!yTngM<;K3!XuEz| zv}mBzJwbdpl1Te*M5}7@%RyB|(|9*E^hUO%PMo(?WJuHwpU5^5Z&fFOTa-?m;Clon z^dzW6O zo84wnA1$G0=~27w=?_U=COBGjo|C71aFrxldf(cZCE`5xMfURYvh*flh;XT_MoU2J zK`HAyZ0kpIXWh73>$_~I3LSY|t@rHbCf2*u6KA%Pi$AUncN@GZlZ(wfp7H|3GR>@W zywp{C3a%Xi>5YwcW9ehYx;ldC&CweRrc-z70T4JKMzriy^y!`zQ(2yUX@98+Q3{)U z#_TG+*bDvE=E&Zd1EP z-t}k~t?!qTTlAXkTxm&>Sf!`=3XvXV-`|idHl$6JS6BPV7-K>NGkx|v<2K~t+J?+& z>8#t?CtHg@$Q1j}L%d4|vLyXD8w6wBC;fovjRn+OVje5(ON@Uh}~dA0qZGs!vZ*iGfne2w)tk_+<%il9kogJ@PQtS+yBMp-~RSdTM7aPZ)T0A zvUjc}d+91yjHaU)_9}lI996Zg($$60rFsQFIykVa!^s-dT;wb^7vB14Ot$d$PP_{R zphy(_=?z%&bzheu$ zInG}C1gFty3adD`fh{)Izey6! z@>GnsuKTu0q08go`w8xz5czU1@giu}-NG0-@x}AQ$m@)U6{&uAn?CDjs$wBmRmR!I zdh_c$Y=o~U4ti{Rk#+HZz1#2ROxl%LC+ym#efdDRv7kH(dn zVvoiZJ_XX+i&Qh|La7tT%rOJ*?(U`?%-3bNN{{RDtlNyd=5i@Bkx7YOAD-Iz#BggRDD_f4 zqwRwJeBTlgS5dI?`0zeF)b=$pp8+UsUwJ@)3Gdp2e6MnQ;l1WQ@sm==E0zW&7FNbpXJu4i45h}aCXH83q?cDyvjKA9n0`fgeeFYTB5>3rsiuk9 z0KS9VA&z@RL$5_Ob#-nFAx+D9CX=r`JGR~rEMJ88?=n5xAC7Xy)R-l{mQ>}UI(fO< zTV(2K)8lpu=%Inv*4FN@Ff&_kB&e#rWz;k`)^G@vtp1w1)+}$5@tw7{GGC zSvS%Ny%E&Wo?m!w?j9Ds7kXY`#VDN@JXCXnB2|-`}!(*a`3%+xsg#REsow|^J{G+L4!rMzR|6LOG2?z<}l!OQI1WZ(jWFCJBT@hYr36#FSMkuVW zg@nqbr^M!FD6b3Z3F{n-cU3?tG6V?-2@{40gZEHuEW@V&J*8(K3z@-yrKVXL9H#%o zt9`SD5qp3Z-O>m6!Ep+q{oG(jmx%f34r%cW(=u{ity9C-Y5c2n!w_CivQ$ zNCvh7q8E9l(+*y;Hcqq*1^Q zys|2Jq@>?p>M+K-f51|IL|eJh@u%$7BG0-H!QDL*BP%2Ngd+k*lh)(WZ%STVQu4}# zWOWoW6Deok%g}u{3VTz4Se>o$TXfBt)`2pLpn~Bq7dWJ_w*QpyQ$O zY47OR+uP&%s7FPl4T{i%}e`Q9CX9yD(g>Cs#AJsOt@;MX}?dbYC1S$2F}RO7i;h6U}R;4T9`fw z4_9=8#ydU{u`Y&8Na1TjM23pICSF1vLT_IB_?4gXww{8X(- z;_AvTUV}?!s_QyGl1I1t{mhYMTq>p;7UrEcUGdcSa+s5xZ2@;{7j~MjOmGd%Q*o;r z1n^<@dYDqdmcT{?Z1qxh$IiQ^)?E)usd2+WE;(j6d764GW51Zzz$^IM$MTj+DAGRX zUpv7*3p0_no6#s#_labhH%sVL1BpJN7+aR8?qBke59*SRp~-DM54xBVnm3L!b!3k> zi@vP2`>u^Y{Ql#{oyl(J36#iiD(6 z2dH!isC0;Qi-gqO(IJh1AfZTiBZxs zu`}zH;Y#t0vX9~Qq#jLoPy*b^q@|?4RUnHlK65o+aUtMZdS=mg8>`>tQW4D+#jQ6F zky?9nRZ&X*b4Lp+n)h(nfRcz0`|cLOEvjuUeuNd}dPJ+7{RB%dJ$wq0#(wy}TY#^j zx{&m&Rh5=OQLFP`Yk~J$`vW}E-~8h{2`=G&1TwE!Ka3$@d@ zAmNFWg@Cfm^$V$O9zb`2a!9u&2SoA)_iV`8J2vZAHJ?OsYq_>MRtzMcJe;%NZ_xQ} zG}h+MK^V1$e7e`NU(k1^@_PZYx^)i|?!X=*5fG|)F@N*D%1r$$)2#y9JB9_pTH{=z zt5NHlE?V3_g%}JcmZk@Wm3JktW?RyMwu=Shr=9`{mTY!ww+P zvZboYWW?32F*nyjoKc;j<74p-MS_n5&@sjT`48Wm^b_SW;B6rhN6N>7$(|W{LfhNh z*tK}35BI~2RXVmWFd=J!=r_y?6sM_2Ifu$2=W%Y!rWNJXKx8u;%=b;Ha;N9ckmF|c z2PW!h)=2o|Q`4t`n&jWVC>k+8{R~=tnpt`5C|n_#tVw)$OU=-mP1t~Yb82XHH+1_F z6MD^yK6Y4!_)xIJoFP89T8RRRC{o;?c#djKpo$j=+siNEo z1a4%tqVm&+MQ&ig4;BDmy+Koc-|WjVo?Jcd*+L^UVSyZ)fUPmy{Cg390f{N}{vM|j zomQC3RAm~Tp5m||U?O^TeYN%PL0`Os=KVKV1EErM+yhv*S> zD2;%az5}cU0p(ydraE3hIC;hSO$o_}j}z$+mH0dsdK@OYkQ4Q+=xlxm<8!(5%=WUhqa)_Z zOrNeH*W%MJPEZdl#`TkX$8|GnT@_$Ggre!$*LzUnq~CD-%uAo8wjaMaTE$I1TI(oA z3yTn6@cj1GG8avc2OssQ1&4HQZ|{F9>&%mOHt_ch-fFw3C9M!B-0R7Ui_yK`GBs!AqLpT1s#%fCKw9WS9#E4@>oCscp;&cS5rW3uOFi(l}q zju|?F@q?5c-0VeYbRm&w6WkF(QGg*%ZIG_U5!Xqp3S~Y+h!1?n!b4-E!p2)hvY=Fr zaQ0!E3ExLWtS-H0kbiwEE~|Neug>o*Y>wM(nJ{PtXs8+sV=_pevSgYk)(nQR+6t+#v|8T*^Ml!L9>C1S=E z0`U(&tSuMqD*0XY6A9NgUoXm3|0+pNAQ)$+RpWJu;zjh?c+nW427OnCa%!LmJe>4& zVAPBj8$k6BNm0b}ocUIRndfMSyLY>fSID(_kCB2~E~>tC+y1GEzi0_mi)HXh(*xIS zH89F(dUs$qzn3O`ajGQb((jPl^iUbR#nuRtZfsF7$As{o7^4xc0 zOD(-Zpz_lvw_L>w`^-<`fR`2!!YLX!K@ z__75d+zMOfqkYgxGO+*)Spy!!&}h+ibvpnbEJ2r;bHRD8LLZDik|(6+1V3u(87Kwu zkw+wSn|2$4b2*C6TdE}8Zb1ftic}$O@bM$xZ~wMwR23(vrXA`oVLhcyF7Fo}oA}Yl z%KGP&-v0!dZ5{1~t7_8ozPuP?)Aqut%ok`b#vUX&{&MKnq3%$8%B{H!)7Gx%*3zyQ zRQSQKs_cru>LrlD<;5>oX@yD6P?TGcoSo2dnrfen!%B%Y_L+`Etvl>GhfEQU5U;%D~aqgx&aitOJ+;tFT8E-jws$j}$j z9y`$dMGSU5+M@qE|8xce_^733u zY>728PKfD5WZG$O>Gr$_f6#M%{cWG{qxHnaHDCAVqTIiKToAAo!;iMVk&2h!|8sC3 zC4If~g#j!2(1G>l8^{t9>KAOO8!WI&J(%LA(0UD>YG$ z1bd+|^my}^A%Nm@aAglo4l}(S?b`EuDkt7S!wWMAZ$!B@!Z~t`OPzXZ%czR#)@^V! z%uF@5H4t5Bq%kFk_{zp}CDl*=<+oI#lo~b|K*st|R+8fGR1&HCeIjPm{#w@T8TDXm zg?o;M2s0=q5eWr7dO}5^G4*HK1S1)%LG$PE-y}WL9|5AME378{| zaq?%|Xe4`^IrR(=itf}?Ovt=h|J^TYaS%2GHs8}1tDuo zf)|f1IB?2rNoul9xj{|H8%kMO{}R;P^4z6lS@@@8k2<~WUf=wF*g?^>Fe|r2vP4!O zOM~u)lO{h$^>B0nf3`khA-A4+($d@4(kp$I<>*_gs{LcXtP3Hb=Kt1_d7pKHkJXob z>*2K{P3kHc%&#SF^omy?ReLXp|#AN2;)tPPsR^j1v*?0=O z@Ymmn!e^WZapgv3YWYItPxz`Ky>~rFI#&(jrZg9I_75K7kE`Npi^&aDI^Ur$#dE1$ zUc`BTe3HK+-^Kaeo_*`7SY8=X>E@CvC+7Pzj0N%$b~838G?naG)Jd{R6yFcn&g^id zJCy4F=~)Ft)F_J0x!c;(H}h8NrMY;e4p>MJAQXXbxqSesGOGIGh0ycA#;<%iaX}Nv zqIT5xwXY3&$ZSys#!8*$nTaFAlS*}Pw*8Pd$BrNVW_-9Y%I`QQk`Ph4?aJ_Dbm5TH zES5M)pqg3()O3YB5%qHWDOy#krhp?YC^pUhsFg;O#=6=PT2jT*yNq_bO1#WlUk-7E z2!+>g@C_BAw2^i^j4&EIeMv*L-LLl@G|yckVBXS0U^S2~wbQP^*ryvpYWJiYzR&H( z%YT_}{G2tNXOV8XG*DyqGOcBCZ*67K#DC}b?+X@l8uK+u=6`=4{|!N(kn#^golT(d z1Xi=C3H{tT=VN6x*p(o4uEbQEkt^+rpohhGY;p9HzIw;=;t*O~jpk-oz6Dw2mo5U`0g%OtYmB*J3>;_p{pMhp^Jgf#0^kZ3eit8f zRHz^3`v-gS#-S4@Jgz+a9!=m{qhYF)tO)}n@P;2-r6%0}9<(-lHFn6Ne78k^Pyg=b zgF#@>H40i3=#apb>BLj~4+jHhIog|xj%W!KeJ4PyWbQSc@!|4|A{_}407PvS9-IZbTj3EwMkrNNhcN$~FB z*hAHD`hQ2dp}eejp6ThxqM)M3o8v}5xw)vpZ;O^{^T@IQ|MKE4Y@I#NpUB;eho6xw zD@-M`HKJYtL6~eAPXGNmj)LF`j0n82%u!8zv#Esz4*OvX%Z28I2swxE?~g&XZeMF- zxTwGs6v&Tpn9RcQJR?c}QdKBvVDLU+hQyjNDf$%2iivzq5}a*8S?#DvQi*xxX0}d! z3+rwEQD6?wVLjWGGM;AKkc7cZnNz8QA)hC^zg}?eNN<`4KFvlsn!6ciyUK(>P7iHo z{LPlC`IjilW)4nesV6qyH^Q=y=H_MK6wyyaX0=3Fz{gm>K(6C%4LcZsy#!ar6B03r zKA*|?&2mSybXNzX?a{!+-Wn$Q= z*uhX}4G+kdL?KR*=meZOsTXUhMLL?h1-J2~8o!YLw^(C%I2Cztj}QM%^S@?1kYbMq zn;!K0zyOhn6ju~TR3fSQGTJoD^lZK)soM zgK?WrX!)D;1YuD{qky7YcfW3f0_rn!p?1_LdvlprgIeBn5{&h|qd+9~=1Yf+7yrPu zn+`cWW~j`P^vD?0=9g;EY2TZ%P3t`mfmcehV7a!DqUB_I@D&KDmPq3LAcvN8kKYvX z&r=m64yq3IHleHgC1~3NZ-yUZZk&aNQ;ALgu9h)YV63doT{CXApN^4byM2QN@#-$PND7B7XD1RZq$iO<$h&Z z*a}Jve-dVRmVWs^M5L)f9rx`Z@PEFb7yBk(dNk}XK)Wd{Vyy}NP;CYuSl7c zSR{|+OOS_{gBW@cyLP`anNv1Lr%cQIw#4$aio2yhXYJtSaSiGb@QOPRS}r6^aZQWz zEWA*po@D}bK+!64vo*NUR9p=lAHzt(mlfJO4I5$6C!CA8{n|Q5Zat9hnamvn>cMRN zqq@%9r*-W{{%gmoUv?0d5!X%?4WWyHOP6zt5wS+Hc`-;pUt{^^#t)BolK7qtN@Pa<87w`F=IeRnAWD_INiTjLa*u zp;^x(O9GwV|Mvl2;ubY#$tcOpwox#~Q5aH(hO%p^*v$aqrij|ulqy0XD@pX-;ZH6p zEE+FxQrJGSn~9R7Yd_;}zu2g)wYRDk4VSn%g|FZ4?U<~*bg#9-YqoWfuvIMYD$6%1 zmI=*MW-2R+`@J5-w>Qqo%S(}bl6Mp5*Tmir&mY2I78|Pem`9v8T2?CQ-{8Xpt@v?t_$dASpdN<7lYA6 zr!@wig}MRK*d>7f#1xW=8-?RXYrnzqY~s?0ZJEK>d89w?Mqk^i5_#A%x*Lo8 z52E^QTV10Ga)}a)0i>q7tmay9ivBGCAgFlCOoi_zDeXPpT;69V0K(1RB=z+JoC)-} zDsSTI@GfVC7=0HlqxS80>R0I(yUgQC_>T!7b`R#F@h2KEImX!=sNk(l-(T?YUp+Q_ z6ViYVT0&>VWuHCbT(@ilE$@76^#Lb5Zu64ZtDS5}d1r8uNL9UvSz<|v*R~t_S$|7f z;hq2ywqWZkD4UI?Y5P!x!pTPr3f*QbpZwMnP4Ck+W%eL`NBLfc;--$N0h~fx&EC#J zsHMW;rQEaF8^9$E7~rJmZs@k3t={T2V;|JiGbJW%Sh79@oCaqE@6R18 zt`lV_ul_J^aR99U5W8p(MnkvLoO%tJ^;!}PP4H!7Qiu(9VQLBxFc5=m>Fe@n17~%K z-MLrg7S8tWuu0Ipl@%@W&1W)PP=Kg&SiL|Bj-*NXgUzA_Rh_-d_U*NWM!B=!zo7+mo_+q|gfP1Bt4th=j{%SA#Jy7Jb3$ zQN909eQ-dae%INYVeY(Mwfs`v+H@4rbi_-@+M02VN9*X~e?9feyI!=Fn9klT*&H9= z7~2-~CND1l_8F~$W2U%~?2tGBX#LiEowVyY@=ChA(O|Os{%;3oyy*U0wX*Nozfw1@ zXwd{gX;3Z#so+QhQlqN|5FUGo&U;HbmqRm>>h2s(3K16@GL-JAmh?-Y=n)i_JDnXr ze5I(wepQu8Tss>ujx5K{Eo(j zx%^EkN)U*JM(m`TH)__Zxc(eSUpi(yKf4w%x+XDykjC+XxoEtO9C&6sJ*=)X$q0hP zIb+(^3j>gV{zy2wZ7)3rgv>cao9yxK?I$LX4%o!PmA(7p5KdW_tM@l(KzxEq?S5Nq z$1VvNkGjh|Y@onXO;+3XIo!p^T-zC9Ub!6F;7YK@yKbPaaNx{1Y@1>GQrOvVQ~4nT zr1nbE@kw5;V3P_?TpdCuK=lYz3UJH&VAb{WIDYWUi57wIVxc%kiZ)KK%w z;y*gH|NK(Rd(;a@5^TdUX>}B%C>QXAXN1qVGN_XrF5iMM-YUEtB|k|dPef-(L!}vx zoR2d`#`WtZnc@&fWc7VRlYP#NW5wYCh10vY++NH@ z;}Y}Sk_)+H`Vgh-k9TaXbq#25C{b^50u-Z2`7u|m@g&`o4YpFfaDKKa{DXx;DZ5+B zJ-u%SdOe`$bt>S&{mW0^hnjKEtK)E7D(i6kQ$eElK=Y;lcl7<^ls!-4XU%p=PJ2lE zJ?6g&ztrFt(5?O=8>_XUGt1e{f{iY`t4h-}nk6bkSykE0rMUE&{k@0v1xQo**>^AY zE8Yg36FTr2jfRnH*3r%WBlNV)0P85yuUu7b;Ad3)IIlFZH#A|>F9u3pB^cgfTev*+ zcBsM?n#5^392+dID&k!ir&Lv8H8Cw*p>TV$j`Gsf8jb7iJoCQX<3lueN?4s}HW8ov z5>|tMwW*ZIPk_T+AncE6Kwy}hjTue!r^MV2( zipEBUZ6d0>#W?H>IS}wG3TY1+$$aD=9OLmNN-FA%9os=wvwYMreEl-oFo7t+_2=iM zE2Nqd>N3WY>6Vt2D=}_c0OkGqBqMOPASFH#!Z;uW1?=9#)3=eD&<`BKH=+hGBOH}g z-t$pb^-nK)Kaal`wQadf(TgT*2voTW65WhWs%lkKT~2;ty}K+Yu_>*W#bjaFtLs&{ zX4*S))RdlBi;8dfxKsQk1Uw=F{_`h>8nuDsE1nk9;?LuUXaWIY;hdoL7=}{{2zSKO z+|Ve#mm8Xvp?NO>E<5hhc5Qi)-ye~!IEPjH0V@1lFE`WdbSlz8#&%aK!pA-j4yxox zX`)A5Zv?~ZSkAL=7B=q5F5uB;O>U-m$Mim;i)S5)#Uo`gJ&Kn|CxH(d^G55ryE#XYHq|3 zmp+K3vQU<_ccR-py=YYQIsN=84cH7wB}S!=hpuUTE_?Rx632;zQ8DMK@7{Vy6Y_J@gxM^WFa7xkhtsQAJMI19dHlXuUhT zm=~M%s`I6>&psZTwW#$!0sdjHuUKN0~o=G9z`Moj7{$pj7*1?Q^a%HBTtv- z!*Hh+eN;fI>d!)=>!p_V=&FH(rtPb#4-b!?$JJe~Qd|j8Sw?o4{1$D9agBxJI%u^x zJ~#a*KQ@%t7DIs|yku+-=KWg>)(|hL1bbE_OH&*_)(DT>>x~6ARaXft->^pdDgzd- zNT|iH0~@{>wy)3VA5J8Jag14V_Tl%;go&v+;Ag)xsyAqAWbsylp@QMl8>D$f%cTTW ztCNGNb+*yl2br!0Zj5m=GyimH3WN@)y^)5aOx8N48nTR=fjPGcT z%UfpJ+s}|1>{k-be}z-v0R7Goc7C-fyEdKtz^%XNy}?ath|BJIt{$2qz zwR<{tVZfFqp49$md&iOZ#pCjM-4ye=YdYzi9MC)HJBn=YQF|b7N38#@Y3TgpCD=KC zf~7^4veGAb zff~FwlJf%x6GY2SP*LC2N!;{Aces^p3a^77$CRIH;D1f1R*dp0CpVRoI%AOs!x>GS zpvEuLZ4t-X@VQvyGkRYxxiODkk26 zfk%LbZ(QGB!nSO-w2da50N6o)9;Ns8x5%75S~WqOAWB(ABdml`uHqk+uWjZh*B*0T zNA8hqB!gc1*sGO`Plq#uOB&rK(8GwrfBUu?Q7|94ABeHNquFni^x{3++&3GIS+uWi zv%ee3`((8qnELu_2Ci?A0%lWna=6N2%wg(RbU6S3B}ZM$DfK~uYRzQMO=8zus* z-K^02|ElJ^j;ankLVsqHu^}X6zscP_ZSVZc1U9&?Rbq&SL#aOBbCsi+q`dK;>f+N; z(!CnqDG0uvIaO#^b~uBf$|C}3*0jr4mT z2?SD!ZPH|>@IIGCSM{U+9KOTdEVSqoRUwUCwS^*{V==DUbvAA!gFkE#s|5;Fcbi%U z?45SQeQEvhOFLRtw*+)YF^(jAbVt_n*RkiKj{Xzd7}8nmDoPyEsKEoHg5)1lKt*B5 z_Gg)M)_iQZiHb<9%!vtnT`r)cu zih^2TM=@C>lFulFfx13I3x+oSJ98gZigUl&N1SGRyD%vY0Nfb+??=E-yvmVDYnu_3 zYW}INMTIE!!NXK~KYh5CIONx+*C#-jJ!ttXCIT*pgex!te8O;V97yW$ctmbX#)-o3 z=TvAo-c6^@aP&N39NqNiAlFv)f#BQpTS$et!7yQQLnuKEk5GieYos8`Q=h)Fbj}LVZs#}fjxC(V^wGAacc2!NVwUmd(U5DfR zXP^q}ogZ?B3Qj&>y@%dnruuC9!siWLAFnc4z^A3z{b)zuJkaEX{_}Zkj|UwqK`fX% zY^kCsVTUdud(w=fheIA0VL(mYee_hoN9yK?=l&FkXIW#oXalj9R*I9~&BER3*g%B% z8+j6I2N3JSEN`}d3!d_0C+iUp1U&!qbQRaYlWK|gPpHyXaYrg#2a=Vy%+-j*uVD2Sbm$Rq5eR*DFZ>tC(JtJg^HC+YAV=ABWcAA1ae@Cfnup3nr^#AC;b7SqWDNbm{o9OMXAB@l zv-kP-1U!de_@Fbt>B)2MLbs(mDx^Pd!bdZ+-;kT%py*Zt2<37B=K?#OtR?P*MI*sB z6}w`@>=}n9LI?}On1sM_%!X{$c^U#Hgnw()!5264sZBH?Up<>}<o_S@7+c!=$q ziArnv-Dtr8@42@;*3j)D@GdcYnm9oTfE#M}Y;9`S^&MP*f!gJPaFMbl{}qRjx8PhX zI_QRFYu1r50blEOvfy=eDL<%zpFfuecMq4$rJPWtN%ydvX~Mj-&8 zC`7(m?G0`J2!jdHj%{~V#nRGz%(DGU1J1=FPQP0G`63#g-4gR}vrcXitBT(~HjB4i zAfn)plh`w15LOnT@fR5`X&^YD0sT@QTexG5*QROS=Q`5h1*S??R?n!Xzg*IQ`;5_r zJvmS|x>!l3G(3d>?-G*+#h10Tm(J!OZp4-tF4_bC@6Yh_=j31r42tKFMQM%lYOPOt zjBJF&zUKE$Ry8jg|^6Z8p^I@sfYA{@>7o!Xa68cpaB62j|=(~NZ6~l=5vLfqF zwCKAVzMgc%if&EQD4L2u=0Q;V{3w-p^yD|%YYV(2006gTj8qJhU;rJ=irHxK-BZ7N zU%XG1_7O-?tw@kqv=P{hv;K2>XtN+1zMfQq*t`z6Qg^BDuk%Ex!Gffb$O-6#b<|DR zL1Fu)DP$RoarGb-dGf;Tj+l9b zsptHHDQ^LD)JOS^;(L@X2hQXmukR4EGjWRg+scR7SRfgI;s)w4iI#>E8R(gn3r&S- zD3cYzeC{BTJW}oVq;=OFQd;5>H7kwJ==(7~3AW)~IByMEl2(7Ak70}(e-sk@*1hCA zR+J$E4kP*q)Z6@!`qG{ZfgKjgtvseY;*~ZJcFp&G1?i{P003yoLBD!`$hXDp5EQod=sNZ5U z;dZ#E##=CaNtYpbw8gkM$Rdba;^kO~v7(I(!nDcSYw^x%QNOJ>8|j7mXrTbn>*B?3 z#|H0H73XpQ@}nAT|9#+7wvUCZR`r6oPbDKBLZb~#(x%+mXEB4peI?i+8P5H_I;)UF zeZy$N%Dk#rc&vt4xF zF-PXAx^C|uzThEaAc+tZUjw?kVK9w@SbkLN+VUs>#1xU(O8fOT-@DeF5ARD~bXG5j zTh^v5`S6Bc&TC?P7MQ{<@WB#o2GOe%akdMoup<6WNw5H{?j7eqllrUb)Gv0|cGu}K zJ0^c$x1arrVN|&d4C?*No;%LF)FA9dht5|gk_m>hGXU(Cp^!GVVowiJss2%Qw29=G zc0q<@u(V@Z;h2eksE4i2;Mrf&u=@omi3_tagQbs+qI3h#!aR}C)HH|qj=`0XAw!*{ z*iBkdHm7@RtyZFLwJ*bdu5@9A)d@p|!wJ>- zzpJIZ6qyemSdsLy{3zBM#H618==^;m7aoMhm!Sh4j-J{Mf3BCjO>7Y34r$M%C#Px!`re;bpJ^yJnuhW*fYW4Dcay_SM=Z#@nalpz zI-Tp%8^3aUoJXiNRmHHDvo}y(xS3Du7^+M}nd^l&g_i1jr;mKT2MS6Lfl9l!OM|v0 z7rq3_c{G0#pqb8Y*2n7l!LAaa`q3_~(rC&>g1v)FM0`Q@Ji3_oPni~Mzw3}dgV~gf z^H=|4b1w2O^qCQnPWZLF3#LT=AEy14v>dVJaTth-Re$TzsOB^ze8hPL6P3>xP!##< zbrK8&pT2z$SIrR0T6@-Ksh}D7dRvZ*dqDK}YjUaj~@P@kGjly`@lJnn0mxYE5iP1K;KI-;51^!xe|nzvvVLb}(e3 z;j_*Fq%upoOPuza|CH|&$ZWGZ;qey1i{_DWjgKA8AgtPu7`>-oS&nEa%D{7Z?zp>f z-zM!V0=f&_6Y2+8(p`GB*pOR{OTWHhZ2Ef0Y!xUR!w$U{3A@wiuH*%FUDCcTpu6@v zLs@rR(C;i8=oTflJW<7EGT| z0Kf;;8HM}v-ICfTBr0y^m@0O&vnD^8OGCsuU%z;8Xd~v-QPFD9L=&i(Q=T`|9mJgc z#F7%zn})c4LCFJ{Fj3n+wGmzr74w{LXMRg~sY$%~A&DH&y!WZ-)a_=zs#mlFdM*ud z?d?Dg@Kj{ZtoN5*dacPd7|~F;_XAC6Y5*f!d8l>9<;J41MYCy$3oi#cWcgl8H+Po0 zuaTz&QMvk?vME5JkzcVfKrwX{ki7dNxmq;- Q004mYBZG&v>UI(T1MHQDWB>pF literal 0 HcmV?d00001 diff --git a/hicolor_apps_32x32_xchat.png b/hicolor_apps_32x32_xchat.png new file mode 100644 index 0000000000000000000000000000000000000000..59b1850da79c97f4c114e5e65fb71d1c2f1870b5 GIT binary patch literal 2418 zcmV-&361uNP)P{QzDxiB02FjZSad;kbZBpK07_wN zbz&e>bY*F7Wpd{G_b&hd03mcmSaefwb#h~60BCe{a5^t9YH4k4VPh_Bb#rNBXklz@ zE@OIWX5(G}00@dnL_t(og{7Bya8>mc$3OSpw`6-SI|M?2#0TbOE2JVp5M-N+GB{HQ zTw3W$>s0Gfp+&K^ELx@2PPGf8*6JuSqK+dJY#v$%kmW%kA_)?K7m}AimY4PI@7=9` z4OZKv$FyiqeM}F0|A{?v{Z|Hl zjs4+P*Yy@_?yHvZWix|K2mV;`h`wprGT9gzCw>+9nWe66`Od`~o%igum8{x6%WBGW zZ(QVZUMu;=MJ}h5l6U<2yLQYiTJ}Q9)cL=9qUL$=pVieaVN3y=7rC}gEMLAR_ogS! zc)yFNouqW-Tj|NRyrUbgLBxhdE@x_bfxBeoTXrG(2{bIhK5en7aQ>sKk8QnL#4rKB zz1g*G@{I4S89(PC6D>c1Xf3pFMu>kx#htIGr=}FR*UkHS5$oo;oT+Jr?y@^yw+oTI z(D4kY9pGI}=JmHo(-%E@@8PG1ix?E}Se0vA(T%It&})iyvNnV3YXjfC$Oq zaIm)WqbIK`{q`dTbAMpQyA~qNpfTJ7ClDloyvp^~&Wkmx%TwIDj<-8H0UrF8%bAf^ z?7rci7wux-4rqV%YP=Ez|3Oj;e=9NV`8D_}{fy(F}xPTD9%%rMy*2yLFtzyed(E9JOaVn_HsOQ^g?(|1mQY}eKrcKC`B(>-2gEZ1Z?GS7oJ5B>NX(qc5cdP%X_O9Li8Sepo zvMlS8!{NZ;a2OtsCw9?CQ+HpeB_+wabb9_2Ns9WeDYLO$OPaw4?jH5!>ZV^;*Rd1m z0yKxifoaI`&{nKi;a{-$CTlpu*8R3<9Z$;GXKE}|5r}U7B22F!BFq2Q*!0_lFZ$m|Ri#!J)OCfI2`vOaMSEuH0W* zRF-T_$>ef(WN`e+y&A5fSA@2h=Fg7x#G!f%0nI$$}ys&E3s#QPp`~AZ@;;>%e z_Xo-|GRL7A2AbaQXHMa73eeB=&0Vj`rdbp=2Ja1&ourtuy z-1^smzh`OtW$z-vWD>rq0J|-n@BMTgu08MI`LY&401Ta!-e#r*&Q}zw?Zq|L;Ww*c z0&Yt^J;7$ntDI#Og-i7(FvhBZARq_=hOPrpZ!X}^zwcnl@;j+Nd5DE=`^dK_+?Z`3 z6-~1Jts(trrQbED#(qV_;1-nlT#l^V@yG8kcVuQY9UePfQG(Qr{%5Ec)Ho3ho@>kD zSY{;#0uPu@bDO1g5YlBC&tIBDy}?j$PF+sF2yuWs-Jb2fzi?t^)|ZDN%IL0`!8(qh zIF4x44E8BN8p#Sgp4Exm=|l5SfT&yEcpyI~ zJFBw=RLkh(ss)nA;a5}HRC`%_>Ow#Zb%!BmI#{wX#o!lqKX-Q?!KB1!j-?F2ni;RF z+?OV0n&ZL_0LkO=2n!0*UsxFGv@`_mWID?cyE-7IUfong3nXXKqnOz2=~mva_y4`N zBX-%vG|Lc@{AJ&7;AIUmZWpu1j`a!k}S&% zyO03AjWKHDk;n~xOH$TyBOn92`e!j34g`2ugOfnFEXx`s{tFU|42oz{s0+na=fN;}yMjjGc*JiaAGJqjA%vxE|<#$WC3L&l<3e4 z)Fd*G$g-@DBp-nv*p4Z{OcAnm_yVW{x@1{ahsF<9U`Qr4lu87F kR-+%^2=tM-2M)FW0e&)V?#+JwU;qFB07*qoM6N<$f}rZ4O8@`> literal 0 HcmV?d00001 diff --git a/hicolor_apps_48x48_xchat.png b/hicolor_apps_48x48_xchat.png new file mode 100644 index 0000000000000000000000000000000000000000..47db53ed11fba5c5eede305e5fabbe8c33c8d89b GIT binary patch literal 4018 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 0.60, dbus-glib-devel >= 0.60 @@ -48,6 +61,8 @@ BuildRequires: desktop-file-utils >= 0.10 BuildRequires: libnotify-devel # For xchat-2.8.8-link-against-libnotify.patch BuildRequires: autoconf +BuildRequires: automake + # For gconftool-2: Requires(post): GConf2 >= %{gconf_version} Requires(preun): GConf2 >= %{gconf_version} @@ -91,9 +106,18 @@ This package contains the X-Chat plugin providing the Tcl scripting interface. %patch52 -p1 -b .libnotify07 %patch53 -p1 -b .link-against-libnotify %patch54 -p0 -b .glib +%patch55 -p1 -b .hires-icons sed -i -e 's/#define GTK_DISABLE_DEPRECATED//g' src/fe-gtk/*.c +cp -p %{SOURCE1} icons/ +cp -p %{SOURCE2} icons/ +cp -p %{SOURCE3} icons/ +cp -p %{SOURCE4} icons/ +cp -p %{SOURCE5} icons/ +cp -p %{SOURCE6} icons/ +cp -p %{SOURCE7} icons/ + %build # Remove CVS files from source dirs so they're not installed into doc dirs. find . -name CVS -type d | xargs rm -rf @@ -102,8 +126,7 @@ export CFLAGS="$RPM_OPT_FLAGS $(perl -MExtUtils::Embed -e ccopts)" export LDFLAGS=$(perl -MExtUtils::Embed -e ldopts) # For xchat-2.8.8-link-against-libnotify.patch -autoconf -autoheader +./autogen.sh %configure --disable-textfe \ --enable-gtkfe \ @@ -152,18 +175,14 @@ EOF export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` gconftool-2 --makefile-install-rule /etc/gconf/schemas/apps_xchat_url_handler.schemas >& /dev/null || : - -%pre -if [ "$1" -gt 1 ]; then - export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` - gconftool-2 --makefile-uninstall-rule /etc/gconf/schemas/apps_xchat_url_handler.schemas >& /dev/null || : +%postun +if [ $1 -eq 0 ] ; then + /bin/touch --no-create %{_datadir}/icons/hicolor &>/dev/null + /usr/bin/gtk-update-icon-cache -f %{_datadir}/icons/hicolor &>/dev/null || : fi -%preun -if [ "$1" -eq 0 ]; then - export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` - gconftool-2 --makefile-uninstall-rule /etc/gconf/schemas/apps_xchat_url_handler.schemas >& /dev/null || : -fi +%posttrans +/usr/bin/gtk-update-icon-cache -f %{_datadir}/icons/hicolor &>/dev/null || : %clean %{__rm} -rf $RPM_BUILD_ROOT @@ -178,6 +197,7 @@ fi %{_libdir}/xchat/plugins/perl.so %{_libdir}/xchat/plugins/python.so %{_datadir}/applications/xchat.desktop +%{_datadir}/icons/hicolor/*/apps/xchat.png %{_datadir}/pixmaps/* %{_sysconfdir}/gconf/schemas/apps_xchat_url_handler.schemas %{_datadir}/dbus-1/services/org.xchat.service.service @@ -187,6 +207,9 @@ fi %{_libdir}/xchat/plugins/tcl.so %changelog +* Fri Jun 07 2013 Debarshi Ray - 1:2.8.8-18 +- Add hi-res icons (http://sourceforge.net/p/xchat/bugs/1504/) + * Fri Feb 15 2013 Fedora Release Engineering - 1:2.8.8-17 - Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild diff --git a/xchat.svg b/xchat.svg new file mode 100644 index 0000000..c7055d8 --- /dev/null +++ b/xchat.svg @@ -0,0 +1,1802 @@ + + + + + Pidgin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + Pidgin + + + pidgin + im + instant + messaging + + + + + + + + + + + + + + + + + + + + + Hylke Bons, Lapo Calamandrei + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 8a46bfc1e5085353de15c8f79955663e8f478ed1 Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Mon, 10 Jun 2013 13:38:19 +0200 Subject: [PATCH 2/5] Add BR on gettext-devel --- xchat.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xchat.spec b/xchat.spec index 3120802..ee26d1a 100644 --- a/xchat.spec +++ b/xchat.spec @@ -53,7 +53,7 @@ BuildRequires: perl perl(ExtUtils::Embed) python-devel openssl-devel pkgconfig, BuildRequires: GConf2-devel BuildRequires: dbus-devel >= 0.60, dbus-glib-devel >= 0.60 BuildRequires: glib2-devel >= 2.10.0, gtk2-devel >= 2.10.0, bison >= 1.35 -BuildRequires: gettext /bin/sed +BuildRequires: gettext-devel /bin/sed BuildRequires: libtool BuildRequires: libntlm-devel BuildRequires: libsexy-devel From 5a2942098d3ca955f4accdd58882f268a615db3a Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Mon, 10 Jun 2013 14:48:29 +0200 Subject: [PATCH 3/5] Use XDG_CONFIG_HOME instead of home for config files (http://sourceforge.net/p/xchat/bugs/1506/) - Use name and generic name correctly in desktop file (http://sourceforge.net/p/xchat/bugs/1397/) --- xchat-2.8.8-desktop-file-name.patch | 13 + xchat-2.8.8-xdg-dirs.patch | 1224 +++++++++++++++++++++++++++ xchat.spec | 14 +- 3 files changed, 1250 insertions(+), 1 deletion(-) create mode 100644 xchat-2.8.8-desktop-file-name.patch create mode 100644 xchat-2.8.8-xdg-dirs.patch diff --git a/xchat-2.8.8-desktop-file-name.patch b/xchat-2.8.8-desktop-file-name.patch new file mode 100644 index 0000000..2d6044a --- /dev/null +++ b/xchat-2.8.8-desktop-file-name.patch @@ -0,0 +1,13 @@ +diff -urNp xchat-2.8.8.orig/xchat.desktop xchat-2.8.8/xchat.desktop +--- xchat-2.8.8.orig/xchat.desktop 2013-06-10 14:01:07.408432973 +0200 ++++ xchat-2.8.8/xchat.desktop 2013-06-10 14:12:56.044209785 +0200 +@@ -1,7 +1,8 @@ + [Desktop Entry] + Encoding=UTF-8 +-Name=XChat IRC ++Name=XChat + Name[zh_TW]=網路清談 ++GenericName=IRC Client + Comment[de]=IRC-Client + Comment[es]=Aplicación de IRC + Comment[fi]=IRC-sovellus diff --git a/xchat-2.8.8-xdg-dirs.patch b/xchat-2.8.8-xdg-dirs.patch new file mode 100644 index 0000000..5530085 --- /dev/null +++ b/xchat-2.8.8-xdg-dirs.patch @@ -0,0 +1,1224 @@ +diff -urNp xchat-2.8.8.orig/src/common/cfgfiles.c xchat-2.8.8/src/common/cfgfiles.c +--- xchat-2.8.8.orig/src/common/cfgfiles.c 2013-06-10 14:01:07.402432963 +0200 ++++ xchat-2.8.8/src/common/cfgfiles.c 2013-06-10 14:27:09.668464169 +0200 +@@ -1,3 +1,4 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + /* X-Chat + * Copyright (C) 1998 Peter Zelezny. + * +@@ -34,7 +35,8 @@ + #ifdef WIN32 + #define XCHAT_DIR "X-Chat 2" + #else +-#define XCHAT_DIR ".xchat2" ++#define XCHAT_DIR "xchat2" ++#define OLD_XCHAT_DIR ".xchat2" + #endif + #define DEF_FONT "Monospace 9" + +@@ -318,17 +320,68 @@ get_xdir_fs (void) + return xdir_fs; + } + ++void ++maybe_migrate_xdg_config (void) ++{ ++} ++ + #else + + char * + get_xdir_fs (void) + { + if (!xdir_fs) +- xdir_fs = g_strdup_printf ("%s/" XCHAT_DIR, g_get_home_dir ()); ++ xdir_fs = g_strdup_printf ("%s/" XCHAT_DIR, g_get_user_config_dir ()); + + return xdir_fs; + } + ++void ++maybe_migrate_xdg_config (void) ++{ ++ char *old_dir; ++ char *new_dir; ++ GFile *source; ++ GFile *dest; ++ GError *error; ++ gboolean res; ++ ++ new_dir = g_strdup_printf ("%s/" XCHAT_DIR, g_get_user_config_dir ()); ++ ++ /* already migrated */ ++ if (g_file_test (new_dir, G_FILE_TEST_IS_DIR)) ++ { ++ g_free (new_dir); ++ return; ++ } ++ ++ /* nothing to migrate */ ++ old_dir = g_strdup_printf ("%s/" OLD_XCHAT_DIR, g_get_home_dir ()); ++ if (!g_file_test (old_dir, G_FILE_TEST_IS_DIR)) ++ { ++ g_free (old_dir); ++ g_free (new_dir); ++ return; ++ } ++ ++ source = g_file_new_for_path (old_dir); ++ dest = g_file_new_for_path (new_dir); ++ ++ g_message (_("Migrating data from %s to %s"), old_dir, new_dir); ++ error = NULL; ++ res = g_file_move (source, dest, G_FILE_COPY_NONE, NULL, NULL, NULL, &error); ++ if (error != NULL) ++ { ++ g_warning (_("Error migrating data: %s"), error->message); ++ g_error_free (error); ++ } ++ ++ g_free (old_dir); ++ g_free (new_dir); ++ g_object_unref (source); ++ g_object_unref (dest); ++} ++ + #endif /* !WIN32 */ + + char * +@@ -351,7 +404,7 @@ check_prefs_dir (void) + #else + if (mkdir (dir, S_IRUSR | S_IWUSR | S_IXUSR) != 0) + #endif +- fe_message (_("Cannot create ~/.xchat2"), FE_MSG_ERROR); ++ fe_message (_("Cannot create configuration directory"), FE_MSG_ERROR); + } + } + +@@ -593,6 +646,7 @@ load_config (void) + const char *username, *realname; + int res, val, i, fh; + ++ maybe_migrate_xdg_config (); + check_prefs_dir (); + username = g_get_user_name (); + if (!username) +diff -urNp xchat-2.8.8.orig/src/common/cfgfiles.c.orig xchat-2.8.8/src/common/cfgfiles.c.orig +--- xchat-2.8.8.orig/src/common/cfgfiles.c.orig 1970-01-01 01:00:00.000000000 +0100 ++++ xchat-2.8.8/src/common/cfgfiles.c.orig 2013-06-10 14:26:18.219319628 +0200 +@@ -0,0 +1,1104 @@ ++/* X-Chat ++ * Copyright (C) 1998 Peter Zelezny. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "xchat.h" ++#include "cfgfiles.h" ++#include "util.h" ++#include "fe.h" ++#include "text.h" ++#include "xchatc.h" ++ ++#ifdef WIN32 ++#define XCHAT_DIR "X-Chat 2" ++#else ++#define XCHAT_DIR ".xchat2" ++#endif ++#define DEF_FONT "Monospace 9" ++ ++void ++list_addentry (GSList ** list, char *cmd, char *name) ++{ ++ struct popup *pop; ++ int cmd_len = 1, name_len; ++ ++ /* remove <2.8.0 stuff */ ++ if (!strcmp (cmd, "away") && !strcmp (name, "BACK")) ++ return; ++ ++ if (cmd) ++ cmd_len = strlen (cmd) + 1; ++ name_len = strlen (name) + 1; ++ ++ pop = malloc (sizeof (struct popup) + cmd_len + name_len); ++ pop->name = (char *) pop + sizeof (struct popup); ++ pop->cmd = pop->name + name_len; ++ ++ memcpy (pop->name, name, name_len); ++ if (cmd) ++ memcpy (pop->cmd, cmd, cmd_len); ++ else ++ pop->cmd[0] = 0; ++ ++ *list = g_slist_append (*list, pop); ++} ++ ++/* read it in from a buffer to our linked list */ ++ ++static void ++list_load_from_data (GSList ** list, char *ibuf, int size) ++{ ++ char cmd[384]; ++ char name[128]; ++ char *buf; ++ int pnt = 0; ++ ++ cmd[0] = 0; ++ name[0] = 0; ++ ++ while (buf_get_line (ibuf, &buf, &pnt, size)) ++ { ++ if (*buf != '#') ++ { ++ if (!strncasecmp (buf, "NAME ", 5)) ++ { ++ safe_strcpy (name, buf + 5, sizeof (name)); ++ } ++ else if (!strncasecmp (buf, "CMD ", 4)) ++ { ++ safe_strcpy (cmd, buf + 4, sizeof (cmd)); ++ if (*name) ++ { ++ list_addentry (list, cmd, name); ++ cmd[0] = 0; ++ name[0] = 0; ++ } ++ } ++ } ++ } ++} ++ ++void ++list_loadconf (char *file, GSList ** list, char *defaultconf) ++{ ++ char filebuf[256]; ++ char *ibuf; ++ int fh; ++ struct stat st; ++ ++ snprintf (filebuf, sizeof (filebuf), "%s/%s", get_xdir_fs (), file); ++ fh = open (filebuf, O_RDONLY | OFLAGS); ++ if (fh == -1) ++ { ++ if (defaultconf) ++ list_load_from_data (list, defaultconf, strlen (defaultconf)); ++ return; ++ } ++ if (fstat (fh, &st) != 0) ++ { ++ perror ("fstat"); ++ abort (); ++ } ++ ++ ibuf = malloc (st.st_size); ++ read (fh, ibuf, st.st_size); ++ close (fh); ++ ++ list_load_from_data (list, ibuf, st.st_size); ++ ++ free (ibuf); ++} ++ ++void ++list_free (GSList ** list) ++{ ++ void *data; ++ while (*list) ++ { ++ data = (void *) (*list)->data; ++ free (data); ++ *list = g_slist_remove (*list, data); ++ } ++} ++ ++int ++list_delentry (GSList ** list, char *name) ++{ ++ struct popup *pop; ++ GSList *alist = *list; ++ ++ while (alist) ++ { ++ pop = (struct popup *) alist->data; ++ if (!strcasecmp (name, pop->name)) ++ { ++ *list = g_slist_remove (*list, pop); ++ free (pop); ++ return 1; ++ } ++ alist = alist->next; ++ } ++ return 0; ++} ++ ++char * ++cfg_get_str (char *cfg, char *var, char *dest, int dest_len) ++{ ++ while (1) ++ { ++ if (!strncasecmp (var, cfg, strlen (var))) ++ { ++ char *value, t; ++ cfg += strlen (var); ++ while (*cfg == ' ') ++ cfg++; ++ if (*cfg == '=') ++ cfg++; ++ while (*cfg == ' ') ++ cfg++; ++ /*while (*cfg == ' ' || *cfg == '=') ++ cfg++; */ ++ value = cfg; ++ while (*cfg != 0 && *cfg != '\n') ++ cfg++; ++ t = *cfg; ++ *cfg = 0; ++ safe_strcpy (dest, value, dest_len); ++ *cfg = t; ++ return cfg; ++ } ++ while (*cfg != 0 && *cfg != '\n') ++ cfg++; ++ if (*cfg == 0) ++ return 0; ++ cfg++; ++ if (*cfg == 0) ++ return 0; ++ } ++} ++ ++static int ++cfg_put_str (int fh, char *var, char *value) ++{ ++ char buf[512]; ++ int len; ++ ++ snprintf (buf, sizeof buf, "%s = %s\n", var, value); ++ len = strlen (buf); ++ return (write (fh, buf, len) == len); ++} ++ ++int ++cfg_put_color (int fh, int r, int g, int b, char *var) ++{ ++ char buf[400]; ++ int len; ++ ++ snprintf (buf, sizeof buf, "%s = %04x %04x %04x\n", var, r, g, b); ++ len = strlen (buf); ++ return (write (fh, buf, len) == len); ++} ++ ++int ++cfg_put_int (int fh, int value, char *var) ++{ ++ char buf[400]; ++ int len; ++ ++ if (value == -1) ++ value = 1; ++ ++ snprintf (buf, sizeof buf, "%s = %d\n", var, value); ++ len = strlen (buf); ++ return (write (fh, buf, len) == len); ++} ++ ++int ++cfg_get_color (char *cfg, char *var, int *r, int *g, int *b) ++{ ++ char str[128]; ++ ++ if (!cfg_get_str (cfg, var, str, sizeof (str))) ++ return 0; ++ ++ sscanf (str, "%04x %04x %04x", r, g, b); ++ return 1; ++} ++ ++int ++cfg_get_int_with_result (char *cfg, char *var, int *result) ++{ ++ char str[128]; ++ ++ if (!cfg_get_str (cfg, var, str, sizeof (str))) ++ { ++ *result = 0; ++ return 0; ++ } ++ ++ *result = 1; ++ return atoi (str); ++} ++ ++int ++cfg_get_int (char *cfg, char *var) ++{ ++ char str[128]; ++ ++ if (!cfg_get_str (cfg, var, str, sizeof (str))) ++ return 0; ++ ++ return atoi (str); ++} ++ ++char *xdir_fs = NULL; /* file system encoding */ ++char *xdir_utf = NULL; /* utf-8 encoding */ ++ ++#ifdef WIN32 ++ ++#include ++ ++static gboolean ++get_reg_str (const char *sub, const char *name, char *out, DWORD len) ++{ ++ HKEY hKey; ++ DWORD t; ++ ++ if (RegOpenKeyEx (HKEY_CURRENT_USER, sub, 0, KEY_READ, &hKey) == ++ ERROR_SUCCESS) ++ { ++ if (RegQueryValueEx (hKey, name, NULL, &t, out, &len) != ERROR_SUCCESS || ++ t != REG_SZ) ++ { ++ RegCloseKey (hKey); ++ return FALSE; ++ } ++ out[len-1] = 0; ++ RegCloseKey (hKey); ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ ++char * ++get_xdir_fs (void) ++{ ++ if (!xdir_fs) ++ { ++ char out[256]; ++ ++ if (!get_reg_str ("Software\\Microsoft\\Windows\\CurrentVersion\\" ++ "Explorer\\Shell Folders", "AppData", out, sizeof (out))) ++ return "./config"; ++ xdir_fs = g_strdup_printf ("%s\\" XCHAT_DIR, out); ++ } ++ return xdir_fs; ++} ++ ++#else ++ ++char * ++get_xdir_fs (void) ++{ ++ if (!xdir_fs) ++ xdir_fs = g_strdup_printf ("%s/" XCHAT_DIR, g_get_home_dir ()); ++ ++ return xdir_fs; ++} ++ ++#endif /* !WIN32 */ ++ ++char * ++get_xdir_utf8 (void) ++{ ++ if (!xdir_utf) /* never free this, keep it for program life time */ ++ xdir_utf = xchat_filename_to_utf8 (get_xdir_fs (), -1, 0, 0, 0); ++ ++ return xdir_utf; ++} ++ ++static void ++check_prefs_dir (void) ++{ ++ char *dir = get_xdir_fs (); ++ if (access (dir, F_OK) != 0) ++ { ++#ifdef WIN32 ++ if (mkdir (dir) != 0) ++#else ++ if (mkdir (dir, S_IRUSR | S_IWUSR | S_IXUSR) != 0) ++#endif ++ fe_message (_("Cannot create ~/.xchat2"), FE_MSG_ERROR); ++ } ++} ++ ++static char * ++default_file (void) ++{ ++ static char *dfile = 0; ++ ++ if (!dfile) ++ { ++ dfile = malloc (strlen (get_xdir_fs ()) + 12); ++ sprintf (dfile, "%s/xchat.conf", get_xdir_fs ()); ++ } ++ return dfile; ++} ++ ++/* Keep these sorted!! */ ++ ++const struct prefs vars[] = { ++ {"auto_save", P_OFFINT (autosave), TYPE_BOOL}, ++ {"auto_save_url", P_OFFINT (autosave_url), TYPE_BOOL}, ++ ++ {"away_auto_unmark", P_OFFINT (auto_unmark_away), TYPE_BOOL}, ++ {"away_reason", P_OFFSET (awayreason), TYPE_STR}, ++ {"away_show_message", P_OFFINT (show_away_message), TYPE_BOOL}, ++ {"away_show_once", P_OFFINT (show_away_once), TYPE_BOOL}, ++ {"away_size_max", P_OFFINT (away_size_max), TYPE_INT}, ++ {"away_timeout", P_OFFINT (away_timeout), TYPE_INT}, ++ {"away_track", P_OFFINT (away_track), TYPE_BOOL}, ++ ++ {"completion_amount", P_OFFINT (completion_amount), TYPE_INT}, ++ {"completion_auto", P_OFFINT (nickcompletion), TYPE_BOOL}, ++ {"completion_sort", P_OFFINT (completion_sort), TYPE_INT}, ++ {"completion_suffix", P_OFFSET (nick_suffix), TYPE_STR}, ++ ++ {"dcc_auto_chat", P_OFFINT (autodccchat), TYPE_INT}, ++ {"dcc_auto_resume", P_OFFINT (autoresume), TYPE_BOOL}, ++ {"dcc_auto_send", P_OFFINT (autodccsend), TYPE_INT}, ++ {"dcc_blocksize", P_OFFINT (dcc_blocksize), TYPE_INT}, ++ {"dcc_completed_dir", P_OFFSET (dcc_completed_dir), TYPE_STR}, ++ {"dcc_dir", P_OFFSET (dccdir), TYPE_STR}, ++ {"dcc_fast_send", P_OFFINT (fastdccsend), TYPE_BOOL}, ++ {"dcc_global_max_get_cps", P_OFFINT (dcc_global_max_get_cps), TYPE_INT}, ++ {"dcc_global_max_send_cps", P_OFFINT (dcc_global_max_send_cps), TYPE_INT}, ++ {"dcc_ip", P_OFFSET (dcc_ip_str), TYPE_STR}, ++ {"dcc_ip_from_server", P_OFFINT (ip_from_server), TYPE_BOOL}, ++ {"dcc_max_get_cps", P_OFFINT (dcc_max_get_cps), TYPE_INT}, ++ {"dcc_max_send_cps", P_OFFINT (dcc_max_send_cps), TYPE_INT}, ++ {"dcc_permissions", P_OFFINT (dccpermissions), TYPE_INT}, ++ {"dcc_port_first", P_OFFINT (first_dcc_send_port), TYPE_INT}, ++ {"dcc_port_last", P_OFFINT (last_dcc_send_port), TYPE_INT}, ++ {"dcc_remove", P_OFFINT (dcc_remove), TYPE_BOOL}, ++ {"dcc_save_nick", P_OFFINT (dccwithnick), TYPE_BOOL}, ++ {"dcc_send_fillspaces", P_OFFINT (dcc_send_fillspaces), TYPE_BOOL}, ++ {"dcc_stall_timeout", P_OFFINT (dccstalltimeout), TYPE_INT}, ++ {"dcc_timeout", P_OFFINT (dcctimeout), TYPE_INT}, ++ ++ {"dnsprogram", P_OFFSET (dnsprogram), TYPE_STR}, ++ ++ {"flood_ctcp_num", P_OFFINT (ctcp_number_limit), TYPE_INT}, ++ {"flood_ctcp_time", P_OFFINT (ctcp_time_limit), TYPE_INT}, ++ {"flood_msg_num", P_OFFINT (msg_number_limit), TYPE_INT}, ++ {"flood_msg_time", P_OFFINT (msg_time_limit), TYPE_INT}, ++ ++ {"gui_auto_open_chat", P_OFFINT (autoopendccchatwindow), TYPE_BOOL}, ++ {"gui_auto_open_dialog", P_OFFINT (autodialog), TYPE_BOOL}, ++ {"gui_auto_open_recv", P_OFFINT (autoopendccrecvwindow), TYPE_BOOL}, ++ {"gui_auto_open_send", P_OFFINT (autoopendccsendwindow), TYPE_BOOL}, ++ {"gui_dialog_height", P_OFFINT (dialog_height), TYPE_INT}, ++ {"gui_dialog_left", P_OFFINT (dialog_left), TYPE_INT}, ++ {"gui_dialog_top", P_OFFINT (dialog_top), TYPE_INT}, ++ {"gui_dialog_width", P_OFFINT (dialog_width), TYPE_INT}, ++ {"gui_hide_menu", P_OFFINT (hidemenu), TYPE_BOOL}, ++ {"gui_input_spell", P_OFFINT (gui_input_spell), TYPE_BOOL}, ++ {"gui_input_style", P_OFFINT (style_inputbox), TYPE_BOOL}, ++ {"gui_join_dialog", P_OFFINT (gui_join_dialog), TYPE_BOOL}, ++ {"gui_lagometer", P_OFFINT (lagometer), TYPE_INT}, ++ {"gui_mode_buttons", P_OFFINT (chanmodebuttons), TYPE_BOOL}, ++ {"gui_pane_left_size", P_OFFINT (gui_pane_left_size), TYPE_INT}, ++ {"gui_pane_right_size", P_OFFINT (gui_pane_right_size), TYPE_INT}, ++ {"gui_quit_dialog", P_OFFINT (gui_quit_dialog), TYPE_BOOL}, ++ {"gui_slist_select", P_OFFINT (slist_select), TYPE_INT}, ++ {"gui_slist_skip", P_OFFINT (slist_skip), TYPE_BOOL}, ++ {"gui_throttlemeter", P_OFFINT (throttlemeter), TYPE_INT}, ++ {"gui_topicbar", P_OFFINT (topicbar), TYPE_BOOL}, ++ {"gui_tray", P_OFFINT (gui_tray), TYPE_BOOL}, ++ {"gui_tray_flags", P_OFFINT (gui_tray_flags), TYPE_INT}, ++ {"gui_tweaks", P_OFFINT (gui_tweaks), TYPE_INT}, ++ {"gui_ulist_buttons", P_OFFINT (userlistbuttons), TYPE_BOOL}, ++ {"gui_ulist_doubleclick", P_OFFSET (doubleclickuser), TYPE_STR}, ++ {"gui_ulist_hide", P_OFFINT (hideuserlist), TYPE_BOOL}, ++ {"gui_ulist_left", P_OFFINT (_gui_ulist_left), TYPE_BOOL}, /* obsolete */ ++ {"gui_ulist_pos", P_OFFINT (gui_ulist_pos), TYPE_INT}, ++ {"gui_ulist_resizable", P_OFFINT (paned_userlist), TYPE_BOOL}, ++ {"gui_ulist_show_hosts", P_OFFINT(showhostname_in_userlist), TYPE_BOOL}, ++ {"gui_ulist_sort", P_OFFINT (userlist_sort), TYPE_INT}, ++ {"gui_ulist_style", P_OFFINT (style_namelistgad), TYPE_BOOL}, ++ {"gui_url_mod", P_OFFINT (gui_url_mod), TYPE_INT}, ++ {"gui_usermenu", P_OFFINT (gui_usermenu), TYPE_BOOL}, ++ {"gui_win_height", P_OFFINT (mainwindow_height), TYPE_INT}, ++ {"gui_win_left", P_OFFINT (mainwindow_left), TYPE_INT}, ++ {"gui_win_save", P_OFFINT (mainwindow_save), TYPE_BOOL}, ++ {"gui_win_state", P_OFFINT (gui_win_state), TYPE_INT}, ++ {"gui_win_top", P_OFFINT (mainwindow_top), TYPE_INT}, ++ {"gui_win_width", P_OFFINT (mainwindow_width), TYPE_INT}, ++ ++#ifdef WIN32 ++ {"identd", P_OFFINT (identd), TYPE_BOOL}, ++#endif ++ {"input_balloon_chans", P_OFFINT (input_balloon_chans), TYPE_BOOL}, ++ {"input_balloon_hilight", P_OFFINT (input_balloon_hilight), TYPE_BOOL}, ++ {"input_balloon_priv", P_OFFINT (input_balloon_priv), TYPE_BOOL}, ++ {"input_balloon_time", P_OFFINT (input_balloon_time), TYPE_INT}, ++ {"input_beep_chans", P_OFFINT (input_beep_chans), TYPE_BOOL}, ++ {"input_beep_hilight", P_OFFINT (input_beep_hilight), TYPE_BOOL}, ++ {"input_beep_msg", P_OFFINT (input_beep_priv), TYPE_BOOL}, ++ {"input_command_char", P_OFFSET (cmdchar), TYPE_STR}, ++ {"input_filter_beep", P_OFFINT (filterbeep), TYPE_BOOL}, ++ {"input_flash_chans", P_OFFINT (input_flash_chans), TYPE_BOOL}, ++ {"input_flash_hilight", P_OFFINT (input_flash_hilight), TYPE_BOOL}, ++ {"input_flash_priv", P_OFFINT (input_flash_priv), TYPE_BOOL}, ++ {"input_perc_ascii", P_OFFINT (perc_ascii), TYPE_BOOL}, ++ {"input_perc_color", P_OFFINT (perc_color), TYPE_BOOL}, ++ {"input_tray_chans", P_OFFINT (input_tray_chans), TYPE_BOOL}, ++ {"input_tray_hilight", P_OFFINT (input_tray_hilight), TYPE_BOOL}, ++ {"input_tray_priv", P_OFFINT (input_tray_priv), TYPE_BOOL}, ++ ++ {"irc_auto_rejoin", P_OFFINT (autorejoin), TYPE_BOOL}, ++ {"irc_ban_type", P_OFFINT (bantype), TYPE_INT}, ++ {"irc_conf_mode", P_OFFINT (confmode), TYPE_BOOL}, ++ {"irc_extra_hilight", P_OFFSET (irc_extra_hilight), TYPE_STR}, ++ {"irc_hide_version", P_OFFINT (hidever), TYPE_BOOL}, ++ {"irc_id_ntext", P_OFFSET (irc_id_ntext), TYPE_STR}, ++ {"irc_id_ytext", P_OFFSET (irc_id_ytext), TYPE_STR}, ++ {"irc_invisible", P_OFFINT (invisible), TYPE_BOOL}, ++ {"irc_join_delay", P_OFFINT (irc_join_delay), TYPE_INT}, ++ {"irc_logging", P_OFFINT (logging), TYPE_BOOL}, ++ {"irc_logmask", P_OFFSET (logmask), TYPE_STR}, ++ {"irc_nick1", P_OFFSET (nick1), TYPE_STR}, ++ {"irc_nick2", P_OFFSET (nick2), TYPE_STR}, ++ {"irc_nick3", P_OFFSET (nick3), TYPE_STR}, ++ {"irc_nick_hilight", P_OFFSET (irc_nick_hilight), TYPE_STR}, ++ {"irc_no_hilight", P_OFFSET (irc_no_hilight), TYPE_STR}, ++ {"irc_part_reason", P_OFFSET (partreason), TYPE_STR}, ++ {"irc_quit_reason", P_OFFSET (quitreason), TYPE_STR}, ++ {"irc_raw_modes", P_OFFINT (raw_modes), TYPE_BOOL}, ++ {"irc_real_name", P_OFFSET (realname), TYPE_STR}, ++ {"irc_servernotice", P_OFFINT (servernotice), TYPE_BOOL}, ++ {"irc_skip_motd", P_OFFINT (skipmotd), TYPE_BOOL}, ++ {"irc_user_name", P_OFFSET (username), TYPE_STR}, ++ {"irc_wallops", P_OFFINT (wallops), TYPE_BOOL}, ++ {"irc_who_join", P_OFFINT (userhost), TYPE_BOOL}, ++ {"irc_whois_front", P_OFFINT (irc_whois_front), TYPE_BOOL}, ++ ++ {"net_auto_reconnect", P_OFFINT (autoreconnect), TYPE_BOOL}, ++ {"net_auto_reconnectonfail", P_OFFINT (autoreconnectonfail), TYPE_BOOL}, ++ {"net_bind_host", P_OFFSET (hostname), TYPE_STR}, ++ {"net_ping_timeout", P_OFFINT (pingtimeout), TYPE_INT}, ++ {"net_proxy_auth", P_OFFINT (proxy_auth), TYPE_BOOL}, ++ {"net_proxy_host", P_OFFSET (proxy_host), TYPE_STR}, ++ {"net_proxy_pass", P_OFFSET (proxy_pass), TYPE_STR}, ++ {"net_proxy_port", P_OFFINT (proxy_port), TYPE_INT}, ++ {"net_proxy_type", P_OFFINT (proxy_type), TYPE_INT}, ++ {"net_proxy_use", P_OFFINT (proxy_use), TYPE_INT}, ++ {"net_proxy_user", P_OFFSET (proxy_user), TYPE_STR}, ++ ++ {"net_reconnect_delay", P_OFFINT (recon_delay), TYPE_INT}, ++ {"net_throttle", P_OFFINT (throttle), TYPE_BOOL}, ++ ++ {"notify_timeout", P_OFFINT (notify_timeout), TYPE_INT}, ++ {"notify_whois_online", P_OFFINT (whois_on_notifyonline), TYPE_BOOL}, ++ ++ {"perl_warnings", P_OFFINT (perlwarnings), TYPE_BOOL}, ++ ++ {"sound_command", P_OFFSET (soundcmd), TYPE_STR}, ++ {"sound_dir", P_OFFSET (sounddir), TYPE_STR}, ++ {"stamp_log", P_OFFINT (timestamp_logs), TYPE_BOOL}, ++ {"stamp_log_format", P_OFFSET (timestamp_log_format), TYPE_STR}, ++ {"stamp_text", P_OFFINT (timestamp), TYPE_BOOL}, ++ {"stamp_text_format", P_OFFSET (stamp_format), TYPE_STR}, ++ ++ {"tab_chans", P_OFFINT (tabchannels), TYPE_BOOL}, ++ {"tab_dialogs", P_OFFINT (privmsgtab), TYPE_BOOL}, ++ {"tab_layout", P_OFFINT (tab_layout), TYPE_INT}, ++ {"tab_new_to_front", P_OFFINT (newtabstofront), TYPE_INT}, ++ {"tab_notices", P_OFFINT (notices_tabs), TYPE_BOOL}, ++ {"tab_pos", P_OFFINT (tab_pos), TYPE_INT}, ++ {"tab_position", P_OFFINT (_tabs_position), TYPE_INT}, /* obsolete */ ++ {"tab_server", P_OFFINT (use_server_tab), TYPE_BOOL}, ++ {"tab_small", P_OFFINT (tab_small), TYPE_INT}, ++ {"tab_sort", P_OFFINT (tab_sort), TYPE_BOOL}, ++ {"tab_trunc", P_OFFINT (truncchans), TYPE_INT}, ++ {"tab_utils", P_OFFINT (windows_as_tabs), TYPE_BOOL}, ++ ++ {"text_background", P_OFFSET (background), TYPE_STR}, ++ {"text_color_nicks", P_OFFINT (colorednicks), TYPE_BOOL}, ++ {"text_font", P_OFFSET (font_normal), TYPE_STR}, ++ {"text_indent", P_OFFINT (indent_nicks), TYPE_BOOL}, ++ {"text_max_indent", P_OFFINT (max_auto_indent), TYPE_INT}, ++ {"text_max_lines", P_OFFINT (max_lines), TYPE_INT}, ++ {"text_replay", P_OFFINT (text_replay), TYPE_BOOL}, ++ {"text_show_marker", P_OFFINT (show_marker), TYPE_BOOL}, ++ {"text_show_sep", P_OFFINT (show_separator), TYPE_BOOL}, ++ {"text_stripcolor", P_OFFINT (stripcolor), TYPE_BOOL}, ++ {"text_thin_sep", P_OFFINT (thin_separator), TYPE_BOOL}, ++ {"text_tint_blue", P_OFFINT (tint_blue), TYPE_INT}, ++ {"text_tint_green", P_OFFINT (tint_green), TYPE_INT}, ++ {"text_tint_red", P_OFFINT (tint_red), TYPE_INT}, ++ {"text_transparent", P_OFFINT (transparent), TYPE_BOOL}, ++ {"text_wordwrap", P_OFFINT (wordwrap), TYPE_BOOL}, ++ ++ {0, 0, 0}, ++}; ++ ++static char * ++convert_with_fallback (const char *str, const char *fallback) ++{ ++ char *utf; ++ ++ utf = g_locale_to_utf8 (str, -1, 0, 0, 0); ++ if (!utf) ++ { ++ /* this can happen if CHARSET envvar is set wrong */ ++ /* maybe it's already utf8 (breakage!) */ ++ if (!g_utf8_validate (str, -1, NULL)) ++ utf = g_strdup (fallback); ++ else ++ utf = g_strdup (str); ++ } ++ ++ return utf; ++} ++ ++void ++load_config (void) ++{ ++ struct stat st; ++ char *cfg, *sp; ++ const char *username, *realname; ++ int res, val, i, fh; ++ ++ check_prefs_dir (); ++ username = g_get_user_name (); ++ if (!username) ++ username = "root"; ++ ++ realname = g_get_real_name (); ++ if ((realname && realname[0] == 0) || !realname) ++ realname = username; ++ ++ username = convert_with_fallback (username, "username"); ++ realname = convert_with_fallback (realname, "realname"); ++ ++ memset (&prefs, 0, sizeof (struct xchatprefs)); ++ ++ /* put in default values, anything left out is automatically zero */ ++ prefs.local_ip = 0xffffffff; ++ prefs.irc_join_delay = 3; ++ prefs.show_marker = 1; ++ prefs.newtabstofront = 2; ++ prefs.completion_amount = 5; ++ prefs.away_timeout = 60; ++ prefs.away_size_max = 300; ++ prefs.away_track = 1; ++ prefs.timestamp_logs = 1; ++ prefs.truncchans = 20; ++ prefs.autoresume = 1; ++ prefs.show_away_once = 1; ++ prefs.indent_nicks = 1; ++ prefs.thin_separator = 1; ++ prefs._tabs_position = 2; /* 2 = left */ ++ prefs.fastdccsend = 1; ++ prefs.wordwrap = 1; ++ prefs.autosave = 1; ++ prefs.autodialog = 1; ++ prefs.gui_input_spell = 1; ++ prefs.autoreconnect = 1; ++ prefs.recon_delay = 10; ++ prefs.text_replay = 1; ++ prefs.tabchannels = 1; ++ prefs.tab_layout = 2; /* 0=Tabs 1=Reserved 2=Tree */ ++ prefs.tab_sort = 1; ++ prefs.paned_userlist = 1; ++ prefs.newtabstofront = 2; ++ prefs.use_server_tab = 1; ++ prefs.privmsgtab = 1; ++ /*prefs.style_inputbox = 1;*/ ++ prefs.dccpermissions = 0600; ++ prefs.max_lines = 500; ++ prefs.mainwindow_width = 640; ++ prefs.mainwindow_height = 400; ++ prefs.dialog_width = 500; ++ prefs.dialog_height = 256; ++ prefs.gui_join_dialog = 1; ++ prefs.gui_quit_dialog = 1; ++ prefs.dcctimeout = 180; ++ prefs.dccstalltimeout = 60; ++ prefs.notify_timeout = 15; ++ prefs.tint_red = ++ prefs.tint_green = ++ prefs.tint_blue = 195; ++ prefs.auto_indent = 1; ++ prefs.max_auto_indent = 256; ++ prefs.show_separator = 1; ++ prefs.dcc_blocksize = 1024; ++ prefs.throttle = 1; ++ /*FIXME*/ prefs.msg_time_limit = 30; ++ prefs.msg_number_limit = 5; ++ prefs.ctcp_time_limit = 30; ++ prefs.ctcp_number_limit = 5; ++ prefs.topicbar = 1; ++ prefs.lagometer = 1; ++ prefs.throttlemeter = 1; ++ prefs.autoopendccrecvwindow = 1; ++ prefs.autoopendccsendwindow = 1; ++ prefs.autoopendccchatwindow = 1; ++ prefs.userhost = 1; ++ prefs.gui_url_mod = 4; /* ctrl */ ++ prefs.gui_tray = 1; ++ prefs.gui_pane_left_size = 100; ++ prefs.gui_pane_right_size = 100; ++ prefs.mainwindow_save = 1; ++ prefs.bantype = 2; ++ prefs.input_balloon_time = 20; ++ prefs.input_flash_priv = prefs.input_flash_hilight = 1; ++ prefs.input_tray_priv = prefs.input_tray_hilight = 1; ++ prefs.autodccsend = 2; /* browse mode */ ++#ifdef WIN32 ++ prefs.identd = 1; ++#endif ++ strcpy (prefs.stamp_format, "[%H:%M] "); ++ strcpy (prefs.timestamp_log_format, "%b %d %H:%M:%S "); ++ strcpy (prefs.logmask, "%n-%c.log"); ++ strcpy (prefs.nick_suffix, ","); ++ strcpy (prefs.cmdchar, "/"); ++ strcpy (prefs.nick1, username); ++ strcpy (prefs.nick2, username); ++ strcat (prefs.nick2, "_"); ++ strcpy (prefs.nick3, username); ++ strcat (prefs.nick3, "__"); ++ strcpy (prefs.realname, realname); ++ strcpy (prefs.username, username); ++#ifdef WIN32 ++ strcpy (prefs.sounddir, "./sounds"); ++ { ++ char out[256]; ++ ++ if (get_reg_str ("Software\\Microsoft\\Windows\\CurrentVersion\\" ++ "Explorer\\Shell Folders", "Personal", out, sizeof (out))) ++ snprintf (prefs.dccdir, sizeof (prefs.dccdir), "%s\\Downloads", out); ++ else ++ snprintf (prefs.dccdir, sizeof (prefs.dccdir), "%s\\Downloads", get_xdir_utf8 ()); ++ } ++#else ++ snprintf (prefs.sounddir, sizeof (prefs.sounddir), "%s/sounds", get_xdir_utf8 ()); ++ snprintf (prefs.dccdir, sizeof (prefs.dccdir), "%s/downloads", get_xdir_utf8 ()); ++#endif ++ strcpy (prefs.doubleclickuser, "QUOTE WHOIS %s %s"); ++ strcpy (prefs.awayreason, _("I'm busy")); ++ strcpy (prefs.quitreason, _("Leaving")); ++ strcpy (prefs.partreason, prefs.quitreason); ++ strcpy (prefs.font_normal, DEF_FONT); ++ strcpy (prefs.dnsprogram, "host"); ++ strcpy (prefs.irc_no_hilight, "NickServ,ChanServ"); ++ ++ g_free ((char *)username); ++ g_free ((char *)realname); ++ ++ fh = open (default_file (), OFLAGS | O_RDONLY); ++ if (fh != -1) ++ { ++ fstat (fh, &st); ++ cfg = malloc (st.st_size + 1); ++ cfg[0] = '\0'; ++ i = read (fh, cfg, st.st_size); ++ if (i >= 0) ++ cfg[i] = '\0'; /* make sure cfg is NULL terminated */ ++ close (fh); ++ i = 0; ++ do ++ { ++ switch (vars[i].type) ++ { ++ case TYPE_STR: ++ cfg_get_str (cfg, vars[i].name, (char *) &prefs + vars[i].offset, ++ vars[i].len); ++ break; ++ case TYPE_BOOL: ++ case TYPE_INT: ++ val = cfg_get_int_with_result (cfg, vars[i].name, &res); ++ if (res) ++ *((int *) &prefs + vars[i].offset) = val; ++ break; ++ } ++ i++; ++ } ++ while (vars[i].name); ++ ++ free (cfg); ++ ++ } else ++ { ++#ifndef WIN32 ++#ifndef __EMX__ ++ /* OS/2 uses UID 0 all the time */ ++ if (getuid () == 0) ++ fe_message (_("* Running IRC as root is stupid! You should\n" ++ " create a User Account and use that to login.\n"), FE_MSG_WARN|FE_MSG_WAIT); ++#endif ++#endif /* !WIN32 */ ++ ++ mkdir_utf8 (prefs.dccdir); ++ mkdir_utf8 (prefs.dcc_completed_dir); ++ } ++ if (prefs.mainwindow_height < 138) ++ prefs.mainwindow_height = 138; ++ if (prefs.mainwindow_width < 106) ++ prefs.mainwindow_width = 106; ++ ++ sp = strchr (prefs.username, ' '); ++ if (sp) ++ sp[0] = 0; /* spaces in username would break the login */ ++ ++ /* try to make sense of old ulist/tree position settings */ ++ if (prefs.gui_ulist_pos == 0) ++ { ++ prefs.gui_ulist_pos = 3; /* top right */ ++ if (prefs._gui_ulist_left) ++ prefs.gui_ulist_pos = 2; /* bottom left */ ++ ++ switch (prefs._tabs_position) ++ { ++ case 0: ++ prefs.tab_pos = 6; /* bottom */ ++ break; ++ case 1: ++ prefs.tab_pos = 5; /* top */ ++ break; ++ case 2: ++ prefs.tab_pos = 1; /* left */ ++ break; ++ case 3: ++ prefs.tab_pos = 4; /* right */ ++ break; ++ case 4: ++ prefs.tab_pos = 1; /* (hidden)left */ ++ break; ++ case 5: ++ if (prefs._gui_ulist_left) ++ { ++ prefs.tab_pos = 1; /* above ulist left */ ++ prefs.gui_ulist_pos = 2; ++ } ++ else ++ { ++ prefs.tab_pos = 3; /* above ulist right */ ++ prefs.gui_ulist_pos = 4; ++ } ++ break; ++ } ++ } ++} ++ ++int ++save_config (void) ++{ ++ int fh, i; ++ char *new_config, *config; ++ ++ check_prefs_dir (); ++ ++ config = default_file (); ++ new_config = malloc (strlen (config) + 5); ++ strcpy (new_config, config); ++ strcat (new_config, ".new"); ++ ++ fh = open (new_config, OFLAGS | O_TRUNC | O_WRONLY | O_CREAT, 0600); ++ if (fh == -1) ++ { ++ free (new_config); ++ return 0; ++ } ++ ++ if (!cfg_put_str (fh, "version", PACKAGE_VERSION)) ++ { ++ free (new_config); ++ return 0; ++ } ++ ++ i = 0; ++ do ++ { ++ switch (vars[i].type) ++ { ++ case TYPE_STR: ++ if (!cfg_put_str (fh, vars[i].name, (char *) &prefs + vars[i].offset)) ++ { ++ free (new_config); ++ return 0; ++ } ++ break; ++ case TYPE_INT: ++ case TYPE_BOOL: ++ if (!cfg_put_int (fh, *((int *) &prefs + vars[i].offset), vars[i].name)) ++ { ++ free (new_config); ++ return 0; ++ } ++ } ++ i++; ++ } ++ while (vars[i].name); ++ ++ if (close (fh) == -1) ++ { ++ free (new_config); ++ return 0; ++ } ++ ++#ifdef WIN32 ++ unlink (config); /* win32 can't rename to an existing file */ ++#endif ++ if (rename (new_config, config) == -1) ++ { ++ free (new_config); ++ return 0; ++ } ++ free (new_config); ++ ++ return 1; ++} ++ ++static void ++set_showval (session *sess, const struct prefs *var, char *tbuf) ++{ ++ int len, dots, j; ++ ++ len = strlen (var->name); ++ memcpy (tbuf, var->name, len); ++ dots = 29 - len; ++ if (dots < 0) ++ dots = 0; ++ tbuf[len++] = '\003'; ++ tbuf[len++] = '2'; ++ for (j=0;jtype) ++ { ++ case TYPE_STR: ++ sprintf (tbuf + len, "\0033:\017 %s\n", ++ (char *) &prefs + var->offset); ++ break; ++ case TYPE_INT: ++ sprintf (tbuf + len, "\0033:\017 %d\n", ++ *((int *) &prefs + var->offset)); ++ break; ++ case TYPE_BOOL: ++ if (*((int *) &prefs + var->offset)) ++ sprintf (tbuf + len, "\0033:\017 %s\n", "ON"); ++ else ++ sprintf (tbuf + len, "\0033:\017 %s\n", "OFF"); ++ break; ++ } ++ PrintText (sess, tbuf); ++} ++ ++static void ++set_list (session * sess, char *tbuf) ++{ ++ int i; ++ ++ i = 0; ++ do ++ { ++ set_showval (sess, &vars[i], tbuf); ++ i++; ++ } ++ while (vars[i].name); ++} ++ ++int ++cfg_get_bool (char *var) ++{ ++ int i = 0; ++ ++ do ++ { ++ if (!strcasecmp (var, vars[i].name)) ++ { ++ return *((int *) &prefs + vars[i].offset); ++ } ++ i++; ++ } ++ while (vars[i].name); ++ ++ return -1; ++} ++ ++int ++cmd_set (struct session *sess, char *tbuf, char *word[], char *word_eol[]) ++{ ++ int wild = FALSE; ++ int or = FALSE; ++ int off = FALSE; ++ int quiet = FALSE; ++ int erase = FALSE; ++ int i = 0, finds = 0, found; ++ int idx = 2; ++ char *var, *val; ++ ++ if (strcasecmp (word[2], "-e") == 0) ++ { ++ idx++; ++ erase = TRUE; ++ } ++ ++ /* turn a bit OFF */ ++ if (strcasecmp (word[idx], "-off") == 0) ++ { ++ idx++; ++ off = TRUE; ++ } ++ ++ /* turn a bit ON */ ++ if (strcasecmp (word[idx], "-or") == 0 || strcasecmp (word[idx], "-on") == 0) ++ { ++ idx++; ++ or = TRUE; ++ } ++ ++ if (strcasecmp (word[idx], "-quiet") == 0) ++ { ++ idx++; ++ quiet = TRUE; ++ } ++ ++ var = word[idx]; ++ val = word_eol[idx+1]; ++ ++ if (!*var) ++ { ++ set_list (sess, tbuf); ++ return TRUE; ++ } ++ ++ if ((strchr (var, '*') || strchr (var, '?')) && !*val) ++ wild = TRUE; ++ ++ if (*val == '=') ++ val++; ++ ++ do ++ { ++ if (wild) ++ found = !match (var, vars[i].name); ++ else ++ found = strcasecmp (var, vars[i].name); ++ ++ if (found == 0) ++ { ++ finds++; ++ switch (vars[i].type) ++ { ++ case TYPE_STR: ++ if (erase || *val) ++ { ++ strncpy ((char *) &prefs + vars[i].offset, val, vars[i].len); ++ ((char *) &prefs)[vars[i].offset + vars[i].len - 1] = 0; ++ if (!quiet) ++ PrintTextf (sess, "%s set to: %s\n", var, (char *) &prefs + vars[i].offset); ++ } else ++ { ++ set_showval (sess, &vars[i], tbuf); ++ } ++ break; ++ case TYPE_INT: ++ case TYPE_BOOL: ++ if (*val) ++ { ++ if (vars[i].type == TYPE_BOOL) ++ { ++ if (atoi (val)) ++ *((int *) &prefs + vars[i].offset) = 1; ++ else ++ *((int *) &prefs + vars[i].offset) = 0; ++ if (!strcasecmp (val, "YES") || !strcasecmp (val, "ON")) ++ *((int *) &prefs + vars[i].offset) = 1; ++ if (!strcasecmp (val, "NO") || !strcasecmp (val, "OFF")) ++ *((int *) &prefs + vars[i].offset) = 0; ++ } else ++ { ++ if (or) ++ *((int *) &prefs + vars[i].offset) |= atoi (val); ++ else if (off) ++ *((int *) &prefs + vars[i].offset) &= ~(atoi (val)); ++ else ++ *((int *) &prefs + vars[i].offset) = atoi (val); ++ } ++ if (!quiet) ++ PrintTextf (sess, "%s set to: %d\n", var, ++ *((int *) &prefs + vars[i].offset)); ++ } else ++ { ++ set_showval (sess, &vars[i], tbuf); ++ } ++ break; ++ } ++ } ++ i++; ++ } ++ while (vars[i].name); ++ ++ if (!finds && !quiet) ++ PrintText (sess, "No such variable.\n"); ++ ++ return TRUE; ++} ++ ++int ++xchat_open_file (char *file, int flags, int mode, int xof_flags) ++{ ++ char buf[1024]; ++ ++ if (xof_flags & XOF_FULLPATH) ++ { ++ if (xof_flags & XOF_DOMODE) ++ return open (file, flags | OFLAGS, mode); ++ else ++ return open (file, flags | OFLAGS); ++ } ++ ++ snprintf (buf, sizeof (buf), "%s/%s", get_xdir_fs (), file); ++ if (xof_flags & XOF_DOMODE) ++ return open (buf, flags | OFLAGS, mode); ++ else ++ return open (buf, flags | OFLAGS); ++} ++ ++FILE * ++xchat_fopen_file (const char *file, const char *mode, int xof_flags) ++{ ++ char buf[1024]; ++ ++ if (xof_flags & XOF_FULLPATH) ++ return fopen (file, mode); ++ ++ snprintf (buf, sizeof (buf), "%s/%s", get_xdir_fs (), file); ++ return fopen (buf, mode); ++} +diff -urNp xchat-2.8.8.orig/src/common/xchat.h xchat-2.8.8/src/common/xchat.h +--- xchat-2.8.8.orig/src/common/xchat.h 2013-06-10 14:26:55.885425482 +0200 ++++ xchat-2.8.8/src/common/xchat.h 2013-06-10 14:27:23.748503597 +0200 +@@ -1,6 +1,7 @@ + #include "../../config.h" + + #include ++#include + #include /* need time_t */ + + #ifndef XCHAT_H diff --git a/xchat.spec b/xchat.spec index ee26d1a..cc3dfc6 100644 --- a/xchat.spec +++ b/xchat.spec @@ -4,7 +4,7 @@ Summary: A popular and easy to use graphical IRC (chat) client Name: xchat Version: 2.8.8 -Release: 18%{?dist} +Release: 19%{?dist} Epoch: 1 Group: Applications/Internet License: GPLv2+ @@ -48,6 +48,10 @@ Patch53: xchat-2.8.8-link-against-libnotify.patch Patch54: xchat-2.8.8-glib.patch # http://sourceforge.net/p/xchat/bugs/1504/ Patch55: xchat-2.8.8-hires-icons.patch +# http://sourceforge.net/p/xchat/bugs/1506/ +Patch56: xchat-2.8.8-xdg-dirs.patch +# http://sourceforge.net/p/xchat/bugs/1397/ +Patch57: xchat-2.8.8-desktop-file-name.patch BuildRequires: perl perl(ExtUtils::Embed) python-devel openssl-devel pkgconfig, tcl-devel BuildRequires: GConf2-devel @@ -107,6 +111,8 @@ This package contains the X-Chat plugin providing the Tcl scripting interface. %patch53 -p1 -b .link-against-libnotify %patch54 -p0 -b .glib %patch55 -p1 -b .hires-icons +%patch56 -p1 -b .xdg-dirs +%patch57 -p1 -b .desktop-file-name sed -i -e 's/#define GTK_DISABLE_DEPRECATED//g' src/fe-gtk/*.c @@ -207,6 +213,12 @@ fi %{_libdir}/xchat/plugins/tcl.so %changelog +* Mon Jun 10 2013 Debarshi Ray - 1:2.8.8-19 +- Use XDG_CONFIG_HOME instead of home for config files + (http://sourceforge.net/p/xchat/bugs/1506/) +- Use name and generic name correctly in desktop file + (http://sourceforge.net/p/xchat/bugs/1397/) + * Fri Jun 07 2013 Debarshi Ray - 1:2.8.8-18 - Add hi-res icons (http://sourceforge.net/p/xchat/bugs/1504/) From 31402e78cc6a18afb280a2375e46b737f87368ad Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Wed, 29 Oct 2014 11:39:34 +0100 Subject: [PATCH 4/5] Fix the dates --- xchat.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xchat.spec b/xchat.spec index cc3dfc6..4d6d738 100644 --- a/xchat.spec +++ b/xchat.spec @@ -246,10 +246,10 @@ fi * Fri Jun 17 2011 Marcela Mašláňová - 1:2.8.8-10 - Perl mass rebuild -* Tue Apr 7 2011 Christopher Aillon - 1:2.8.8-9 +* Thu Apr 07 2011 Christopher Aillon - 1:2.8.8-9 - Link against libnotify (#693362) -* Tue Apr 7 2011 Christopher Aillon - 1:2.8.8-8 +* Thu Apr 07 2011 Christopher Aillon - 1:2.8.8-8 - Update the dynamic libnotify check for the newer soname (#693362) * Mon Feb 07 2011 Fedora Release Engineering - 1:2.8.8-7 From 542694e5743b607b6838d7a4faa81ae5603c44ca Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Wed, 29 Oct 2014 11:40:25 +0100 Subject: [PATCH 5/5] Do not force SSLv3, also allow TLSv1_X (#1091544) --- 0001-Don-t-force-the-use-of-SSLv3.patch | 37 +++++++++++++++++++++++++ xchat.spec | 8 +++++- 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 0001-Don-t-force-the-use-of-SSLv3.patch diff --git a/0001-Don-t-force-the-use-of-SSLv3.patch b/0001-Don-t-force-the-use-of-SSLv3.patch new file mode 100644 index 0000000..e0f0472 --- /dev/null +++ b/0001-Don-t-force-the-use-of-SSLv3.patch @@ -0,0 +1,37 @@ +From 527eb322a5bfa97d5716e7f8178e319c515065a2 Mon Sep 17 00:00:00 2001 +From: Marc Deslauriers +Date: Mon, 20 Oct 2014 10:08:26 -0400 +Subject: [PATCH] Don't force the use of SSLv3. + +SSLv3 should no longer be used for security reasons. Let the best +connection method be automatically determined by using SSLv23_client_method() +and SSLv23_server_method(). +--- + src/common/ssl.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/common/ssl.c b/src/common/ssl.c +index a18ad47..35eb237 100644 +--- a/src/common/ssl.c ++++ b/src/common/ssl.c +@@ -70,7 +70,7 @@ _SSL_context_init (void (*info_cb_func), int server) + + SSLeay_add_ssl_algorithms (); + SSL_load_error_strings (); +- ctx = SSL_CTX_new (server ? SSLv3_server_method() : SSLv3_client_method ()); ++ ctx = SSL_CTX_new (server ? SSLv23_server_method() : SSLv23_client_method ()); + + SSL_CTX_set_session_cache_mode (ctx, SSL_SESS_CACHE_BOTH); + SSL_CTX_set_timeout (ctx, 300); +@@ -281,7 +281,7 @@ _SSL_socket (SSL_CTX *ctx, int sd) + __SSL_critical_error ("SSL_new"); + + SSL_set_fd (ssl, sd); +- if (ctx->method == SSLv3_client_method()) ++ if (ctx->method == SSLv23_client_method()) + SSL_set_connect_state (ssl); + else + SSL_set_accept_state(ssl); +-- +2.1.0 + diff --git a/xchat.spec b/xchat.spec index 4d6d738..727e2ec 100644 --- a/xchat.spec +++ b/xchat.spec @@ -4,7 +4,7 @@ Summary: A popular and easy to use graphical IRC (chat) client Name: xchat Version: 2.8.8 -Release: 19%{?dist} +Release: 20%{?dist} Epoch: 1 Group: Applications/Internet License: GPLv2+ @@ -52,6 +52,8 @@ Patch55: xchat-2.8.8-hires-icons.patch Patch56: xchat-2.8.8-xdg-dirs.patch # http://sourceforge.net/p/xchat/bugs/1397/ Patch57: xchat-2.8.8-desktop-file-name.patch +# https://bugzilla.redhat.com/show_bug.cgi?id=1091544 +Patch58: 0001-Don-t-force-the-use-of-SSLv3.patch BuildRequires: perl perl(ExtUtils::Embed) python-devel openssl-devel pkgconfig, tcl-devel BuildRequires: GConf2-devel @@ -113,6 +115,7 @@ This package contains the X-Chat plugin providing the Tcl scripting interface. %patch55 -p1 -b .hires-icons %patch56 -p1 -b .xdg-dirs %patch57 -p1 -b .desktop-file-name +%patch58 -p1 -b .allow-tls sed -i -e 's/#define GTK_DISABLE_DEPRECATED//g' src/fe-gtk/*.c @@ -213,6 +216,9 @@ fi %{_libdir}/xchat/plugins/tcl.so %changelog +* Wed Oct 29 2014 Debarshi Ray - 1:2.8.8-20 +- Do not force SSLv3, also allow TLSv1_X (#1091544) + * Mon Jun 10 2013 Debarshi Ray - 1:2.8.8-19 - Use XDG_CONFIG_HOME instead of home for config files (http://sourceforge.net/p/xchat/bugs/1506/)