From 17730e023388c19955237b95030596d2067c26f0 Mon Sep 17 00:00:00 2001 From: vicrodh <103399283+vicrodh@users.noreply.github.com> Date: Tue, 28 Apr 2026 20:29:49 -0600 Subject: [PATCH] fix(tray): icon variant picker with Color option and mono labels Three issues with the 1.2.9-pre tray icon override: - The mono PNGs filled the entire canvas, so the tray icon read as larger than its panel neighbours (Plasma + GNOME). - The dropdown labels were inverted: picking "Light icon" produced the dark glyph and vice-versa, because the constants were named after the panel they suit ("light panel" -> dark glyph), not after the glyph colour the user expects to see. - There was no way to pick the colour vinyl logo even on desktops where a monochromatic glyph clashes with the rest of the tray. Rebuild the mono pixmaps (22/32/44/64) from icon-symbolic.svg with a 2px content inset; render a new colour set from icon.svg at the same sizes; rename the Rust constants to glyph-colour names and introduce an IconVariant enum so the UI label, the persisted value, and the file selection all line up. Dropdown options now read Auto / Mono light / Mono dark / Color in all five locales. normalize_tray_icon_theme on the Rust side and normaliseTrayTheme in SettingsView migrate the inverted "light" / "dark" values stored by 1.2.9-pre to the user-intent equivalents. cc --- src-tauri/icons/tray-color-22.png | Bin 0 -> 1314 bytes src-tauri/icons/tray-color-32.png | Bin 0 -> 2160 bytes src-tauri/icons/tray-color-44.png | Bin 0 -> 3195 bytes src-tauri/icons/tray-color-64.png | Bin 0 -> 4839 bytes src-tauri/icons/tray-dark-22.png | Bin 707 -> 730 bytes src-tauri/icons/tray-dark-32.png | Bin 1073 -> 988 bytes src-tauri/icons/tray-dark-44.png | Bin 1473 -> 1330 bytes src-tauri/icons/tray-dark-64.png | Bin 2307 -> 1899 bytes src-tauri/icons/tray-light-22.png | Bin 704 -> 705 bytes src-tauri/icons/tray-light-32.png | Bin 1064 -> 970 bytes src-tauri/icons/tray-light-44.png | Bin 1452 -> 1292 bytes src-tauri/icons/tray-light-64.png | Bin 2207 -> 1818 bytes src-tauri/src/config/tray_settings.rs | 23 +++-- src-tauri/src/tray_linux_ksni.rs | 101 ++++++++++++++----- src/lib/components/views/SettingsView.svelte | 24 +++-- src/lib/i18n/locales/de.json | 7 +- src/lib/i18n/locales/en.json | 7 +- src/lib/i18n/locales/es.json | 7 +- src/lib/i18n/locales/fr.json | 7 +- src/lib/i18n/locales/pt.json | 7 +- 20 files changed, 127 insertions(+), 56 deletions(-) create mode 100644 src-tauri/icons/tray-color-22.png create mode 100644 src-tauri/icons/tray-color-32.png create mode 100644 src-tauri/icons/tray-color-44.png create mode 100644 src-tauri/icons/tray-color-64.png diff --git a/src-tauri/icons/tray-color-22.png b/src-tauri/icons/tray-color-22.png new file mode 100644 index 0000000000000000000000000000000000000000..8a776fd58e905eef4b987ae3c9edb7327602f45e GIT binary patch literal 1314 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 literal 0 HcmV?d00001 diff --git a/src-tauri/icons/tray-color-64.png b/src-tauri/icons/tray-color-64.png new file mode 100644 index 0000000000000000000000000000000000000000..d8eede599a9bb8480da991879a13c0019299cac9 GIT binary patch literal 4839 zcmZ`-XE5Af)c!526PAcxq9sw+5<&Fdd$)wJ(Zyo55GyuHY}6!rkVJ&&61^-EM2}9? zXsef4y}bTk-kJBqduHx=X3m{w&WGo@Gw0k`BLhtuN>)k$0BE$e)J(2X>AyoxdYy~h zkh9mo?WAR*4*($o0D#5-!0B}fjRyb}6ady806;bk0GNET>W$^DFGwHjYN}o1b)2X+ zgkJ-hzqY3kT@%yV=`8zxMBV?U?5!V2~pfD*BsH6x?#tbShdtX{s z0xATB%0i)Kf3mIr55eoHv)hy4|DP}$#lL(_xck2y{N20|e*TVLKL0-_HU%sT0FX{? zHD$A)sb$+|Z_Ly~uFPlt$Pdr_!>-4!9mG-y*c4*^eBulYIz@*6ZE*Hr8HK={wjhCPzZA0qr>5^_(7J_Gw`o# zA7XLMq*2z~l0;uX^X5ewzyUgs=EZlIz#&6<6Jof#Us0Cm)=bTX3JfU}aY^JbJm7}L zNP$AkhbOBVa^QQDT*4ravBodiH{Q&3F+W42>mCu5hSwNK4<|ku?dGT2*Z)2zzKx!E zyAe38$9K5^cR4F2(|6^K5BCf%T08Ok&atY7`*2qM=&qh8xLi_9y)7mx(kn74V)2(2 zo;iUgXRO!xP3E342Tv5&BH|D7SU_YnE|G?Fx$v`9pB**`cRB3LmHk zRFHUNw)8MRC&De8sq%gNNX*d?6{$J<_xC05sG16|j{dDx_OU902nK*4_OTvMj0rEp z%q2?icNd86`8AbGcRJ8J99+CBusA>O(Q0QBa5xFfxQJ!;x;-CKFt_N`l(%gd&d4Hn zISZ!$+%Gc#Ag~Br_x!&w1_<+b@2j=14I3*n7I@L3VxRX6AtK6u55o)}-4C55xAMQL zj%^#PA*$87=+nYP8-{;F`tKgcYhxoSMsg&$hvrLG;SLDjrTW4UtRSl;YE*32=u=%| z{tZ>RF4SVijA8NiX*Y#c(9?gC6fV_S(#2_4<*0InNtC=P5+jJw zZW-2}Adp&n=Ir|YrWEPPF8b9y4_k*c#rtEM68~*(%wj1wsk_`mWCP6dvF%=NZ~a+0!z- z$rN>1O*tELgO>A|pQ`lG1+t`PnP`>pA%bw_3uJ0%ce(s z4zDrs#PfwN)4YsL@=i!%W~+oyjjXku&($3@n!Z8~NrUNhf4EZNMBnKyew5EUd~g-T zmeed*^M^)%ICn!9E^0|yY%Z`Wa<2j?nya>c(~bC5xgQb5&wbm-$f6+qmz6dT{kkP- zcx>jz0Px1L`+KOOeVz9SF*wv#RJS84I{s-`VmmXzRzf7QN+IJj;)wxgEw$05MNgKJ zZDGJH$Cr#?8fM+^B@Iozdhv|OZZ~|IlxCfJi!#qn=GVe(50~1~QnJ6LRB@pn^3pze zTzv7GMqGlmcn~E|Y)@LcUfCC zLkl&Qap%lL?$W*!*Tu?q18J1Y@ee(x&P8mJt>}5^QOga1_9oO=??(N5{%&gzX(tx| z`mSOV$aQ1I&{ZEvuhOYFcYT{$-sX`Mz5>0v(_4{XmZpV?#7|$b!#P`4gr2H7teYeY zjQ3&cC~}t#;*&pu;dRX?w|GJ9EBwJ2zqu_iUJ>v!H;&5Epx zGafspxoK!mO6TxdviG;xd_5WG)yrW@uWp;O&P{%R&PqriL`4~H7LQ8ytqgT5Wz#!RtEa3ubr(*zFpNjn(=xASF<~gE->L z7aG6+2<-44K6bGdu2KBm%r4%H#~DT>QL5S3h?=(nF{eIBCg;m~%mThmjqcKbB&EBj zqVrN3kjE|KA9t!OJ?-;`Ynh23em_e8G}L)ca@4G-D{5?pzO?D5;8l1wE*1QP0mpBCTzbRORXlVcrzX1A_QSU- z`)ngk7=|Fi!x9M_{Bi$6_u5yTE#?8bMB@mdZSPWZRhtXVYWIEClI{Hw+To@z8Gd&# zS`kccyT6+w@l$)Mn1-WBE$86SlWQ$z_X}OE2!?6Tx18?2_i-EBF&MCD-q~d%(TS5t zov!jzxdqA)&F~!J#=3rM`94MDAtNs68eI6#@IqG0j~J^=r<@q8wF5fXnIo5AL49Ma zR$v?-=Ly~4k2aQEFgX@v{awBfsf{bDdNOy97WgRNQo;@U2qTVq;#~fO+=#bs!QoFX zV@EQoca0Z=UJ=#MZg&T$RX%n1b^)hHS8RIiKGUZ~xNQ3IX`kSp*0gsv>b3Djao)_9 z?w`^}+Ag+;tLONO;UOMT@Ov;H;X>Aj1^CzeAoY~gh%^D22kfnp13c+5I7$76{#8&m zqmU#+4A|CG<7VN7Qf?jvc6Fw6(xkR!rkrp)u~kqkGJr^h!{w8z`18sM+xbuiv1lco z9sS#MT=K7d1|syrCUbvn#cPrS2VsXcPwtTb*Dt)1B)%%A)pvT^4BFc(fHo2tkEIFp z4R+$Oy%6r{o$+BD|194)Qu*NgBpRwO@h>S5(IdMYi6MCx}Y>3o0+<3z6JN(U2kRu+;+iq%sdw*Eb~QuiGRw0uN}tE zZ#|(;x;%WtOM({1nM#qkWcDtl**zkkz3*W^(yxW1do_}(##6jXBt|v{E|agkNGPj zQuE~3Y7UWH!K5`)J`lN;vhe3RPgKX=9pB3?P;RA!bOs@+$73lO7*&;^|GmkH zDsuwgwLDkk5-)6ra7bl}(97J>*SCose-B4y4;$F|+y;M=u03Rka2&{0E#M7hOi<$XC4S`3ylMXXsL zf1IIP3zLB;r)dX$6${8Bz{T4t*Tx;jG9Eb|>Wk%`4rNLRs;kY5(#kQuF6T=J#Ux}^ zMwqp`?$;D}`cC&#*OzF<0s%iXlpJ2IIoGliXSFHuO;9E-7vt~NIZ)uf2`ehusl24~ zIVmy@o3wKXxy?LmB>s#>Kx85@mg4x17$}v4t3!O~q|nKEQk$l6nGi6}FtVzyygs%?lRgZ1fs@e9TM7XBw;uO}K=8{ubd8cBLIG|(VIUDHhYlOqJnYPi)BsJ(xz-KABwLE%o(aJPw zpXvMIdF!31Gn*vlttcqJIf6YOMJ0YFR)br<*At_t#T|5vqC+%{8aP8sGiP6s%1DtD z9U>q~d>LC}?(aXWQ=JLp_6-KnYg8&;CpnEl!6 z&TZ^nZuL0k#rY6WB1Hm3k2k8hy=-+P5VdFl_cK;>%Gg{=@?P(=27mLknfyiW1*7X+V1Q* z1+P@H-=R5Ie#jvTng6!E;l2I3GZ=I|N%yB3+Szo}dP}n?c(|Qa74B^-XpibB}XEeblk->9XfJa?c_iq zd0aNi;&AoRUGVxsP9r#FW$rcZ+gB6!CHy3$F@h8mzXi;*TP0BxW(Dg9246gG7!W?5 z8a}IbW=}1)zg6lnOEnlOltX?*cBB|+Dx*ubw(P3kOx!;-RhL$I?&z~kI%3M}2*7Is zMSK05kZmh!c*T0gI{_EM4E8BC6X`QTkiG`OvO;R7*pBZ}wWkg8y^07&Y`)P zg=Fcr#f4YF>p0=(?FC19TYY47917`^KedzJ(xiAu?eb9P(V;!Qoc< z<|HFPL6^?FIq`CA{J}iFnv1BdOATZ4OYPT>9$)Xu+U?jevDsX(>hCF&rVYgR9$^nZ z{GhJcgR5!~kd9*;hrjfGgqXv{((0HYE!&?=B8V0ogidcXMQMez^{Rp4Vi=jzys2I@s)VxuK(R-nOYX@X?y9RkM!xi{4{=VVgA?4WNe9{7{8z;#thix&@ zUZ`aj1om2B2%(2l&G8o>wg2XiRW5}jSwYiJ+(s?m3Xp_^B1X@h8c%n3*^NacQ2ThR zp-N^kr!7F4MJ*B6c!4rB#l{#(Xk&|DLwrFE~wPFFPWv$z;`A%99gnPo)c`izI1sA`|BLrdI5PEUTU&zGHfp$$rGmr`L!if(q8 z2l~Xor}$HHz7BeQ-DaTv0n~Sm#xUA$wvytIbXTXxRA`@*2kWPcHGc793%Jpp@BJuv zG>h%3{jPBO$WtnN9ZN^&0b>&3f%`zTzR&K(-(* znGf4l!I5x-z!m25VYn_UmVPEUbls!i#$4>Uc^e;$c@A-rxy{X?3M>9}bJ zQQ`R4pFV-XM)q14ljf7W7>av_WFGcaQGN;jQ%N3E#A11L?KvYH;f2!J84i>>SSFL1 zeq{m%aMRCb@1Z0vbw{B#_aGF6?5Q(7*hKYrR=$H!v|mIY55`Sn8C!N_?{kt}-(zaA zH375>sU*x)tnPVeHj}>>yP##D8sDA(G_I(B878Jc8F=#+A4Z?uXjx|6lCh$oXDRcO zqtJTUdjDhXO0p4Q(}N-6ls_Ntmx`158H;aCkSYs3@8Omy2v4{6**U9ncy)*6Yi;y;lm6Kt;Jqss;7c4;vqf5bBRNGI(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9fnimzvJsHSUgGKN%KnN)meES?(;TDM zKq1u<*NBpo#FA92Lf8sk!+9@5Q5cT{WWE9lJ^b3WIurE_!-)PhZNq zn6Y(HMrQBMzx{{*Kfkn$ud1#8^WNvS&#m>J*L>g?i>@i(M=eXMcN$ICJ zL+gLs+Ot2THt&DYmBnFetR5{eWY~S@eQb8v8NH?R3<_>F_6bc75x?jgRdlOY_DbFU z6;XyandV2BivG;DeLEvL?)yAd=JggSXJfSE-IeTf1J_F4>N(8Nw`#BA!#%Uu3g*sV zTYb$`?M~Vy>31v!i{toCexGa3_dxTj&*q(SU)356pVvq<>7R9fSh#v!p0LH^-6v*$ z5-Bbit4Gf4NmI+@{K;BP6XqH8ief12$+&AxxO@+#}+gk!7x zqgR#xzTGt2>e$}9dAt9<*t7fA!!?bqZePu8at|Iz_I~(y+FHw3cHs;X-y62CjsA3^ zNP6z4nXBw;UoYX#deFSB_VtgjzdW0#^EyoAlsmrcNBnQ*K9kVmOQ&)!0%M=S)78&q Iol`;+02eSPLjV8( delta 694 zcmV;n0!jVa1;Yi98Gi-<006|aY&!q|010qNS#tmY08sz{08s&s7op<-000?uMObuG zZ)S9NVRB^vcXxL#X>MzCV_|S*E^l&Yo9;Xs0006|Nklsr&q%`#sf z8&h|dX%vB(>iG!zt@f#V)Ft7ssH@Zi>QM55UbUf~@EmnG$z*+<*`!ZLB%pdX6;DZL zgD@B$nM@RQi+}nn$^1f5xGTxDOmw>1qApkGs`J%j>eq-HR^P?{9jWlcn9_z4!5;OK z<@Q@WWxn=pfjy}TSAo6~(OcpBrVa#WOnq*?VVesvSA*Y*dLmx-7DzpTKTwyIEKk3B zrhx5_m~Pa|@v;qB+5uL+eTgG=Bj$(+bcEYzNi?4S|0JMu2|u c%d}MB4-_rT0O_eYlK=n!07*qoM6N<$f`Xbz4FCWD diff --git a/src-tauri/icons/tray-dark-32.png b/src-tauri/icons/tray-dark-32.png index d70be980c1a527cdc47f79f4e561886d3063e19b..7b28a6bf489e6b3d5f7d3392f2d792f74b04a856 100644 GIT binary patch literal 988 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4zl0AZa85pY67#JE_7#My5g&JNk zFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenMVO6iP5s=4T;_2(k{)$DG(Ms;q9HZAj zA=MJsh?11Vl2ohYqEsNoU}RuqrfXoLYh)Q>U}$A(VP$NfZD3$!V6gu7+(;A+x%nxX zX_dG&+-p;P3e=zhx1l66H?_DVF}DD>p3ccERzO!D@N{tu@i@M8s;@^#qDb5Qi*-7u zPR_4evtomfVh>N$43W$rPuFR;__v8Qbxhl;krQeyE-LAk(S5H!1!0o$1v|(}K+Zz6w0*}+|CSIA7%shWRn6=SaPj=ds=dXHp zPdGlQOM}OH-2^)?Egp4`$zRSgOxFw#@^9kVrRpi&`#&_OYKD%d_oA&{lm2jW)=XNm z^jN$|-4ahO&!{{mM^=@$20u5we88AD)nk&K^qkviUNNj{vc6v!>aN|0Gi7k*VT^mj zbs~Xlhfvw7N9#VaFw`a*RMwa~Wf{$=Wsu>rw)8p9H8Y)or+Ai+Sn)-b8>s@i2TX1X zZkPSwwwxjF-h?yvZiTK@X4v9heuvp%_To04b;g+;io1S_{%y!vIn}cC8gImvBN_VL zQc@WU=J5*MmRQg)(^a)*xzSMOw+Ei4yUs&^X z$)AlkJWstW2~aX~R-fAWVrSht?U02+xq-V>yyu&&h`WAcPxb%qzl<#wC-?p|$_A!o O1_n=8KbLh*2~7YD+l>JL delta 1063 zcmV+?1larB2eAl{8Gi-<0047(dh`GQ010qNS#tmY0CoTX0CoXRdnO0~000?uMObuG zZ)S9NVRB^vcXxL#X>MzCV_|S*E^l&Yo9;Xs000BNNklSd+ojU+7*>~& za2)s=_!2nNF{0Y8b*V$@VRhQ}G_CGex2oOk@Y@;hQ%6e-{i%+rC)J4(nWO5)|KmW9 z`dR^OQr)XQrhnGeN#g zK#y6ha~f0o=V7?m4ir{mzuBHDb>Q_#xG~RJr&eLix%6_G1A~Q`*A`%Wy?Q!fJg2*J z*@{^n=mx$6dI5m}U~h}lTMPN122_FHfCexHYyx%wi+_UbIPfS?2VM;Sz6I6;Q@O|6 zBJbX9F|)e5$Jv{!6`fLVj`Tl@cn=wcAm4bC>h&eY?^4foXn0C}Q@x^qabvKd*^#EA zt^|GsD!?$XIkDuuAp*|#{|Gz?oKMK*bXE9X2W(034@Uhv zs=zg2@DJIIR-`_%@Blmy{L#WVzu6hlG3u zxGePT0!G8&60!|OT&AQs8d@o(}yx1HUJXk0u3`R@CJ-Q|oZa*?u5WnpB@DobdtYmTS98u!bWCSLQ$Wg`d-A`97ui zY=6PPL;(9({Uxyi4RuukV_h`aLq>PO{gL7aB@R^7r_{d_#>(jZ0>-Y0_eku(Mb3`% zK#3Fijrf9kL_MpHhuOZR-eVT7zXHzgNN*^@A2n1)G4KYPaXhE4ZQ(?_cB@&=UlGPP zsOJOrjJhe8Eh_GeylgDci8$_OBHYrF41aZz&0U(W#NYyqZ*g`FanM3}o>J;jKXo>J zX!+?#wKZn(k7-0*Qj{$N=uuyCcIlNrxwe~CHnDuSS?RSs%(7Ury%I3z*lIVEd(~s6 zX~O0S__svndv$Xw8=Wj?)vRjz+__J#6iu7GtcL91ahjLqozj)z^0^&YLw1`&_8>ez h1$;wRGmLc#_#c1Fm)XGc7Q+Al002ovPDHLkV1nj81N{I1 diff --git a/src-tauri/icons/tray-dark-44.png b/src-tauri/icons/tray-dark-44.png index 3e1cc24c1154b001046faf4a28757492248aa664..709277e114b05f0ac4c4d7aa2b57e78bc3b24100 100644 GIT binary patch literal 1330 zcmZ{kdpOez7{`A^b@nt#q;f0mlH0M(I+#mj%YMW|kCaa3wvA!4SjQ9{Cz9K;hRl#$ zI*V8?qhg(O7&^(V5d10D)s@4YTCjCy$D+r8b)e3V`UL$Mis%Cgi}mXFq4c6jUlT5U{IJJtWa1h zjJ+QUjXPwAvq4#)P&gFo{z!4a{{&hziAst8w(uquKA{p0{&#^%rIBNq!8FFVo%9?H z8~|wS0`abX#LmWiTDU)Xcjv}r{H;55#0)`0#`%*>_bj)q)CLm*2p&5sbbtA=qc-Fy zLAz_)QQ}eEgM?_&?OC@^V-Y-`DMj)#%gMj?N{ck1d3RSZ4+KuVmlN%lVh>L`_l|(m zt1&%^vW<<6*OSe2UvNV=z9JVq)Y2-wGethJu9t!=>Q^@Sh%Lrqr_ywqxmWZFx z^bhdg`mUOh*P~#Ifuww8C~?fuiTUz{Z_hP~R*WaMe>bhd%1YwQzY8~Z>7GO{qJq)X z(`I=V=F0;*9jvQT%^R`9J(`*8oJt8v&@g)Bu%LN-@1OYq}xTZlHIn&@SSnPl6!`b>V>m9Iwb}DZLSent~+Iq?CT>lZnc8vKIR{R zZU77{@f{GY!L`X@+68ANnL)ft?Ax4Su*ODPp|^ zqt)wIo48-9_fwkEyO1qQjd|X=HsQ6k5QUQJ3uO?ZRF2~uxk@yDUCQxDY;eBdd zmx<7}Ene&HQ~&#h0qJncqEqLknt3`Wge%N}v00r)bBXe1iKiTL@1z^I;!^QN$BJAS zwbXi6@D`t@_}OH$I60m);iX6f2lA>QEaa!caf=R^R}QQgdOi%~D*y1{Y8B25USATy zs8!apBcwD|0gNiT{c%rh4O2W(P{^x5g99h_kJ*C*2}94Y^fG^L)YcyRBnUY0(Av=y z?!1AMa@j`jr|6*UR{NS~ZJ5wV{q9wRaB$^0VsOp-{D`5;lc)rX2I0e% z?yS0fFsJM`!c`=Xs{d|soY&A2HN0d_f`wCBcYG-vVsUIJqV~5Kws*Owb$RcxC|~39 zo9?VDg5h?|6Lc^dndGg*#b*Yalv*A;OIQ4yaUp}$UWtl>B50Ljs3}ceSzgUX(8xAU zubbAAQl!^7^69SnLfYsG__QfY>GE8Z&*zp6GEc1y6}0Md--MRFpJilcC0CE#aWNS2 z6|oPQNfp?^!2a$K!Mw2a#&rNeh-^36Om8f-4h@^0Fwp9YT#D|vUTYcQ4BPR(w6Cr! zY#pmP3a?@n>51v)fy1fsnI|Otg@MDITf%;5)sUWfKGXGp;$+F@@84}v4$KCYIS`7K S5?giER{=nRH(q!o=*mCV@?XFJ delta 1466 zcmV;r1x5O@3c(AI8Gi-<0016@S^)q6010qNS#tmY0HOc@0HOgRfOskZ000?uMObuG zZ)S9NVRB^vcXxL#X>MzCV_|S*E^l&Yo9;Xs000F}NklOt!&RgIWh!T1RS8} zXaZga2A9JjuYY0zcsO#B7ac%b4!vgJ>BvW~5FQR}4mfNCmH@MXQD$sK)HefI3j7+d z^94}dQ^FH~eF?@pfEB>RJhPHu^F82fg55(|HbaId11A!UehSodgQ%6!ku8f>;I?uJ zPlyKkI1Mc51){$6CwZp-2FBziTn+3u295&bdzq|&5r3pF%w52+EW!m~s~LC%7<(Sb z4h4QlAsb^0X7{j0o-za4fV%TQwhq{nK{m$xG{S>%d!mnWzuDoyG+=Jz=pLXJci!rB$V6i0{yWI3Q0fUkVFE)xBa+0h79tXY#I@6|!1X>R(&kVaQIjP+0d)CveO&8 zIYaj~7ROnXf!NvkC7i{#m; z?{1Y&inZyZ+UT}c$`v_$Op>%W#lZJ+Gk+34^(;wON%}KEwENi(*v#KC`WtblUy|+-!Z;3G5b*V?Jvfq%<{cS?M*#mCL+_G&EKkFoglTvs z!&if+dlV?fH&z=%lQRr0PH_GsFdY{k`?}AkkZs2W_GvzDHu|ga!pm9a=KC3hD}QkT zei9Dj()W+aj+K`Me5^FOvwXt+C=KAxkX?J|53I`|ln0L{*dC2bB4RWV1@Q5~(JtwA zZ#DLj^p@N{nugQSF0nvTOF%D1r=+dw8Us%^?SiCwm2PMCicd%HsfN%s2`$N312O=Y z*R93H(=EU;TxzoocnKI8={`Vd5`VhX*qU!RG~-n`t>bw{xgEGQC+Tuz67VLl5UBF{ zC(<>ee#9SZ4HfB{v9^#>HtJ=mq3gc=nbk`gcq#5x`e;5+GwsjpVdL{J;Nm=lg-f$- zM%<384CN|3mmyCAr;M*wU|f=Z$k3Do(g53W6`Y4-8e}%$Q4TB(!mM2n4>}Nw{4@s^|Va<4+J{Q UI+Auo)&Kwi07*qoM6N<$f?zDJGynhq diff --git a/src-tauri/icons/tray-dark-64.png b/src-tauri/icons/tray-dark-64.png index 0c98d32d8a39ae7e702a0170d38fab8ccd43bcfc..7ff20e1eeb66272fdb14a3719485bf4112072b1c 100644 GIT binary patch literal 1899 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 diff --git a/src-tauri/icons/tray-light-22.png b/src-tauri/icons/tray-light-22.png index 6847482541b88c9473885694d312cbc8ba990763..8a855900d92dd8d22cdf35a5fc0f8634c81d1f65 100644 GIT binary patch literal 705 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L26p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9fnimzvJsHSUgGKN%KnN)meES?(;TDM zKq1u<*NBpo#FA92b`nmq1j}KD^5uU9yP8JZ^S&Ed4)2UFefR=tu&ap?c>HRotIjc zD4MKYUMqk6L*D(>*QG2DpWXTYv;Ffs|82j2;@`F=YyWM<+-ncJue0&|*WGw^fxy1% z)D!-SHkUVveC@Eb+U$%vt>Eomp=-yT=vT~I zqqE%fXZD;+>+hSEr;5g2Q`HYX$-npHdjrKMtpdkNn(Y>Dbg@t`Y1nF~X_36uD%x~+ z9{URsy{RX@`>bYEZ@v8VuqlW6C6i?~8jboqOFuNs3FT(#tDL<@P=9IHR?et}31U}n zwrG}W1{v@7xix3fy~vje7Oxktp0&sS=(ZU;sj(W|ck-^au$3$;ET76cPk*9x>+F@W z{fp*2H`?T6!I;PG``O9p)2+$%2b|+;Cl?;=Q7k!C85FqpwEkl=J*n?zUtiT4wS6q9vz<932eYfX7F_Nb6Mw<&;$T-NEB%R delta 691 zcmV;k0!;nE1;7Q68Gi-<006|aY&!q|010qNS#tmY08sz{08s&s7op<-000?uMObuG zZ)S9NVRB^vcXxL#X>MzCV_|S*E^l&Yo9;Xs0006_Nklv8Ajcy4NL}6 zQ7tNnm=H##n(N}7$M1IM4by@5d+&YkIp5#8=iKvsDd()qQc6AS$7|S)ZFq=3@HM7$ z&hwqYkaJ#j;V8aEUgx@tH#<2h!Y6P(f>tnvx3MGE6JEqPW{W?V#O6+73}CLvW zszgR3fsC6ad4K72E*xesupVi|9Kydv<`@1$jIkoqRixO25j>AAcn0s|e#Fh;w|IV| zB)%P6dbNXa0)MU1ycK*Lwci)mVtdkBV5)<3KGq&!I+}SG-$%m^Rxy{ue-E6Fmt&RF zMBumZTt|7X;?oLyCt^N=i}5mCIP~x3dj8DV^152u(>^dp35l1ZQ+NZ!+*t&-N3sz zfgcLu&wr|zF9YA(0t=DJzRGczW_aqs__N6TVEDEP-YF;VE&Y++T9Nm#7pL$64r3!u z;wubeu-M61Ekdna&er7X2+`BH9h_dI*|J9D_x}&l1Nt9?8wvrd9XI2GzQA0? zaeblh;RVg;UMuSSxk?q+%47`RbTqB&({!|pBP_KNS6fOcX;kWUycD~k(cp#H&3s;i Z;1Ob~Xv-AQYh3^U002ovPDHLkV1kXcOv(TN diff --git a/src-tauri/icons/tray-light-32.png b/src-tauri/icons/tray-light-32.png index c522edcd2ac0d4aeea126684482eb684e9b18872..9be22de462912d2ad7d70067d0a7f2774d70a10b 100644 GIT binary patch literal 970 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4zl0AZa85pY67#JE_7#My5g&JNk zFq9fFFuY1&V6d9Oz#v{QXIG#NP=YDR+uenMVO6iP5s=4T;_2(k{)$DG(Ms;q9HZAj zA=MJsh?11Vl2ohYqEsNoU}RuqrfXoLYh)Q>U}$A(VP$NfZD3$!V6gu7+(;A+x%nxX zX_dG&+-p;P3e=zhx1l66H?_DVF}DD>p3ccERzO#;^K@|x@i@Nps&__gssQ_k`0Cn_ zi$~PH28y<3g-+-ajk&VmM#Pn-q^6I=F5h%Id+BLOHMbG5!jtw)C@s`*%Va+9HU4k*LM&O#_43vS#r<(}_QY8RX4M6lz3X_nM7r4B{MYAIPAe*|t1Vrk zfAh&+8=tF}=f2Qi&0YFC=K8g|wStN|l`H2~dc@B77&4vb{b~7>l~-TuZ9cSxeb}txRfFzc4)HiQyaxUa{@d=Z%l3sOf;GqW}#ej z`%?e*mV)#{$6L=wX#V~?ktaN|`QtQ(_5*7<|MvyCwP{aMbXcqEAR06CL+Z_3)oBH# zMmjT&@8$e%`9OHDSyTMvedg(pcoVk;9N835?A*7FGx5@r08hy^M(TU!HLmr|t#RWJ z-uXFd`6Y$7zIOcF4?psJvA%9{BA)Z%lILG`+|kxN@b_f${sO=IMlzyWt-2RpA2(~3 zsXMiK*U3EwRS%D_w;BYUNSwO;tlFbV&i}ObINV&pYf@%;B{x6gPS)+W+ip*YF4(?U z?Mt!;N4xayn$7!LZ?5B3o$M&O@YbGy8<~MCMB`?ZZ8}^tJEpku;GzKYONlGjea(!U zC~kf9ex};}ir>5ByZ6V<|Bn9{TLWxP`m=c{0#iGKr>mdKI;Vst0C~op Am;e9( delta 1054 zcmV+(1mXM22dD^;8Gi-<0047(dh`GQ010qNS#tmY0CoTX0CoXRdnO0~000?uMObuG zZ)S9NVRB^vcXxL#X>MzCV_|S*E^l&Yo9;Xs000BENkl9xANR z%BGv-z-W!#n9J_r+sD~{^L^(WbHnEBeb!q4|JrNq%lbl$QKv10uo&yG3cct`qG=q) zXZR$>c&ua47-P$xNCt2aQ;2Q)6!u~(y4&KnA>V)_HAH`66yIUIM&}ULowWn#!HXrZ z2@K)^^dXdNmVYJLE=-neU#N>l75PQ@I5VEc>sa0{oEb(hUQ4!3oDZ>}r2}c@2Q#Bl zZ0eM_!jXNYNbE&dD+gZ6lt<2H)iqHVt=JdORXTwF(#m_!fqV^)wm2!bHg!XcQ3#Hgi_eP7A z^u*PsO#`t>$)*i(LH-)8eZ|3>7n$_>lboOCki!?ow z^p0X)g@1f|hSlG|>de7UD?IMQrZoK#cgGk{mi4lBY5KhqTPo!Hv++$0T%IQXC|u(~_a5ek5c*<_-+3a#{XARa+=HQa%pL@*IbA2_2 zPk)pM#uM0k_@yEOBUoC(Se-5QK>ilonHj!a<3PZp_`8CvuD?~n*qO=h%N;ncl;_QD zUc{%-Jnv&^wXfo~l&-%L&aTXEAj3Z*RYp1R+ANPJu<9HNlIso-v>A#1bAKS;;>;RizfyT#Wz>TYN}K7Oy3bTyJUMFJ(XN-R&qPOsySlg*$Mc!M&}!B zY{}6&8FobRe05=lobgm8)CxZarZ++THb{C5I YA6^7l3q;~^d;kCd07*qoM6N<$f}M~7F8}}l diff --git a/src-tauri/icons/tray-light-44.png b/src-tauri/icons/tray-light-44.png index e62e61116c8a003b0d33ac545910668ff2c5ea51..957fe66b20b783f2be7103cb819cff2e5309ccab 100644 GIT binary patch literal 1292 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 diff --git a/src-tauri/icons/tray-light-64.png b/src-tauri/icons/tray-light-64.png index 2428dada776303b8a31cc9f508720404381db8f8..dfbb6b927a4eb19c88bf79adfda90dcc275bfca4 100644 GIT binary patch literal 1818 zcmZ{lX*Ao38pi+BUJ*M(Wo%KRLBqAgQu~@%gUl^$EG;QfB6QHAN`hJ|gbGS=MQbZ9 zWvZxsskJj=yC|*3P)jW_mg|1G=iCqT;eDR-KJWRR=i{5=>}UfLkP!d?0Ay!t>3Z&_ z{~bQAa|Lj3-Op9t&(;+U0MRM{5T6JDN9R%e8URFS0RRgJ0LXj*kP4-@x)_}wIDH*# zECHZ8T?ui%@sjM&R=g}OISwRbhmKf3kDw$gEXm)8bPMT6ymf8>LJOe_*V2I_3@}<( zk^j&~YHO)$X(6?=>Sl|6`9FYg*B^g7>hFOCGIaGEQ2k#62~W5cPVymy{ymeD!-WI@ z?o&HUGfdz@PeD*H#!9>|ZX?72Uy6x(4HFimdh%I`Gg7h>tJCEZg+Yg^0 z05TEGMtS_fO;_wlI(_gLF{HI!%@R~G47FfWId#M6AyQ6;&;j*>#t~@M!{&Tpns(;B zK+^VRS4rBD!lf|27IU?4cKJUqYElwEK-|imdHy|(jX8|>vCH(4{BDTS&&}tL&6t_i z*v3u_exP=NDEt)Bf@GrX&{gX_H{*`GwXf^7AwxrNHhFXM@9EVzKlrfQfK{2HZ*WZT zJZsO__!O_J65UW9YEF7-AM#m0P@>uR4KQ(jKQ8H*#aH1L zG>6i>Se3!(9<>)9@=s5m@n8$)e=hBaaKK}_XmhGhH;gB`WX_ZX5~mjlwUe!)sVot zmM-!K!eCZUC<+!kY|DfYjz8(tdKT<_lVItIKDI}_A9cU~sB_f%>3!1E-d|voLZz`% z4UFL*e|q%cT07emKgK@6-*Inblm3a$>}_G}m+AYhip8j1n-lj=2*70TCidrcKgTSo zS5H9#1lxsO%?{sL=PtRpt^42fx?q0)HY@xSL<$Wz3^pZMoz);vh}U;omt_D78ct~w zKTc)b(g(Fv2&DDCnc zNewilgb{Mtdl7v0!=)CsMP?YUl@c!{t!!QR3gpAHUf6%H$}_o8Ca~$&bLMl0du5E( z6|kkm?0|dha@TjudrrMb4g2Ucr1#e=bc7|C@7fkQAx>2^%X2`SIpJx4_kE~kjuLtt z_cCc*oCR9w;*-*F8_NpSmgKOSK|P9GzNpy+x!QkGT=MaJr3pFHyJe29*2N}Og}ksu z)i5Jgd#j%ZlA7T)3oO&gD%Zv`LiNiW9?eW$6S(5EbnZq(;hM1!m^PwmZ(SAD>6M*z zBksC~KDYq@KPx4~J_2l@`{ zzh&Mw`JD(S4^B?aoDMlLA+r|#$=z**lNnZ5>$oy$-Yx2gM;WA21aqU3it7+DBH6_slRJ36Xn{ap7%}m6+^Lvb1oW!d$&Pxf7;~Cd{R_&@UKAM$lpfR96jYl%~Ll zc?tg16MyX#r~Ep_4f^u}$(i`z9qCc=*>pRqqv$gYc3q|n77=gr0-3jeGlEKXed@1* z^AYhMSu~nW8W{D38E?KXT2c qxsT{q;I0p>$dLzOPoC_bO~g^7`!-aq-LId255UgK(X!SYm+&8O8aHzQ delta 2206 zcmV;P2x0e{4xbT_8Gi-<0063Kaozv`010qNS#tmY0PFw&0PF#IC~>_2000?uMObuG zZ)S9NVRB^vcXxL#X>MzCV_|S*E^l&Yo9;Xs000OqNklpBr( zD#$tKfD?ezfMbB^z~{h7#jt+hV_>_8j82JMjWU39?l9nD;Jd&=RPn%pNYuJ ziSv}Ic#F0nie_o(A*+%Yk*7a(}TaVja-Y&@BKQ3%na4Oh51- z@NJ+}<2E}B_%m_a?0w+mh8O_-l>N6rfFWQF&{YoymE+%uI@Qbu|ERHn1X}2!{srKO zsa8Id?SDrRK4CX7w<-ew9l&1$;CGOP(oHhJ!x09MOb2iD7-Fz40Q!e!DW1vpi%8|m z?Y<-f02kr^&fnH#<$oEF&DSP???f2@J+W=~0KM3(WuM9QP@>|MZ7W8gWHDOp0r;q% z4iA_C^kmH&H=v>MN?=QYg72Xb76V5Xz;6Jq5|Pg`Ugw|@>$KdsexO%G`VaQxtbGfK zP9)+@p9(yU220g0-%xu5Xf^n*^^9L_ZUOX=v)7m~1k9;I@fP4V!Vz07Z36gBfd4Es zcYlzdw+onV8DP1G(alvTe63z?DAX}708U4p z@EE%N4xrK8o4`{dG8ik5hzvUCoY*lr=y=Pi&-C@NGuZjwH)64iSxG^GTl{a zfcK37YZI9~=}~?UiCLN)?pyZ>oGSr~j7P7E$evi70(#Wb ze^$(7(Pgm9cr>#Fv>Ok0$H@g~;D6I&^lwbS2$G2W1N)_%lmKJt)Lufrv3dF;0l3rC zzcm3PhO8}V8Qw>q8-491)EVSyECIO9({Js$TBt99w?&qolsL3Np-jHFYLQP-%eT}* z)}5gxyN|4uKH@XLQ3=39p8hBYRVL?Lr*m$JbM8v#+5vYb2(1I)t? z5>848R$egXj}jS70XKPM_*M4&e$Vr$a5$i2FK9Sum9s2MFu+ee45GqS>{z|r9>ET? z`v_dM=kQk;^Y;VON+L3j7Jnq==>ntAN6%wB!)ue~ww6+m5$?EoJak=U=56{&6( zk@2#HtOVkg#F+hd14Ga};~52WyGhF;9YC|YF>*OHrJu)GDk{AO-AF}W#M3z<>pa(m9duQS*_;En!arC~?>s&Kot$+Pq*~WmQ6J)X+ z=qS*0&;Z%M7mb1aBvyN%`w8udRpc_x4h4L;py zF2d5`rb*)sfc5~u^E9tO;&|Yh%vf&&D~&NFv{K!Y{hvTvp??7~pvwcx^N-CiK%|lG z2yCfE=9~bS?|xmV;>LIil)p6~uQzfG0k#2~0-#MTldF((THwtK`mdAe-uVUKa}DQH z+13NyO;o-U_)9>(9Tb%B#xOaPaH;IS2?Qh!RDMy$+b7pP;2VWFk<893Fv2)mxR4Yv zR;l>m=%+LkAb;&4Hd~ay_)Lob6Z8piLnF2Y`h8zTxN2R{*kXP(ZlVw;Vqc}_+W;Dh zo>K?K&qnJPVor+h0VgKmS0PY4#Yf)CwhcX#FGrJ*-Y*B5z3Byhm>KZHNFEdDm%!`o zeXW*1O;kY)G7^RO9lTf$qxz;#Wky z+Ax|_nH1hObPIS4F&p?D>I56D_)av@(fmJ78iwdV3!67m-wM(F=pknXkyRlL_W?!Z zoa+WIMRW4!qP2sqk<*9K)7vJr5c+k|N|E}@*(d`{V&q&adiU3h-W<2` String { "auto".to_string() } -/// Coerce free-form values to the supported set. Anything outside -/// "auto"/"light"/"dark" falls back to "auto". +/// Coerce free-form values to the supported set. Anything outside the +/// supported list falls back to "auto". +/// +/// Legacy 1.2.9-pre values "light"/"dark" had inverted semantics +/// relative to the labels users saw (picking "Light" got the dark +/// glyph and vice-versa). They're remapped here to the value that +/// matches the user's original intent. pub fn normalize_tray_icon_theme(input: &str) -> String { match input { - "light" | "dark" | "auto" => input.to_string(), + "mono-light" | "mono-dark" | "color" | "auto" => input.to_string(), + "light" => "mono-light".to_string(), + "dark" => "mono-dark".to_string(), _ => "auto".to_string(), } } diff --git a/src-tauri/src/tray_linux_ksni.rs b/src-tauri/src/tray_linux_ksni.rs index cced48ba1..b70f8fecd 100644 --- a/src-tauri/src/tray_linux_ksni.rs +++ b/src-tauri/src/tray_linux_ksni.rs @@ -33,17 +33,27 @@ use ksni::{ use tauri::{AppHandle, Emitter, Manager}; // Multiple pixmap sizes per StatusNotifierItem spec — panels pick the best -// match for their bar height (22 = base, 44/64 = HiDPI). All are monochromatic -// silhouettes of the qbz glyph: black on transparent for light panels, white -// for dark panels. Generated from icons/icon-symbolic.svg via Inkscape. -const TRAY_ICON_LIGHT_22: &[u8] = include_bytes!("../icons/tray-light-22.png"); -const TRAY_ICON_LIGHT_32: &[u8] = include_bytes!("../icons/tray-light-32.png"); -const TRAY_ICON_LIGHT_44: &[u8] = include_bytes!("../icons/tray-light-44.png"); -const TRAY_ICON_LIGHT_64: &[u8] = include_bytes!("../icons/tray-light-64.png"); -const TRAY_ICON_DARK_22: &[u8] = include_bytes!("../icons/tray-dark-22.png"); -const TRAY_ICON_DARK_32: &[u8] = include_bytes!("../icons/tray-dark-32.png"); -const TRAY_ICON_DARK_44: &[u8] = include_bytes!("../icons/tray-dark-44.png"); -const TRAY_ICON_DARK_64: &[u8] = include_bytes!("../icons/tray-dark-64.png"); +// match for their bar height (22 = base, 32/44/64 = HiDPI). The mono +// variants are silhouettes of the qbz glyph generated from +// `icons/icon-symbolic.svg`; the color variant is the full vinyl logo +// rendered from `icons/icon.svg`. All sizes use a 2px content inset so +// the glyph doesn't crowd the bar against neighbouring icons. +// +// Legacy filename note: `tray-light-*` holds the BLACK glyph (intended +// for LIGHT panels) and `tray-dark-*` holds the WHITE glyph. The +// constants below use glyph-colour names so the mapping is explicit. +const TRAY_ICON_MONO_BLACK_22: &[u8] = include_bytes!("../icons/tray-light-22.png"); +const TRAY_ICON_MONO_BLACK_32: &[u8] = include_bytes!("../icons/tray-light-32.png"); +const TRAY_ICON_MONO_BLACK_44: &[u8] = include_bytes!("../icons/tray-light-44.png"); +const TRAY_ICON_MONO_BLACK_64: &[u8] = include_bytes!("../icons/tray-light-64.png"); +const TRAY_ICON_MONO_WHITE_22: &[u8] = include_bytes!("../icons/tray-dark-22.png"); +const TRAY_ICON_MONO_WHITE_32: &[u8] = include_bytes!("../icons/tray-dark-32.png"); +const TRAY_ICON_MONO_WHITE_44: &[u8] = include_bytes!("../icons/tray-dark-44.png"); +const TRAY_ICON_MONO_WHITE_64: &[u8] = include_bytes!("../icons/tray-dark-64.png"); +const TRAY_ICON_COLOR_22: &[u8] = include_bytes!("../icons/tray-color-22.png"); +const TRAY_ICON_COLOR_32: &[u8] = include_bytes!("../icons/tray-color-32.png"); +const TRAY_ICON_COLOR_44: &[u8] = include_bytes!("../icons/tray-color-44.png"); +const TRAY_ICON_COLOR_64: &[u8] = include_bytes!("../icons/tray-color-64.png"); fn is_flatpak() -> bool { std::env::var("FLATPAK_ID").is_ok() || std::path::Path::new("/.flatpak-info").exists() @@ -104,27 +114,64 @@ fn decode_pixmap(bytes: &[u8]) -> Result { }) } -/// Resolve which icon variant to load. `theme_override` accepts "auto", -/// "light", "dark"; anything else falls through to system detection. The -/// override exists for desktops like GNOME where the top bar is dark even -/// when the system theme reports light, leaving auto-detected dark -/// glyphs invisible. -fn resolve_dark_tray(theme_override: Option<&str>) -> bool { +#[derive(Clone, Copy, Debug)] +enum IconVariant { + /// Black glyph — for light panels. + MonoBlack, + /// White glyph — for dark panels (Plasma dark, GNOME top bar). + MonoWhite, + /// Full color vinyl — for users who'd rather see the logo than a + /// monochrome silhouette. + Color, +} + +/// Resolve which icon variant to load. `theme_override` accepts: +/// - "auto" (or unrecognised values) — system color-scheme detection +/// - "mono-light" — white (light-coloured) glyph +/// - "mono-dark" — black (dark-coloured) glyph +/// - "color" — full vinyl logo +/// +/// The override exists for desktops like GNOME where the top bar is +/// dark even when the system theme reports light, leaving auto-detected +/// dark glyphs invisible. +fn resolve_variant(theme_override: Option<&str>) -> IconVariant { match theme_override { - Some("light") => false, - Some("dark") => true, - _ => prefer_dark_tray(), + Some("mono-light") => IconVariant::MonoWhite, + Some("mono-dark") => IconVariant::MonoBlack, + Some("color") => IconVariant::Color, + _ => { + if prefer_dark_tray() { + IconVariant::MonoWhite + } else { + IconVariant::MonoBlack + } + } } } -/// Decode all monochromatic pixmap sizes for the active theme. Panels pick the -/// best size from the list; supplying 22/32/44/64 covers standard SNI bar -/// heights and HiDPI variants. +/// Decode pixmaps for the resolved variant. Panels pick the best size +/// from the list; supplying 22/32/44/64 covers standard SNI bar heights +/// and HiDPI variants. fn decode_tray_icons(theme_override: Option<&str>) -> Result, String> { - let sources: [&[u8]; 4] = if resolve_dark_tray(theme_override) { - [TRAY_ICON_DARK_22, TRAY_ICON_DARK_32, TRAY_ICON_DARK_44, TRAY_ICON_DARK_64] - } else { - [TRAY_ICON_LIGHT_22, TRAY_ICON_LIGHT_32, TRAY_ICON_LIGHT_44, TRAY_ICON_LIGHT_64] + let sources: [&[u8]; 4] = match resolve_variant(theme_override) { + IconVariant::MonoBlack => [ + TRAY_ICON_MONO_BLACK_22, + TRAY_ICON_MONO_BLACK_32, + TRAY_ICON_MONO_BLACK_44, + TRAY_ICON_MONO_BLACK_64, + ], + IconVariant::MonoWhite => [ + TRAY_ICON_MONO_WHITE_22, + TRAY_ICON_MONO_WHITE_32, + TRAY_ICON_MONO_WHITE_44, + TRAY_ICON_MONO_WHITE_64, + ], + IconVariant::Color => [ + TRAY_ICON_COLOR_22, + TRAY_ICON_COLOR_32, + TRAY_ICON_COLOR_44, + TRAY_ICON_COLOR_64, + ], }; sources.iter().map(|b| decode_pixmap(b)).collect() } diff --git a/src/lib/components/views/SettingsView.svelte b/src/lib/components/views/SettingsView.svelte index fc294b2f9..0b9ddd98a 100644 --- a/src/lib/components/views/SettingsView.svelte +++ b/src/lib/components/views/SettingsView.svelte @@ -1301,9 +1301,11 @@ let enableTray = $state(true); let minimizeToTray = $state(false); let closeToTray = $state(false); - let trayIconTheme = $state<'auto' | 'light' | 'dark'>('auto'); - const TRAY_ICON_THEME_KEYS = ['auto', 'light', 'dark'] as const; - type TrayIconTheme = (typeof TRAY_ICON_THEME_KEYS)[number]; + type TrayIconTheme = 'auto' | 'mono-light' | 'mono-dark' | 'color'; + let trayIconTheme = $state('auto'); + const TRAY_ICON_THEME_KEYS: readonly TrayIconTheme[] = ['auto', 'mono-light', 'mono-dark', 'color']; + // i18n key lookup uses the kebab-case identifier directly (e.g. + // `iconTheme.mono-light`); the JSON files mirror these keys. function getTrayIconThemeOptions(): string[] { return TRAY_ICON_THEME_KEYS.map(key => $t(`settings.appearance.tray.iconTheme.${key}`)); @@ -1316,6 +1318,17 @@ const idx = options.indexOf(displayValue); return idx >= 0 ? TRAY_ICON_THEME_KEYS[idx] : null; } + // Migration: 1.2.9-pre stored "light"/"dark" with inverted semantics + // (picking "Light icon" produced the dark glyph). Backend normalises + // those legacy values to the user-intent equivalents. + function normaliseTrayTheme(raw: string): TrayIconTheme { + if (raw === 'mono-light' || raw === 'mono-dark' || raw === 'color' || raw === 'auto') { + return raw; + } + if (raw === 'light') return 'mono-light'; + if (raw === 'dark') return 'mono-dark'; + return 'auto'; + } // Library settings let fetchQobuzArtistImages = $state(true); @@ -3333,10 +3346,7 @@ enableTray = settings.enable_tray; minimizeToTray = settings.minimize_to_tray; closeToTray = settings.close_to_tray; - trayIconTheme = - settings.tray_icon_theme === 'light' || settings.tray_icon_theme === 'dark' - ? settings.tray_icon_theme - : 'auto'; + trayIconTheme = normaliseTrayTheme(settings.tray_icon_theme); } catch (err) { console.error('Failed to load tray settings:', err); } diff --git a/src/lib/i18n/locales/de.json b/src/lib/i18n/locales/de.json index 069cafa2b..b0ec30a5b 100644 --- a/src/lib/i18n/locales/de.json +++ b/src/lib/i18n/locales/de.json @@ -2244,10 +2244,11 @@ "closeToTrayDesc": "Fenster in den Tray minimieren statt beenden", "iconTheme": { "label": "Symbolvariante", - "desc": "Erzwinge ein helles oder dunkles Symbol, falls die automatische Erkennung nicht passt (z. B. die dauerhaft dunkle GNOME-Topbar)", + "desc": "Wähle ein monochromes Symbol passend zur Leiste (Plasma, die dauerhaft dunkle GNOME-Topbar) oder das farbige Vinyl-Logo", "auto": "Automatisch", - "light": "Helles Symbol", - "dark": "Dunkles Symbol" + "mono-light": "Mono hell", + "mono-dark": "Mono dunkel", + "color": "Farbe" } }, "composition": { diff --git a/src/lib/i18n/locales/en.json b/src/lib/i18n/locales/en.json index e865b6849..5baae79a1 100644 --- a/src/lib/i18n/locales/en.json +++ b/src/lib/i18n/locales/en.json @@ -2259,10 +2259,11 @@ "closeToTrayDesc": "Hide window to tray instead of quitting", "iconTheme": { "label": "Tray icon variant", - "desc": "Force a light or dark glyph if your panel auto-detection looks wrong (e.g. GNOME's permanently dark top bar)", + "desc": "Pick a mono glyph to match your panel (Plasma, GNOME's permanently dark top bar) or the full colour vinyl logo", "auto": "Auto", - "light": "Light icon", - "dark": "Dark icon" + "mono-light": "Mono light", + "mono-dark": "Mono dark", + "color": "Color" } }, "composition": { diff --git a/src/lib/i18n/locales/es.json b/src/lib/i18n/locales/es.json index 8cc8256d0..0af8009dc 100644 --- a/src/lib/i18n/locales/es.json +++ b/src/lib/i18n/locales/es.json @@ -2259,10 +2259,11 @@ "closeToTrayDesc": "Ocultar ventana a la bandeja en vez de cerrar", "iconTheme": { "label": "Variante del icono", - "desc": "Fuerza un icono claro u oscuro si la detección automática no acierta (p. ej. la barra superior siempre oscura de GNOME)", + "desc": "Elige un icono monocromático para tu barra (Plasma, la barra superior siempre oscura de GNOME) o el vinilo a color", "auto": "Automático", - "light": "Icono claro", - "dark": "Icono oscuro" + "mono-light": "Mono claro", + "mono-dark": "Mono oscuro", + "color": "Color" } }, "composition": { diff --git a/src/lib/i18n/locales/fr.json b/src/lib/i18n/locales/fr.json index 242e5d794..2bfedbe5d 100644 --- a/src/lib/i18n/locales/fr.json +++ b/src/lib/i18n/locales/fr.json @@ -2253,10 +2253,11 @@ "closeToTrayDesc": "Masquer la fenêtre dans la barre d'état au lieu de quitter", "iconTheme": { "label": "Variante de l'icône", - "desc": "Forcer une icône claire ou foncée si la détection automatique se trompe (par ex. la barre supérieure toujours sombre de GNOME)", + "desc": "Choisis une icône monochrome adaptée à ta barre (Plasma, la barre supérieure toujours sombre de GNOME) ou le logo vinyle couleur", "auto": "Automatique", - "light": "Icône claire", - "dark": "Icône foncée" + "mono-light": "Mono claire", + "mono-dark": "Mono foncée", + "color": "Couleur" } }, "composition": { diff --git a/src/lib/i18n/locales/pt.json b/src/lib/i18n/locales/pt.json index dbb4d39fb..fba45acb8 100644 --- a/src/lib/i18n/locales/pt.json +++ b/src/lib/i18n/locales/pt.json @@ -2253,10 +2253,11 @@ "closeToTrayDesc": "Ocultar janela na bandeja em vez de encerrar", "iconTheme": { "label": "Variante do ícone", - "desc": "Força um ícone claro ou escuro se a detecção automática não funcionar (p. ex. a barra superior sempre escura do GNOME)", + "desc": "Escolha um ícone monocromático para a sua barra (Plasma, a barra superior sempre escura do GNOME) ou o logotipo vinil colorido", "auto": "Automático", - "light": "Ícone claro", - "dark": "Ícone escuro" + "mono-light": "Mono claro", + "mono-dark": "Mono escuro", + "color": "Cor" } }, "composition": {