From 096cc76e9f88d5bb86a1b3f2c20ac81341139a7b Mon Sep 17 00:00:00 2001 From: AndyTheGiant Date: Thu, 16 Aug 2018 15:58:08 +0200 Subject: [PATCH 01/13] chore: add tray icon resolutions --- electron/img/tray.badge.png | Bin 2049 -> 410 bytes electron/img/tray.badge@1.25x.png | Bin 0 -> 771 bytes electron/img/tray.badge@1.33x.png | Bin 0 -> 832 bytes electron/img/tray.badge@1.4x.png | Bin 0 -> 903 bytes electron/img/tray.badge@1.5x.png | Bin 0 -> 1006 bytes electron/img/tray.badge@1.8x.png | Bin 0 -> 1234 bytes electron/img/tray.badge@2.5x.png | Bin 0 -> 1805 bytes electron/img/tray.badge@2x.png | Bin 0 -> 1246 bytes electron/img/tray.badge@3x.png | Bin 0 -> 2254 bytes electron/img/tray.badge@4x.png | Bin 0 -> 2934 bytes electron/img/tray.badge@5x.png | Bin 0 -> 4150 bytes electron/img/tray.png | Bin 975 -> 277 bytes electron/img/tray@1.25x.png | Bin 0 -> 631 bytes electron/img/tray@1.33x.png | Bin 0 -> 690 bytes electron/img/tray@1.4x.png | Bin 0 -> 782 bytes electron/img/tray@1.5x.png | Bin 0 -> 796 bytes electron/img/tray@1.8x.png | Bin 0 -> 1055 bytes electron/img/tray@2.5x.png | Bin 0 -> 1470 bytes electron/img/tray@2x.png | Bin 0 -> 1113 bytes electron/img/tray@3x.png | Bin 0 -> 1934 bytes electron/img/tray@4x.png | Bin 0 -> 2529 bytes electron/img/tray@5x.png | Bin 0 -> 3315 bytes 22 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 electron/img/tray.badge@1.25x.png create mode 100644 electron/img/tray.badge@1.33x.png create mode 100644 electron/img/tray.badge@1.4x.png create mode 100644 electron/img/tray.badge@1.5x.png create mode 100644 electron/img/tray.badge@1.8x.png create mode 100644 electron/img/tray.badge@2.5x.png create mode 100644 electron/img/tray.badge@2x.png create mode 100644 electron/img/tray.badge@3x.png create mode 100644 electron/img/tray.badge@4x.png create mode 100644 electron/img/tray.badge@5x.png create mode 100644 electron/img/tray@1.25x.png create mode 100644 electron/img/tray@1.33x.png create mode 100644 electron/img/tray@1.4x.png create mode 100644 electron/img/tray@1.5x.png create mode 100644 electron/img/tray@1.8x.png create mode 100644 electron/img/tray@2.5x.png create mode 100644 electron/img/tray@2x.png create mode 100644 electron/img/tray@3x.png create mode 100644 electron/img/tray@4x.png create mode 100644 electron/img/tray@5x.png diff --git a/electron/img/tray.badge.png b/electron/img/tray.badge.png index 24a125a72aa4f97c0e836e5e68fa3b7ef11c19c9..cd8e87d941eab47b423e4f62216f48c8ad7c3067 100644 GIT binary patch literal 410 zcmV;L0cHM)P)Px$R7pfZR5%fhQ$0(>KoH$c0vDs5iUb13mbThj*xSqf0$cxr`3KhKFIWjlYb|PL z;V)27tQ0}+V0~|HjmhNnZs6VQd-IXG&BT}$ZI)$6)3x+=mX6-VgAYo*_Yp7wu7D@t zgh^7Ij{H=CdfNoa4!8%pHf92!sEdU|w@g5VgS!E?$vd`gt^MTK-k6P!E=Lr9aO4Q= z641p=+U1Y8_K{v2brv53dpa2S0ll@+S>QbMAIN|)Ag?$<@D0d;|7;7vbCvK6e!&Uux`8;3 zOi_@%07*qoM6N<$ Ef<*woVE_OC literal 2049 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 KMNUMnLSTaLqk!K4 literal 0 HcmV?d00001 diff --git a/electron/img/tray.badge@1.4x.png b/electron/img/tray.badge@1.4x.png new file mode 100644 index 0000000000000000000000000000000000000000..2f8ff420a16648830767b61a1d8c822f6f289316 GIT binary patch literal 903 zcmV;219<$2P)Px&K}keGR5%fpRZB=4Q53zCiOEbfq*CjmxG6=UXb`lvPzk8eh0qWEt-26O>aGyF zaM99*P_pdGUFjmasI<$jYF!lkP(f5m5E@HRP%2VQ@RN`Eyq-JFolb+M^ufu!_q_Yg zyYt?i3DGG-DP;opfN>xW>;f4e0X*bog$AR)Xc!-hrtuRtS@an(WtuG~N@9@<2m@Qd zNrN{rN~Rep8s2ij@G2*YrZ=s8zAnwFjs*e4Z-GH4U*+E*zkj_{EG#J^Pt}}+ahG@% z(OJZ`M9Y|;E*Fb;YlyOBhb0VAwp?ikvo%Ia)3m(O=u(XwYf379gs4`fqH_jCxFP&q zh|?@zl!?jF(-MT=-QA_-aQ^|F`;H=W^8VMe_w?{ zAvH8Kq++qy7fk2{pAmI-gZSu_Jle32kK%Uqwp&|Uw70is(}_fa1_lNw8jaH2+}u@6 zJg>{-o@ttk`#Fy4OTZB-oz`{tW%ogLfrYzlg?~7>ILR1A)$jC7W~wfi59&?l{QAvX z0e3EUoemGZNLq5^=e%V9r+t9@!QS59Pc%Eb2H!vna*@{n7Yp;N3q!;eiO(_n!U-?7 zGT(ssj+0}a2Y1B}o?w*AWm{N$wjPg%j*pKio6TB2b29JTSajIBkdPEYlH1zaXmxef z-mJB?l@=El37tai?d_H*=kDz6P-A1G9Wy7OLZR>!)hH)Ysg&yJ=}{XS8#X^YJgiz; zTGaOTw#|jZVKq59X~zzYZyKt-0AdYRm&aneva&*vNQAn(yD1O|(89t3zCC_wZf>Tg zrY4%7pSN0YWMsrXzTc;7-PKF0e{#9pYY6kF(!MNCDwRqUkH;yW&r@e-CmDu8$z+l? zH#aF53|hw^Vq#HL+UxaRw1kh2j=1H%0%s+Gt@8<-y!h3HRMtH4`Fvw`$K%HPaPU(| zu9Jn;wpyrqW5nb2_4Px%PQGqrn&xN3_p$hp1sHt8V%g^**6A|`jHA-WRuX>fiiJ2h zIOssq8^l+H6U&=OmCRNAw65zfaIs^OXU#bSr=L!z`IQX={SdT{M?~2I{HOXJ_7%G3 d&ljsA@(WK2XCR1T3b_CP002ovPDHLkV1g=7t~~$% literal 0 HcmV?d00001 diff --git a/electron/img/tray.badge@1.5x.png b/electron/img/tray.badge@1.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..34ea45bb9f9a5a326ff9cbf6bc4f13c05fb7f4f1 GIT binary patch literal 1006 zcmVPx&s7XXYR7ee-R!vA;R}?#h=bNit}b}zVGtx%bOo2G#AdC zbI;Fr&OPtk%ZRjDTI(yIyP(&gKS4#%G3YnYHw@Luo`W4EU7mwfe+}LTwjp-(e$L5$sHD*F!4!WnHWTP##ACW|&P?Z`^BHbZ< zov55h)(L9>eh>RRs2%t|?3*>M@3aFqxV757Ac0@`k1zx}1)lV291(y z1`ObRFtII7Eo%tj_A{f?s?@?(uhLSo)!v7tU0cF|U!ovaIr?o_*-}>WmJ`EKtecif zrJ}dDx1s*9j*pLZCX+D)`HoJdTuja%P1EB~6sL9{UGxF}V*=AxUtt*gY{}}m z=d#?&xD!&V)jC0gVI5^GCkn$Zgs;rj|A|B*Mhb()<8e7TIWcFnUiRCQ*d}CvUX~Y<*xaVx%X-;EV}QU;*d= z#{mQ{f~o|uCu-!h`96z`X#^)`>(cye<#L%Ld<(71pi(}H{I|hLVt)(JEn^g4Boc{# c{E#O09z$8YfyvB%ssI2007*qoM6N<$f)p;|Q2+n{ literal 0 HcmV?d00001 diff --git a/electron/img/tray.badge@1.8x.png b/electron/img/tray.badge@1.8x.png new file mode 100644 index 0000000000000000000000000000000000000000..95bb7d064ce412cfe20a1d7c821c68db6c839c6a GIT binary patch literal 1234 zcmV;@1TFiCP)Px(j7da6R7ef2R$oY)R}{bB_lf!9-!660Rx>A9anK;t^`R8{5ELoZ2VpCd6=WT2 z*+3|iA@;$R=3!5J==L}VfD{LsiG1@Q?({BUvl?5*WC1e z@k<)$4xF5G&-vZ+yZ3(g9%ZZq;hZ->zk!CJ|3EjO3Fu2`1bTtWz-s9V*Y%X!{L3<3 zd(hYLBbM9!MF}*A5ESu4!_W-0kUSEEm6i3DX+BGtF7Bk3+ZEy-PfbB`RChzipy@(P z*?1DRg$iL;kDbWW7#4M(up0fSf+9^APeIS9@dEy1P17!+*q5B~i2@i~xJ)7!ANW&V{r{Q+s|A4TRxmX?;-`1m;6 z+}!M?l%eVOa3ife*pVSHZ*l#7a<(I*p?=H8t_o)m2+=Y;24V4-bo2S63IGpPygE;26JiM^C%m zH}PKM`GnM&tV;7Mxpg|yi*itk#g%8KX$mOWbUIBpH_UF|_89T_kA{n#)|obn@B9Ed zscZVMp&Or+y-ECr#eD?*l-_AeDP-@!oJXE|@(An$L(_sP9`SNKm2VNd3;mu*PpE+R z@O_v&F*P-HufM(Jh^{|fE*Y} zC_vP2g*Xw?cO;<&kxv*^Wu7oHuf`}YMc4Hm9h28&0d)fTRaI3il}bsxDCqTiSu`3I zKH0jux?G+dTr4rq7R(Na2NKg!e1Qm5Lb-^Jjt(|AH<#NL&FJjxWYg2rY!S|Qum*kHJ=0viklS#xup6~`kB*LVYKKEZL%hAcU9`o%zCJ!XJDZy$=c*Q`d5!qcgT+5oCz8qJGFDTeJ{jqg zbrL!iiJ`poC0@-V_5vO3G;EsMAc5Bb5M6|TQnE+lcq!CeAw0zihx#0Pg9s^>+XBe6 z{r&xiu%A()6hRU3?Z}eQf@Lgk{w+K|`tvCyM@l11s@U7xdjj{I$o>yMSj4X&{8}v~ zj#mZ%*asj0@(Eh?`zUH+I;S1l2#L$KQ%O#CcX#(XCf$X4)p#jB7XJe6?gj||aKaZP zB`^r9cXoDe;xb&t&?mna*=#=l8`3-cxwf|UKCHMj0+{zxlvKrTZ*PB$aR(OgAsWgt wET|IW*YIQLHtXf(<@43m)rSvXo#^2I2f|nl0=f?N0000007*qoM6N<$f+ZYZXaE2J literal 0 HcmV?d00001 diff --git a/electron/img/tray.badge@2.5x.png b/electron/img/tray.badge@2.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..e5884ef5c93d90c606350a4f7b5c570a1bfd2419 GIT binary patch literal 1805 zcmV+o2lDudP)Px*$4Nv%R9FeUSWRqHRTRE&W}KfgZ7G?X4jDm5u z&w9nKq>eUP;nlQZ`y&9RpO{_w%Dw0@QP z;z+-q)gTh_wk~$&q>nM9BoZ%TCQ4l%l7oS@X$@lbcEZaw_ox&%3AFY;QX;LqsRq$p z5Xnw~7d>KIGcOoj>xG%LIZ9D6`=hA_5%?+ixl$73!M;qN6^o5p%K9S@F0Tu*mraA1 zy=ov2=0z9boSU0dWYC)e$L%;Hda2TFS!ZMhKSnTbu_MjT&#Q1atm5&7rR4-Vdi1EO zsHia9*4DNLgMN)TS7qf1Y&oM&G5KtkrFwA(`V0oi^1fR~Mn#(BHU(saK13ljZTTR{?meuERd)~J0-~W#|-eMk^@)C;V^>Yc7 zm6fG1)M*2qKtpd(VUzBP%9mWqI-L37AiGwUbq)6SJ<-@UD-z*RO(Av-Uv>4octXVd zy(sjFnaOZ?8rNTvaW2GJ&K z*5MWek@oNa@!_!hL>HOq&&)tvCPrfIl9(J6=QhJ> zE+-&YLP;hVN)l&58X(4riIaH2(nb=yUD`3w$GOdnNn(3YrY_flwI^M&WQm%do=z2v zL?Vhdi7^U(GH)w$&?Y%E@wgsy!I^4MfFdP$*|KG(#`ySnT0+5X+_+H<4i2hBB4OUe z)Yq?HpDHXkCSeZJ^5x4@0}{W39ODcQh=YODGbs=VsI_a?s-B)6;}X2c&6_u?nVA{Y z)zziWo;|B(XJ^%>O`B3!$wz!|Z?DPa_xrO3Ao)ZhZh)ZGI0WcIeDdT;?Q*&Fl`B^? zPApm6($boYkzIyxNvnLV&KGdMVI(TS0pKuWtVzNV%oU0YkL zuV24z{DPw#9v;?Suh%qi`}XZr9*Mni{PpV?^av4ZdH5t?o}H$Y*3+4NR5t;s?(=WD>SIe%gfcSUAxr2efv~R zO^sP|H*elF{`&fQvjmt6^$d$nDNk@xF07{{pc-9I#bPmywWKNSI&H$yXjHeix9hsP zI&-W-yk5C-rA9;g&Ye4YVq!ucIB>ws7JX#S-0|bbHJ!S7I~4Y#&i@RX@rEJg(3@EiRBvf#f9EPw%}8j~C%#Yaghfd4TV z489BO!YGqT%r=wMjUWKDhYK9CS&G;(qSMD2q;w)SL=x$wCu7;%9_VS!5ubL8X&?a@ zOOB=$msvr?kfbnWG0edbN0}TLbGIgI#Z1zSALpUlKvPpw`~&k8__03Sn1nERKQ{KX zHD@br)PfBXh30~jlau^w1v@`KdO}!N vq2%oHUoD<9$8bFW?p?Zc>7VxaV)g$44quFLDu8nH00000NkvXXu0mjfK2~y5 literal 0 HcmV?d00001 diff --git a/electron/img/tray.badge@2x.png b/electron/img/tray.badge@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..de63306a722a46f3f6389d4f190c599a5d7164b1 GIT binary patch literal 1246 zcmV<41R?v0P)Px(m`OxIR9FeES4&G|M-)E&u)7_f5J6)ix(E>+R7BFzoq@)IEE0mu#<+A7h?^{C z6VibRQOP2kWbzN%Fd!xbA`J?LSxuOw!+_vpljwjE(Q(v%R=%(7({uZJ`!SsyIDM+l z`RbhSR@JRrEmETxV?xk7&=r;5P^c4COnuJC*ow;>uG}{>Y8TxlN5>8o*KK+WR z$s%bN^d~3_Rg#BHXeK9vxk%(|6isI$VdGZ%88>(D1}YLjr7-k9^t@8lLX0!f$%IVq zF6z}Mj(8t`+=66X@cjZEcgM=~ANYK}&pExheC|&p(ohChbfa)4;19eXEP4tJ6dy+O zcj(*hScU$tjO9%JUMVS$!yhrG!`fPZfG-ljm@lEVuDQF!8`k0TT@!If%k_b`1PW9CMLApz{@Vr2qZ+VI z$RnMBIJ`~HNVRr0o0a9|Wl1CwlFQ{jCO+Wvf5+WjZ7k#VEdUB*5dO_O{s`rsp*$r4?O2cV=RXiIAYk_ob5xMil5YWkg5!~-uGi6J-BZcFVzsT~ z)vwkaXCGJ}x9bhZBn+9>b012v&jg86b>Z+`)tjOr-Xwk26j^WsFIBauk4X0&o$z(Ej(&@A*r%Ovq z_Ov@cKQF;-Y;2gOrY5UvYil-!T-IX7%*e=ySzKH+>hsFa+GHL=?o1UH?)7jZ+c6N4(_`SV7Gc`43qS2_~Sk2?i&04I<+Ci*&8taw7 zbbQ8X=M*}Hdmx!iN<1Ey!NEc4=;*Nf;rRGi=I7_7xw%;;CMKl4z1{8=y!SFUHzx}V z3w94U^J%+a6AcXwX?r7rqYDgoU`xJ;1Ufe*zkpj?TY|G+`uqFs`jRZ3Mz*)N1vzAB zXh=e#kn61ODm;`hRpd9_SnFA6@}o-HH(mgTx=O_1=oA zQY8T_>0`XolX&`62?2Jn)4LFO0$@G&!m0$2`!D2v5Bui1f{RO_4v?_da*`lp3@UC+ zZPQY!#Wg1_i^F_~;#(ztXGhzd2^<*qkBJu1Se^DUrv4M>lWU$EGoS$!4xgQ!@utkn zs(m|@46T=V%+O2tzHe=9{T9})xqDn$0t)18;Ps26=%+~1sw6aC#-0J22m}K6y`I`R zrYZpiqi_f_@&W8e@C`z{u}s}4M92XZ?Pt*6@Wh+2X$GpvzrDL~ek+YZLjV8(07*qo IM6N<$f@ObJlK=n! literal 0 HcmV?d00001 diff --git a/electron/img/tray.badge@3x.png b/electron/img/tray.badge@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6feaed7a1e167f204b252ebbb4f0c4265162ec0b GIT binary patch literal 2254 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 giuv71JB5P(00*%B+6OcknE(I)07*qoM6N<$f literal 0 HcmV?d00001 diff --git a/electron/img/tray.badge@5x.png b/electron/img/tray.badge@5x.png new file mode 100644 index 0000000000000000000000000000000000000000..ed55bd74f39457627c7773347ae15b96f9af9f4a GIT binary patch literal 4150 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 A#{d8T literal 0 HcmV?d00001 diff --git a/electron/img/tray.png b/electron/img/tray.png index 8b1cb550d78ba66838fdfbf6c703abc620a9157c..23d1b76f1afcf330ae5ca17a7fc285757e590d65 100644 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|&U?BzhFA!$ z4Zh8L$bhG3R^Ea5Df8bQFc7_+(wEaX#g8%jL*o&KnpW%W0l^uoMRevSS?}|n({A{G z%ba4?Ee8a5Fnmu;Ia6c0TTV^-0gsO4^V$4@YK^ajg3oTu6LCC{yMFDOACETe%V+1S zzMZ5Sz3`Od_a}2E7vzO(J+$~hoT_)s!@z{_LqQ;(FPQgWN#wPt$w5YjZo${L_Vmo0 zA94Qh$NhJmu9x1d*5^>%Q}aw+ZF|CmKW}9Vq6KdL6PjPktCX$(>34j9($W1N8CRdZ Wx4`?&tjR#HF?hQAxvXy$eq6;@{LOezj+8TF!D`H~kGwZ}DyFXG>b6zbE25_SoaN z>0~)(8Khgaq`k%clI44Z8{9xRE_v>ArFt3cCIrJOuW(ed>~RNx&)6+_4w33-7$)0^ z-;7|J2LL>v-ITzmEp)J+8-Ybf7*y<5n>nOrN4%gDs5njtnghOP1HU zM@-B;UMqR-(lS?R;4~g%VH6P&6A>Gow0F6gYez)f<~k7(*SS^df0NzP_!NwUfz}a= z_=qk3Em$6MiNE-h7C)efPzGbR_z+bQLu&>?2TQSt-x0npSe|j2Yh2?JPv^D>#Wx7Q z@{r5C#NUN+X&jX-*CKSa9S{W4`25_7Se|G&dp-J>PJ4Z~}q~f{-b{@;1*1+OqJ zz0rUm+cHJy$8LaMfdHSt=zKdxy*eM?F~utkOe~qbu3f}zF?CFmUmq6_*J$q?oY&8iMQfPx%F-b&0R5%f(RlkcGQ4pRLe>OSXHnA1EK>iO!5ls`YOC?+{q)KIZDX+dlF9`WdS{P zx%W@|a6$m*@xMlmkU7nanZtU$mS(eQ9%Z#!Nuf}Xd_J$fNi-S_Ava*uC{geu5HktS z^Q7DDnnxK729nKYC6~*oZxX#;Psj}zHOgUpybT1OxM)K{+K34K7wjD?ym^82n)D4T zJejG0>$Se&Q3T%{VTFtRelG-*kw`=~n~nO1!$EA@mg#gVlgUJq$)qqw9{JH|^u+Vy z3kr@&2$II*u{e&Sv2;4Eht%nGB$LT#Y(AgMY&KIt^8)Tig$@OIM?90@TCdloTCGaI z-eg+p=6P_1c8PVSP>{ z5_%_7DgFrkwOB0n3l)B_7=lo7x7*!sw_DqY`f(jJV>Ax^Tpn|u;)S1)Z?QTOTL?U0 zb-5vUNanB@501t7xTCJWw?(bfwSm|zH{paop?#Z48e^9Xr#uB%$gSaM%jSVA1o+GI z#dX~bMsWH{203Wa!z_mo`U+@eCjUgx7v(5Q5H6#&6rg_rXm0^H5V`ml@Ef?fk;!?r R%}oFR002ovPDHLkV1hHn87lw) literal 0 HcmV?d00001 diff --git a/electron/img/tray@1.33x.png b/electron/img/tray@1.33x.png new file mode 100644 index 0000000000000000000000000000000000000000..efacc0211fcf9fd0f832b0c533e3c1e119dc2b61 GIT binary patch literal 690 zcmV;j0!{siP)Px%Y)M2xR5%f}mCtJ$K@`WI>xxDiDoCJ$!H~beOG$h2QW1X;5emI{Du__X&0K`^ z5a^{)=-Hcx(%vL@4=o1wsKG-ILCD2e=?|aM@G-?w#^U2P3Q`rx}W^WK}!yxE;m z2mQlzUEf3KIrIeDhVDTsbOT*L?;H-tIojI|upQ_FbPcVuK7tB#u$GF1N6;m-iG4xx z@n69RFtD=;&64{Q{Zktl4&L&n6m2ApGYM1@px?WVQ?;i%;#{e z4F&@Whr{Icde`PHg1ZdmgMF8_^*^9q86}S9^SMzet{uN)n}m;ZIL0me*hH?F&pyO7 zuJpzl4-R5AhSbeb}m4241= z)7NM;$mjDJmGc5ZsPr3epMPzhp$Z?vd288hmh$;L6^liRL?YDfc4;^q8WXG4Dz)2f zs#GdeE|-l(xI8wV3;Sd|0aH{}eas%K)$4V_`7|m_CX>`^wMbDE3I>A|kH^XFb{n9@ zwt0L7@IwJTK>23?Kj76wlISlgu&%e#mu2~v%jJ5D+><|_5h(y2PbQNS+>rY#Gj4I< zW6eDtPZeniKy`knhGFmq;BB-oMx)V=@ULr;OI#s<{11>}Am^Kvipc;U;#IuXG;JT1 zyM=$bl_ZI;?G@Vhh`kg*&Rc=96JXxK5!$C%V0Sv5ZlTW?UqfXoK;NN{7{3DS2U?r` Y2BS-}4qWO%z5oCK07*qoM6N<$f)}SkApigX literal 0 HcmV?d00001 diff --git a/electron/img/tray@1.4x.png b/electron/img/tray@1.4x.png new file mode 100644 index 0000000000000000000000000000000000000000..610e44c7b8a62c56fc45285893a4e89898f9da81 GIT binary patch literal 782 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 literal 0 HcmV?d00001 diff --git a/electron/img/tray@2x.png b/electron/img/tray@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c1abc3e6afc478d5ac25d279682afaf5f4f0b2c0 GIT binary patch literal 1113 zcmV-f1g86mP)Px(6G=otR9FecSG`Y~K^Q-f4=o|efDD9aQjI!*H73UH#KaCRZic_W!KB?~&_UzS z&hFL8ICNlvy;BoYmYRr8##jbOipcl%_dB^a?+Y)fsMIIU-#Ve-W?9{NRm>z zAsPqPfOkL`2m+)$a1ERR-++w6;i#j1KEZJaI0Wv1BG3eS5$7mFS?YwI908O)z%Eb% zDnP$P9qQ7Cr>{Vuz*YYMxRU1*ZP3=^vH`&ua0}Fcmm=Dt&1h#P9A*Xt80Al3+{}N$ z{%_cdp+Il7O{ea_Irk|A1T=2|Ep4aTzLa?*0F1VQS%9D0poq5VgT550Eoi4c2ad1J zA9QmE2XDC*Is-dkxcc$hXf(v}@v%5MIuh*nN%TdZLSXf7!1i-16bf>EeOOc;)}K&4Vqx}&3`nq}8s zvj+H#LXZzD&@H8hhlj=7+?+_K)5-w@)L2|x6sM=B;^gE+EG#S-d_7Mc>UzCil^xnO zgFb;XDz0LpSgX~f9rpM4)oE8Ml`Qj_Oh)>AK7~{&rRM7Ox@wUzIX^!y_xARr=5^Yp zPx@v6>L{i_wOUmM*lN(&^768b$Kx`W%Na6Azl=m8G878Qi;D|G{_^rtuB@!crKKfF zU2Vr~o4!B~M=?{4!6A-LY+FUzp;#=+t*tGIbjolzET^WXWFQcb$z)O<9304CFes;| zr`4Rt z-R?S&g`f8bpvLtW0dRl_)uR+!F^+vA>&0kjXo#!tdX!oMpf>~&Lz70O2CyA&^TDM1 zY}>My8tI%@Lij;V)PVxJamX+O26Y9%nRX^pD7xAE`}-%?1OwupqiBD@><5gE=eUl* zHh^{ztch&|^AR=SLN>fS$@D6<0duS8czolNtzy3$;C+G2E?TwcW_k8|2A~Do+1Npw z0P5HpKQiM)-?)J2kj}Bv7E=8OV;1pOAPIigslm f^m(cE{rCJYKn=nx+*g@|00000NkvXXu0mjf3*i!V literal 0 HcmV?d00001 diff --git a/electron/img/tray@3x.png b/electron/img/tray@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..67916c7b26acbda6a2138b0a2bc6fe97175d0360 GIT binary patch literal 1934 zcmV;92XXj`P)Px+NJ&INRA>d&noVdGNf5_7FNvB&P$9aYtYDBBL?xPoD8iD%;zbcr@M2JjZ1AXf zSkQ>Dd)R~Q!IPf63KZ@(cHR5XV8u3aoG$&_v{LgSb-+Q3i`e=9^d>3X+5z?G`gLU`!|}A!Wu}@E`G7aXPVNz!z?CKlF*KR7%5O34xx|^>-;9HeVBg z7mQ%_zWeGBw7ZCE4?v;VzTfgP@M zN`M{VtkmD%A2l~OM-Lu6n9;ViwKd9QG6^eCbo=)08OPkef8YCl{rdHcc0uP!4?a$S zZLRGL1Dot-Pfrio`#{+}*;h3+HPOzUJENB`UwW>st&OUytFw(#R~If^@V=itdzR|S zc?s55uxHfZV`RU$1VtgJySv*RIB>vi+_=&6!Gi~#lAqDFR%yomR3}*XgPog#FDa5J zD5-=Je_=aOetyG$1rnuR%;V`>BQV#K0N=3RD%FqxAK;(X``byyW9Mh-KBx;nIcrG3 zjy?+Se(^o7oY$jMk1Y=gY3&drkHTDfv!O4vvGzP4q2|s@65vRqAY~MSr)}5yBnWc# zg*r=Mn#?i!u${KEezP%Ydb2mZN$a<3!(xEZr*s3{13gks zio9Qw=FB96%gUzScNQR&w2e1!-t1nyc#&K`fBxK6RaJTaHpcv#w7AQcFZXu*m<|au z)+Cr^(nA8><}{RH8)wkEb?f{Lbar+oD`0k07E`~wcI|SH9z9A_U0q!c-AsV+$s3y( z_%y#J6K8QF)_0RYyRtzh1I(_g(sHli~dwcWxKXc}c_la-AV7^S69tl=3gPmkZ z!f&V3fIocr;2k2ZJv1~F?bxxy2fTUnW>&x1A+KDy;%#t$`SN8yKI}JtS|M+@ZQHg8 z-(WC1Ya1>bBfOus(>{Z#lZX;^_~o;khCZuX+VoRK0`6<|*s){o?Afz!aFFBwPxS8H zJExDIMDga$8($`gLXF|!VR!!gd3WT<5m#AR>3!mx7)I7MT&9=g>Dk7$FG3mc80{6< zaxGc1F{efuY_-Y&BYmv6hK2^$(b3^}a_FPQscc+dU!T)Qi3ix&*yvWTUhS@4z3NI! zOPxMyJXjKZ{P?lcj5_X@mX;Q`Y15|kBQl9?i4a?U_|i*0DHE_Vx~TqNv|L%UZh-U2 zd-v|STeohxCr_TZ_wV1kEnBuYm4iEV>Xh5Mb*l$Kve&O)cTb-_^*1+<s zy2FPLC$49jFf)oDv(2*o6+d?IpXxILtHyDGQwYEP$y)G zAtCxr$F;Q=+K-Q1gg=!X=c9j%ck7zAr>q3f2$VnERVh`Hgn^>Z+Q@~_YzgP{xnjkN z2~B>^!`+-n6v!X1>xEG|Iy%b9h4=lr3FHGflU_4V-RC`C&v~;7C}niIxVSij1AvF% zNoXz%FiSpc=NlW^(ALZY9*n1BOsKOcX98GgK#N2J*~j(g2Zk>;uLyn&Y(9W#Jwt5_ z?a((dHG#~0LyQHJX_T{sLMsKJoH&=SR5=xokB^7l1#j~vUgCa$iW&H7^nvKjTP<**BeL+m{Swt1kXR1o*7K#xN#Lc}plXj2*EOO$yMb z-K8rpFXxpWn$6m_5<$Ww0I6IeeBxV|O=2FEvw~;roK^rsBL(G+eNOUc1*wo6*PFXU zdnm`M07`mqZfzulo;GE|-bj1@ap~AZ4oUtdliwx%A1?fWIsD8!0rRP#Yyc0%%;7NK z75vKpvzxJ5#-5dm*`8=D-H7-PF{Rli;8SP)x|k0wIDs&TK=Wb2A#uHUN&nsEf0Ol) U33UXv$p8QV07*qoM6N<$f~qaK1ONa4 literal 0 HcmV?d00001 diff --git a/electron/img/tray@4x.png b/electron/img/tray@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..29b130f71726e24078a89563c02ac8da3410838f GIT binary patch literal 2529 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 literal 0 HcmV?d00001 From 4924f5ab4ff348552deffe132bdb595d685f3a0c Mon Sep 17 00:00:00 2001 From: Benny Neugebauer Date: Fri, 17 Aug 2018 10:59:34 +0200 Subject: [PATCH 02/13] Replaced ICO with PNG on Windows --- electron/img/tray.badge.ico | Bin 19566 -> 0 bytes electron/img/tray.ico | Bin 19566 -> 0 bytes electron/js/menu/TrayIconHandler.js | 8 ++------ 3 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 electron/img/tray.badge.ico delete mode 100644 electron/img/tray.ico diff --git a/electron/img/tray.badge.ico b/electron/img/tray.badge.ico deleted file mode 100644 index 7882e9c3750dc07d39f44b27530623eb93cc7b0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19566 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 YVZE+&R||BtKvxTNwLn)3RMP_g2BRr3;s5{u diff --git a/electron/img/tray.ico b/electron/img/tray.ico deleted file mode 100644 index c5ad8fa29074877f824e78089cec4af5ab25fdbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19566 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 Date: Fri, 17 Aug 2018 11:56:00 +0200 Subject: [PATCH 03/13] TrayIconHandler -> TrayHandler --- .../{TrayIconHandler.js => TrayHandler.js} | 4 ++-- electron/main.js | 4 ++-- tests/main/TrayIconHandlerTest.js | 18 +++++++++--------- 3 files changed, 13 insertions(+), 13 deletions(-) rename electron/js/menu/{TrayIconHandler.js => TrayHandler.js} (97%) diff --git a/electron/js/menu/TrayIconHandler.js b/electron/js/menu/TrayHandler.js similarity index 97% rename from electron/js/menu/TrayIconHandler.js rename to electron/js/menu/TrayHandler.js index 382d887765..d5b250557d 100644 --- a/electron/js/menu/TrayIconHandler.js +++ b/electron/js/menu/TrayHandler.js @@ -22,7 +22,7 @@ function buildTrayMenu() { this.appIcon.setToolTip(config.NAME); } -class TrayIconHandler { +class TrayHandler { constructor(platform, appIcon = new Tray(nativeImage.createEmpty())) { this.lastUnreadCount = 0; this.platform = platform; @@ -74,4 +74,4 @@ class TrayIconHandler { } } -module.exports = TrayIconHandler; +module.exports = TrayHandler; diff --git a/electron/main.js b/electron/main.js index 39b2e1f640..7e6747f332 100644 --- a/electron/main.js +++ b/electron/main.js @@ -54,7 +54,7 @@ const locale = require('./locale/locale'); const systemMenu = require('./js/menu/system'); const util = require('./js/util'); const windowManager = require('./js/window-manager'); -const TrayIconHandler = require('./js/menu/TrayIconHandler'); +const TrayHandler = require('./js/menu/TrayHandler'); const EVENT_TYPE = require('./js/lib/eventType'); // Config @@ -259,7 +259,7 @@ const handleAppEvents = () => { appMenu.on(EVENT_TYPE.ABOUT.SHOW, () => about.showWindow()); Menu.setApplicationMenu(appMenu); - tray = new TrayIconHandler(environment.platform); + tray = new TrayHandler(environment.platform); showMainWindow(); }); }; diff --git a/tests/main/TrayIconHandlerTest.js b/tests/main/TrayIconHandlerTest.js index 54b75fd14d..e03d29f820 100644 --- a/tests/main/TrayIconHandlerTest.js +++ b/tests/main/TrayIconHandlerTest.js @@ -23,7 +23,7 @@ const {app} = require('electron'); const assert = require('assert'); const path = require('path'); const sinon = require('sinon'); -const TrayIconHandler = require('../../electron/js/menu/TrayIconHandler'); +const TrayHandler = require('../../electron/js/menu/TrayHandler'); const {BrowserWindow} = require('electron'); describe('TrayIconHandler', () => { @@ -36,7 +36,7 @@ describe('TrayIconHandler', () => { describe('"constructor"', () => { it('creates native images for all tray icons on instantiation', () => { - const tray = new TrayIconHandler({IS_MAC_OS: false, IS_WINDOWS: true}, TrayMock); + const tray = new TrayHandler({IS_MAC_OS: false, IS_WINDOWS: true}, TrayMock); assert.equal(Object.keys(tray.icons).length, 3); assert.equal(tray.icons.badge.constructor.name, 'NativeImage'); assert.equal(tray.icons.tray.constructor.name, 'NativeImage'); @@ -44,17 +44,17 @@ describe('TrayIconHandler', () => { }); it('creates a tray icon on Linux', () => { - const tray = new TrayIconHandler({IS_LINUX: true}, TrayMock); + const tray = new TrayHandler({IS_LINUX: true}, TrayMock); sinon.assert.match(tray.appIcon, sinon.match.defined); }); it('creates a tray icon on Window', () => { - const tray = new TrayIconHandler({IS_WINDOWS: true}, TrayMock); + const tray = new TrayHandler({IS_WINDOWS: true}, TrayMock); sinon.assert.match(tray.appIcon, sinon.match.defined); }); it('does not create a tray icon on macOS', () => { - const tray = new TrayIconHandler({IS_MAC_OS: true}, TrayMock); + const tray = new TrayHandler({IS_MAC_OS: true}, TrayMock); sinon.assert.match(tray.appIcon, sinon.match.typeOf('undefined')); }); }); @@ -62,7 +62,7 @@ describe('TrayIconHandler', () => { describe('"updateBadgeIcon"', () => { describe('"Mac"', () => { it('updates the badge counter and stops flashing the app frame when app is in focus while receiving new messages', done => { - const tray = new TrayIconHandler({IS_MAC: true}, TrayMock); + const tray = new TrayHandler({IS_MAC: true}, TrayMock); const appWindow = new BrowserWindow(); sinon.spy(app, 'setBadgeCount'); @@ -85,7 +85,7 @@ describe('TrayIconHandler', () => { describe('"Windows"', () => { it('updates the badge counter and stops flashing the app frame when app is in focus while receiving new messages', done => { - const tray = new TrayIconHandler({IS_WINDOWS: true}, TrayMock); + const tray = new TrayHandler({IS_WINDOWS: true}, TrayMock); const appWindow = new BrowserWindow(); sinon.spy(appWindow, 'flashFrame'); @@ -103,7 +103,7 @@ describe('TrayIconHandler', () => { }); it('flashes the app frame when app is not in focus and you receive new messages', done => { - const tray = new TrayIconHandler({IS_WINDOWS: true}, TrayMock); + const tray = new TrayHandler({IS_WINDOWS: true}, TrayMock); const appWindow = new BrowserWindow({ show: false, @@ -124,7 +124,7 @@ describe('TrayIconHandler', () => { }); it('does change the flash state if the window has already been flashed', done => { - const tray = new TrayIconHandler({IS_WINDOWS: true}, TrayMock); + const tray = new TrayHandler({IS_WINDOWS: true}, TrayMock); tray.lastUnreadCount = 5; const appWindow = new BrowserWindow({ From 13756b7de82557616c3637aaa09753e55f465bdb Mon Sep 17 00:00:00 2001 From: Benny Neugebauer Date: Fri, 17 Aug 2018 12:02:59 +0200 Subject: [PATCH 04/13] Don't create a new Tray on Mac --- electron/js/menu/TrayHandler.js | 14 ++++++------ electron/main.js | 3 +++ ...yIconHandlerTest.js => TrayHandlerTest.js} | 22 ++++++++++++------- 3 files changed, 24 insertions(+), 15 deletions(-) rename tests/main/{TrayIconHandlerTest.js => TrayHandlerTest.js} (89%) diff --git a/electron/js/menu/TrayHandler.js b/electron/js/menu/TrayHandler.js index d5b250557d..d592b9c47c 100644 --- a/electron/js/menu/TrayHandler.js +++ b/electron/js/menu/TrayHandler.js @@ -23,7 +23,7 @@ function buildTrayMenu() { } class TrayHandler { - constructor(platform, appIcon = new Tray(nativeImage.createEmpty())) { + constructor(platform) { this.lastUnreadCount = 0; this.platform = platform; @@ -40,18 +40,18 @@ class TrayHandler { tray: nativeImage.createFromPath(iconPaths.tray), trayWithBadge: nativeImage.createFromPath(iconPaths.trayWithBadge), }; - - if (!platform.IS_MAC_OS) { - this.appIcon = appIcon; - this.appIcon.setImage(this.icons.tray); - buildTrayMenu.call(this); - } } get hasOverlaySupport() { return this.platform.IS_WINDOWS; } + initIcon(appIcon = new Tray(nativeImage.createEmpty())) { + this.appIcon = appIcon; + this.appIcon.setImage(this.icons.tray); + buildTrayMenu.call(this); + } + updateBadgeIcon(win, count) { if (this.appIcon) { const trayImage = count ? this.icons.trayWithBadge : this.icons.tray; diff --git a/electron/main.js b/electron/main.js index 7e6747f332..003776fa16 100644 --- a/electron/main.js +++ b/electron/main.js @@ -260,6 +260,9 @@ const handleAppEvents = () => { Menu.setApplicationMenu(appMenu); tray = new TrayHandler(environment.platform); + if (!environment.platform.IS_MAC_OS) { + tray.initIcon(); + } showMainWindow(); }); }; diff --git a/tests/main/TrayIconHandlerTest.js b/tests/main/TrayHandlerTest.js similarity index 89% rename from tests/main/TrayIconHandlerTest.js rename to tests/main/TrayHandlerTest.js index e03d29f820..8833f27458 100644 --- a/tests/main/TrayIconHandlerTest.js +++ b/tests/main/TrayHandlerTest.js @@ -36,7 +36,8 @@ describe('TrayIconHandler', () => { describe('"constructor"', () => { it('creates native images for all tray icons on instantiation', () => { - const tray = new TrayHandler({IS_MAC_OS: false, IS_WINDOWS: true}, TrayMock); + const tray = new TrayHandler({IS_MAC_OS: false, IS_WINDOWS: true}); + tray.initIcon(TrayMock); assert.equal(Object.keys(tray.icons).length, 3); assert.equal(tray.icons.badge.constructor.name, 'NativeImage'); assert.equal(tray.icons.tray.constructor.name, 'NativeImage'); @@ -44,17 +45,19 @@ describe('TrayIconHandler', () => { }); it('creates a tray icon on Linux', () => { - const tray = new TrayHandler({IS_LINUX: true}, TrayMock); + const tray = new TrayHandler({IS_LINUX: true}); + tray.initIcon(TrayMock); sinon.assert.match(tray.appIcon, sinon.match.defined); }); it('creates a tray icon on Window', () => { - const tray = new TrayHandler({IS_WINDOWS: true}, TrayMock); + const tray = new TrayHandler({IS_WINDOWS: true}); + tray.initIcon(TrayMock); sinon.assert.match(tray.appIcon, sinon.match.defined); }); it('does not create a tray icon on macOS', () => { - const tray = new TrayHandler({IS_MAC_OS: true}, TrayMock); + const tray = new TrayHandler({IS_MAC_OS: true}); sinon.assert.match(tray.appIcon, sinon.match.typeOf('undefined')); }); }); @@ -62,7 +65,7 @@ describe('TrayIconHandler', () => { describe('"updateBadgeIcon"', () => { describe('"Mac"', () => { it('updates the badge counter and stops flashing the app frame when app is in focus while receiving new messages', done => { - const tray = new TrayHandler({IS_MAC: true}, TrayMock); + const tray = new TrayHandler({IS_MAC: true}); const appWindow = new BrowserWindow(); sinon.spy(app, 'setBadgeCount'); @@ -85,7 +88,8 @@ describe('TrayIconHandler', () => { describe('"Windows"', () => { it('updates the badge counter and stops flashing the app frame when app is in focus while receiving new messages', done => { - const tray = new TrayHandler({IS_WINDOWS: true}, TrayMock); + const tray = new TrayHandler({IS_WINDOWS: true}); + tray.initIcon(TrayMock); const appWindow = new BrowserWindow(); sinon.spy(appWindow, 'flashFrame'); @@ -103,7 +107,8 @@ describe('TrayIconHandler', () => { }); it('flashes the app frame when app is not in focus and you receive new messages', done => { - const tray = new TrayHandler({IS_WINDOWS: true}, TrayMock); + const tray = new TrayHandler({IS_WINDOWS: true}); + tray.initIcon(TrayMock); const appWindow = new BrowserWindow({ show: false, @@ -124,7 +129,8 @@ describe('TrayIconHandler', () => { }); it('does change the flash state if the window has already been flashed', done => { - const tray = new TrayHandler({IS_WINDOWS: true}, TrayMock); + const tray = new TrayHandler({IS_WINDOWS: true}); + tray.initIcon(); tray.lastUnreadCount = 5; const appWindow = new BrowserWindow({ From 2a08e6b9745a032aa463bb838cfdd5822a698000 Mon Sep 17 00:00:00 2001 From: Benny Neugebauer Date: Fri, 17 Aug 2018 12:03:08 +0200 Subject: [PATCH 05/13] Don't create a new Tray on Mac From c2c97364df43d5ed2706f528ef37e34050d63503 Mon Sep 17 00:00:00 2001 From: Benny Neugebauer Date: Fri, 17 Aug 2018 12:09:17 +0200 Subject: [PATCH 06/13] Remove dependency to platform --- electron/js/menu/TrayHandler.js | 11 +++++------ electron/main.js | 2 +- tests/main/TrayHandlerTest.js | 29 +++++++++++++++-------------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/electron/js/menu/TrayHandler.js b/electron/js/menu/TrayHandler.js index d592b9c47c..f0976baf04 100644 --- a/electron/js/menu/TrayHandler.js +++ b/electron/js/menu/TrayHandler.js @@ -23,9 +23,9 @@ function buildTrayMenu() { } class TrayHandler { - constructor(platform) { + constructor() { + this.hasOverlaySupport = false; this.lastUnreadCount = 0; - this.platform = platform; const TRAY_ICON_IMAGE_ROOT = path.join(app.getAppPath(), 'img'); @@ -42,13 +42,12 @@ class TrayHandler { }; } - get hasOverlaySupport() { - return this.platform.IS_WINDOWS; - } + initIcon(hasOverlaySupport, appIcon = new Tray(nativeImage.createEmpty())) { + this.hasOverlaySupport = hasOverlaySupport; - initIcon(appIcon = new Tray(nativeImage.createEmpty())) { this.appIcon = appIcon; this.appIcon.setImage(this.icons.tray); + buildTrayMenu.call(this); } diff --git a/electron/main.js b/electron/main.js index 003776fa16..1933197d45 100644 --- a/electron/main.js +++ b/electron/main.js @@ -261,7 +261,7 @@ const handleAppEvents = () => { Menu.setApplicationMenu(appMenu); tray = new TrayHandler(environment.platform); if (!environment.platform.IS_MAC_OS) { - tray.initIcon(); + tray.initIcon(environment.platform.IS_WINDOWS); } showMainWindow(); }); diff --git a/tests/main/TrayHandlerTest.js b/tests/main/TrayHandlerTest.js index 8833f27458..4dae3cb965 100644 --- a/tests/main/TrayHandlerTest.js +++ b/tests/main/TrayHandlerTest.js @@ -36,8 +36,8 @@ describe('TrayIconHandler', () => { describe('"constructor"', () => { it('creates native images for all tray icons on instantiation', () => { - const tray = new TrayHandler({IS_MAC_OS: false, IS_WINDOWS: true}); - tray.initIcon(TrayMock); + const tray = new TrayHandler(); + tray.initIcon(true, TrayMock); assert.equal(Object.keys(tray.icons).length, 3); assert.equal(tray.icons.badge.constructor.name, 'NativeImage'); assert.equal(tray.icons.tray.constructor.name, 'NativeImage'); @@ -45,19 +45,19 @@ describe('TrayIconHandler', () => { }); it('creates a tray icon on Linux', () => { - const tray = new TrayHandler({IS_LINUX: true}); - tray.initIcon(TrayMock); + const tray = new TrayHandler(); + tray.initIcon(true, TrayMock); sinon.assert.match(tray.appIcon, sinon.match.defined); }); it('creates a tray icon on Window', () => { - const tray = new TrayHandler({IS_WINDOWS: true}); - tray.initIcon(TrayMock); + const tray = new TrayHandler(); + tray.initIcon(true, TrayMock); sinon.assert.match(tray.appIcon, sinon.match.defined); }); it('does not create a tray icon on macOS', () => { - const tray = new TrayHandler({IS_MAC_OS: true}); + const tray = new TrayHandler(); sinon.assert.match(tray.appIcon, sinon.match.typeOf('undefined')); }); }); @@ -65,7 +65,8 @@ describe('TrayIconHandler', () => { describe('"updateBadgeIcon"', () => { describe('"Mac"', () => { it('updates the badge counter and stops flashing the app frame when app is in focus while receiving new messages', done => { - const tray = new TrayHandler({IS_MAC: true}); + const tray = new TrayHandler(); + tray.initIcon(true, TrayMock); const appWindow = new BrowserWindow(); sinon.spy(app, 'setBadgeCount'); @@ -88,8 +89,8 @@ describe('TrayIconHandler', () => { describe('"Windows"', () => { it('updates the badge counter and stops flashing the app frame when app is in focus while receiving new messages', done => { - const tray = new TrayHandler({IS_WINDOWS: true}); - tray.initIcon(TrayMock); + const tray = new TrayHandler(); + tray.initIcon(true, TrayMock); const appWindow = new BrowserWindow(); sinon.spy(appWindow, 'flashFrame'); @@ -107,8 +108,8 @@ describe('TrayIconHandler', () => { }); it('flashes the app frame when app is not in focus and you receive new messages', done => { - const tray = new TrayHandler({IS_WINDOWS: true}); - tray.initIcon(TrayMock); + const tray = new TrayHandler(); + tray.initIcon(true, TrayMock); const appWindow = new BrowserWindow({ show: false, @@ -129,8 +130,8 @@ describe('TrayIconHandler', () => { }); it('does change the flash state if the window has already been flashed', done => { - const tray = new TrayHandler({IS_WINDOWS: true}); - tray.initIcon(); + const tray = new TrayHandler(); + tray.initIcon(true, TrayMock); tray.lastUnreadCount = 5; const appWindow = new BrowserWindow({ From 263cb0c8fbbc5cdbbbd20053b9dcd62aaafe8e97 Mon Sep 17 00:00:00 2001 From: Benny Neugebauer Date: Fri, 17 Aug 2018 12:13:29 +0200 Subject: [PATCH 07/13] Structured images in sub folders --- .../{ => tray-icon/tray-with-badge}/tray.badge.png | Bin .../tray-with-badge}/tray.badge@1.25x.png | Bin .../tray-with-badge}/tray.badge@1.33x.png | Bin .../tray-with-badge}/tray.badge@1.4x.png | Bin .../tray-with-badge}/tray.badge@1.5x.png | Bin .../tray-with-badge}/tray.badge@1.8x.png | Bin .../tray-with-badge}/tray.badge@2.5x.png | Bin .../tray-with-badge}/tray.badge@2x.png | Bin .../tray-with-badge}/tray.badge@3x.png | Bin .../tray-with-badge}/tray.badge@4x.png | Bin .../tray-with-badge}/tray.badge@5x.png | Bin electron/img/{ => tray-icon/tray}/tray.png | Bin electron/img/{ => tray-icon/tray}/tray@1.25x.png | Bin electron/img/{ => tray-icon/tray}/tray@1.33x.png | Bin electron/img/{ => tray-icon/tray}/tray@1.4x.png | Bin electron/img/{ => tray-icon/tray}/tray@1.5x.png | Bin electron/img/{ => tray-icon/tray}/tray@1.8x.png | Bin electron/img/{ => tray-icon/tray}/tray@2.5x.png | Bin electron/img/{ => tray-icon/tray}/tray@2x.png | Bin electron/img/{ => tray-icon/tray}/tray@3x.png | Bin electron/img/{ => tray-icon/tray}/tray@4x.png | Bin electron/img/{ => tray-icon/tray}/tray@5x.png | Bin electron/js/menu/TrayHandler.js | 8 ++++---- 23 files changed, 4 insertions(+), 4 deletions(-) rename electron/img/{ => tray-icon/tray-with-badge}/tray.badge.png (100%) rename electron/img/{ => tray-icon/tray-with-badge}/tray.badge@1.25x.png (100%) rename electron/img/{ => tray-icon/tray-with-badge}/tray.badge@1.33x.png (100%) rename electron/img/{ => tray-icon/tray-with-badge}/tray.badge@1.4x.png (100%) rename electron/img/{ => tray-icon/tray-with-badge}/tray.badge@1.5x.png (100%) rename electron/img/{ => tray-icon/tray-with-badge}/tray.badge@1.8x.png (100%) rename electron/img/{ => tray-icon/tray-with-badge}/tray.badge@2.5x.png (100%) rename electron/img/{ => tray-icon/tray-with-badge}/tray.badge@2x.png (100%) rename electron/img/{ => tray-icon/tray-with-badge}/tray.badge@3x.png (100%) rename electron/img/{ => tray-icon/tray-with-badge}/tray.badge@4x.png (100%) rename electron/img/{ => tray-icon/tray-with-badge}/tray.badge@5x.png (100%) rename electron/img/{ => tray-icon/tray}/tray.png (100%) rename electron/img/{ => tray-icon/tray}/tray@1.25x.png (100%) rename electron/img/{ => tray-icon/tray}/tray@1.33x.png (100%) rename electron/img/{ => tray-icon/tray}/tray@1.4x.png (100%) rename electron/img/{ => tray-icon/tray}/tray@1.5x.png (100%) rename electron/img/{ => tray-icon/tray}/tray@1.8x.png (100%) rename electron/img/{ => tray-icon/tray}/tray@2.5x.png (100%) rename electron/img/{ => tray-icon/tray}/tray@2x.png (100%) rename electron/img/{ => tray-icon/tray}/tray@3x.png (100%) rename electron/img/{ => tray-icon/tray}/tray@4x.png (100%) rename electron/img/{ => tray-icon/tray}/tray@5x.png (100%) diff --git a/electron/img/tray.badge.png b/electron/img/tray-icon/tray-with-badge/tray.badge.png similarity index 100% rename from electron/img/tray.badge.png rename to electron/img/tray-icon/tray-with-badge/tray.badge.png diff --git a/electron/img/tray.badge@1.25x.png b/electron/img/tray-icon/tray-with-badge/tray.badge@1.25x.png similarity index 100% rename from electron/img/tray.badge@1.25x.png rename to electron/img/tray-icon/tray-with-badge/tray.badge@1.25x.png diff --git a/electron/img/tray.badge@1.33x.png b/electron/img/tray-icon/tray-with-badge/tray.badge@1.33x.png similarity index 100% rename from electron/img/tray.badge@1.33x.png rename to electron/img/tray-icon/tray-with-badge/tray.badge@1.33x.png diff --git a/electron/img/tray.badge@1.4x.png b/electron/img/tray-icon/tray-with-badge/tray.badge@1.4x.png similarity index 100% rename from electron/img/tray.badge@1.4x.png rename to electron/img/tray-icon/tray-with-badge/tray.badge@1.4x.png diff --git a/electron/img/tray.badge@1.5x.png b/electron/img/tray-icon/tray-with-badge/tray.badge@1.5x.png similarity index 100% rename from electron/img/tray.badge@1.5x.png rename to electron/img/tray-icon/tray-with-badge/tray.badge@1.5x.png diff --git a/electron/img/tray.badge@1.8x.png b/electron/img/tray-icon/tray-with-badge/tray.badge@1.8x.png similarity index 100% rename from electron/img/tray.badge@1.8x.png rename to electron/img/tray-icon/tray-with-badge/tray.badge@1.8x.png diff --git a/electron/img/tray.badge@2.5x.png b/electron/img/tray-icon/tray-with-badge/tray.badge@2.5x.png similarity index 100% rename from electron/img/tray.badge@2.5x.png rename to electron/img/tray-icon/tray-with-badge/tray.badge@2.5x.png diff --git a/electron/img/tray.badge@2x.png b/electron/img/tray-icon/tray-with-badge/tray.badge@2x.png similarity index 100% rename from electron/img/tray.badge@2x.png rename to electron/img/tray-icon/tray-with-badge/tray.badge@2x.png diff --git a/electron/img/tray.badge@3x.png b/electron/img/tray-icon/tray-with-badge/tray.badge@3x.png similarity index 100% rename from electron/img/tray.badge@3x.png rename to electron/img/tray-icon/tray-with-badge/tray.badge@3x.png diff --git a/electron/img/tray.badge@4x.png b/electron/img/tray-icon/tray-with-badge/tray.badge@4x.png similarity index 100% rename from electron/img/tray.badge@4x.png rename to electron/img/tray-icon/tray-with-badge/tray.badge@4x.png diff --git a/electron/img/tray.badge@5x.png b/electron/img/tray-icon/tray-with-badge/tray.badge@5x.png similarity index 100% rename from electron/img/tray.badge@5x.png rename to electron/img/tray-icon/tray-with-badge/tray.badge@5x.png diff --git a/electron/img/tray.png b/electron/img/tray-icon/tray/tray.png similarity index 100% rename from electron/img/tray.png rename to electron/img/tray-icon/tray/tray.png diff --git a/electron/img/tray@1.25x.png b/electron/img/tray-icon/tray/tray@1.25x.png similarity index 100% rename from electron/img/tray@1.25x.png rename to electron/img/tray-icon/tray/tray@1.25x.png diff --git a/electron/img/tray@1.33x.png b/electron/img/tray-icon/tray/tray@1.33x.png similarity index 100% rename from electron/img/tray@1.33x.png rename to electron/img/tray-icon/tray/tray@1.33x.png diff --git a/electron/img/tray@1.4x.png b/electron/img/tray-icon/tray/tray@1.4x.png similarity index 100% rename from electron/img/tray@1.4x.png rename to electron/img/tray-icon/tray/tray@1.4x.png diff --git a/electron/img/tray@1.5x.png b/electron/img/tray-icon/tray/tray@1.5x.png similarity index 100% rename from electron/img/tray@1.5x.png rename to electron/img/tray-icon/tray/tray@1.5x.png diff --git a/electron/img/tray@1.8x.png b/electron/img/tray-icon/tray/tray@1.8x.png similarity index 100% rename from electron/img/tray@1.8x.png rename to electron/img/tray-icon/tray/tray@1.8x.png diff --git a/electron/img/tray@2.5x.png b/electron/img/tray-icon/tray/tray@2.5x.png similarity index 100% rename from electron/img/tray@2.5x.png rename to electron/img/tray-icon/tray/tray@2.5x.png diff --git a/electron/img/tray@2x.png b/electron/img/tray-icon/tray/tray@2x.png similarity index 100% rename from electron/img/tray@2x.png rename to electron/img/tray-icon/tray/tray@2x.png diff --git a/electron/img/tray@3x.png b/electron/img/tray-icon/tray/tray@3x.png similarity index 100% rename from electron/img/tray@3x.png rename to electron/img/tray-icon/tray/tray@3x.png diff --git a/electron/img/tray@4x.png b/electron/img/tray-icon/tray/tray@4x.png similarity index 100% rename from electron/img/tray@4x.png rename to electron/img/tray-icon/tray/tray@4x.png diff --git a/electron/img/tray@5x.png b/electron/img/tray-icon/tray/tray@5x.png similarity index 100% rename from electron/img/tray@5x.png rename to electron/img/tray-icon/tray/tray@5x.png diff --git a/electron/js/menu/TrayHandler.js b/electron/js/menu/TrayHandler.js index f0976baf04..aaefb95f09 100644 --- a/electron/js/menu/TrayHandler.js +++ b/electron/js/menu/TrayHandler.js @@ -27,12 +27,12 @@ class TrayHandler { this.hasOverlaySupport = false; this.lastUnreadCount = 0; - const TRAY_ICON_IMAGE_ROOT = path.join(app.getAppPath(), 'img'); + const IMAGE_ROOT = path.join(app.getAppPath(), 'img'); const iconPaths = { - badge: path.join(TRAY_ICON_IMAGE_ROOT, 'taskbar.overlay.png'), - tray: path.join(TRAY_ICON_IMAGE_ROOT, 'tray.png'), - trayWithBadge: path.join(TRAY_ICON_IMAGE_ROOT, 'tray.badge.png'), + badge: path.join(IMAGE_ROOT, 'taskbar.overlay.png'), + tray: path.join(IMAGE_ROOT, 'tray-icon', 'tray', 'tray.png'), + trayWithBadge: path.join(IMAGE_ROOT, 'tray-icon', 'tray-with-badge', 'tray.badge.png'), }; this.icons = { From 99c9dc89ea9de88b36f09e87cd30e6381bcbbb84 Mon Sep 17 00:00:00 2001 From: Benny Neugebauer Date: Fri, 17 Aug 2018 13:01:06 +0200 Subject: [PATCH 08/13] Updated tests --- tests/main/TrayHandlerTest.js | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/tests/main/TrayHandlerTest.js b/tests/main/TrayHandlerTest.js index 4dae3cb965..6569fb4c7c 100644 --- a/tests/main/TrayHandlerTest.js +++ b/tests/main/TrayHandlerTest.js @@ -42,31 +42,14 @@ describe('TrayIconHandler', () => { assert.equal(tray.icons.badge.constructor.name, 'NativeImage'); assert.equal(tray.icons.tray.constructor.name, 'NativeImage'); assert.equal(tray.icons.trayWithBadge.constructor.name, 'NativeImage'); - }); - - it('creates a tray icon on Linux', () => { - const tray = new TrayHandler(); - tray.initIcon(true, TrayMock); sinon.assert.match(tray.appIcon, sinon.match.defined); }); - - it('creates a tray icon on Window', () => { - const tray = new TrayHandler(); - tray.initIcon(true, TrayMock); - sinon.assert.match(tray.appIcon, sinon.match.defined); - }); - - it('does not create a tray icon on macOS', () => { - const tray = new TrayHandler(); - sinon.assert.match(tray.appIcon, sinon.match.typeOf('undefined')); - }); }); describe('"updateBadgeIcon"', () => { - describe('"Mac"', () => { + describe('without tray icon initialization"', () => { it('updates the badge counter and stops flashing the app frame when app is in focus while receiving new messages', done => { const tray = new TrayHandler(); - tray.initIcon(true, TrayMock); const appWindow = new BrowserWindow(); sinon.spy(app, 'setBadgeCount'); @@ -87,7 +70,7 @@ describe('TrayIconHandler', () => { }); }); - describe('"Windows"', () => { + describe('with tray icon initialization', () => { it('updates the badge counter and stops flashing the app frame when app is in focus while receiving new messages', done => { const tray = new TrayHandler(); tray.initIcon(true, TrayMock); From fbebca93a6d57e4c1aaaf47d82406986a02af8e3 Mon Sep 17 00:00:00 2001 From: Benny Neugebauer Date: Fri, 17 Aug 2018 13:15:31 +0200 Subject: [PATCH 09/13] initIcon -> initTray --- electron/js/menu/TrayHandler.js | 22 +++++++++++----------- electron/main.js | 2 +- tests/main/TrayHandlerTest.js | 18 +++++++++--------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/electron/js/menu/TrayHandler.js b/electron/js/menu/TrayHandler.js index aaefb95f09..2765ea6e8b 100644 --- a/electron/js/menu/TrayHandler.js +++ b/electron/js/menu/TrayHandler.js @@ -17,15 +17,19 @@ function buildTrayMenu() { }, ]); - this.appIcon.on('click', () => windowManager.showPrimaryWindow()); - this.appIcon.setContextMenu(contextMenu); - this.appIcon.setToolTip(config.NAME); + this.trayIcon.on('click', () => windowManager.showPrimaryWindow()); + this.trayIcon.setContextMenu(contextMenu); + this.trayIcon.setToolTip(config.NAME); } class TrayHandler { constructor() { this.hasOverlaySupport = false; this.lastUnreadCount = 0; + } + + initTray(hasOverlaySupport, trayIcon = new Tray(nativeImage.createEmpty())) { + this.hasOverlaySupport = hasOverlaySupport; const IMAGE_ROOT = path.join(app.getAppPath(), 'img'); @@ -40,21 +44,17 @@ class TrayHandler { tray: nativeImage.createFromPath(iconPaths.tray), trayWithBadge: nativeImage.createFromPath(iconPaths.trayWithBadge), }; - } - - initIcon(hasOverlaySupport, appIcon = new Tray(nativeImage.createEmpty())) { - this.hasOverlaySupport = hasOverlaySupport; - this.appIcon = appIcon; - this.appIcon.setImage(this.icons.tray); + this.trayIcon = trayIcon; + this.trayIcon.setImage(this.icons.tray); buildTrayMenu.call(this); } updateBadgeIcon(win, count) { - if (this.appIcon) { + if (this.trayIcon) { const trayImage = count ? this.icons.trayWithBadge : this.icons.tray; - this.appIcon.setImage(trayImage); + this.trayIcon.setImage(trayImage); } if (this.hasOverlaySupport) { diff --git a/electron/main.js b/electron/main.js index 1933197d45..c48ad0c226 100644 --- a/electron/main.js +++ b/electron/main.js @@ -261,7 +261,7 @@ const handleAppEvents = () => { Menu.setApplicationMenu(appMenu); tray = new TrayHandler(environment.platform); if (!environment.platform.IS_MAC_OS) { - tray.initIcon(environment.platform.IS_WINDOWS); + tray.initTray(environment.platform.IS_WINDOWS); } showMainWindow(); }); diff --git a/tests/main/TrayHandlerTest.js b/tests/main/TrayHandlerTest.js index 6569fb4c7c..5ddbc52a63 100644 --- a/tests/main/TrayHandlerTest.js +++ b/tests/main/TrayHandlerTest.js @@ -34,20 +34,20 @@ describe('TrayIconHandler', () => { setToolTip: () => {}, }; - describe('"constructor"', () => { - it('creates native images for all tray icons on instantiation', () => { + describe('initTray', () => { + it('creates native images for all tray icons and sets a default tray icon', () => { const tray = new TrayHandler(); - tray.initIcon(true, TrayMock); + tray.initTray(true, TrayMock); assert.equal(Object.keys(tray.icons).length, 3); assert.equal(tray.icons.badge.constructor.name, 'NativeImage'); assert.equal(tray.icons.tray.constructor.name, 'NativeImage'); assert.equal(tray.icons.trayWithBadge.constructor.name, 'NativeImage'); - sinon.assert.match(tray.appIcon, sinon.match.defined); + sinon.assert.match(tray.trayIcon, sinon.match.defined); }); }); - describe('"updateBadgeIcon"', () => { - describe('without tray icon initialization"', () => { + describe('updateBadgeIcon', () => { + describe('without tray icon initialization', () => { it('updates the badge counter and stops flashing the app frame when app is in focus while receiving new messages', done => { const tray = new TrayHandler(); const appWindow = new BrowserWindow(); @@ -73,7 +73,7 @@ describe('TrayIconHandler', () => { describe('with tray icon initialization', () => { it('updates the badge counter and stops flashing the app frame when app is in focus while receiving new messages', done => { const tray = new TrayHandler(); - tray.initIcon(true, TrayMock); + tray.initTray(true, TrayMock); const appWindow = new BrowserWindow(); sinon.spy(appWindow, 'flashFrame'); @@ -92,7 +92,7 @@ describe('TrayIconHandler', () => { it('flashes the app frame when app is not in focus and you receive new messages', done => { const tray = new TrayHandler(); - tray.initIcon(true, TrayMock); + tray.initTray(true, TrayMock); const appWindow = new BrowserWindow({ show: false, @@ -114,7 +114,7 @@ describe('TrayIconHandler', () => { it('does change the flash state if the window has already been flashed', done => { const tray = new TrayHandler(); - tray.initIcon(true, TrayMock); + tray.initTray(true, TrayMock); tray.lastUnreadCount = 5; const appWindow = new BrowserWindow({ From 290a2b53641b608fad3a6cf500cadd7d5743ded2 Mon Sep 17 00:00:00 2001 From: Benny Neugebauer Date: Fri, 17 Aug 2018 13:32:50 +0200 Subject: [PATCH 10/13] Seperated methods --- electron/js/menu/TrayHandler.js | 48 ++++++++++++++++++++------------- electron/main.js | 4 +-- tests/main/TrayHandlerTest.js | 8 +++--- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/electron/js/menu/TrayHandler.js b/electron/js/menu/TrayHandler.js index 2765ea6e8b..481deab65b 100644 --- a/electron/js/menu/TrayHandler.js +++ b/electron/js/menu/TrayHandler.js @@ -22,6 +22,31 @@ function buildTrayMenu() { this.trayIcon.setToolTip(config.NAME); } +function flashApplicationWindow(win, count) { + if (win.isFocused() || !count) { + win.flashFrame(false); + } else if (count > this.lastUnreadCount) { + win.flashFrame(true); + } +} + +function updateBadgeCount(count) { + app.setBadgeCount(count); + this.lastUnreadCount = count; +} + +function updateTrayIcon(win, count) { + if (this.trayIcon) { + const trayImage = count ? this.icons.trayWithBadge : this.icons.tray; + this.trayIcon.setImage(trayImage); + } + + if (this.hasOverlaySupport) { + const overlayImage = count ? this.icons.badge : null; + win.setOverlayIcon(overlayImage, locale.getText('unreadMessages')); + } +} + class TrayHandler { constructor() { this.hasOverlaySupport = false; @@ -51,25 +76,10 @@ class TrayHandler { buildTrayMenu.call(this); } - updateBadgeIcon(win, count) { - if (this.trayIcon) { - const trayImage = count ? this.icons.trayWithBadge : this.icons.tray; - this.trayIcon.setImage(trayImage); - } - - if (this.hasOverlaySupport) { - const overlayImage = count ? this.icons.badge : null; - win.setOverlayIcon(overlayImage, locale.getText('unreadMessages')); - } - - if (win.isFocused() || !count) { - win.flashFrame(false); - } else if (count > this.lastUnreadCount) { - win.flashFrame(true); - } - - app.setBadgeCount(count); - this.lastUnreadCount = count; + showUnreadCount(win, count) { + updateTrayIcon.call(this, win, count); + flashApplicationWindow.call(this, win, count); + updateBadgeCount.call(this, count); } } diff --git a/electron/main.js b/electron/main.js index c48ad0c226..d8f089c060 100644 --- a/electron/main.js +++ b/electron/main.js @@ -80,7 +80,7 @@ const bindIpcEvents = () => { }); ipcMain.on(EVENT_TYPE.UI.BADGE_COUNT, (event, count) => { - tray.updateBadgeIcon(main, count); + tray.showUnreadCount(main, count); }); ipcMain.on(EVENT_TYPE.GOOGLE_OAUTH.REQUEST, event => { @@ -213,7 +213,7 @@ const showMainWindow = () => { main.on('focus', () => main.flashFrame(false)); main.on('maximize', () => saveFullScreenState()); main.on('move', () => saveWindowBoundsState()); - main.on('page-title-updated', () => tray.updateBadgeIcon(main)); + main.on('page-title-updated', () => tray.showUnreadCount(main)); main.on('resize', () => saveWindowBoundsState()); main.on('unmaximize', () => saveFullScreenState()); diff --git a/tests/main/TrayHandlerTest.js b/tests/main/TrayHandlerTest.js index 5ddbc52a63..547fd06ce3 100644 --- a/tests/main/TrayHandlerTest.js +++ b/tests/main/TrayHandlerTest.js @@ -59,7 +59,7 @@ describe('TrayIconHandler', () => { appWindow.webContents.on('dom-ready', () => { assert.equal(appWindow.isFocused(), true); assert.equal(appWindow.flashFrame.callCount, 0); - tray.updateBadgeIcon(appWindow, 1); + tray.showUnreadCount(appWindow, 1); assert.ok(app.setBadgeCount.getCall(0).calledWith(1)); assert.ok(appWindow.flashFrame.getCall(0).calledWith(false)); assert.equal(tray.lastUnreadCount, 1); @@ -82,7 +82,7 @@ describe('TrayIconHandler', () => { appWindow.webContents.on('dom-ready', () => { assert.equal(appWindow.isFocused(), true); assert.equal(appWindow.flashFrame.callCount, 0); - tray.updateBadgeIcon(appWindow, 10); + tray.showUnreadCount(appWindow, 10); assert.ok(appWindow.flashFrame.getCall(0).calledWith(false)); assert.equal(tray.lastUnreadCount, 10); appWindow.flashFrame.restore(); @@ -104,7 +104,7 @@ describe('TrayIconHandler', () => { appWindow.loadURL(`file://${path.join(__dirname, '..', 'fixtures', 'badge.html')}`); appWindow.webContents.on('dom-ready', () => { assert.equal(appWindow.isFocused(), false); - tray.updateBadgeIcon(appWindow, 2); + tray.showUnreadCount(appWindow, 2); assert.ok(appWindow.flashFrame.getCall(0).calledWith(true)); appWindow.flashFrame.restore(); done(); @@ -127,7 +127,7 @@ describe('TrayIconHandler', () => { appWindow.loadURL(`file://${path.join(__dirname, '..', 'fixtures', 'badge.html')}`); appWindow.webContents.on('dom-ready', () => { assert.equal(appWindow.isFocused(), false); - tray.updateBadgeIcon(appWindow, 2); + tray.showUnreadCount(appWindow, 2); assert.equal(appWindow.flashFrame.callCount, 0); appWindow.flashFrame.restore(); done(); From 0ba9f31285ebbe29dec780ca01c1507c02fc3737 Mon Sep 17 00:00:00 2001 From: Benny Neugebauer Date: Fri, 17 Aug 2018 14:03:46 +0200 Subject: [PATCH 11/13] Simplified initTray --- electron/js/menu/TrayHandler.js | 13 ++++--------- electron/main.js | 2 +- tests/main/TrayHandlerTest.js | 8 ++++---- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/electron/js/menu/TrayHandler.js b/electron/js/menu/TrayHandler.js index 481deab65b..d39a26ed0f 100644 --- a/electron/js/menu/TrayHandler.js +++ b/electron/js/menu/TrayHandler.js @@ -35,13 +35,11 @@ function updateBadgeCount(count) { this.lastUnreadCount = count; } -function updateTrayIcon(win, count) { - if (this.trayIcon) { +function updateIcons(win, count) { + if (this.icons) { const trayImage = count ? this.icons.trayWithBadge : this.icons.tray; this.trayIcon.setImage(trayImage); - } - if (this.hasOverlaySupport) { const overlayImage = count ? this.icons.badge : null; win.setOverlayIcon(overlayImage, locale.getText('unreadMessages')); } @@ -49,13 +47,10 @@ function updateTrayIcon(win, count) { class TrayHandler { constructor() { - this.hasOverlaySupport = false; this.lastUnreadCount = 0; } - initTray(hasOverlaySupport, trayIcon = new Tray(nativeImage.createEmpty())) { - this.hasOverlaySupport = hasOverlaySupport; - + initTray(trayIcon = new Tray(nativeImage.createEmpty())) { const IMAGE_ROOT = path.join(app.getAppPath(), 'img'); const iconPaths = { @@ -77,7 +72,7 @@ class TrayHandler { } showUnreadCount(win, count) { - updateTrayIcon.call(this, win, count); + updateIcons.call(this, win, count); flashApplicationWindow.call(this, win, count); updateBadgeCount.call(this, count); } diff --git a/electron/main.js b/electron/main.js index d8f089c060..8a4ea7b5e2 100644 --- a/electron/main.js +++ b/electron/main.js @@ -261,7 +261,7 @@ const handleAppEvents = () => { Menu.setApplicationMenu(appMenu); tray = new TrayHandler(environment.platform); if (!environment.platform.IS_MAC_OS) { - tray.initTray(environment.platform.IS_WINDOWS); + tray.initTray(); } showMainWindow(); }); diff --git a/tests/main/TrayHandlerTest.js b/tests/main/TrayHandlerTest.js index 547fd06ce3..3976f66f2d 100644 --- a/tests/main/TrayHandlerTest.js +++ b/tests/main/TrayHandlerTest.js @@ -37,7 +37,7 @@ describe('TrayIconHandler', () => { describe('initTray', () => { it('creates native images for all tray icons and sets a default tray icon', () => { const tray = new TrayHandler(); - tray.initTray(true, TrayMock); + tray.initTray(TrayMock); assert.equal(Object.keys(tray.icons).length, 3); assert.equal(tray.icons.badge.constructor.name, 'NativeImage'); assert.equal(tray.icons.tray.constructor.name, 'NativeImage'); @@ -73,7 +73,7 @@ describe('TrayIconHandler', () => { describe('with tray icon initialization', () => { it('updates the badge counter and stops flashing the app frame when app is in focus while receiving new messages', done => { const tray = new TrayHandler(); - tray.initTray(true, TrayMock); + tray.initTray(TrayMock); const appWindow = new BrowserWindow(); sinon.spy(appWindow, 'flashFrame'); @@ -92,7 +92,7 @@ describe('TrayIconHandler', () => { it('flashes the app frame when app is not in focus and you receive new messages', done => { const tray = new TrayHandler(); - tray.initTray(true, TrayMock); + tray.initTray(TrayMock); const appWindow = new BrowserWindow({ show: false, @@ -114,7 +114,7 @@ describe('TrayIconHandler', () => { it('does change the flash state if the window has already been flashed', done => { const tray = new TrayHandler(); - tray.initTray(true, TrayMock); + tray.initTray(TrayMock); tray.lastUnreadCount = 5; const appWindow = new BrowserWindow({ From 6f4a56b1147392689d85546aea6c6ee613df6e80 Mon Sep 17 00:00:00 2001 From: Benny Neugebauer Date: Fri, 17 Aug 2018 14:13:04 +0200 Subject: [PATCH 12/13] Removed need for param in constructor --- electron/main.js | 2 +- tests/main/TrayHandlerTest.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/electron/main.js b/electron/main.js index 8a4ea7b5e2..d3a308ebf3 100644 --- a/electron/main.js +++ b/electron/main.js @@ -259,7 +259,7 @@ const handleAppEvents = () => { appMenu.on(EVENT_TYPE.ABOUT.SHOW, () => about.showWindow()); Menu.setApplicationMenu(appMenu); - tray = new TrayHandler(environment.platform); + tray = new TrayHandler(); if (!environment.platform.IS_MAC_OS) { tray.initTray(); } diff --git a/tests/main/TrayHandlerTest.js b/tests/main/TrayHandlerTest.js index 3976f66f2d..b3205a6558 100644 --- a/tests/main/TrayHandlerTest.js +++ b/tests/main/TrayHandlerTest.js @@ -46,7 +46,7 @@ describe('TrayIconHandler', () => { }); }); - describe('updateBadgeIcon', () => { + describe('showUnreadCount', () => { describe('without tray icon initialization', () => { it('updates the badge counter and stops flashing the app frame when app is in focus while receiving new messages', done => { const tray = new TrayHandler(); From 5173c42d5bc60acae09983e26dcdceef13eabe9b Mon Sep 17 00:00:00 2001 From: Benny Neugebauer Date: Fri, 17 Aug 2018 15:51:39 +0200 Subject: [PATCH 13/13] Optimized icons --- .../tray-icon/tray-with-badge/tray.badge.png | Bin 410 -> 410 bytes electron/img/tray-icon/tray/tray.png | Bin 277 -> 279 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/electron/img/tray-icon/tray-with-badge/tray.badge.png b/electron/img/tray-icon/tray-with-badge/tray.badge.png index cd8e87d941eab47b423e4f62216f48c8ad7c3067..925941c774ad4811f24a220e4d5f602390f2ea44 100644 GIT binary patch delta 361 zcmV-v0ha!n1DXSnI)A%L#6T3CNdgEr2py-iMNHLQh>33y=vWm(F3VV|6HTP*zXEg+k> z9iSR`_!kID6FmWa{)P2rfk@lO`4)|i(P$Sez%eMVI79FmEWzKff#6gnJitHY1lMsO zO;gjht!bLZWMWw+mOgcbz7C^s^8&iA^Ho&|>$(nS>IxHS2$8#>H&EpcT;_B79&otE zkAt-30`s`J-$4=lYZAtX#hXMfN7J?Rc9xFb#e)w@z4s9?0j_{2 z;Dkw1oR0idfqL5n$qu*&x;AD4pQww4L$^#og@d~Rw#hrTZhx))=5-i_o7Y;?G`=VbL0OjVnYyxxG=#`q&>N_72bB4oer_OK z7beOEe9ND50nW9~zk4hb& zFM8(?N>Y+2X)PUK!yOomQvb9NLIt$I1-JvR*wbgcTHFtl4R8b2jPuQx2!p_5jhW4H z-A4otkG-{X#+M=259wgQ+=^D$buk`;t)v2n7nE!yE%j+3cxM#gG0vj2zY!hk?DV zv2GMWz-_OstoY)xzHbK(d)s0yTcOH9_vD