From 32a47bcb7a0c9be1b402887da9bf54cc7e8e25fc Mon Sep 17 00:00:00 2001 From: Juan Tejada Date: Mon, 14 Mar 2016 17:15:34 -0700 Subject: [PATCH] feat(tray): Update to new set of icons and behavior for tray (menubar) Summary: - See #1698 Add specs Test Plan: - Unit tests Reviewers: bengotow, evan, drew Reviewed By: drew Differential Revision: https://phab.nylas.com/D2734 --- ...ng => MenuItem-Inbox-Full-NewItems@1x.png} | Bin 18374 -> 14745 bytes ...ng => MenuItem-Inbox-Full-NewItems@2x.png} | Bin 19031 -> 14986 bytes .../assets/MenuItem-Inbox-Full@1x.png | Bin 0 -> 14753 bytes ...-unread.png => MenuItem-Inbox-Full@2x.png} | Bin 19245 -> 14985 bytes .../assets/MenuItem-Inbox-Zero@1x.png | Bin 0 -> 14770 bytes ...y-nylas.png => MenuItem-Inbox-Zero@2x.png} | Bin 20471 -> 15045 bytes .../win32/ic-systemtray-nylas-unread.png | Bin 21047 -> 0 bytes internal_packages/system-tray/lib/main.es6 | 3 +- .../lib/system-tray-icon-store.es6 | 109 ++++++++---------- .../spec/system-tray-icon-store-spec.es6 | 81 +++++++++++++ src/browser/application.coffee | 4 +- src/browser/system-tray-manager.es6 | 27 ++--- 12 files changed, 139 insertions(+), 85 deletions(-) rename internal_packages/system-tray/assets/{darwin/ic-systemtray-nylas.png => MenuItem-Inbox-Full-NewItems@1x.png} (72%) rename internal_packages/system-tray/assets/{linux/ic-systemtray-nylas.png => MenuItem-Inbox-Full-NewItems@2x.png} (70%) create mode 100644 internal_packages/system-tray/assets/MenuItem-Inbox-Full@1x.png rename internal_packages/system-tray/assets/{linux/ic-systemtray-nylas-unread.png => MenuItem-Inbox-Full@2x.png} (70%) create mode 100644 internal_packages/system-tray/assets/MenuItem-Inbox-Zero@1x.png rename internal_packages/system-tray/assets/{win32/ic-systemtray-nylas.png => MenuItem-Inbox-Zero@2x.png} (65%) delete mode 100644 internal_packages/system-tray/assets/win32/ic-systemtray-nylas-unread.png create mode 100644 internal_packages/system-tray/spec/system-tray-icon-store-spec.es6 diff --git a/internal_packages/system-tray/assets/darwin/ic-systemtray-nylas.png b/internal_packages/system-tray/assets/MenuItem-Inbox-Full-NewItems@1x.png similarity index 72% rename from internal_packages/system-tray/assets/darwin/ic-systemtray-nylas.png rename to internal_packages/system-tray/assets/MenuItem-Inbox-Full-NewItems@1x.png index 30204c2796eb1d7f1e9bf22d784718dd075c414f..fe7fc2cd57a26c2eed2ac294e53a080dc13b539d 100644 GIT binary patch delta 673 zcmX@s&p5N#sx!dPotI0Bi-CcG*VDr#2uKTnFb5lul>huc5lC?sctjR6Fo>ywFr#OX z$_EAp3$4vlx$+n%ckonBX69*~%*cC^*G$*ISl7@b#L&pf&~);3UaiTVe7pk4qGnb` zrjyh7R44!E6~vTK;8U3#C!8?3gHKY$ILXo?H7PAg*T~e+Qr9HSC{Z^l$--1O(a<#2 zD8H7y_C!pE21>$@!Jz;@MT}Ss&20213y6wNwi8ugGBn$qAeyhwvM}t+ zmdTf0^y(R2db&7j&=WfX?Xob}Bm>UNv|*89!vMs8%X?S6I>C^{E;^#B`xiL-Sg)R3st(Z`j{He R0TUa8r>mdKI;RB2CII#D-kJaa delta 3974 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 K(5u#Ujs6d2V-nN= diff --git a/internal_packages/system-tray/assets/linux/ic-systemtray-nylas.png b/internal_packages/system-tray/assets/MenuItem-Inbox-Full-NewItems@2x.png similarity index 70% rename from internal_packages/system-tray/assets/linux/ic-systemtray-nylas.png rename to internal_packages/system-tray/assets/MenuItem-Inbox-Full-NewItems@2x.png index 9d73b5f2de0577addd51255c943f1b9cb86030ed..ef3f094a387662da6b36d88f35ee6d86a82d72e8 100644 GIT binary patch delta 875 zcmcaUg|Vx2f;PXHDg%Rl&C(&g4^?{GV44tDG{Q;^agzt;tfN zW|KSkBvn$9OpGnfjSO{-jm?sEO$-xFbdypo40TNnEsT;alG9AgjZ-Ec<F!Po^7sI2#JI$%nMWvx*8@aq-FS zeyQ{#NJK_v&85(iuWW@=oYd95)u$`XJ>pmpxT`eqIA7D^CO`IVJ0e~!xc0orspiOp zTTe7ACOj?r`Chr){T}xr1D?8K)_Nv|ECoA;!WR{yiz|H?uFEm#tz~eqVR>XOV9vx| z&-RF=W4_}Zw!-m9fXPw}Sw9u)aqaSJC zX1L?|ValW3KN$}QcL*2RDeu!(X6QJsx`FwTW4o$H*E{VFb{~drp$cIOGXZm#>SHVc z6BbOCd%ga3^Q<4+d>BGGwZ25u$I4GRQl7$;;Z+}S&6)Gs;-`O^7#?}H+B{`U@VY2} znej===g6JgmNc6yXht;~#VU4)moQXsiVR;7F2nG|seVXNu$w5eJf7jn z(Jc4lN0<*hpJDI9cem0&_*J1n`@WOFaUw4tDnm{r-UW|WuG>t delta 4261 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 literal 0 HcmV?d00001 diff --git a/internal_packages/system-tray/assets/linux/ic-systemtray-nylas-unread.png b/internal_packages/system-tray/assets/MenuItem-Inbox-Full@2x.png similarity index 70% rename from internal_packages/system-tray/assets/linux/ic-systemtray-nylas-unread.png rename to internal_packages/system-tray/assets/MenuItem-Inbox-Full@2x.png index 53efe1f6ef650885fcbf152b8a0e2fedcfd91016..763fa718a229d8e01e8186c13bd55665df0da0de 100644 GIT binary patch delta 874 zcmZ2Gjj^+If;PXHDg%RK4NXD}jjRmKtc(qG4a_HJ@+nRJ&nt*k zPMJ?}a-x{lWGPXz$sK%>DoKW>rk2KO#=6E9<|eu(24*R`mZm1jx+&&q#-;{F$*IQ1 zCXFZSF7U-p9rdScBL66^_IFl#x-zQF?tdOYydN@p$6KREy_P_By^KZIxnU(8)zQ6dSIg9VzpV8(ha4Y_ewbm6lQ6gF&r1#vqtd8 zDXZ{v>pRycF&C&GtUMb2pY4FLp-@qsSIu=dhNK?P2iAs@_`D~G-8E0*nZ=N%x>x|Pv;~vpuf<24p*G-Txwra?|xkmE}Hy?x7th!rQ7-LR6b9`{J zqfp7xZ#Tn}qgigpk1!v2KEvLHvFOxP-%1t@t;%De4X)i$W*vqJ6H{hL=!;cd)^a$u zX`z`eLzzy=y-q{1+(Xet-Oag4XQU_T3ocGx7<}3H;Jl~0B^`l^$5;%5jz}oFHA=L{ zOPtk}Jus)8|6&}sRfC9OT(ZYMr=EXt{TEYt7}A$rFHmM{2o*ly!ov_L?9e3PFE{yq hw!PQ?ulGM5XJ9+8z3;iz%p(jy;OXk;vd$@?2>>@AG8zB? delta 4483 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 G>puW7=EO?? diff --git a/internal_packages/system-tray/assets/MenuItem-Inbox-Zero@1x.png b/internal_packages/system-tray/assets/MenuItem-Inbox-Zero@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..05dfc6a7633f9160375b5d57a68226012c1022eb GIT binary patch literal 14770 zcmeI3Z)_7~9LH}H`BO3-LBtS@XD1>;d)Mo~?P$y9I@}UE>ZoBeCh~CibUSG8&fb-F zi-9rp1!zE-CQeP<3;*DsNYE@s7C~ZoLDYoAy;=-WUqB=fG>Vath|jfM`?PC$!0_^E z()QQq`F?-D=RVJ$-kaMW?S8Vsw!+3ROhZ>^xCebVTJMGP(dR>d-T>%pk>1&7FwFg{ ztan{k&m+GxO!MPPtk>*~Y!W3c=>)R29Xhi~9jO^6upz4hX(u$f*HV!6I(-g__xV|Wi__)x`#t`3tiZdx9Pj4byhCt{9$xeaY~f`O z*-#Wn$#JnKys=OY{R-L#Oj8#*E|bYPGj6Ar>gQZ7EiD``aDw1K3WqVMnjq^?ji!8( z**sxrNGU}(6-{NWykNVQHiLG%RjBwXTvt*r7E+A@J4BJo0-bX?d9IpCmWm!dol4|} zCQBSlz$8>n1NmH4efofAYQ}(8qhztWW??iZkw~$2)$t~iRZAOY$1a4RfV8U9hz;tH z>w$)rPD!w17rK8Zl*YU5V{lLQA1x!H_$^RcppvxwR&CsfGzu33i1;sKKcyvgiR)vk$mr zhc^!04v#<1JAlB;4nOdCfE&mHkWuzI_BpA;nv}NoOChy4^fwgo<4-a6ZnP;#e|4pIiR_FT|DyXlI@Sn-syJh{Cq z0?9hhLXx#5pd8@JT1&$!Itw=C|4v{&KW498BQpTin{B9ks+_8J5<`od8IXc){b)_x z+HTM1EjLyc2yoUvKtd^>ihOJN49%|DxicED4mJ_31~f8|n*~>Zo6}aRoY(hSvzkcf z^&St8UYyJNEO_z$N^c**i}zQ0OV+1V#S96Bauv;(%Q}DaN5d9$s{lhjuh;DjaFxxK zj;NA_iQce+_OM~COqZ|VsqCm~?5kzOIts@8WMO~mxw*`@qFV-Zx55=~SIVckxEbzn zP`aW!oET3>i{LbfF~vnhgbOGxoCYzbxQK{w0mX&WAjT9I5fLt+xNsW8nBpQL!UYr; zPJar$LM9?9MMQ)PC@!1^F{ZePh;RYLh0`F$6c-T@ zE}*z@8pQafxNM~d0HKPW`pcll`wo9J`Zjtrkd-=nA`CNx9wi*!$1vA!pzq%pCe1U< z#cd2DzR57lwZqSy-pDX@^5ohPKA3M<3`u_UqWzZ;gd3M~1(d zIJlO5=Bd4{+g@8avRG&4?Om+b*DvZCRev}s&s_NMb>WPhIsf&QRg>3`F6#h?{(8T) zp>^4wOD9g>y~DOc_S>cwPI*>++B&hj?vr1p>n9GJwjEh|>#54Fj_&YhPi!0c E4^%TA7XSbN literal 0 HcmV?d00001 diff --git a/internal_packages/system-tray/assets/win32/ic-systemtray-nylas.png b/internal_packages/system-tray/assets/MenuItem-Inbox-Zero@2x.png similarity index 65% rename from internal_packages/system-tray/assets/win32/ic-systemtray-nylas.png rename to internal_packages/system-tray/assets/MenuItem-Inbox-Zero@2x.png index 725b50036e1fd2c6ed6988d60edc7df6ea2750b6..0099752c6af4290a42d50b9b8facde17ab54f779 100644 GIT binary patch delta 934 zcmex9pYdqv1Z{pXRR#tzRYuPsl@AOI7FwI9a^*2jKFMP-xr4`XGBZ!>WJcbT!e+V# zM!H6(A%><_rUq6&!7HebN=76Gygal>Km%~we%~_ z{jfA_m}|vQeusb@Fqvp#6;Oy_2q zVSawOCWE$`-2Nle?thu*JL7o_*MWVVzq5JbnYOa8I$dd(GVgXELx8NB4fEBg@oeK&wq%B2wWzfMB}=CjT+WTERjOy(kho}NgQNb6 z^9$ZpKRoUCxaUjLT;+beJ&S$kfCR;WRt;-tg5xvNXV`La}4J{;?MYA^|C9H_xpCq`OU8X%J^$exmAdJgQ5EKY1|()9y%3D z{8Hp<+0ty~^+CFfahGtu>10j@V@|vD1y+BYcTC^#LFCF|j~~JT&pGX$28i$RzSCM9 zP`rT6VQb?qzAS+&PNLrrzZ5vI*DA(E+qaeBmc!o+haZ9~rg_OPUdzU?=J>w0_0swb zA8gnRE-*CAlW^d?vfZk!o-5Al|LgkW``H-Uw%tA!bMB)v0}yz+`njxgN@xNAJ(ISZ6g6Jc9Bt#b_ zL=B=u35j;+cWycNp6A?q&-&xr&$IUXthM&L-?jI*y8;fgAy2P@9LxZ~!3@D=51Ro1 zjfsnf#`WvYUjANw&R*WUdKwzM-o9Q~7k4KB2%5??$Dz&F*p&{y?yDQbMm#t0GGn9S zHB*m|U`-Mh=c8uQkLAn#!e-ijK}(B_vo|M}G$A44F`MZ%x<@pVluLZC67J{4KKgL{ zEi}(wfb6=Rh-_zOsZAn5kl19)QV4|vV zBxr<|3LqF|5TvfeoHMSgr`?1^Jb)1VljIGkB3J>{kOcJt zKvf$Ok@-T{9LOO9?D`$-7lG?gz)l2Q837_PkJ3Ux2w?l1j}4NO1n{yr#cBf13P9akVuK)3E7Fz<>O*N|CBZE^pvQ5QRTe{nNmrG4ADngx771sZ-vd7a zKu!`HalLz|K?4ls0|T-Nbqsf)>unV0{Py;XXUl^n-l_ob%|CqT?3!fF

