1- const { app, BrowserWindow, ipcMain, session, dialog, shell, screen, Menu, clipboard, nativeImage } = require ( 'electron' )
1+ const { app, BrowserWindow, ipcMain, session, dialog, shell, screen, Menu, clipboard, nativeImage, Tray } = require ( 'electron' )
22const path = require ( 'path' )
33const fs = require ( 'fs' )
44const { brotliDecompress } = require ( 'zlib' )
@@ -77,8 +77,55 @@ const sendMessageToWebContents = (message) => {
7777}
7878
7979let mainWindow
80+ let tray
8081let screenWidth
8182let sendImageLock = false
83+
84+ const createTray = ( ) => {
85+ if ( tray ) return
86+ const iconPath = path . join ( __dirname , 'public/icon.png' )
87+ tray = new Tray ( iconPath )
88+ tray . setToolTip ( 'exhentai-manga-manager' )
89+ tray . on ( 'click' , ( ) => {
90+ if ( mainWindow ) {
91+ if ( mainWindow . isVisible ( ) && ! mainWindow . isMinimized ( ) ) {
92+ mainWindow . minimize ( )
93+ } else if ( mainWindow . isMinimized ( ) ) {
94+ mainWindow . restore ( )
95+ mainWindow . setSkipTaskbar ( false )
96+ mainWindow . focus ( )
97+ } else {
98+ mainWindow . show ( )
99+ mainWindow . setSkipTaskbar ( false )
100+ mainWindow . focus ( )
101+ }
102+ }
103+ } )
104+ const contextMenu = Menu . buildFromTemplate ( [
105+ {
106+ label : 'show window' ,
107+ click : ( ) => {
108+ if ( mainWindow ) {
109+ if ( mainWindow . isMinimized ( ) ) {
110+ mainWindow . restore ( )
111+ } else {
112+ mainWindow . show ( )
113+ }
114+ mainWindow . setSkipTaskbar ( false )
115+ mainWindow . focus ( )
116+ }
117+ }
118+ } ,
119+ {
120+ label : 'exit' ,
121+ click : ( ) => {
122+ mainWindow . close ( )
123+ }
124+ }
125+ ] )
126+ tray . setContextMenu ( contextMenu )
127+ }
128+
82129const createWindow = ( ) => {
83130 const mainWindowState = windowStateKeeper ( {
84131 defaultWidth : 1560 ,
@@ -95,7 +142,6 @@ const createWindow = () => {
95142 } ,
96143 show : false
97144 } )
98- mainWindowState . manage ( win )
99145 if ( app . isPackaged ) {
100146 win . loadFile ( 'dist/index.html' )
101147 } else {
@@ -111,7 +157,33 @@ const createWindow = () => {
111157 win . setTitle ( name + ' ' + version )
112158 } )
113159 win . once ( 'ready-to-show' , ( ) => {
160+ if ( setting . minimizeOnStart ) {
161+ if ( setting . minimizeToTray ) {
162+ createTray ( )
163+ win . hide ( )
164+ win . setSkipTaskbar ( true )
165+ } else {
166+ win . minimize ( )
167+ }
168+ } else {
169+ win . show ( )
170+ }
171+ } )
172+ win . on ( 'minimize' , ( event ) => {
173+ if ( setting . minimizeToTray ) {
174+ event . preventDefault ( )
175+ createTray ( )
176+ win . hide ( )
177+ win . setSkipTaskbar ( true )
178+ }
179+ } )
180+ win . on ( 'restore' , ( ) => {
114181 win . show ( )
182+ win . setSkipTaskbar ( false )
183+ } )
184+ win . on ( 'show' , ( ) => {
185+ win . setSkipTaskbar ( false )
186+ mainWindowState . manage ( win )
115187 } )
116188 return win
117189}
@@ -768,6 +840,10 @@ ipcMain.handle('save-setting', async (event, receiveSetting) => {
768840 } )
769841 }
770842 setting = receiveSetting
843+ if ( tray && ! setting . minimizeToTray ) {
844+ tray . destroy ( )
845+ tray = null
846+ }
771847 return await fs . promises . writeFile ( path . join ( STORE_PATH , 'setting.json' ) , JSON . stringify ( setting , null , ' ' ) , { encoding : 'utf-8' } )
772848} )
773849
0 commit comments