From 0bffc684bbfdb0123a16bbe9e1c617a49a1069ea Mon Sep 17 00:00:00 2001 From: lyswhut Date: Fri, 3 Apr 2020 18:22:00 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=BB=E8=BF=9B=E7=A8=8B?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9E=B6=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-config/main/webpack.config.base.js | 2 + package-lock.json | 2 +- src/main/events/_name.js | 5 + src/main/events/index.js | 16 +-- src/main/events/tray.js | 14 +++ src/main/index.js | 105 +++++------------- src/main/modules/appMenu.js | 43 +++++++ src/main/modules/index.js | 2 + src/main/modules/tray.js | 42 +++++++ .../{events => rendererEvents}/appName.js | 0 .../{events => rendererEvents}/clearCache.js | 0 .../getCacheSize.js | 0 .../getEnvParams.js | 0 src/main/rendererEvents/index.js | 14 +++ .../{events => rendererEvents}/musicMeta.js | 0 .../{events => rendererEvents}/progressBar.js | 0 .../{events => rendererEvents}/request.js | 0 .../restartWindow.js | 0 .../{events => rendererEvents}/selectDir.js | 0 .../setIgnoreMouseEvent.js | 0 .../setWindowSize.js | 0 .../showSaveDialog.js | 0 .../trafficLight.js | 10 +- src/main/rendererEvents/tray.js | 17 +++ .../{events => rendererEvents}/winEvent.js | 0 src/main/utils/autoUpdate.js | 7 +- src/main/utils/index.js | 13 ++- src/renderer/components/core/Toolbar.vue | 2 +- src/renderer/lang/cns/view/setting.json | 4 +- src/renderer/lang/cnt/view/setting.json | 2 + src/renderer/lang/en/view/setting.json | 2 + src/renderer/utils/index.js | 6 +- src/renderer/views/Setting.vue | 17 ++- src/static/images/tray/256x256.ico | Bin 0 -> 7602 bytes src/static/images/tray/512x512.icns | Bin 0 -> 43120 bytes src/static/{ => images/tray}/512x512.png | Bin 36 files changed, 212 insertions(+), 113 deletions(-) create mode 100644 src/main/events/_name.js create mode 100644 src/main/events/tray.js create mode 100644 src/main/modules/appMenu.js create mode 100644 src/main/modules/index.js create mode 100644 src/main/modules/tray.js rename src/main/{events => rendererEvents}/appName.js (100%) rename src/main/{events => rendererEvents}/clearCache.js (100%) rename src/main/{events => rendererEvents}/getCacheSize.js (100%) rename src/main/{events => rendererEvents}/getEnvParams.js (100%) create mode 100644 src/main/rendererEvents/index.js rename src/main/{events => rendererEvents}/musicMeta.js (100%) rename src/main/{events => rendererEvents}/progressBar.js (100%) rename src/main/{events => rendererEvents}/request.js (100%) rename src/main/{events => rendererEvents}/restartWindow.js (100%) rename src/main/{events => rendererEvents}/selectDir.js (100%) rename src/main/{events => rendererEvents}/setIgnoreMouseEvent.js (100%) rename src/main/{events => rendererEvents}/setWindowSize.js (100%) rename src/main/{events => rendererEvents}/showSaveDialog.js (100%) rename src/main/{events => rendererEvents}/trafficLight.js (67%) create mode 100644 src/main/rendererEvents/tray.js rename src/main/{events => rendererEvents}/winEvent.js (100%) create mode 100644 src/static/images/tray/256x256.ico create mode 100644 src/static/images/tray/512x512.icns rename src/static/{ => images/tray}/512x512.png (100%) diff --git a/build-config/main/webpack.config.base.js b/build-config/main/webpack.config.base.js index 01a2d03d..fc5be7d5 100644 --- a/build-config/main/webpack.config.base.js +++ b/build-config/main/webpack.config.base.js @@ -9,6 +9,8 @@ module.exports = { }, resolve: { alias: { + '@': path.join(__dirname, '../../src/main'), + events: path.join(__dirname, '../../src/main/events'), common: path.join(__dirname, '../../src/common'), }, extensions: ['*', '.js', '.json', '.node'], diff --git a/package-lock.json b/package-lock.json index 0fa10792..00e4bbc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "0.16.0", + "version": "0.17.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/main/events/_name.js b/src/main/events/_name.js new file mode 100644 index 00000000..95d4d37c --- /dev/null +++ b/src/main/events/_name.js @@ -0,0 +1,5 @@ +exports.tray = { + create: 'create', + destroy: 'destroy', +} + diff --git a/src/main/events/index.js b/src/main/events/index.js index 0ad3cfed..15015415 100644 --- a/src/main/events/index.js +++ b/src/main/events/index.js @@ -1,13 +1,5 @@ +global.lx_event = {} -require('./request') -// require('./appName') -require('./progressBar') -require('./trafficLight') -require('./musicMeta') -require('./selectDir') -require('./setWindowSize') -require('./showSaveDialog') -require('./clearCache') -require('./getCacheSize') -require('./setIgnoreMouseEvent') -require('./getEnvParams') +const Tray = require('./tray') + +if (!global.lx_event.setting) global.lx_event.tray = new Tray() diff --git a/src/main/events/tray.js b/src/main/events/tray.js new file mode 100644 index 00000000..39867f43 --- /dev/null +++ b/src/main/events/tray.js @@ -0,0 +1,14 @@ +const { EventEmitter } = require('events') +const { tray: TRAY_EVENT_NAME } = require('./_name') + +class Tray extends EventEmitter { + create() { + this.emit(TRAY_EVENT_NAME.create) + } + + destroy() { + this.emit(TRAY_EVENT_NAME.destroy) + } +} + +module.exports = Tray diff --git a/src/main/index.js b/src/main/index.js index 33900686..f54798d4 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -1,4 +1,4 @@ -const { app, BrowserWindow, Menu, Tray } = require('electron') +const { app, BrowserWindow } = require('electron') const path = require('path') // 单例应用程序 @@ -15,28 +15,28 @@ app.on('second-instance', (event, argv, cwd) => { } }) -const isDev = process.env.NODE_ENV !== 'production' +const isDev = global.isDev = process.env.NODE_ENV !== 'production' // https://github.com/electron/electron/issues/18397 app.allowRendererProcessReuse = !isDev -const { getWindowSizeInfo, parseEnv } = require('./utils') +const { getAppSetting, parseEnv, getWindowSizeInfo } = require('./utils') global.envParams = parseEnv() require('../common/error') require('./events') -const winEvent = require('./events/winEvent') +require('./rendererEvents') +const winEvent = require('./rendererEvents/winEvent') const autoUpdate = require('./utils/autoUpdate') -const { isLinux, isMac } = require('../common/utils') +const { isMac, isLinux } = require('../common/utils') let mainWindow let winURL -let isFirstCheckedUpdate = true -let tray if (isDev) { - global.__static = path.join(__dirname, '../static') + // eslint-disable-next-line no-undef + global.__static = __static winURL = 'http://localhost:9080' } else { global.__static = path.join(__dirname, '/static') @@ -44,7 +44,7 @@ if (isDev) { } function createWindow() { - let windowSizeInfo = getWindowSizeInfo() + const windowSizeInfo = getWindowSizeInfo(global.appSetting) /** * Initial window options */ @@ -66,87 +66,32 @@ function createWindow() { }, }) - // 托盘 - tray = new Tray( - isDev - ? 'src/static/512x512.png' - : path.join(global.__static, '512x512.png'), - ) - const contextMenu = Menu.buildFromTemplate([ - { - label: '退出', - click: () => { - mainWindow.destroy() - }, - }, - ]) - tray.setToolTip('洛雪音乐助手') - tray.setContextMenu(contextMenu) - tray.on('click', () => { - mainWindow.show() - mainWindow.setSkipTaskbar(false) - }) - mainWindow.loadURL(winURL) winEvent(mainWindow) // mainWindow.webContents.openDevTools() - if (!isDev) { - autoUpdate(isFirstCheckedUpdate) - isFirstCheckedUpdate = false - } + if (!isDev) autoUpdate() } -if (isMac) { - const template = [ - { - label: app.getName(), - submenu: [ - { label: '关于洛雪音乐', role: 'about' }, - { type: 'separator' }, - { label: '隐藏', role: 'hide' }, - { label: '显示其他', role: 'hideothers' }, - { label: '显示全部', role: 'unhide' }, - { type: 'separator' }, - { label: '退出', accelerator: 'Command+Q', click: () => app.quit() }, - ], - }, - { - label: '窗口', - role: 'window', - submenu: [ - { label: '最小化', role: 'minimize' }, - { label: '关闭', role: 'close' }, - ], - }, - { - label: '编辑', - submenu: [ - { label: '撤销', accelerator: 'CmdOrCtrl+Z', role: 'undo' }, - { label: '恢复', accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo' }, - { type: 'separator' }, - { label: '剪切', accelerator: 'CmdOrCtrl+X', role: 'cut' }, - { label: '复制', accelerator: 'CmdOrCtrl+C', role: 'copy' }, - { label: '粘贴', accelerator: 'CmdOrCtrl+V', role: 'paste' }, - { label: '选择全部', accelerator: 'CmdOrCtrl+A', role: 'selectAll' }, - ], - }, - ] - - Menu.setApplicationMenu(Menu.buildFromTemplate(template)) -} else { - Menu.setApplicationMenu(null) +function init() { + global.appSetting = getAppSetting() + createWindow() + global.lx_event.tray.create() } -app.on('ready', createWindow) - -app.on('window-all-closed', () => { - if (!isMac) app.quit() -}) +app.on('ready', init) app.on('activate', () => { - if (mainWindow === null) { - createWindow() + if (mainWindow === null) return init() +}) + +app.on('window-all-closed', () => { + if (isMac) { + global.lx_event.tray.destroy() + } else { + app.quit() } }) + +require('./modules') diff --git a/src/main/modules/appMenu.js b/src/main/modules/appMenu.js new file mode 100644 index 00000000..89bfd837 --- /dev/null +++ b/src/main/modules/appMenu.js @@ -0,0 +1,43 @@ +const { app, Menu } = require('electron') +const { isMac } = require('../../common/utils') + +if (isMac) { + const template = [ + { + label: app.getName(), + submenu: [ + { label: '关于洛雪音乐', role: 'about' }, + { type: 'separator' }, + { label: '隐藏', role: 'hide' }, + { label: '显示其他', role: 'hideothers' }, + { label: '显示全部', role: 'unhide' }, + { type: 'separator' }, + { label: '退出', accelerator: 'Command+Q', click: () => app.quit() }, + ], + }, + { + label: '窗口', + role: 'window', + submenu: [ + { label: '最小化', role: 'minimize' }, + { label: '关闭', role: 'close' }, + ], + }, + { + label: '编辑', + submenu: [ + { label: '撤销', accelerator: 'CmdOrCtrl+Z', role: 'undo' }, + { label: '恢复', accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo' }, + { type: 'separator' }, + { label: '剪切', accelerator: 'CmdOrCtrl+X', role: 'cut' }, + { label: '复制', accelerator: 'CmdOrCtrl+C', role: 'copy' }, + { label: '粘贴', accelerator: 'CmdOrCtrl+V', role: 'paste' }, + { label: '选择全部', accelerator: 'CmdOrCtrl+A', role: 'selectAll' }, + ], + }, + ] + + Menu.setApplicationMenu(Menu.buildFromTemplate(template)) +} else { + Menu.setApplicationMenu(null) +} diff --git a/src/main/modules/index.js b/src/main/modules/index.js new file mode 100644 index 00000000..bd79f0da --- /dev/null +++ b/src/main/modules/index.js @@ -0,0 +1,2 @@ +require('./appMenu') +require('./tray') diff --git a/src/main/modules/tray.js b/src/main/modules/tray.js new file mode 100644 index 00000000..5337c21c --- /dev/null +++ b/src/main/modules/tray.js @@ -0,0 +1,42 @@ +const { Tray, Menu } = require('electron') +const { isMac, isWin } = require('../../common/utils') +const { tray: TRAY_EVENT_NAME } = require('../events/_name') +const path = require('path') +global.lx_event.tray.on(TRAY_EVENT_NAME.create, () => { + createTray() +}) +global.lx_event.tray.on(TRAY_EVENT_NAME.destroy, () => { + destroyTray() +}) + +let tray +function createTray() { + if (tray && !tray.isDestroyed() && global.appSetting.tray && global.appSetting.tray.isShow) return + + const iconPath = path.join(global.__static, 'images/tray', isWin ? '256x256.ico' : isMac ? '512x512.icns' : '512x512.png') + + // 托盘 + tray = new Tray(iconPath) + + const contextMenu = Menu.buildFromTemplate([ + { + label: '退出', + role: 'quit', + }, + ]) + tray.setToolTip('洛雪音乐助手') + tray.setContextMenu(contextMenu) + tray.on('click', () => { + const mainWindow = global.mainWindow + if (!mainWindow) return + mainWindow.isVisible() + ? mainWindow.focus() + : mainWindow.show() + }) +} + +function destroyTray() { + if (!tray) return + tray.destroy() + tray = null +} diff --git a/src/main/events/appName.js b/src/main/rendererEvents/appName.js similarity index 100% rename from src/main/events/appName.js rename to src/main/rendererEvents/appName.js diff --git a/src/main/events/clearCache.js b/src/main/rendererEvents/clearCache.js similarity index 100% rename from src/main/events/clearCache.js rename to src/main/rendererEvents/clearCache.js diff --git a/src/main/events/getCacheSize.js b/src/main/rendererEvents/getCacheSize.js similarity index 100% rename from src/main/events/getCacheSize.js rename to src/main/rendererEvents/getCacheSize.js diff --git a/src/main/events/getEnvParams.js b/src/main/rendererEvents/getEnvParams.js similarity index 100% rename from src/main/events/getEnvParams.js rename to src/main/rendererEvents/getEnvParams.js diff --git a/src/main/rendererEvents/index.js b/src/main/rendererEvents/index.js new file mode 100644 index 00000000..a555a5bd --- /dev/null +++ b/src/main/rendererEvents/index.js @@ -0,0 +1,14 @@ + +require('./request') +// require('./appName') +require('./progressBar') +require('./trafficLight') +require('./musicMeta') +require('./selectDir') +require('./setWindowSize') +require('./showSaveDialog') +require('./clearCache') +require('./getCacheSize') +require('./setIgnoreMouseEvent') +require('./getEnvParams') +require('./tray') diff --git a/src/main/events/musicMeta.js b/src/main/rendererEvents/musicMeta.js similarity index 100% rename from src/main/events/musicMeta.js rename to src/main/rendererEvents/musicMeta.js diff --git a/src/main/events/progressBar.js b/src/main/rendererEvents/progressBar.js similarity index 100% rename from src/main/events/progressBar.js rename to src/main/rendererEvents/progressBar.js diff --git a/src/main/events/request.js b/src/main/rendererEvents/request.js similarity index 100% rename from src/main/events/request.js rename to src/main/rendererEvents/request.js diff --git a/src/main/events/restartWindow.js b/src/main/rendererEvents/restartWindow.js similarity index 100% rename from src/main/events/restartWindow.js rename to src/main/rendererEvents/restartWindow.js diff --git a/src/main/events/selectDir.js b/src/main/rendererEvents/selectDir.js similarity index 100% rename from src/main/events/selectDir.js rename to src/main/rendererEvents/selectDir.js diff --git a/src/main/events/setIgnoreMouseEvent.js b/src/main/rendererEvents/setIgnoreMouseEvent.js similarity index 100% rename from src/main/events/setIgnoreMouseEvent.js rename to src/main/rendererEvents/setIgnoreMouseEvent.js diff --git a/src/main/events/setWindowSize.js b/src/main/rendererEvents/setWindowSize.js similarity index 100% rename from src/main/events/setWindowSize.js rename to src/main/rendererEvents/setWindowSize.js diff --git a/src/main/events/showSaveDialog.js b/src/main/rendererEvents/showSaveDialog.js similarity index 100% rename from src/main/events/showSaveDialog.js rename to src/main/rendererEvents/showSaveDialog.js diff --git a/src/main/events/trafficLight.js b/src/main/rendererEvents/trafficLight.js similarity index 67% rename from src/main/events/trafficLight.js rename to src/main/rendererEvents/trafficLight.js index d0a7e046..d6e02b29 100644 --- a/src/main/events/trafficLight.js +++ b/src/main/rendererEvents/trafficLight.js @@ -11,14 +11,10 @@ mainOn('max', event => { global.mainWindow.maximize() } }) -mainOn('close', (event, arg) => { +mainOn('close', (event, params) => { if (global.mainWindow) { - console.log('close', arg) - if (arg && arg.min) { - global.mainWindow.hide() - global.mainWindow.setSkipTaskbar(true) - return - } + // console.log('close', params) + if (params && params.isToTray) return global.mainWindow.hide() // global.mainWindowdow.destroy() // app.quit() global.mainWindow.close() diff --git a/src/main/rendererEvents/tray.js b/src/main/rendererEvents/tray.js new file mode 100644 index 00000000..127abf4f --- /dev/null +++ b/src/main/rendererEvents/tray.js @@ -0,0 +1,17 @@ +// const { app } = require('electron') +const { mainOn } = require('../../common/ipc') + +mainOn('changeTray', (event, params) => { + switch (params.action) { + case 'create': + global.lx_event.tray.create() + break + case 'destroy': + global.lx_event.tray.destroy() + break + + default: + break + } +}) + diff --git a/src/main/events/winEvent.js b/src/main/rendererEvents/winEvent.js similarity index 100% rename from src/main/events/winEvent.js rename to src/main/rendererEvents/winEvent.js diff --git a/src/main/utils/autoUpdate.js b/src/main/utils/autoUpdate.js index 84ddd8d8..2e2cc857 100644 --- a/src/main/utils/autoUpdate.js +++ b/src/main/utils/autoUpdate.js @@ -5,6 +5,9 @@ const { mainOn } = require('../../common/ipc') autoUpdater.logger = log // autoUpdater.autoDownload = false autoUpdater.logger.transports.file.level = 'info' + +let isFirstCheckedUpdate = true + log.info('App starting...') @@ -67,7 +70,7 @@ const handleSendEvent = action => { } } -module.exports = isFirstCheckedUpdate => { +module.exports = () => { if (!isFirstCheckedUpdate) { if (waitEvent.length) { waitEvent.forEach((event, index) => { @@ -79,6 +82,8 @@ module.exports = isFirstCheckedUpdate => { } return } + isFirstCheckedUpdate = false + autoUpdater.on('checking-for-update', () => { sendStatusToWindow('Checking for update...') }) diff --git a/src/main/utils/index.js b/src/main/utils/index.js index 4f328a6a..cee08b53 100644 --- a/src/main/utils/index.js +++ b/src/main/utils/index.js @@ -1,12 +1,19 @@ const Store = require('electron-store') const { windowSizeList } = require('../../common/config') -exports.getWindowSizeInfo = () => { - let electronStore = new Store() - const { windowSizeId = 1 } = electronStore.get('setting') || {} +exports.getWindowSizeInfo = ({ windowSizeId = 1 } = {}) => { return windowSizeList.find(i => i.id === windowSizeId) || windowSizeList[0] } +exports.getAppSetting = () => { + let electronStore = new Store() + const defaultSetting = { + windowSizeId: 1, + isShowTray: false, + } + return Object.assign(defaultSetting, electronStore.get('setting') || {}) +} + exports.parseEnv = () => { const params = {} const rx = /^-\w+/ diff --git a/src/renderer/components/core/Toolbar.vue b/src/renderer/components/core/Toolbar.vue index b35d3987..15a3242f 100644 --- a/src/renderer/components/core/Toolbar.vue +++ b/src/renderer/components/core/Toolbar.vue @@ -120,7 +120,7 @@ export default { }, close() { rendererSend('close', { - min: this.setting.minClose, + isToTray: this.setting.tray.isToTray, }) }, }, diff --git a/src/renderer/lang/cns/view/setting.json b/src/renderer/lang/cns/view/setting.json index aa46ac8e..56c91698 100644 --- a/src/renderer/lang/cns/view/setting.json +++ b/src/renderer/lang/cns/view/setting.json @@ -18,8 +18,8 @@ "basic_window_size_medium": "中", "basic_window_size_big": "大", "basic_window_size_larger": "较大", - "basic_min_title": "关闭时最小化到系统托盘", - "basic_min": "关闭时最小化到系统托盘", + "basic_to_tray_title": "关闭时不退出软件将其最小化到系统托盘", + "basic_to_tray": "关闭时最小化到系统托盘", "basic_lang_title": "软件显示的语言", "basic_lang": "语言", diff --git a/src/renderer/lang/cnt/view/setting.json b/src/renderer/lang/cnt/view/setting.json index 50011d1c..5b52df1a 100644 --- a/src/renderer/lang/cnt/view/setting.json +++ b/src/renderer/lang/cnt/view/setting.json @@ -18,6 +18,8 @@ "basic_window_size_medium": "中", "basic_window_size_big": "大", "basic_window_size_larger": "較大", + "basic_to_tray_title": "關閉時不退出軟件將其最小化到系統托盤", + "basic_to_tray": "關閉時最小化到系統托盤", "basic_lang_title": "軟件顯示的語言", "basic_lang": "語言", "play": "播放設置", diff --git a/src/renderer/lang/en/view/setting.json b/src/renderer/lang/en/view/setting.json index 1ff617cd..e48a394d 100644 --- a/src/renderer/lang/en/view/setting.json +++ b/src/renderer/lang/en/view/setting.json @@ -18,6 +18,8 @@ "basic_window_size_medium": "medium", "basic_window_size_big": "big", "basic_window_size_larger": "Larger", + "basic_to_tray_title": "Minimize it to the system tray without closing the software when closing", + "basic_to_tray": "Minimize to system tray when closing", "basic_lang_title": "Software display language", "basic_lang": "Language", diff --git a/src/renderer/utils/index.js b/src/renderer/utils/index.js index 28e505c5..f69167e1 100644 --- a/src/renderer/utils/index.js +++ b/src/renderer/utils/index.js @@ -177,7 +177,7 @@ export const isChildren = (parent, children) => { * @param {*} setting */ export const updateSetting = (setting, version) => { - const defaultVersion = '1.0.19' + const defaultVersion = '1.0.22' if (!version) { if (setting) { version = setting.version @@ -238,6 +238,10 @@ export const updateSetting = (setting, version) => { password: '', }, }, + tray: { + isShow: false, + isToTray: false, + }, windowSizeId: 2, themeId: 0, minClose: false, diff --git a/src/renderer/views/Setting.vue b/src/renderer/views/Setting.vue index 4dce3714..1068926c 100644 --- a/src/renderer/views/Setting.vue +++ b/src/renderer/views/Setting.vue @@ -28,10 +28,10 @@ div.scroll(:class="$style.setting") material-checkbox(v-for="(item, index) in windowSizeList" :id="`setting_window_size_${item.id}`" name="setting_window_size" @change="handleWindowSizeChange" :class="$style.gapLeft" need v-model="current_setting.windowSizeId" :value="item.id" :label="$t('view.setting.basic_window_size_' + item.name)" :key="item.id") - dd(:title="$t('view.setting.basic_min_title')") - h3 {{$t('view.setting.basic_min')}} + dd(:title="$t('view.setting.basic_to_tray_title')") + h3 {{$t('view.setting.basic_to_tray')}} div - material-checkbox(id="setting_min" v-model="current_setting.minClose" :label="$t('view.setting.is_enable')") + material-checkbox(id="setting_to_tray" v-model="current_setting.tray.isToTray" @change="handleToTrayChange" :label="$t('view.setting.is_enable')") dd(:title="$t('view.setting.basic_lang_title')") h3 {{$t('view.setting.basic_lang')}} @@ -366,8 +366,11 @@ export default { themeId: 0, sourceId: 0, randomAnimate: true, - minClose: true, - apiSource: 'messoer', + tray: { + isShow: false, + isToTray: false, + }, + apiSource: 'temp', }, languageList, cacheSize: '0 B', @@ -618,6 +621,10 @@ export default { handleMediaDeviceChange(audioDevice) { this.setMediaDeviceId(audioDevice.deviceId) }, + handleToTrayChange(isToTray) { + this.current_setting.tray.isShow = isToTray + rendererSend('changeTray', { action: isToTray ? 'create' : 'destroy' }) + }, }, } diff --git a/src/static/images/tray/256x256.ico b/src/static/images/tray/256x256.ico new file mode 100644 index 0000000000000000000000000000000000000000..a961683defa298d1c3762a952f8bbf694f4ebd16 GIT binary patch literal 7602 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 F@jrfBY54#E literal 0 HcmV?d00001 diff --git a/src/static/images/tray/512x512.icns b/src/static/images/tray/512x512.icns new file mode 100644 index 0000000000000000000000000000000000000000..8bb1977e2b3d986f9af0d9c4204c96a08a18d94d GIT binary patch literal 43120 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 SMxzUAk~Qe0L?#`w`o92dA;o?G literal 0 HcmV?d00001 diff --git a/src/static/512x512.png b/src/static/images/tray/512x512.png similarity index 100% rename from src/static/512x512.png rename to src/static/images/tray/512x512.png