From 23d1f2ce269732f6397f008214ef0754ba7ecdbe Mon Sep 17 00:00:00 2001 From: Darrin Smart Date: Fri, 15 Dec 2023 09:48:34 -0800 Subject: [PATCH] macOS: Show alternate tray icon for unread messages --- app/renderer/js/tray.ts | 60 ++++++++++++------ public/resources/tray/traymacOSTemplate.png | Bin 321 -> 354 bytes .../resources/tray/traymacOSTemplate@2x.png | Bin 631 -> 613 bytes .../resources/tray/traymacOSTemplate@3x.png | Bin 932 -> 937 bytes .../resources/tray/traymacOSTemplate@4x.png | Bin 1284 -> 1184 bytes .../tray/traymacOSUnreadTemplate.png | Bin 0 -> 347 bytes .../tray/traymacOSUnreadTemplate@2x.png | Bin 0 -> 593 bytes .../tray/traymacOSUnreadTemplate@3x.png | Bin 0 -> 851 bytes .../tray/traymacOSUnreadTemplate@4x.png | Bin 0 -> 1212 bytes 9 files changed, 39 insertions(+), 21 deletions(-) create mode 100644 public/resources/tray/traymacOSUnreadTemplate.png create mode 100644 public/resources/tray/traymacOSUnreadTemplate@2x.png create mode 100644 public/resources/tray/traymacOSUnreadTemplate@3x.png create mode 100644 public/resources/tray/traymacOSUnreadTemplate@4x.png diff --git a/app/renderer/js/tray.ts b/app/renderer/js/tray.ts index 289090aa4..e7d9220ef 100644 --- a/app/renderer/js/tray.ts +++ b/app/renderer/js/tray.ts @@ -17,16 +17,37 @@ let tray: ElectronTray | null = null; const appIcon = path.join(publicPath, "resources/tray/tray"); const iconPath = (): string => { - if (process.platform === "linux") { - return appIcon + "linux.png"; - } + switch (process.platform) { + case "darwin": { + return appIcon + "macOSTemplate.png"; + } + + case "win32": { + return appIcon + "win.ico"; + } - return ( - appIcon + (process.platform === "win32" ? "win.ico" : "macOSTemplate.png") - ); + default: { + return appIcon + "linux.png"; + } + } }; -const winUnreadTrayIconPath = (): string => appIcon + "unread.ico"; +const unreadTrayIconPath = (): string => { + switch (process.platform) { + case "darwin": { + return appIcon + "macOSUnreadTemplate.png"; + } + + case "win32": { + return appIcon + "unread.ico"; + } + + default: { + // Note this isn't used - see renderNativeImage() + return appIcon + "linux.png"; + } + } +}; let unread = 0; @@ -118,8 +139,8 @@ const renderCanvas = function (argument: number): HTMLCanvasElement { * @return the native image */ const renderNativeImage = function (argument: number): NativeImage { - if (process.platform === "win32") { - return nativeImage.createFromPath(winUnreadTrayIconPath()); + if (process.platform === "win32" || process.platform === "darwin") { + return nativeImage.createFromPath(unreadTrayIconPath()); } const canvas = renderCanvas(argument); @@ -197,18 +218,15 @@ export function initializeTray(serverManagerView: ServerManagerView) { return; } - // We don't want to create tray from unread messages on macOS since it already has dock badges. - if (process.platform === "linux" || process.platform === "win32") { - if (argument === 0) { - unread = argument; - tray.setImage(iconPath()); - tray.setToolTip("No unread messages"); - } else { - unread = argument; - const image = renderNativeImage(argument); - tray.setImage(image); - tray.setToolTip(`${argument} unread messages`); - } + // Update tray icon based on unread count + unread = argument; + if (unread === 0) { + tray.setImage(iconPath()); + tray.setToolTip("No unread messages"); + } else { + const image = renderNativeImage(argument); + tray.setImage(image); + tray.setToolTip(`${argument} unread messages`); } }); diff --git a/public/resources/tray/traymacOSTemplate.png b/public/resources/tray/traymacOSTemplate.png index 222de0636ce22d9d10f9f3c2338d1e285e66b4b9..8c3781e88dc075c3c35535aba73aaafba3e0d3d3 100644 GIT binary patch delta 320 zcmV-G0l)si0^$OYD}Ml4000140jiy;h5!Hn8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10PjgeK~y-6m6EYaLqQNl&wT_GBcw>1GEEA>!XT#b7vhijlNO4> zB7TZ!#5B1UnU&qgu1PK|%)p%4_wHWVCP~sIaKZojw*B?Tq<;mHZh*xBIO*B;8$cJZ zfccRyz&x1!f{+`-HSHXq-T_4Oa>A0=RH$d-8F1c!9)J+b1PW0)Dc+ zrUz9IFa^d@FM(Ngt^v=0Wz=I}+PtU&UjdK6qy^=t@E{A*2kyeeNo(lv13 zc!9#UF!LSCAUWM00RsrQOHCf-u0_Ou1;96N>T17aR>|#z#H3})cgYL>A|lx S_^3<(0000J{1D}M_T000XT0n*)m`~Uy|^GQTOR5*>5(mhH9K@f)FXKH2ju8ZFtyBfBAXaR#8qR`uRPC>u+_A89ua4$t|HmR diff --git a/public/resources/tray/traymacOSTemplate@2x.png b/public/resources/tray/traymacOSTemplate@2x.png index 2400018a54637109fe46950b1f5561750f5d4ee2..b97e3c6c1404d6a433317b23d6edb6426d8281d1 100644 GIT binary patch delta 581 zcmV-L0=oV81my&fD}Mm9000290lCwP1ONa48FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10rE*iK~z|U#g{#66j2z3pJV(eO-Kk56v4toL=d9JkjBPB1PlMC zSZHG*LO?X4l1fpu@PnYRtFiMVyT@X#WVw6q?9T37b6|@(Gk7x>5@u zX$F`p2rw(@Xcho)_>@#X3t+nsbPI-eZ0}_Of}Rxwcpe)=0Jh%)kAPmw;aj%f#%8h) z07yDU)re*q27jFe&PU#3+b>cVXFH+oU%*boa3pO+)~4<4-1S+2NhIksuow;vJhc6) zZcVEI>^HF<@WA%FQ41#8Xe7;t{bJBN0h|Q(fcxWwPXr)o5x5P+6@3Z#1KhLyVch#Q z`Uxa00k?opwz~uV9Iyo3wf&{ZJ;w$J1$Hy6iT_e7z<-@Vs8#_aodIr8^@PvyQ`&yg zG_UmP+olc`#07(~sYk-2)vHkJC07zN|;;!~p(y4|SJ>Z+|pUIreOt=QD zH4GXB@ies`q-Mh9mcyYc-i=Vq^#D{2rIfDL0!TVSwFQ^bLdZx1P|a(lXF?4g#4}+J z_+Bu4*FN^|EI?3la%o9hv5}eyUsGl^@R9J=0m$8e~KorKmZ|2Q}$*yZw zJS{F*%5flKCy3pF*a>!8T8enZ{S`LaS!iovVQq7G9yVI4AlE1&Xkl?I$eF#c*|FI5 z%*M@zg$(+^6nV+a?|b3RQ)@sewG|Q$z?0mYVU{mQo~w1&lDzk40hqZ4y!Sss8z6ZI zpqOibuxHNFA%N<4vaD9n;affN<9Yfvt{_ch+MA1>i6WNP+XJSs^U2A zW?A;hdmkM^$bT=!n5%i7e^_?CrDcrS#O$_v=bT#&4xY-9{8oa$Op+uCLh5$Ar>e1X z_FC(w0HVJpwxKABHni3c%ds>~e`h}ykq4-3@z!Lmy#e6BTDw*;wF#gQk*y$L0GKXb zD5aj1<7t{YrPOC@?afeZB_j7RIl)HN?Bh7TCL$Z5;D2^nP#%D`J=Fv}MtFD!gTEy#Pnjs-no7TN&G z5lSst^-vA$gf;+R7p11ODk1p>;cDQ}7;~}7;YpIuFgf+wEWVG^-@X~u_Jm22B!j`A lm2Sp4H_Ec?>(tEurC;*WS1NmQ5Q+c*002ovPDHLkV1n?5BoF`q diff --git a/public/resources/tray/traymacOSTemplate@3x.png b/public/resources/tray/traymacOSTemplate@3x.png index f234a51f3bb9595c38431711e1b97a6cd1a0a6f1..0be30e5a49b676cf176668e79ae8a92d6ee35658 100644 GIT binary patch delta 908 zcmV;719SYO2dM{;D}MnE0003E0Yu;$v;Y7A8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H112#!SK~!jg)tXC-6-O9`pV#r8sG!E+1!i1`!3#!5jYeGvx(SF1 z{>*{s!bLzAf_ID;qKM#P#v4i$)QQf8nR#7Qk525aK3#pfJ%8h~Ih?Md`uR>3b@}SZ zHs3P~dM(f`3#(L;v=ZnCex&`NXMq2J5!>%Ox|IzfNdk@ly8tz1SP=tvfy*wD>=eK; zU|aKUNj$K9F;*BI4wCxmy*$A7%%zaB@w~eQnY#QMD<}*=QXjCfHJx-eNh)-W^}uqV zuRWh+`Up-rVt)b5wC7Tr>7s|R0LFmH_FR&gv^`c-P#A#i8Q@8)N@)zo3d&}ozX^*; zuQ9=;kZ1t5UjaATFiPZ_?SEs1r7JOjq@BR;z>mmAgrr|eiZ9u|SEZdw0e`ea(N@L41=|m+Hqw&-By9$M z`s(pC@R#k!DQ)$t2ljsTeF`{ldnC1?R!&#hW-wN^fiNM=G6|fkBM&VEAZaOZTGHZ3 zmASwEIPjgGWM4l5XKlak=ADi8fTR_`8DI@?CsJ)N z`y2&^x__02hI$~&TAU^cNk0Q8`Le|rF4}lWT0$6FL$=4ed1tQex~WA;8-WwR+}UQx_KQgUKHG(-s&1&& z1ClloHvb|<8!6`>9fccbKpC##j;3JWAc8{1MIOT|Cr>B8uZ5k!=Jj}4-wLUy}0PU16-+n(fzqn$T$q}?fz;oO8Be6Xs61x ikCgL;@BZH^p8$dD1B6%;miYhx002ovP6b4+LSTY%$f_j( delta 902 zcmV;119|+Z2c!p(D}M_T000XT0n*)m`~Uz0R!KxbRA_n>VvFH#^xy zlAuC}V6X_N1QII+Q4o?w@E_1lg_Kr;kV3Fi3k5CWM`NJ~Rt5_zZH$G2phA+`C?v#u zk;{GTTHHnA-tOIQ%<=QAIp>$lA{n6cobN&J1JHH~O9JA@x63_F-Ab&<45r1i|Pgs>pgAk&j`;4(U z&-0GhHA{i#d7}`KC!&wWm|nYPbzIjyptU}j^gP;qBANmKH!r`Y7-I%G=QB#F{{=kDJP!ct08nhw{jIrQ5kg$e)2}H~ z$}5Oifq&YRc$kz|@BVtBP`HqvT?-t?xd{LP)H>U&`(uc>sFXUDt6&nt!^47zCgI<8 zJaO(Tr6!CqgSiQ|z$K#B@b6ll*!_;e7}HBc)6lq!CeHni!T0?E#@H-0o?$w_`&#P} zM4X4116ap*UrIR&04orG^sU(Jewy3qi8i$iS> zcnQf1PBKcV{`xt`%BIE``yr*g)=WOt?Q~C1PuKGD^5Js1oc1>Rzv=4g+E`s(orT)> c_8uL}A5G?>L;p|d$p8QV07*qoM6N<$f}sYu7ytkO diff --git a/public/resources/tray/traymacOSTemplate@4x.png b/public/resources/tray/traymacOSTemplate@4x.png index acb7b4b9e7f048c66cd082929d9650c6cb7ae192..c7082d2fff254d51f565a45738fb981b0b0400a8 100644 GIT binary patch delta 1156 zcmV-~1bh303ZMy)D}MoJ0004J0dk$Sr2qf`8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11T9HKK~#90<(u7a6-5}ve-HgoP%H>Begk3=6%EvCo2VDwkSHSZ zFZll%QKE)u;)Ntyr3KW85l}H|ltcviXiK557qbRD_RP%g&VSDCNq=`|_nqBmo-_L~ z@4PEBV>Pp;Z2@hw>J1n!+d$IYzz$#|Fq&LZHLe2}fYWAnrA$M`-UB2J0n@-9x;t`~ zfjQuFGh2>n5M@Bo`PYDLwdCdF2jGJk6Jr0#X$GhB0FMDvF@Zq?By9jD>MCl1Nl9a& zpqLS`8&G{c*?$pEyO$UPw$_%?9$P~JUIQfE3EY!PO$&@ky2BR`8UgDPifIdPA3_F1 zJxe>zP2bLt0oM`=X^X4Aon8aX>^ksgQaO1!Z)UYd0Kl0sl38enGgz^5q`W#*`vErf!i<^pE+4REZsqbMVpz-$kIn2{6@XLuQt2f|fPEFUMZssX*L) zz@t5zF9UC<>^x*Npm?6Yic4947YKi@=l9>Z&R ziAfp-cHtH_KMdvaQjy$%VlD9?|IZoB2AV#J>-Ljj>W z!D0HZ%nSmXiC#CGrC=5*32%2f?^j(XXtolr-!pR%|Xh3 zHaCS^z3K92bF;Ww!E~R^{ilKZaB>`1C)kw_Cl|T(;bf^* WvpgqY*4z&O0000VRT#$K_syB}F(*4S zNtoS4W8AtcNJPC@h2FUcMZBvb2x8IypjQRG(o1QtNDHO~2a?RI;0Vn1Fgl^Tq(F9D!GB^7ecKbo7H)2Ypu z%jE|U@rN9kid{m8RR9oa{3By*&9sp;rIb3G*uB>JWzz=I79#FcDwRiuc`S@-K)>IA zCk(?zbgOa=^?!Q3ZWxAN#G2J;G)jorgB+xowisg@vCIPiD5Z{?7Cxy$#GU2kWf`jh zwOZ|Y)50fQ&LE#OtO4zIdvm;20mX?-!u_pPxUj={w%qN$+EX(?Fn9re4z~<&= z%d)I*$7xpHA)=uxz|aQlPJDOra`v4*5xt*i=KTD;WPglZgB(1@NlOUvc_QH z?m$HHLVt+UkTBF-Bc=QhMi@uLKq+<7pv3GLBmGXXSbWK##B3RrJ|f<7UH2K2`Z8ry z`h`N_MyXVK+^E2;8J0d{?21yVZd6RXoe z73cg+)L7fL?@6C?eyLustE_cq!tCtqLqv2H5r1zNi^bVdV+W)k3L(xx#O^h>xURc| zh(E#I6yv5JNGV^>T4QEtt&bt%uW)zSij_VhcBPaj_D5+3Xsu5mVi*4Y509Nb5#82W zKbyJ8tPnz+f`6PT#z~)uZrZlJv@b$4fP@fd0U(5bFJEJ&kBC=&-(SpHWG2+>b;TI_ z6o2l0WsOW906X` z)OjIe?6gUJnc{ig(};KrhHqC7Zu&~87XhFHqYoz!X8Ky|lTqIe9Mtqt2=O+IaWu_2 z|IC=m7{ob2Wt{U1-EQ}lF~{%h-XZJ@M1KST&|-|ONh!~7ZEanj*pHXXWyi9t%P_&q zi!2Kf??@@%gh?EcHyVu+5q)jiRFYCkT}<5s#@Hp(M$(j&@{Ppi9mjdjw1KomM8A)^ zBpvykU=Rf7!Z4i9o!Kt^exC(F&<=uNCDz1dvspyMKOhGwrY#~`k7XVJz;T?XOn(cX zU<2+nn@v8*=g?DDrBrR)X62nQ4Ee^!#=z_Rp$+JCI@{Sv+FuYcY&M%=tVy+6?Lo-F z<2#9BjJ0B!-@~%3?@f!JL~+h94)ZwjrUentM|NonK*SFcP4qm^Bchv-gA|jNWmzkU z%ZFa6932H*{r4+{ zFG@9bia%(6VyTi#xBi1}mVd4a2i$gx%zVUkW=~bc=bm-1R=u3LbNlZ6?Vg8b&#YyR z7rDKDiLaFBp@}|>uD?`{S{5+Pu~V>M>QtHJlX=~IY5LnY9dc0;4AW0=waKOXD}^;= zDZCcSU<&s9{N_1*Wz*>c1-(Tkua28R(xz95<2+gbpTrvK>XW5LT z%YI?PYwVKjS4``;g#iJQZh%%qcvI4!fto-JydYi-G)4wtDq<68R}9|?u?B+BH8Xn% z%mKB6%iI9ox{D0Fm$VoBI;3hG2Tq+?_kgX;?<gKRA{_{@I~MPIP~ft13!U>=oZpc3TGl8sT9M8%Lw}DS2DO%r7fh98w zcM4k@IFs}%*g9n9JB+?uiug6~F4q_!$aF|;754SbCVKbMmc_o03aydho;tmX+q13pmw(`=u>A(oXB&I0pfJYaKLha?^U f9^?!Ya94H{FdAIot-%)BK*&) zxCY3p6=?=3rFH^GfGugilS3`wGcY3}?-NIhh&6yJFb%W;>2tJ!TR=6IF~PtC2jJ1T zpUD9FC*vBv6XRJ7JoW&*6EikWWh$desT!~Vtm;a-(QjZtM3$ooTN$n64?Jj=x+!5Z z&@PW9vzAOB+6;UH7RzJlS&P7TQ^IIKL|W*F*cUa#w&sbcLZi58V9{s+`?5B&Ne>KM z$=rzp6X$_>NAOcge8xTyl~QUoupd~TI5@qAfNPeV023l|GjWzAhh+tD2J>D23tUV+ zk0W>myfDDGfU`Z#<;cJ>1N;(jqUX6B8JLa0{~~6^*>?j#4RnDplcma2S*TCkY;By;5uUO|o4`stLZe8$T z4;BfZ%K$JIl)!LFJYX5CfLhV;nGFDk&~Hg$_~&H+7H$AI4m1r*fur6V08Ry!Bntn^ z)_J`#0Gz}Aih0@vyojXUoxTKI4<1I7wkf4frkN|HegLx~(o7tg;?7Uu=5=x&xRC27 z1YC6lACAdP27nR#*j8y1vto@qVw%8@Bd7{+*_O2JPFK)fc1?L)J?ST~K}5RtY;AXV z6aK&h3;-KV37dhH<*{T|)%2mwz*qF4f-h>Kcg(wF+nxRcJS~%`M?De4=?oBCM#phq zLOXFdYa_eo0sP%Oowy3zK)8@z>Hf5jejr`?_2fj&3hN`L-p@Ckji`Z19$jRBwK d!%`ua{sCy@@DB-8Jq7>(002ovPDHLkV1lowZ?ymb literal 0 HcmV?d00001 diff --git a/public/resources/tray/traymacOSUnreadTemplate@4x.png b/public/resources/tray/traymacOSUnreadTemplate@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..4699ac672a1de0d7bb57d28fcc05d2df47bb6c1f GIT binary patch literal 1212 zcmV;t1Vj6YP)aevs#YT@rao#_iNvCW1?fVhk|EehMUcz_4a<@mqhc$; z2D?^TA5kBTSac&oLgKqJg9b%aODAnjXZp7|ujDo6o^$TK=YG7Ie{weWJkLG<|MQ;r zp67g-B<3^DXqrINnD+r#kk`S?Rs**Kmjg?ZGb)BZfvqnI8r0jx^4tNa8)nuI{0J=fn4Jdhm-JlT z_vc;`YXEoQ7e51Rmh@tgm$$kHn3(~e0qZhMrhq#o?JC+v+k3z!vc(?jSeie&f27J&Z==p&C`M`;e?LJ^h zp#c1rkVsSb)mIrhCwLh6E-9UQF)q(J zVTc