From 148d3885ada8c0729af23cfd1d661438df542473 Mon Sep 17 00:00:00 2001 From: celeron533 Date: Sat, 6 Jul 2019 21:17:03 +0800 Subject: [PATCH] Code refactoring: Notification tray icon --- .../Properties/Resources.Designer.cs | 28 +-- shadowsocks-csharp/Properties/Resources.resx | 19 +- shadowsocks-csharp/Resources/ss128.pdn | Bin 0 -> 15863 bytes shadowsocks-csharp/Resources/ss16.png | Bin 376 -> 0 bytes shadowsocks-csharp/Resources/ss20.png | Bin 411 -> 0 bytes shadowsocks-csharp/Resources/ss24.png | Bin 492 -> 0 bytes shadowsocks-csharp/Resources/ss32.pdn | Bin 0 -> 7187 bytes shadowsocks-csharp/Resources/ss32Fill.png | Bin 0 -> 617 bytes shadowsocks-csharp/Resources/ss32In.png | Bin 0 -> 211 bytes shadowsocks-csharp/Resources/ss32Out.png | Bin 0 -> 215 bytes shadowsocks-csharp/Resources/ss32Outline.png | Bin 0 -> 787 bytes shadowsocks-csharp/Resources/ssIn24.png | Bin 225 -> 0 bytes shadowsocks-csharp/Resources/ssOut24.png | Bin 239 -> 0 bytes shadowsocks-csharp/Util/Util.cs | 14 +- shadowsocks-csharp/Util/ViewUtils.cs | 134 ++++++++++---- shadowsocks-csharp/View/MenuViewController.cs | 204 ++++++++++----------- shadowsocks-csharp/shadowsocks-csharp.csproj | 19 +- 17 files changed, 224 insertions(+), 194 deletions(-) create mode 100644 shadowsocks-csharp/Resources/ss128.pdn delete mode 100755 shadowsocks-csharp/Resources/ss16.png delete mode 100755 shadowsocks-csharp/Resources/ss20.png delete mode 100755 shadowsocks-csharp/Resources/ss24.png create mode 100644 shadowsocks-csharp/Resources/ss32.pdn create mode 100644 shadowsocks-csharp/Resources/ss32Fill.png create mode 100644 shadowsocks-csharp/Resources/ss32In.png create mode 100644 shadowsocks-csharp/Resources/ss32Out.png create mode 100644 shadowsocks-csharp/Resources/ss32Outline.png delete mode 100644 shadowsocks-csharp/Resources/ssIn24.png delete mode 100644 shadowsocks-csharp/Resources/ssOut24.png diff --git a/shadowsocks-csharp/Properties/Resources.Designer.cs b/shadowsocks-csharp/Properties/Resources.Designer.cs index 9c931553..5740858f 100644 --- a/shadowsocks-csharp/Properties/Resources.Designer.cs +++ b/shadowsocks-csharp/Properties/Resources.Designer.cs @@ -116,7 +116,7 @@ namespace Shadowsocks.Properties { ///logfile ss_privoxy.log ///show-on-task-bar 0 ///activity-animation 0 - ///forward-socks5 / 127.0.0.1:__SOCKS_PORT__ . + ///forward-socks5 / __SOCKS_HOST__:__SOCKS_PORT__ . ///max-client-connections 2048 ///hide-console ///. @@ -150,9 +150,9 @@ namespace Shadowsocks.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap ss16 { + internal static System.Drawing.Bitmap ss32Fill { get { - object obj = ResourceManager.GetObject("ss16", resourceCulture); + object obj = ResourceManager.GetObject("ss32Fill", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -160,9 +160,9 @@ namespace Shadowsocks.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap ss20 { + internal static System.Drawing.Bitmap ss32In { get { - object obj = ResourceManager.GetObject("ss20", resourceCulture); + object obj = ResourceManager.GetObject("ss32In", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -170,9 +170,9 @@ namespace Shadowsocks.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap ss24 { + internal static System.Drawing.Bitmap ss32Out { get { - object obj = ResourceManager.GetObject("ss24", resourceCulture); + object obj = ResourceManager.GetObject("ss32Out", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -180,19 +180,9 @@ namespace Shadowsocks.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap ssIn24 { + internal static System.Drawing.Bitmap ss32Outline { get { - object obj = ResourceManager.GetObject("ssIn24", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap ssOut24 { - get { - object obj = ResourceManager.GetObject("ssOut24", resourceCulture); + object obj = ResourceManager.GetObject("ss32Outline", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } diff --git a/shadowsocks-csharp/Properties/Resources.resx b/shadowsocks-csharp/Properties/Resources.resx index f95c473e..081bd8d8 100755 --- a/shadowsocks-csharp/Properties/Resources.resx +++ b/shadowsocks-csharp/Properties/Resources.resx @@ -136,20 +136,17 @@ ..\Data\proxy.pac.txt.gz;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\Resources\ss16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\ss32Fill.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\ss20.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\ss32In.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\ss24.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\ss32Out.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\ssIn24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\ssOut24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\ss32Outline.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\ssw128.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/shadowsocks-csharp/Resources/ss128.pdn b/shadowsocks-csharp/Resources/ss128.pdn new file mode 100644 index 0000000000000000000000000000000000000000..5fa50a374cb9c4d85b179e9ab36aa7a139f7eddf GIT binary patch literal 15863 zcmV1w zJalMvZDJsBZf89rX;wl{Qg<**M`v$AK|w)IQ&nh1RcAp#K}kVDK|w=7LqSxQZPwDa&t6eHc>%AK|xY(QB^TQK|w=!YIk-xSy5F%K|w)EV?}6M zV|PJ8L~~6+K|wb}L1ScgaYs=>K|wD~Q&mzzR!C@NH(D`faY9%~NMmMpF;{gsPHJH_ zYE(5@OK~zzFl=aXQAtTgLwYwfNliyXXJ|o6LT^$_O-Dm;MM86PIaNn>MN@1;W=cV4 zF+xIca8_wiNkU_0W=cY7cUehLMs9j{QC4tNN=ImEMR0amctcZRS4(hhD=#o(T6$V~ zHFbA2S}$gGFEdawLoqK;c4cNzH+6U`S~6rWO*t=SdPz2GcUoFlXD@7NNklblGi`5o zR7ym5RVzzKG;A+TS9dZ;LQ+gQQf5X>Yf@roYI15$W=>LPM?*wHPEZ|I9N?;c0*V%b}}|AFmXdRS3^WAS5$gYD`_}zN>EEhWlnWTH+D~TD@ag! zF;QYxL32rFMo%kCXJtl4O;T%XI7mlQWivHZLRmyudPZYnRzXcvG;wxmOk_n%VlQiE zO;j{%H)nQfRx~$RRZ~%SW=(E5a79KnHbYl9HC9D9AcUEO{S3*Z~S8`ZOW>YyUdN49WRBv!AG)`qsZZvK;dQ~`LMoCX~cWF6h zc4~JtWoAliK|@(>N_2WqY;SHkNmNK~X>LeHba_%ya6)WxYePA2VPa)TRxnanGe<;9 zYiU<#I8Q`*HDh*lH92=-G;2mfNN86tO-)QkN@7SuY)))NXDfPARWE63QZzV6IV(40 zO*u&~cuGZTQaO5dZcJVP*X%WS7b$2a(P%dZfY?%XKZydVrXnN zD>P1LFivhqWnx7$N=|8FS#)u7Gc`+6Q8-~{M>teOV{k=hdQw$%M?!66IASYncWicZ zGE7KBGgex5NH9WaP*Y=ha%ebgHEvQ$NlH&t{@VrgwuT5MxZc4$XsZ%ubnVNg**SYlanRyH(QLu62B zH%@JOdU9GwOmB8lYeZ;jG;w4{a!hzhSx##=L1-~JS4VbNMKd&OGE8_iV=`hxS1WpE zb~!I(QZr*jQ%y-@MsQ6}D^po)a#cZjMlx`BMNe2tbT?>dcQj&WG;>!>QgTXjb5}QH zPi|ypS2$KrQ%Y1ZG;UHzFG@>OK~PRLb1QUcXG~UYVl;JiM@>j!bXRnGML9P^O*BJS zX>c-8Nl!R7L1& zF)ftD^p5%D=%7fGj~F9IBG>xL2Y(2bWdqzct=7w zW=wihcWib=PH#bBWJ5$#YcOUsbV@ZiYhgoEPjyuHG;DHCVM;PZ zbT~q4V@Wnda&2)$OmAv1H9|!zQ!pzlVNH2tPdR0DK|*+HL3cS>b2Mf}L~AQ6Q%^`{ zW_EUTG)gfuGipdLT2WAAQe|W`M@m|CG)qBMR5>?DFJ^W#XE<(3d1XUNN;Nb|T5B~p zIWag;NNRU?ZZ=d%Z&go7Gfz-)PDw*YMowX2H&R1oXi05pXhCLJa%?b6F>!cWML2m{ zO*CdXW-u`?P-AsccQ7(yPI7KYXnJcgF+*x(YcphcD|S?HG)zcHNNrFrSUGfgFi=Ws zX<{@-FiJ#0S8`2ccWO>Zc5P~CK~qmhGj&2uI8RelRCii4H*|M+GcajTHaTT>bvboz zbW(LTWKwT&H8^fmc1JH{b#hm9Oh`m!c1UYZ>bK{r81cS>+VZgzQi zSvY1mMKmilIY@STGH!8DOJp@QSusIPNk@82G&V{%O-fiXHArT5GjuUmRB%R8cz9+` zVJmYvZFN;?Wob}FQAlBCG-qviR&i-oN-#MyX)i`MbT)TsGh{|?ctk>0ZcjIFdRlWc zdSNelQdTfdNlSQIZ**2+LqRKbSaLIQL^onVO?gT=VsSP&F>ZEaMsIL1M@%qTT1i$} zVOCT_YcMNIV=HD)Qc+enN=j9CM{jOwM@%7M2Wo=bXNlP|UW>-se zXhCE}I9fJTQZ{sKMlp0*N;F|+MN)HBLs3dnS}!XwQgBv8a8!CVN<%|IICpnfc}!Av zcxhQdLwPnuLwYMwYDR7_MNm^RVq|t>b8bgvOLtFmS7BLeF)%eWQA|W`T4ZEHXKH$4 zcs5#TXfZTJO*BYMM@n^XZ)ZkTPgOW8OHpV+c4AgBNm+94bQB!e4P;gpm zOn7irPeyY`cQHwBGBI#+baG-tXL?RYaMm05g zWphPUa6?#nYk6;4aA!6|c5g6ZPBm|IY(Y+GOICANYguqwM@MgZR5vtcM@ut$RB2N< zNkcSMSYkv)VRC0pL`!UKLP>CJXH{@wXlF)6IW%QdG%GeVY;#FOL26`SODj1vI73i4 zSxItYNJuktF>Yl^MPqMeaa4FOFLHQdT5d^bV=z^8H8^fFL2pN5WOrCXVs)V@@wcVNgp?X)9q=G&C?ncx!Q4F>6>$Rxwy-D^g5kd2l#c zYg#opGg(zgY)&yZV?jx4cz8m3OJ{L7NHjHYYfws7T69EiXLf2tY-@FEIb&}{IY?$i zL`GU!T32&2LsUayS4~V#P*h=3NI_CFV@+d5H#B2PaYlG_S7R?}Q&CSgGE7=?Noh}0 zZDm17Z*q2MG*4}AZZbA(Ph@2^L2^Q6SZh>aR&paS2 zIY>b>Geu!GQ#5xtFlI7uLw9IZc4bdzbz@U2H&InXadts7Wn(jGQ&CVyNlJHla%e?* zK{QQfD^7StFKl;kH*YmVFmQKMML9uaadk>>NH1h@OfWD@O>Ie9c2+klPBud~M|d?e zSaMD@FmpkAXG3UmVrN-VM|oLwZ$x8JL~buOT1QDoV^K zR8KTFYDqOQR83_vN=RpEOj>bnR%l~VQC3iJHcK=%T46#pGecrWQDSICSVBj7Wll^% zZ8A4yVrD~eRYE~HG;cXGbxBEeOH^rUVMcB#iVq`XY zWll>$S2lQ9d17@=Sz1v?XK8n3L3BoFM@(yLQCU%CQe<#NRYx>>Gi*g!cu6u#YsjYhq+aT61?zYEoflIYVc6ST$&CG-g?ELql&lN;ElVL^xx0Lsd&^ zX)iHVWmPsqLpCo{S~6KdY*B4CY%+95cx_@YQ)YNgW;b(4M@mdVXgP5&W_B?)FM3U7 zQ&2E^O;K)PT6RTuRz`P7YfO4+Y)W%yWO+k)VRK<>GcRsLHc)9Zbu=_FM@LFwFI7%s zOhZ~iabiw1Flj+{K{jejS41^>Gj?WXX-a8LX=Z44X;e5;NO(p_cvNUvadAX;Q#Ud) zbZk&ZOiDB`I8aGhLUl%XWi)MfT2EqXLo+sRRy8+bQ7=$4Y(i*QWkf-EO>IzfZEQ7S zN;N`CNHJJ=IdxD&Z8m6Wa5h;^N>OKNYcy&vD@|%mS64AYSa@xEWll>$NN;a+b}(vD zQ!9E^NkL(6OH4RqNK!CPR4YVPF-lQ2a%NRRQgCy0b}(saQ*TdMD@s~6Mlvu$N>eaF zP*HI>XE$$abY(YVb!1O;K}%IxQAk)uNKi#ib5k=`dSXg%cQSD{I7mraV^>vTNyaz$raaxqCuSVAyOZ%l7OZ!~CiR!wDbZ+SL)O>uftL2oZbOHyN2bwx)vZD%i9dSXONMRYZ3MrJZoS7>%?K}vH&QZhAYcq?yiY-dt& zN=s%@Z#Zg8S9M`%ML0AoLUdU{d1y~BMo>6!MQV6>Zh2-*PggfXQ$%HRMQ1BXSXgsa zWJ5VxV>Cfpc1LYCY&dvIV@zU9a$#&jQEOB&FE?#3FgH_FL}*zvXJJudI8Re}YJXGn8HZ#ZXfNmEX8S5tX*Q+8!jNM~0^R%BBv zS8`E$a!*V!OH6u3OEPFRM`=<;WkE`CYH3e%T3TZ;Hd%L2T1-e)LvKwnWN%tlF?cja zICm>qHF#q&cQkM{Lt`~FGF4h?K}9e`G*xXdZ$fTuLvMLmOl5gfaW!XkRyQwNQb(UhMmKhLMOad8YBxD_Q&KQRa8*e{D|b0iS!p?Ucv?kbc}ql0H%@JO zGg445QB8PqH%c*TN;gMDM@v+4L_>B&P*+ScYe7OnLRx7uS2yL3eI>Zb)iaMN?={ zW@%R|Sx8}IPBKbXK}cjaD`jePQaLYHVK!|!Z!t+{Rb(_(VOnu&QcZPBWH?k~Y-(3d zQBF8ZcSCq;Oe0bSQddh(Np&l9W>a)QGBQe2O)_RVR$(th zLo{qebb3Q}R&PUZW;QQcR#r%FS5ZeeW<+*ZO-E-_Olee8LNqmRS6WMMVNzvIZfICR zQ#WH}aYbcyRCse!Hg0WFQA06Hcu#J5Q#D9#HfUi^a%fmVWjQouNi#KCM?@<`L0N1u zR!w?wR%=3ROKo&fN@7VvO;BQXby-DoMow5kQEyC6Mq+GkQg>}(Y(-T_W@$8OOLs(C zPh&N1H9@>0WJyp(GI@AUPI*CVI7oI%VoPsxbVgM{aBgfh zLoj$&FKkG1a8*rdNNQwhQg3c!X*POERa9bOOK(IoWlU&oZERIzQ%z?|O<`3Rx59KHaAy6 zQcyEVMPh4MPX_(Z*nwmId5}DV^DM}T39txLRD03HA7@% zR$@~^Xk$}kMQ(O6Lv%EHST-1IzX?AUIcVa?8Z*VwMGk9fUIA&64Xh~9LOHN5cb4WsZ zXE|_aT2E9jS7U2qXiqh7b81aNK|w)5Q&m<^QcE>MSxHGfA|Nk5JTGH)b98TQK0GgQ zWNt}qVP|DN0096200030|Ns91000000000C0ssI2P*7oMZgfO%bWUY-E<|B;VJsk4 zWpZ&wrb8v5SWn>0y zVR>b8a|L&4WOQf-Xk}?N2xZ*)#&bS_L`d1Z1;X>)V}000082o6(ub97~GE>>l7b7^mG<^fZAb97~G zE<V?GE=OfEXa%DYkWp#9NVQefQP<3K#X=6)e zc~oy}Wo|uUH#cE5V>LE0IWsh6FgQ6~EL&4~b97~GE>m=JX>MmMAZ>GFZ*pvDVk{t5 zWpZN2xZ*)#&bS_L`d1Z1;X>)W000006aA9&~Zgdbqa&lpLOlfm;D_?1JWo>g0L2`0o zc}!_@bSqzTX?kT6L2`0oc}!_@bSqzWWpZV=> z00006Urk|ZZ*m4-O=)g#at2>Qb!lv5313oWc4>2IZ*Bkp000OG2nYlK003$L003wk z006p_000LC000000RR911ONa41LOfyd2@7SZ7xG^Y;0v?bZKvHb1p|^Ze?<5V=hZ& zc~)U;b!AXtX>wpPTU%3kb97~GE>m=JX>MmMAZ>GFZ*pvDVk{t5WpZV>lG%heMFfK4GAVYO*bairN zJ#J-nbaG*AEFe&IVr*$+OJ#XfZ);_4Jz_UEVKrklHZeIfG-WV2IbB@@`2YX^V?GE=OfEXa%DYkWp#9NVQefQP<3K# zX=6)ec~oy}Wo|uUH#cE5V>LE0IWsh6FgQ6~EL&4~b97~GE>m=JX>MmMAZ>GFZ*pvD zVk{t5WpZ7K|wt|A|Nk50rmg?|M>s^{{{>I000XlWq4_3E_7jMF*F7Z0000l zJY{%kW*})~Jt8tWHX001{UWq4_3AZcVhA~HBKA|PyKZapG6A|P~m zaAiFrH6kE(VQh6}JtA2_K|w)5ML|J9K|LZMFFpb9|NsB^|Ns965&!@I3nXQDX=W~T zVP`Qm1`_}P05?2kcxh%JX=FVjGB`6LAZ%rBJt8VQFr3L~nFXWppk>Z*pZUAXa5^b7^mGJv1&cFg7kXFfleRGdM6eG%O%Pb!>EX za%DYkWp#9NVQefQP<3K#X=6)ec~oy}Wo|ugb!=<}6aWAK7f@koZgfO%bWUY-E<$N^ zZDDXsVR>b81^@s63UG37aAk6IX=QTOWpZ?BWpe}s00004El^=;ZgfO% zbWUY-E<$N^ZDDXsVR>b8D?({>ZDDXsVR>b8P;zf@WpZ?BWpe@m000wEVQFr3L~nFX zWppl6b#i85V`Uit000392q92mX>N2xZ*)#&bS_L`d1Z1dOksIta!_(_aAk6IX=QT) z00002000098UO$Q2^#OV0TuuN02BZK00|%f000Rg00000fB*mhfB*mh2_gUh009>O000yK z000Ri00009Bme*a0Du4h0Du4h00|`k0003P0000K00009CIA2c2`2ym004jh004jh z000Rn000058UO$QEl^=;ZgfO%bWUY-E<$N^ZDDXsVR>b8D?({>ZDDXsVR>b8P;zf@ zWpZ?BWpe=l000MKY-Mg_PjCb#P+@6qbVP4-PGxj1RdZ!>LTqJjWKVE&D^726ZDDLe zY-Mg_PjCVN00062000Ro000058vpm@KW?^Gx1ONa41$Sv= zbZ7=>Woc(N2xZ*)#&bS_P0ZEtdULTqni zYZ(9l02u%P0Du4h0Du4h0006200}Ap000FX0000XP+@6qbVP4-PGxj1OksItaw|+> zd1Z1?a&K^Da&&2Ba|Qqa00eGfZDkR4b7gW(WprU=VRT_hbY*RG2X<+5X<}?;3~6&h zVPk7&a&L8RWCw3>VPk1@c?n`{Wo~3mZ)9Zw0{{R31m*!#d2@7SZ7xG^Y;0v?bZKvH zb1p|^Ze?<5V=hZ&c~)U;b!AXtX>wpPTU%3kb97~GE>m=JX>MmMAZ>GFZ*pvDVk{t5 zWpZV>lG%heM zFfK4GAVYO*bairNJ#J-nbaG*AEFe&IVr*$+OJ#XfZ);_4Jz_UEVKrklHZeIfG-WV2 zIbB^_T>$|C8c<b8LTqJjWKC~mWdQ&H00(wqY;|Q{ zUjPUK00000000019RL6T8UO$Q2`&Ht00ABV000{R004jh004jh00002000Ru00001 z9{>OV8~^|S1~32s019GZV{2z}Z*^{D2`m5r009910nY#b|I`2f{{R3000AHX000^Q z000Ry00001ApigX8vpMf+EC2ui0RaC2$^ZZV)Bpef000000V4na02%-Q00}q%0003b0000R0001h0001h z000000ssIBIRF3v0VMzc02}}S00ue$000JcaBOd3WC<()00031{{h7R|Nqnf|Nj60 z0003d0000Q00009Jpcdz0VeLTqJjWKVE&D^726ZDDLeY-Mg_PjCPL00062000Fl0000NP+@6qbVP4-PGxj1 zO=WFwa(O~*Z)0l%00008Y-Mg|bZ9m-320$+P+@XqZgdD_WoBh^a%E%y000RA0T}=Q z000010000000038EC2ui009610000000ZO!Q+acAWo<4)Z)|L3V{~b6ZgVb2Wo~71 zX=5%+WqDR%Y;|Q&VQF$;GFw|yd2@7SZ7x%Ea%pa7EFf)jV{dY7X<{rOR%LQ?X>V>l zG%heMFfK4GAVYO*bairNJ#J-nbaG*AEFe&IVr*$+OJ#XfZ);_4Jz_UEVKrklHZeIf zG-WV2IbAGUQ+acAWo<4~baH8KXDlFXb7OCEY-wUFAXa5^b7^mGJv1&bE-)@IEFeR5 zY;<*UWj$_Xb#!uJY%Cy9bz*F3V@qXuRBvl#Zarc*H(@nnH8wFhGc;u|I5}Ni0WJUl z04V?f00A!m001fg000000RR91000010W$yq04V?f00A@r001fg000000RR9100001 z0XP5v04V?f00B7w001fg000000RR91000010X+Z!04V?f00BM#001fg000000RR91 z000013jhEF00000000001yLW12mk;8000C4?VZta>mU$CQ-XirpG!yyD&du&64Jn% zQ3okOC8UHc!6m2!myl;-h%uIA2?M(e_sra13%Jtm3bEt2Hvj+t00000007hm{rhvc z=!1J4pe)w+;iB_J#62ERhQRl4tATr5ATJBPJ9XUS19^Dj`;WNC2-35~cPr%nirC>h za(_ic_>SCP36Z`#9k|C2;<$L%Uo=JfZgk?F1K3Xj-<>|W=K{8q(08Z5+;alY$>2M3 zzXCG)j@&Pp%)UE~-17wY6!P7v=bkUPQrLH=Blo;phsk%NiF@uX!{|G5KO+KsNA71p zknhO-1rg}G(V2T)YDcK=PG8*XQ!B!Kcfwik#3=FI>79GMYC)OrM#%jMQ0Ti8a{mh` z_T6dVUPFyA`EITkd!}zm9rs#lg7JAjUG$auce&S73yi)SjTe1n_+9jQJb~GFBXf?s z%k|sb>njxjzJJ>>yi@v|@6>Uxvo!3pM$EpSt?#CP=alO@+-offA-;cGzmIlIImd(C z|0c?JBU9fW?6}6v*J`@YLzwSIqc^s`!1bE!^APB}QSXiKZ=q{8)#oA9cT?we-WYS% z`o5a!^API0(L~;NSGv~vQ=w~DpZf*-{`34%5PvD-d)|zy&HciCH+nc{P5Ep6P}Svr z1-=^%Gvm&&ufL|M`aG2QZfd%IX6&VEeP31dc_{JSdH-;}j>^^gp?U_plA*|Vqu;&U zU=Af~{ZJ3%(SS1FjehrXXXa9}*7v0@_bc?>Xz~4;%Gdh7)Z~7pz8m!`b1GfyhZ5iC zq1gAkz1*33an$;u#P)e8_TA{TwzkAq>)+jrra^Iczi~DKBTkHE0)#p)x??$Wj z6lFfYwNoN;e2pM7&Ts8e z@w1+l`EImY=Xvv%Q0s>p3Rv#uf20h3YRp>P%MIp!5a_*8SIGBKz+6*n(^)B!RqNjg zzDKLyu?|w#AWQDA-1pVJ+?lnIRO^QtGI%dG)+NyDUhd3VNUQZjb*cUL=5Atu`KC1q zm}d$R?Km4rGHd-i)*{W zhj*#5_d?0Kag6l-U4W;1#Gd>2LbrE_TyQx}j~s`VT0hh= zts^|pt!|8chlr~4yz5JScUhCVK94PU_rliaao1k%%=JD6co`!#eIBvU^Sx)H7v6tJ zSFInaPq@_Lp~t=Fm+pVkSL=s5CR$o`ygGN%S?l|%GWVB&^w#>mMD=-Sf^^pUp+xj~ zXoF<*XQq(Y9#84e?fr5joi%{S9#5^a&A`1DfVF18|9J?5%GL}6_k6)Jl)q-^xaSDAk)vkdo>L9jyxlWg_tlyKxjzBk zdYziklr+XivJZ4md{264Y_5ck^#aldU4_uB?>ziklr+XivJZ4md{264Y_5ck`K zuIH-}_Z!9fkGKy200000n&&@V0m4=Q0096100aO4000000008QABzY8000001OV-n zL2kq_5X1WaPp2>nqrGiYcSFq#1@Ih=Xym%Ck4r>EL_|bHL`1sqGjtbWyzkJRgzlr)VZ86qeTDIU1#}k1`wrb*IQLgTe__1u(02&q{R+5681FmuO~QEJ zp>Gq$`wo4hFy5~R?vPCHJM_K6c;BJ#o(>)Q{;4E{-e4k0p|_YsV(3jKkQ{oO&ZLLl zrz=%L@6?TIq4(-S)zG_Dr+Vo9s?s6!h85`)ddo_XdDr*pO)Eg>ogL_HlcDqO9`wGc zB;<)M^v-Fd3xOnOZ%DXeI=nc?Md%!ciPt^?<-0DX=jtXucX~TyPM*DCGig0;RNq1skhKBr+QDg ziT2sq`%3yTNj>_~U&!ri3wrF(SYuc3R3{)O>RcNYB%@(;Y?s!uY5A3Fn{gCi)k~Kix|>|8ytOzcBvkKEnB@yNLdU@lW><&OhBj z^e-YJA|fJ!@CoP~b@l)N0RR911ONa40000001Mn7iwFP!000040PS5dXdFir{Z5Xc zB!ak5;lf~%h*%I6BDhGv#T71GxDdgG3Kd6C;eZPjhNuwaf(jQZR0!gLAXhjb5*LQJ z5J3SIDily*hzTl`Ac!GOkb?<^C?H~GzGqhYJ2!i~dpkRSc5fCQ*t*@>KmX0n{6BAI z_xSi2jspS$0s;a80s?9aahwzQT40IWmH_9xFAE$B94kEJwkx1?-p>lO1)dS!BRu7{ zFMx&j2pw)a1FZ8tBrqrN#K8BCz!v%c4Q_h_obdioU`m}w`-2H?y8{aI-VkUB>=}69 zi+ES(j+5V>aoZkHD)0DPL%U{{ob!OY4gr00Kc)I~o%bgu-pO?xa_&5LJp!!qj${8& z%JsYCnkILB0y6X7)Z+G&F1SpC&1Lm%HAB4mj0fb>0zoZShX-H&4p%aMyoO0cH(80*?EW zCEb_ClC#`?7&O4C7W>@5`+8ZtllxQ6XPny~g97NS!DC+EbYQ~-xo6OP-0&W0u?Gg; zw_Wf~Y`HSXbc;DsVo!CZg`heS4bprIE!8^8( zYCf2A1kJ~uZ&6QqWZ?ZVH}Ay8>%^`tZhPtgD5$|Zwv}o=x4G@9GN88xUzqpkux#@V zu`_5s{qw$=zjvKY*5K24x6FT&*c>#Ue7u*U z!Kd+Vvkj;=8ri0;2(kiK<4QUy^R#O#~P{I9JlX1;hjx`*X+3}@VCGVt>2;T zqbUCaulc~K7Hi^t%Qf%HCbUP7H+~g(Qy(1qV&HXd!8!3 ztZ=XHHBI|BZay6QxCK&w)BXI2gLh@uIWX%6N3;*J$p1iTKH#wi4|46@zQHa;Deqo^ zxHfr}o1c>Xi(2fi!MFRIyc63@>wOWW%*TS%eCT~@sri8C8oW3bG`nc5zg0-i~J9 zALQSdi(M+&h7EGR8E&6gs85mx|J)bem7SNMJKy|K`+uus8yZ@?G0N?ig1nci!CSO- zM)N!7bzeYyo@d38&rZe}Zol+d2h?KM47^*_;4Rv_Xc&(^hWMN#_Q|E^Au9ff?s<>f zH+}Hl0S6kqC3}Yr{S)S)??Ze|IOd^F-n9S~)O=LTbf+r3E1O55JNLwA9CfC9T8!dE zQ&e`*_@mS~(-QA28hk;!FGF{nhigbM_G)W?pLX0PX}j}M^HI;pV%2z8wzsr?3jaN; ze!HgCWzn&1Gqf+__EiG!_stBAhmIr(PxnsTUp*!J+2t~tlP9-hwj|}8k4Q;nh$ua!S_)Yd|wKU^DtJO(axFH z>eyzqm$t*w=NS$6pQ;J(*oNoNk}`XXw1 z=MCrWlXD(B=U{wr#RL1P=CfAPJtnnwUwPhDz2+ev=V3dzo^WnUtGgHP zQG>V!b+ZKCE1|*XtQYp<9j#8dX52XU403G;ov*&jT?b+t&9kk{okOw)UuoV|-B5SZ z*AH$d)k&RCeY~T`1&nnWqkWg9GEql(q4~#KEjDM}CZT(82-YjfAlEZjmVc1%!PD1h_5A)F#P@5(_UiZmC_(dqcs^kQ=1Dl;RGB@c z(5=g3JLoxA3-SH)2=Bg=4DoeF)^ZV$`w{Uwp&MX+HwKNFFdn#))Q2+r2emsrj=}cZ zQ=dA~L7n>N&VQhMyH+T5Xb|4d^y#P@BLzE`JUJ?VaOUgNyOrd!z)o<(H zO5M%c#z3y0pz)sb{xoNOX^ytfZBL4=7*EYXdM<(e2Idl%bCy2}-S6PXHCdVB4v=$b z&iCpR^eOGDyqSy6VE2fM1MY)){Wr}eFkZv>A~BZ$nWyP-=yF#6RKLNpSEryKsV3vy zyhIM)qeE<8;I_wc-7!|j*cayz zFlN7K;=Kp=IA>1#6wDF5(DHNmfbK_Wa@)h?13ZRva{rdVx5RfWdvyxddxY4J@h-d0 z!o>Z{Bg;AJI3w^W#MiZa#9fy@>OMv6-{!WbLj1oW@EgSA2Ymi9mq5Ls66;sRu|(|m zdXCan8_0OPF7PFEuWO@ysWXkLK)vZ&v`Xxw^r#Ksf$!$Ys!`$EaBtSTf#;f!5A7gJ z+aTv)F0laScZpJ1(Worc^D?n%kK6CQqZjvvbF*qx`_P9*WvM>%#EuTPe|<+*?hV&r zj@5$f8Wn2CrRQN#1I>qv`@C&{lv7BfvRo&sQCDi-qN@CBWk&1WvS?Je76o$&D_Szh zZ%9Pt*HZH-xea_G@D<3oAIJE@>rz3+V@uFGm%vzJ6J%`BcU}qdeI!wt;ah(B+kh$W zKU94-j^Bm!A4t}yOt}Q+91}Uq?~pQj?pX>j`mYx!Q7ngXec|=KAoEIm-c8?oqKNiU zrREY^ALBgts5&&i&!s%4d+He-wQyhDI~?t!>Xl32`gz>T*R_vIl|lQgfzy0!@=yLY zp`O29dl$CU*jqS`gVTLfxF0QT9~F*EFZWSF(0oeaU;DiYGOjnhqcnQ%tj)I*URR;_ zJ}SKLFXaDA+`gD#@<@RM2k(YlJhtWRxB9q;bMuq#RYWFQaANg1PG2Ij5#rJa|#Qm=L zpVeaVN~{eED9%5~^}%#*Kj>^VKo0)t{&5@wDzh&jpcwxk_Yu=MI`(g91UTiNz9*{o z`>F;BY5YTcZ5?X1VSPo7kb!@?2DCQcOb=+r^ET)u#dLp(D>%lSZ)e0el-p5>$x)qOlzB&F*Nj+1<>{{`t=G{SKTWfo#b6*x9?2-P-C;(=;P< zx?OCFcm92^IQa3xwY$((IlV0&7vIJHo9W=Ka(Y<&J%0ZGD(=Ppo96=ie;#k&dQ!a6 z`vGHr{Qg&dE~kUykBR;3*Dsdx_#t=yoNg6QC$?|>Q@k7dZ;k`@e=~l)pSFMXeeAzE z_Sz?>-QwAt?VItL@KNl)8TQ&?^j>e?_N`y)S+MKxS2u9B^Zq&QPdW3=@_X@l?9aE; z{yE+3v3=|5`B^dcN854#!{X1L`=6cPAB_FcUb}xzI~~q^^Ui_~Vt=k3_CFf9ee0*# zpX=QHb9y@9x<6?>Hyp(NOlR(&({}OOg4Ho`+Lp* z&+@Lz`a1AL{rB5DI`f^ZdHdE&XTeaie|_$+>izz8*4Lb8@&?XocAqq^0lNLQ?dxZY z)D6Ng3=Qo9`SHWm@4sr)4V)#QZs05dbpvM!s2ey-K;6Ju0_q0N5>PjAmVml}vjo%) zoF$-c;4A@k17``S8#qfq-N0D_>ITjdP&aUvfVzRR1k??jC7^ELECF=`X9=hqI7>j? zz*z$72F?;tH*l7Kx`DF<)D4^^pl;wS0d)gs38))5OF-SgSpwPjAmVml}vjo%)oF$-c;4A@k17``S8#qfq z-N0D_>ITjdP&aUvfVzRR1k??jC7^ELECF=`X9=hqI7>j?z*z$72F?;tH*l7Kx`DF< z)D4^^pl;wS0d)gs38))5OF-SgSpwPjAmVml}vjo%)oF$-c;4A@k17``S8#qfq-N0D_>ITjdP&aUvfVzRR z1k??jC7^ELECF=`X9=hqI7>j?z*z$72F?;tH*l7Kx`DF<)D4^^pl;wS0d)gs38))5 zOF-SgSpwXu# zf+i7n-I+N_<}1E#!E^5K?CkMQRaJuu00000000000000000000000000000000000 z0000000000000000000000000Ai-eec&g8TzwhGwtG~cZ_Br%boc%^PP0IZwY-gWA zpOxot_?ndeb(qdRgT9Ll*1}E4*?$k4*}d~~2F^Op|026*p5(t69y-eYJ}hPT%x^RB zzJ4yZnf-0p&+e5!=06>-TF$@h8N=*ed3FXiT6_kSeSa&vM_!zPk1gf@DZ4jD%KuHh zqcxfRU0BWTjge>ILxaBqWtI-Idt$8oXX@W;J6}&lW}6Mnz_+lI-3zatfr|$gYvrXJDtk z*ZXzn+sm$vPV%3s@AV$%e`V+Ek8-c~XcsJZ1MAr}(fJG7V3=fl8*2M<8b zFMw%oFf%p=3!-aww6i-8lVE>!m;k~c4WNMBv~eTM{|!VL5E>Np-_p$NJN>Vwu?aCQ&(07(=Z?>Exn#BuPs`*5ahN0n>KEQi-FVt#R^C=2n0%sia;9ogTf1o zB?d$r^x^&c{~$S#D?l{5JV*@Lumnw2)%VEZfo_L)YID!ifx#S-JG5GlWL#?$N+yIpZl=93QZLWpu|j0{&hHb-~cQQ z8c?IGb7*O50vXmot-=!&e&>l*&qRcp4?vtqtbqUl1^`wKrO{gB;UEA2002ovPDHLk FV1mKBpOOFo diff --git a/shadowsocks-csharp/Resources/ss24.png b/shadowsocks-csharp/Resources/ss24.png deleted file mode 100755 index 9a155ff15e0b46cb4397460aa90a56e753c6e93c..0000000000000000000000000000000000000000 GIT binary patch literal 0 KcmV+b0RR6000031 literal 492 zcmV-Lhr5Eo<;fqi+C650|fg5Vqc*431XkXyul{79)#(BVHeV6H_h({OTz5r zo7rz>CyrAi&Kr%3+K9zsV)0std)+R7TdzsHe^yF-)oStg&4z%F-3|d*WyH(HfI5io>JTgW_hL3_ i(vU|Yt2Al&6<`37lT_2gRcoRE0000b8 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 zX<}?;3~6&hVPk7&a&L8RWCw3>VPk1@c?n`{Wo~3mZ)9Zw0{{R31m*!#d2@7SZ7xG^ zY;0v?bZKvHb1p|^Ze?<5V=hZ&c~)U;b!AXtX>wpPTU%3kb97~GE>m=JX>MmMAZ>GF zZ*pvDVk{t5WpZV>lG%heMFfK4GAVYO*bairNJ#J-nbaG*AEFe&IVr*$+OJ#XfZ);_4Jz_UEVKrkl zHZeIfG-WV2IbB^_T>$|C8c<b8LTqJjWKC~mWdQ&H z00(wqY;|Q{UjPUK00000000019RL6T8UO$Q2`&Ht00ABV000{R001BW001BW004jh z000Ru000019{>OV8~^|S1~32s019GZV{2z}Z*^{D2`m5r009910nY#b|I`2f{{R30 z00AHX000^Q000Ry00001ApigX8vpMf+EC2ui0RaC2$^ZZV)Bpef000000V4na02%-Q00}q%0003b0000R z0000W0000W0001h00009IRF3v0VMzc02}}S00ue$000JcaBOd3WC<()00031{{h7R z|Nqnf|Nj600003d0000Q00009Jpcdz0VeLTqJjWKVE&D^726ZDDLeY-Mg_PjCPL00062000Fl0000NP+@6q zbVP4-PGxj1O=WFwa(O~*Z)0l%00008Y-Mg|bZ9m-320$+P+@XqZgdD_WoBh^a%E%y z000RA0T}=Q000mG0000000038EC2ui009610000000ZO!Q+acAWo<4)Z)|L3V{~b6 zZgVb2Wo~71X=5%+WqDR%Y;|Q&VQF$;GFw|yd2@7SZ7x%Ea%pa7EFf)jV{dY7X<{rO zR%LQ?X>V>lG%heMFfK4GAVYO*bairNJ#J-nbaG*AEFe&IVr*$+OJ#XfZ);_4Jz_UE zVKrklHZeIfG-WV2IbAGUQ+acAWo<4~baH8KXDlFXb7OCEY-wUFAXa5^b7^mGJv1&b zE-)@IEFeR5Y;<*UWj$_Xb#!uJY%Cy9bz*F3V@qXuRBvl#Zarc*H(@nnH8wFhGc;u| zI5}Ni0WJUl04V?f00A!m001fg0000G00000000010W$yq04V?f00A@r001fg0000G z00000000010XP5v04V?f00B7w001fg0000G00000000010X+Z!04V?f00BM#001fg z0000G00000000013jhEF00000000000?8kX2mk;8000C4?Uqew6G0TmSG{P}R+HVG zNj!)LK~K_yUOebUJSg5oj~+y&C=^08*`3|VHf;{Mcu`P`o$cAb~764Rtf>$*Yk!N7jZ%x~U%|9LYU_uss>nad-4tT>*@Nc?#(xpSc% zyGs;5u1^K+7m1+#kd zYZ*y6=QY=9waK787a7_4x4H1F6TIBcHx>NF6>g}zzgYq~#_x0@zW)6?#9w^)C*1if z+;EYK_o|bffcwM=-kKB@He-)@UIkOenox9(vj`{yo$f;UHTcaIO`VI(UYm7 zuLj}w!dT|_TgZRM{;Y376+>=tfBCJUH@Puk8;sA%LM7Xc-Hg4RBEJ3Y+-G#yXDH}a zE#4oup<|}&0znyPj+`vs>@|kPX1SB!x*{AdYxoAsTSLFS)&SblWpv#cU!we3OY0pg zT^96Sxz{EB1Unn<*V*1S*?QX70&G*|&p7=nL^#lk?bL*VilV*vtp;aAj-b?HqPdUr zD%1}DLFd0I@c~v#fAo{DVhr2nRo|ht@ExNZx6z{F_|x&BK9TmyBxoM$U%rEW;oXX%xSQPDUG8qFi2qbs zL(>M+8|V_)1_6%z|78MCWn}cxiV0zQgxlPyPnz(fd5V*4Z+~X58{FixI}C+A z1^%&fc*)JV*TS!{^VGP;j}C$lwLUAOX|LH0emtmJvA~Bxu)!7+IGG+m+#Q<@H_!Wj z-F^Z|Z{Td!csM0VxGM@aCZLXB+>>H2lDTRiy+9fxy&(g9aZjeb*J1jB?6ZW_|N8aI3f*3yK1ovTh1$IZ zW(F{yttLhfHh%-nF#<|0AkpqANcsbb)N_nb+ymA45|Ot9Vd{VW{HafZo9hYLkLH$G zAYPAVh8dE)HnDa?^_r4mKQaKO+cH=hN3#DCDfW|VH#PvY+YN~Ckl=TMaZjc@gn>93 zJ)W@GUqelMfkyJ+aF6$YEP3ho@86!(v>#|s3lP5p;zFSDf;il$0ICB)Wj+wIQ`!D{ zq_F);O|wb0A6Nz$4wU`Ca(5!V?S|T42gEOdPGB7%`@04r+>z{887RA{2>?%MxHte1 z000001ONa40000000N62iwFP!000040L7L~NR>etg%8xiLZU^XlwgY>gBEUtkb*Wr z2%;^72uim>WQ$q^L8d{3n?QuXjV>Yrp+%7`Dk6dktyMopkWfT_gq3DlS)Ic>7ru19 zW^Rr5zVM*TH#2AE{hJGv)s~h?w}M{v{K^~HNa*8}Efo?bX zPM(o%nQ`6!%p&S`l3DVGw0gczlg*2uyO(?>A4muMIbI3Ny^4goO-@tV2LpTWB<~aH z%7?GX3@p|wBi0O)YyYWRM+x+}nEJHufD3Cer)euMy|u^jmp}<~>tM2;(R>L7XLcWsQuzXzgm${1HuAFcEPWK(GhGSxM z19tDzuyCpd`5xTNhZcUrhZV$|Ff%z$G>Qhs0{W#f&a9>nS$H?F_xBkLmf(LCj8O_BOpE4(d=$+SC< zeBX?4t@I$>n46xI~t_G1c@1*t?|syh<7}Yczf| zkv^QhYDE23G1!>-wgvV^DL%9Aoaz%h66-7G$B_TdDo@mFZ^7!QDzUyyJ^ymV{FK@S z{YF^crTiUPjQ(44xD46_{gm}wj4AK*UNx3UUzQ~1zX3&TNPz$l000001ONa400000 z0031ViwFP!000040PWW?3IHGs1i?Jjr}*;|6~RI*FCsgTdPBNIOp-#iXiXT6c6NVj zyLULXojct6{WfWB!ws_g0002M3)W9Y|L=YSSJmZw01yBG000C40000000000Ngs;{ z0000000aQ-&cO))APfY-lxnGVrXu7ei7!u)9mqF(W&i*H03cFo+uiVOfBw$;hrQ4b VHwbut*&uSe-vR6C?|%Rg005Uxq)`9> literal 0 KcmV+b0RR6000031 diff --git a/shadowsocks-csharp/Resources/ss32Fill.png b/shadowsocks-csharp/Resources/ss32Fill.png new file mode 100644 index 0000000000000000000000000000000000000000..5b603bb342b0b0353d2bf9a542338f7c45f47e19 GIT binary patch literal 617 zcmV-v0+#)WP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E;jv63FrU-0oqAKK~z{r?UcVu!%!53vxtiz(#b^%ii?9N z*ulw35OEL}L0sG&T%4p`oTQ83EG`b>;Glm)Hy1@*1YKR+4D?5;Uz!tbOq;yaG)3@( zOY-i$=bqQRq}D%!pxJB|9LK3}-BBtVeB%#c+xCP?{ROX4%uhXA57sX#_YZtR#y;fF z)s{ZY?`rHreN*k}!Q5D5pH$DEdB(;r^xBgC4rWCfQ+wvEf6(#^^4A*C8_X~{<9nj4 zWq?Mbv8z$ZKx_1<>AB#tjM4mtOUW^|lcg=5=?nEo4As`1?z&!Zhb~+ zBj{g{G&#Jz`wVEk={~IQG}{Qt(gE{j;z_e(p*Q~gdx60@Vv7hI)laA&NRkfB9MNq6 zj8>_IzNmV=zM__N!03>8Bleg-rgQ-EdFo}tCWe(x2L_f}KMlBlS2{b|H^6_voYL9h zZ-BqxW2Lf%4HSu2_AsPWwqSlVkVo&s2BviTm$9r*`EyvFhvJSC00000NkvXXu0mjf Dx-uPE literal 0 KcmV+b0RR6000031 diff --git a/shadowsocks-csharp/Resources/ss32In.png b/shadowsocks-csharp/Resources/ss32In.png new file mode 100644 index 0000000000000000000000000000000000000000..d3e0aa911f56ed233f94c8e06560cd58e0376c08 GIT binary patch literal 211 zcmV;^04)EBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E;jv63FrU-07OYdK~z{r?ana@03ZxQ(HzyIdNW067b!T! zF8@KcKq3GD003w=ht?}m^{58#MAfGn%|ykk8qP$;uXQ}NjvxOINE?U^TQ(o>?LPnj N002ovPDHLkV1n02Ktlik literal 0 KcmV+b0RR6000031 diff --git a/shadowsocks-csharp/Resources/ss32Out.png b/shadowsocks-csharp/Resources/ss32Out.png new file mode 100644 index 0000000000000000000000000000000000000000..6f6b4cb82ae178985e5901cdaa9421d6cec83e76 GIT binary patch literal 215 zcmV;|04V>7P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E;jv63FrU-07ywhK~z{r?asjo05AwcQAh14-P~Rxhfzy3rw9#LghHylxAPB&Vk>Wpr%MpXa+008)r*#XCWdrLHb R9+dz9002ovPDHLkV1n1hM3n#l literal 0 KcmV+b0RR6000031 diff --git a/shadowsocks-csharp/Resources/ss32Outline.png b/shadowsocks-csharp/Resources/ss32Outline.png new file mode 100644 index 0000000000000000000000000000000000000000..2407fb7c238cbdddf44c4e2673c2acd7501264e2 GIT binary patch literal 787 zcmV+u1MK{XP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y9E;jv63FrU-0)$CKK~z{r#gkPt^_&0g#BJTJQ{>Gd56}!fM{DpUL8t%rs*m1Vw zPke-Pe34=V4uoN6Scl*7B`)$s1D|k47{+APJayoY(U+?Tm%-M>ehPOBXn#lvCP8guK8pQ5!~#wPrRSI|Q_0$X7Umxf_8 z_G>48jn;CNJY7V0z8Ae@reYC4u<77##kZ-B?Nn8Gj{eOObn=y0#6mPub=a}YvmdyR ztJ8NySXzeqAx=WWTIFInhF(HVIH7slgU`@Y`~Wv#<6_)}Vf2(6DSN^#tb!5S8HUBU zm~Cjsaxu1A|B>);y7OJ=`8bG1uWHH+e_1s(;m4Qb4fI~ms=}W(lnKdGIsTr9bzJh) zPqK@~v{)@J$nY<~vWnS((QZH)izD$U+Wm~iC7g|UTt^#Q6taIPPT>$=fVF)By`(&( z=Wse^_w)P=aYoFhQ00000NkvXXu0mjfo@q(A diff --git a/shadowsocks-csharp/Resources/ssOut24.png b/shadowsocks-csharp/Resources/ssOut24.png deleted file mode 100644 index 4768ac8731baeeec083eed6fac5f60f86f041ec0..0000000000000000000000000000000000000000 GIT binary patch literal 0 KcmV+b0RR6000031 literal 239 zcmVZfS!gD+1WT|4OYmmc pS+@@_e4VJqx_*GfU-ADpxB#SuCaOYQkY)e?002ovPDHLkV1i+jQxE_E diff --git a/shadowsocks-csharp/Util/Util.cs b/shadowsocks-csharp/Util/Util.cs index b62bb567..47b1a0b7 100755 --- a/shadowsocks-csharp/Util/Util.cs +++ b/shadowsocks-csharp/Util/Util.cs @@ -60,18 +60,16 @@ namespace Shadowsocks.Util // Support on Windows 10 1903+ public static WindowsThemeMode GetWindows10SystemThemeSetting() { - WindowsThemeMode registData = WindowsThemeMode.Dark; + WindowsThemeMode themeMode = WindowsThemeMode.Dark; try { - RegistryKey reg_HKCU = Registry.CurrentUser; - RegistryKey reg_ThemesPersonalize = reg_HKCU.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", false); + RegistryKey reg_ThemesPersonalize = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", false); if (reg_ThemesPersonalize.GetValue("SystemUsesLightTheme") != null) { - if (Convert.ToInt32(reg_ThemesPersonalize.GetValue("SystemUsesLightTheme").ToString()) == 0) // 0:dark mode, 1:light mode - registData = WindowsThemeMode.Dark; + if ((int)(reg_ThemesPersonalize.GetValue("SystemUsesLightTheme")) == 0) // 0:dark mode, 1:light mode + themeMode = WindowsThemeMode.Dark; else - registData = WindowsThemeMode.Light; - //Console.WriteLine(registData); + themeMode = WindowsThemeMode.Light; } else { @@ -83,7 +81,7 @@ namespace Shadowsocks.Util Logging.Info( $"Cannot get Windows 10 system theme mode, return default value 0 (dark mode)."); } - return registData; + return themeMode; } // return a full path with filename combined which pointed to the temporary directory diff --git a/shadowsocks-csharp/Util/ViewUtils.cs b/shadowsocks-csharp/Util/ViewUtils.cs index 7131d40d..fab38037 100644 --- a/shadowsocks-csharp/Util/ViewUtils.cs +++ b/shadowsocks-csharp/Util/ViewUtils.cs @@ -1,35 +1,99 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Windows.Forms; - -namespace Shadowsocks.Util -{ - public static class ViewUtils - { - public static IEnumerable GetChildControls(this Control control) where TControl : Control - { - if (control.Controls.Count == 0) - { - return Enumerable.Empty(); - } - - var children = control.Controls.OfType().ToList(); - return children.SelectMany(GetChildControls).Concat(children); - } - - // Workaround NotifyIcon's 63 chars limit - // https://stackoverflow.com/questions/579665/how-can-i-show-a-systray-tooltip-longer-than-63-chars - public static void SetNotifyIconText(NotifyIcon ni, string text) - { - if (text.Length >= 128) - throw new ArgumentOutOfRangeException("Text limited to 127 characters"); - Type t = typeof(NotifyIcon); - BindingFlags hidden = BindingFlags.NonPublic | BindingFlags.Instance; - t.GetField("text", hidden).SetValue(ni, text); - if ((bool)t.GetField("added", hidden).GetValue(ni)) - t.GetMethod("UpdateIcon", hidden).Invoke(ni, new object[] { true }); - } - } -} +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.Linq; +using System.Reflection; +using System.Windows.Forms; + +namespace Shadowsocks.Util +{ + public static class ViewUtils + { + public static IEnumerable GetChildControls(this Control control) where TControl : Control + { + if (control.Controls.Count == 0) + { + return Enumerable.Empty(); + } + + var children = control.Controls.OfType().ToList(); + return children.SelectMany(GetChildControls).Concat(children); + } + + // Workaround NotifyIcon's 63 chars limit + // https://stackoverflow.com/questions/579665/how-can-i-show-a-systray-tooltip-longer-than-63-chars + public static void SetNotifyIconText(NotifyIcon ni, string text) + { + if (text.Length >= 128) + throw new ArgumentOutOfRangeException("Text limited to 127 characters"); + Type t = typeof(NotifyIcon); + BindingFlags hidden = BindingFlags.NonPublic | BindingFlags.Instance; + t.GetField("text", hidden).SetValue(ni, text); + if ((bool)t.GetField("added", hidden).GetValue(ni)) + t.GetMethod("UpdateIcon", hidden).Invoke(ni, new object[] { true }); + } + + public static Bitmap AddBitmapOverlay(Bitmap original, params Bitmap[] overlays) + { + Bitmap bitmap = new Bitmap(original.Width, original.Height, PixelFormat.Format64bppArgb); + Graphics canvas = Graphics.FromImage(bitmap); + canvas.DrawImage(original, new Point(0, 0)); + foreach (Bitmap overlay in overlays) + { + canvas.DrawImage(new Bitmap(overlay, original.Size), new Point(0, 0)); + } + canvas.Save(); + return bitmap; + } + + public static Bitmap ChangeBitmapColor(Bitmap original, Color colorMask) + { + Bitmap newBitmap = new Bitmap(original); + + for (int x = 0; x < newBitmap.Width; x++) + { + for (int y = 0; y < newBitmap.Height; y++) + { + Color color = original.GetPixel(x, y); + if (color.A != 0) + { + int red = color.R * colorMask.R / 255; + int green = color.G * colorMask.G / 255; + int blue = color.B * colorMask.B / 255; + int alpha = color.A * colorMask.A / 255; + newBitmap.SetPixel(x, y, Color.FromArgb(alpha, red, green, blue)); + } + else + { + newBitmap.SetPixel(x, y, color); + } + } + } + return newBitmap; + } + + public static Bitmap ResizeBitmap (Bitmap original, int width, int height) + { + Bitmap newBitmap = new Bitmap(width, height); + using (Graphics g = Graphics.FromImage(newBitmap)) + { + g.SmoothingMode = SmoothingMode.HighQuality; + g.InterpolationMode = InterpolationMode.HighQualityBicubic; + g.PixelOffsetMode = PixelOffsetMode.HighQuality; + g.CompositingQuality = CompositingQuality.HighQuality; + g.DrawImage(original, new Rectangle(0, 0, width, height)); + } + return newBitmap; + } + + public static int GetScreenDpi() + { + Graphics graphics = Graphics.FromHwnd(IntPtr.Zero); + int dpi = (int)graphics.DpiX; + graphics.Dispose(); + return dpi; + } + } +} diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index b593fefb..a1d2ef4f 100644 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -28,12 +28,13 @@ namespace Shadowsocks.View private UpdateChecker updateChecker; private NotifyIcon _notifyIcon; - private Bitmap icon_baseBitmap; - private Icon icon_base, icon_in, icon_out, icon_both, targetIcon; - private ContextMenu contextMenu1; + private Icon icon, icon_in, icon_out, icon_both, previousIcon; private bool _isFirstRun; private bool _isStartupChecking; + private string _urlToOpen; + + private ContextMenu contextMenu1; private MenuItem disableItem; private MenuItem AutoStartupItem; private MenuItem ShareOverLANItem; @@ -54,12 +55,19 @@ namespace Shadowsocks.View private MenuItem proxyItem; private MenuItem hotKeyItem; private MenuItem VerboseLoggingToggleItem; + private ConfigForm configForm; private ProxyForm proxyForm; private LogForm logForm; private HotkeySettingsForm hotkeySettingsForm; - private string _urlToOpen; - private Utils.WindowsThemeMode currentWindowsThemeMode; + + + + // color definition for icon color transformation + private readonly Color colorMaskBlue = Color.FromArgb(255, 25, 125, 191); + private readonly Color colorMaskDarkSilver = Color.FromArgb(128, 192, 192, 192); + private readonly Color colorMaskLightSilver = Color.FromArgb(192, 192, 192, 192); + private readonly Color colorMaskEclipse = Color.FromArgb(192, 64, 64, 64); public MenuViewController(ShadowsocksController controller) { @@ -79,7 +87,7 @@ namespace Shadowsocks.View controller.UpdatePACFromGFWListError += controller_UpdatePACFromGFWListError; _notifyIcon = new NotifyIcon(); - UpdateTrayIcon(); + UpdateTrayIconAndNotifyText(); _notifyIcon.Visible = true; _notifyIcon.ContextMenu = contextMenu1; _notifyIcon.BalloonTipClicked += notifyIcon1_BalloonTipClicked; @@ -109,7 +117,7 @@ namespace Shadowsocks.View private void controller_TrafficChanged(object sender, EventArgs e) { - if (icon_baseBitmap == null) + if (icon == null) return; Icon newIcon; @@ -124,11 +132,11 @@ namespace Shadowsocks.View else if (hasOutbound) newIcon = icon_out; else - newIcon = icon_base; + newIcon = icon; - if (newIcon != this.targetIcon) + if (newIcon != this.previousIcon) { - this.targetIcon = newIcon; + this.previousIcon = newIcon; _notifyIcon.Icon = newIcon; } } @@ -140,46 +148,19 @@ namespace Shadowsocks.View #region Tray Icon - private void UpdateTrayIcon() + private void UpdateTrayIconAndNotifyText() { - int dpi; - Graphics graphics = Graphics.FromHwnd(IntPtr.Zero); - dpi = (int)graphics.DpiX; - graphics.Dispose(); - icon_baseBitmap = null; - if (dpi < 97) - { - // dpi = 96; - icon_baseBitmap = Resources.ss16; - } - else if (dpi < 121) - { - // dpi = 120; - icon_baseBitmap = Resources.ss20; - } - else - { - icon_baseBitmap = Resources.ss24; - } Configuration config = controller.GetConfigurationCopy(); bool enabled = config.enabled; bool global = config.global; - // set Windows 10 Theme color (1903+) - currentWindowsThemeMode = Utils.GetWindows10SystemThemeSetting(); + Color colorMask = SelectColorMask(enabled, global); + Size iconSize = SelectIconSize(); - if (currentWindowsThemeMode == Utils.WindowsThemeMode.Light) - if (!global || !enabled) - icon_baseBitmap = getDarkTrayIcon(icon_baseBitmap); + UpdateIconSet(colorMask, iconSize, out icon, out icon_in, out icon_out, out icon_both); - icon_baseBitmap = getTrayIconByState(icon_baseBitmap, enabled, global); - - icon_base = Icon.FromHandle(icon_baseBitmap.GetHicon()); - targetIcon = icon_base; - icon_in = Icon.FromHandle(AddBitmapOverlay(icon_baseBitmap, Resources.ssIn24).GetHicon()); - icon_out = Icon.FromHandle(AddBitmapOverlay(icon_baseBitmap, Resources.ssOut24).GetHicon()); - icon_both = Icon.FromHandle(AddBitmapOverlay(icon_baseBitmap, Resources.ssIn24, Resources.ssOut24).GetHicon()); - _notifyIcon.Icon = targetIcon; + previousIcon = icon; + _notifyIcon.Icon = previousIcon; string serverInfo = null; if (controller.GetCurrentStrategy() != null) @@ -203,89 +184,90 @@ namespace Shadowsocks.View ViewUtils.SetNotifyIconText(_notifyIcon, text); } - private Bitmap getDarkTrayIcon(Bitmap originIcon) + /// + /// Determine the icon size based on the screen DPI. + /// + /// + /// https://stackoverflow.com/a/40851713/2075611 + private Size SelectIconSize() { - Bitmap iconCopy = new Bitmap(originIcon); - for (int x = 0; x < iconCopy.Width; x++) + Size size = new Size(32, 32); + int dpi = ViewUtils.GetScreenDpi(); + if (dpi < 97) { - for (int y = 0; y < iconCopy.Height; y++) - { - Color color = originIcon.GetPixel(x, y); - if (color.A != 0) - { - Color flyBlue = Color.FromArgb(192, 0, 0, 0); - // Multiply with flyBlue - int red = color.R * flyBlue.R / 255; - int green = color.G * flyBlue.G / 255; - int blue = color.B * flyBlue.B / 255; - int alpha = color.A; - iconCopy.SetPixel(x, y, Color.FromArgb(alpha, red, green, blue)); - } - else - { - iconCopy.SetPixel(x, y, Color.FromArgb(color.A, color.R, color.G, color.B)); - } - } + // dpi = 96; + size = new Size(16, 16); + } + else if (dpi < 121) + { + // dpi = 120; + size = new Size(20, 20); + } + else if (dpi < 145) + { + // dpi = 144; + size = new Size(24, 24); } - return iconCopy; + else + { + // dpi = 168; + size = new Size(28, 28); + } + return size; } - private Bitmap getTrayIconByState(Bitmap originIcon, bool enabled, bool global) + private Color SelectColorMask(bool isProxyEnabled, bool isGlobalProxy) { - Bitmap iconCopy = new Bitmap(originIcon); - for (int x = 0; x < iconCopy.Width; x++) + Color colorMask = Color.White; + + Utils.WindowsThemeMode currentWindowsThemeMode = Utils.GetWindows10SystemThemeSetting(); + + if (isProxyEnabled) { - for (int y = 0; y < iconCopy.Height; y++) + if (isGlobalProxy) // global { - Color color = originIcon.GetPixel(x, y); - if (color.A != 0) - { - if (!enabled) - { - // Multiply with flyBlue - Color flyBlue; - if (currentWindowsThemeMode == Utils.WindowsThemeMode.Light) - flyBlue = Color.FromArgb(128, 192, 192, 192); // Dark icon more transparent - else - flyBlue = Color.FromArgb(192, 192, 192, 192); // Light icon less transparent - int red = color.R * flyBlue.R / 255; - int green = color.G * flyBlue.G / 255; - int blue = color.B * flyBlue.B / 255; - int alpha = color.A * flyBlue.A / 255; - iconCopy.SetPixel(x, y, Color.FromArgb(alpha, red, green, blue)); - } - else if (global) - { - Color flyBlue = Color.FromArgb(25, 125, 191); - // Multiply with flyBlue - int red = color.R * flyBlue.R / 255; - int green = color.G * flyBlue.G / 255; - int blue = color.B * flyBlue.B / 255; - iconCopy.SetPixel(x, y, Color.FromArgb(color.A, red, green, blue)); - } - } - else + colorMask = colorMaskBlue; + } + else // PAC + { + if (currentWindowsThemeMode == Utils.WindowsThemeMode.Light) { - iconCopy.SetPixel(x, y, Color.FromArgb(color.A, color.R, color.G, color.B)); + colorMask = colorMaskEclipse; } } } - return iconCopy; + else // disabled + { + if (currentWindowsThemeMode == Utils.WindowsThemeMode.Light) + { + colorMask = colorMaskDarkSilver; + } + else + { + colorMask = colorMaskLightSilver; + } + } + + return colorMask; } - private Bitmap AddBitmapOverlay(Bitmap original, params Bitmap[] overlays) + private void UpdateIconSet(Color colorMask, Size size, + out Icon icon, out Icon icon_in, out Icon icon_out, out Icon icon_both) { - Bitmap bitmap = new Bitmap(original.Width, original.Height, PixelFormat.Format64bppArgb); - Graphics canvas = Graphics.FromImage(bitmap); - canvas.DrawImage(original, new Point(0, 0)); - foreach (Bitmap overlay in overlays) - { - canvas.DrawImage(new Bitmap(overlay, original.Size), new Point(0, 0)); - } - canvas.Save(); - return bitmap; + Bitmap iconBitmap; + + // generate the base icon + iconBitmap = ViewUtils.ChangeBitmapColor(Resources.ss32Fill, colorMask); + iconBitmap = ViewUtils.AddBitmapOverlay(iconBitmap, Resources.ss32Outline); + + icon = Icon.FromHandle(ViewUtils.ResizeBitmap(iconBitmap, size.Width, size.Height).GetHicon()); + icon_in = Icon.FromHandle(ViewUtils.ResizeBitmap(ViewUtils.AddBitmapOverlay(iconBitmap, Resources.ss32In), size.Width, size.Height).GetHicon()); + icon_out = Icon.FromHandle(ViewUtils.ResizeBitmap(ViewUtils.AddBitmapOverlay(iconBitmap, Resources.ss32In), size.Width, size.Height).GetHicon()); + icon_both = Icon.FromHandle(ViewUtils.ResizeBitmap(ViewUtils.AddBitmapOverlay(iconBitmap, Resources.ss32In, Resources.ss32Out), size.Width, size.Height).GetHicon()); } + + #endregion #region MenuItems and MenuGroups @@ -355,7 +337,7 @@ namespace Shadowsocks.View private void controller_ConfigChanged(object sender, EventArgs e) { LoadCurrentConfiguration(); - UpdateTrayIcon(); + UpdateTrayIconAndNotifyText(); } private void controller_EnableStatusChanged(object sender, EventArgs e) @@ -629,7 +611,7 @@ namespace Shadowsocks.View private void notifyIcon1_Click(object sender, MouseEventArgs e) { - UpdateTrayIcon(); + UpdateTrayIconAndNotifyText(); if (e.Button == MouseButtons.Middle) { ShowLogForm(); diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index 68c76381..40e59bf3 100644 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -124,6 +124,11 @@ + + True + True + Resources.resx + True True @@ -150,11 +155,6 @@ - - True - True - Resources.resx - @@ -269,9 +269,6 @@ SettingsSingleFileGenerator Settings.Designer.cs - - - @@ -281,8 +278,10 @@ Designer - - + + + +