3e2#>Q@ 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 diff --git a/internal_packages/system-tray/assets/win32/ic-systemtray-nylas-unread.png b/internal_packages/system-tray/assets/win32/ic-systemtray-nylas-unread.png deleted file mode 100644 index d8511905bdd39f8dc5fd6ae47021aee715e85505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21047 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 diff --git a/internal_packages/system-tray/lib/main.es6 b/internal_packages/system-tray/lib/main.es6 index fb34f42b8..04a5c0724 100644 --- a/internal_packages/system-tray/lib/main.es6 +++ b/internal_packages/system-tray/lib/main.es6 @@ -1,8 +1,7 @@ import SystemTrayIconStore from './system-tray-icon-store'; -const platform = process.platform; export function activate() { - this.store = new SystemTrayIconStore(platform); + this.store = new SystemTrayIconStore(); this.store.activate(); } diff --git a/internal_packages/system-tray/lib/system-tray-icon-store.es6 b/internal_packages/system-tray/lib/system-tray-icon-store.es6 index 5290b6916..5f23da9a9 100644 --- a/internal_packages/system-tray/lib/system-tray-icon-store.es6 +++ b/internal_packages/system-tray/lib/system-tray-icon-store.es6 @@ -1,86 +1,67 @@ -import fs from 'fs'; import path from 'path'; -import mkdirp from 'mkdirp'; -import {remote, ipcRenderer} from 'electron'; -import {UnreadBadgeStore, CanvasUtils} from 'nylas-exports'; -const {canvasWithSystemTrayIconAndText} = CanvasUtils; -const {nativeImage} = remote -const mkdirpAsync = Promise.promisify(mkdirp) -const writeFile = Promise.promisify(fs.writeFile) +import {ipcRenderer} from 'electron'; +import {UnreadBadgeStore} from 'nylas-exports'; // Must be absolute real system path // https://github.com/atom/electron/issues/1299 -const BASE_ICON_PATH = path.join(__dirname, '..', 'assets', process.platform, 'ic-systemtray-nylas.png'); -const UNREAD_ICON_PATH = path.join(__dirname, '..', 'assets', process.platform, 'ic-systemtray-nylas-unread.png'); -const TRAY_ICON_PATH = path.join( - NylasEnv.getConfigDirPath(), - 'tray', - 'tray-icon.png' -); +const INBOX_ZERO_ICON = path.join(__dirname, '..', 'assets', 'MenuItem-Inbox-Zero.png'); +const INBOX_UNREAD_ICON = path.join(__dirname, '..', 'assets', 'MenuItem-Inbox-Full.png'); +const INBOX_UNREAD_ALT_ICON = path.join(__dirname, '..', 'assets', 'MenuItem-Inbox-Full-NewItems.png'); class SystemTrayIconStore { - constructor(platform) { - this._platform = platform; + static INBOX_ZERO_ICON = INBOX_ZERO_ICON; - this._unreadString = (+UnreadBadgeStore.count()).toLocaleString(); - this._unreadIcon = nativeImage.createFromPath(UNREAD_ICON_PATH); - this._baseIcon = nativeImage.createFromPath(BASE_ICON_PATH); - this._icon = this._getIconImg(); + static INBOX_UNREAD_ICON = INBOX_UNREAD_ICON; + + static INBOX_UNREAD_ALT_ICON = INBOX_UNREAD_ALT_ICON; + + constructor() { + this._windowBlurred = false; + this._unsubscribers = []; } activate() { - const iconDir = path.dirname(TRAY_ICON_PATH); - mkdirpAsync(iconDir).then(()=> { - writeFile(TRAY_ICON_PATH, this._icon.toPng()) - .then(()=> { - ipcRenderer.send('update-system-tray', TRAY_ICON_PATH, this._unreadString); - this._unsubscribe = UnreadBadgeStore.listen(this._onUnreadCountChanged); - }) - }); + this._updateIcon() + this._unsubscribers.push(UnreadBadgeStore.listen(this._updateIcon)); + + ipcRenderer.on('browser-window-blur', this._onWindowBlur) + ipcRenderer.on('browser-window-focus', this._onWindowFocus) + this._unsubscribers.push(() => ipcRenderer.removeListener('browser-window-blur', this._onWindowBlur)) + this._unsubscribers.push(() => ipcRenderer.removeListener('browser-window-focus', this._onWindowFocus)) } - _getIconImg(unreadString = this._unreadString) { - const imgHandlers = { - 'darwin': () => { - const img = new Image(); - let canvas = null; - - // toDataUrl always returns the @1x image data, so the assets/darwin/ - // contains an "@2x" image /without/ the @2x extension - img.src = this._baseIcon.toDataURL(); - - if (unreadString === '0') { - canvas = canvasWithSystemTrayIconAndText(img, ''); - } else { - canvas = canvasWithSystemTrayIconAndText(img, unreadString); - } - const pngData = nativeImage.createFromDataURL(canvas.toDataURL()).toPng(); - - // creating from a buffer allows us to specify that the image is @2x - const outputImg = nativeImage.createFromBuffer(pngData); - return outputImg; - }, - 'default': () => { - return unreadString !== '0' ? this._unreadIcon : this._baseIcon; - }, - }; - - return imgHandlers[this._platform in imgHandlers ? this._platform : 'default'](); + _getIconImageData(unreadCount, isWindowBlurred) { + if (unreadCount === 0) { + return {iconPath: INBOX_ZERO_ICON, isTemplateImg: true}; + } + return isWindowBlurred ? + {iconPath: INBOX_UNREAD_ALT_ICON, isTemplateImg: false} : + {iconPath: INBOX_UNREAD_ICON, isTemplateImg: true}; } - _onUnreadCountChanged = () => { - this._unreadString = (+UnreadBadgeStore.count()).toLocaleString(); - this._icon = this._getIconImg(); - writeFile(TRAY_ICON_PATH, this._icon.toPng()) - .then(() => { - ipcRenderer.send('update-system-tray', TRAY_ICON_PATH, this._unreadString); - }); + _onWindowBlur = ()=> { + // Set state to blurred, but don't trigger a change. The icon should only be + // updated when the count changes + this._windowBlurred = true; + }; + + _onWindowFocus = ()=> { + // Make sure that as long as the window is focused we never use the alt icon + this._windowBlurred = false; + this._updateIcon(); + }; + + _updateIcon = () => { + const count = UnreadBadgeStore.count() + const unreadString = (+count).toLocaleString(); + const {iconPath, isTemplateImg} = this._getIconImageData(count, this._windowBlurred); + ipcRenderer.send('update-system-tray', iconPath, unreadString, isTemplateImg); }; deactivate() { - if (this._unsubscribe) this._unsubscribe(); + this._unsubscribers.forEach(unsub => unsub()) } } diff --git a/internal_packages/system-tray/spec/system-tray-icon-store-spec.es6 b/internal_packages/system-tray/spec/system-tray-icon-store-spec.es6 new file mode 100644 index 000000000..262cf6cc4 --- /dev/null +++ b/internal_packages/system-tray/spec/system-tray-icon-store-spec.es6 @@ -0,0 +1,81 @@ +import {ipcRenderer} from 'electron'; +import {UnreadBadgeStore} from 'nylas-exports'; +import SystemTrayIconStore from '../lib/system-tray-icon-store'; + +const { + INBOX_ZERO_ICON, + INBOX_UNREAD_ICON, + INBOX_UNREAD_ALT_ICON, +} = SystemTrayIconStore; + + +describe('SystemTrayIconStore', ()=> { + beforeEach(()=> { + spyOn(ipcRenderer, 'send') + this.iconStore = new SystemTrayIconStore() + }); + + function getCallData() { + const {args} = ipcRenderer.send.calls[0] + return {iconPath: args[1], isTemplateImg: args[3]} + } + + describe('_getIconImageData', ()=> { + it('shows inbox zero icon when unread count is 0 and window is focused', ()=> { + const {iconPath, isTemplateImg} = this.iconStore._getIconImageData(0, false) + expect(iconPath).toBe(INBOX_ZERO_ICON) + expect(isTemplateImg).toBe(true) + }); + + it('shows inbox zero icon when unread count is 0 and window is blurred', ()=> { + const {iconPath, isTemplateImg} = this.iconStore._getIconImageData(0, true) + expect(iconPath).toBe(INBOX_ZERO_ICON) + expect(isTemplateImg).toBe(true) + }); + + it('shows inbox full icon when unread count > 0 and window is focused', ()=> { + const {iconPath, isTemplateImg} = this.iconStore._getIconImageData(1, false) + expect(iconPath).toBe(INBOX_UNREAD_ICON) + expect(isTemplateImg).toBe(true) + }); + + it('shows inbox full /alt/ icon when unread count > 0 and window is blurred', ()=> { + const {iconPath, isTemplateImg} = this.iconStore._getIconImageData(1, true) + expect(iconPath).toBe(INBOX_UNREAD_ALT_ICON) + expect(isTemplateImg).toBe(false) + }); + }); + + describe('updating the icon based on focus and blur', ()=> { + it('always shows inbox full icon when the window gets focused', ()=> { + spyOn(UnreadBadgeStore, 'count').andReturn(1) + this.iconStore._onWindowFocus() + const {iconPath} = getCallData() + expect(iconPath).toBe(INBOX_UNREAD_ICON) + }); + + it('shows inbox full /alt/ icon ONLY when window is currently blurred and unread count changes', ()=> { + this.iconStore._windowBlurred = false + this.iconStore._onWindowBlur() + expect(ipcRenderer.send).not.toHaveBeenCalled() + + // UnreadBadgeStore triggers a change + spyOn(UnreadBadgeStore, 'count').andReturn(1) + this.iconStore._updateIcon() + + const {iconPath} = getCallData() + expect(iconPath).toBe(INBOX_UNREAD_ALT_ICON) + }); + + it('does not show inbox full /alt/ icon when window is currently focused and unread count changes', ()=> { + this.iconStore._windowBlurred = false + + // UnreadBadgeStore triggers a change + spyOn(UnreadBadgeStore, 'count').andReturn(1) + this.iconStore._updateIcon() + + const {iconPath} = getCallData() + expect(iconPath).toBe(INBOX_UNREAD_ICON) + }); + }); +}); diff --git a/src/browser/application.coffee b/src/browser/application.coffee index 4dd49189d..e8b999d25 100644 --- a/src/browser/application.coffee +++ b/src/browser/application.coffee @@ -347,8 +347,8 @@ class Application event.preventDefault() # System Tray - ipcMain.on 'update-system-tray', (event, iconPath, unreadString) => - @systemTrayManager?.setTrayCount(iconPath, unreadString) + ipcMain.on 'update-system-tray', (event, args...) => + @systemTrayManager?.updateTray(args...) ipcMain.on 'set-badge-value', (event, value) => app.dock?.setBadge?(value) diff --git a/src/browser/system-tray-manager.es6 b/src/browser/system-tray-manager.es6 index 4700a2eef..5f0126305 100644 --- a/src/browser/system-tray-manager.es6 +++ b/src/browser/system-tray-manager.es6 @@ -1,4 +1,3 @@ -import fs from 'fs'; import {Tray, Menu, nativeImage} from 'electron'; @@ -35,20 +34,15 @@ function _getTooltip(unreadString) { return unreadString ? '' : `${unreadString} unread messages`; } -function _getIcon(iconPath) { - if (!iconPath) return nativeImage.createEmpty() - try { - fs.accessSync(iconPath, fs.F_OK | fs.R_OK) - const buffer = fs.readFileSync(iconPath); - if (buffer.length > 0) { - const out2x = nativeImage.createFromBuffer(buffer, 2); - out2x.setTemplateImage(true); - return out2x; - } - return nativeImage.createEmpty(); - } catch (e) { +function _getIcon(iconPath, isTemplateImg) { + if (!iconPath) { return nativeImage.createEmpty(); } + const icon = nativeImage.createFromPath(iconPath) + if (isTemplateImg) { + icon.setTemplateImage(true); + } + return icon; } @@ -83,20 +77,19 @@ class SystemTrayManager { } }; - setTrayCount(iconPath, unreadString) { + updateTray(iconPath, unreadString, isTemplateImg) { if (!this._tray) return; this._iconPath = iconPath; - const icon = _getIcon(this._iconPath); + const icon = _getIcon(this._iconPath, isTemplateImg); const tooltip = _getTooltip(unreadString); this._tray.setImage(icon); this._tray.setToolTip(tooltip); } destroy() { - if (!this._tray) return; + if (this._tray) this._tray.destroy(); this._unsubscribe(); - this._tray.destroy(); } }