@@ -12,19 +12,24 @@ updateElectronApp({
1212 } ,
1313} ) ;
1414
15+ let mainWindow : BrowserWindow | null = null ;
16+ let tray : Tray | null = null ;
17+ let forceQuit = false ;
18+
1519// Handle creating/removing shortcuts on Windows when installing/uninstalling.
1620if ( require ( 'electron-squirrel-startup' ) ) {
21+ forceQuit = true ;
1722 app . quit ( ) ;
1823}
1924
2025const WindowSizeMap = {
21- minimized : { width : 400 , height : 220 } ,
26+ minimized : { width : 400 , height : 200 } ,
2227 normal : { width : 400 , height : 720 } ,
2328} ;
2429
2530const createWindow = ( ) => {
2631 // Create the browser window.
27- const mainWindow = new BrowserWindow ( {
32+ const browserWindow = new BrowserWindow ( {
2833 webPreferences : {
2934 preload : path . join ( __dirname , 'preload.js' ) ,
3035 webSecurity : false ,
@@ -39,25 +44,34 @@ const createWindow = () => {
3944
4045 // and load the index.html of the app.
4146 if ( MAIN_WINDOW_VITE_DEV_SERVER_URL ) {
42- mainWindow . loadURL ( MAIN_WINDOW_VITE_DEV_SERVER_URL ) ;
47+ browserWindow . loadURL ( MAIN_WINDOW_VITE_DEV_SERVER_URL ) ;
4348 } else {
44- mainWindow . loadFile ( path . join ( __dirname , `../renderer/${ MAIN_WINDOW_VITE_NAME } /index.html` ) ) ;
49+ browserWindow . loadFile ( path . join ( __dirname , `../renderer/${ MAIN_WINDOW_VITE_NAME } /index.html` ) ) ;
4550 }
4651
4752 // // Open the DevTools.
48- // mainWindow .webContents.openDevTools();
53+ // browserWindow .webContents.openDevTools();
4954
5055 // @note : 외부 링크 클릭 시 별도 브라우저로 열도록 설정함
5156 // 외부 링크 여부는 url이 https://로 시작하는지로 판단함
52- mainWindow . webContents . setWindowOpenHandler ( ( { url } ) => {
57+ browserWindow . webContents . setWindowOpenHandler ( ( { url } ) => {
5358 if ( url . startsWith ( 'https://' ) ) {
5459 shell . openExternal ( url ) ;
5560 return { action : 'deny' } ;
5661 }
5762 return { action : 'allow' } ;
5863 } ) ;
5964
60- return mainWindow ;
65+ // @see : https://stackoverflow.com/questions/38309240/object-has-been-destroyed-when-open-secondary-child-window-in-electron-js/39135293
66+ // 창이 닫히지 않고 숨겨지도록 설정함
67+ browserWindow . on ( 'close' , ( event ) => {
68+ if ( ! forceQuit ) {
69+ event . preventDefault ( ) ;
70+ browserWindow ?. hide ( ) ;
71+ }
72+ } ) ;
73+
74+ return browserWindow ;
6175} ;
6276
6377const trayIconMap : Record < string , string > = {
@@ -72,7 +86,11 @@ const trayIconMap: Record<string, string> = {
7286 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADoSURBVHgB3ZIxDoIwFIb/Eg7gEWBxldFNiLOJR+AG6g3AY+Cio6NxcDK66cgN8AawmLjVV62JkhYrOBi/5IWmr+/j5bXAr8N0Cc55Rh9HmdytgeMWuJwLMGvO4mRSKSSZL8qUss3yLnvtK2bTJBIrC2o86EgPik0+eqx0wh5q8nmH3b5qd6EV0vwc6C5DEAwAt72n6Re3AKf5zcba8yQc8mpy8VMZrXK9rXD6qEZIMrk+UbjPSdUMOzBn9fYENyeCCeJRU4Qy8kYyw24j1IEKva/JpLD8fEI0QXRTR2ZX5AoZAWMsxd9wBR1E9hNu08zLAAAAAElFTkSuQmCC' ,
7387} ;
7488const getTrayIcon = ( icon : string ) : NativeImage => {
75- return nativeImage . createFromDataURL ( trayIconMap [ icon ] ?? trayIconMap . default ) ;
89+ const image = nativeImage . createFromDataURL ( trayIconMap [ icon ] ?? trayIconMap . default ) ;
90+ // https://stackoverflow.com/questions/41664208/electron-tray-icon-change-depending-on-dark-theme
91+ // @note : 템플릿 이미지 설정을 해줘야 배경에 맞춰 자동으로 아이콘 색상 변경됨
92+ image . setTemplateImage ( true ) ;
93+ return image ;
7694} ;
7795
7896const createTray = ( mainWindow : BrowserWindow ) => {
@@ -88,15 +106,18 @@ const createTray = (mainWindow: BrowserWindow) => {
88106 } ,
89107 } ,
90108 { type : 'separator' } ,
91- { label : '종료' , role : 'quit' } ,
109+ {
110+ label : '종료' ,
111+ click : ( ) => {
112+ forceQuit = true ;
113+ app . quit ( ) ;
114+ } ,
115+ } ,
92116 ] ) ;
93117 tray . setContextMenu ( contextMenu ) ;
94118 return tray ;
95119} ;
96120
97- let mainWindow : BrowserWindow | null = null ;
98- let tray : Tray | null = null ;
99-
100121// This method will be called when Electron has finished
101122// initialization and is ready to create browser windows.
102123// Some APIs can only be used after this event occurs.
@@ -109,6 +130,7 @@ app.on('ready', () => {
109130// explicitly with Cmd + Q.
110131app . on ( 'window-all-closed' , ( ) => {
111132 if ( process . platform !== 'darwin' ) {
133+ forceQuit = true ;
112134 app . quit ( ) ;
113135 }
114136} ) ;
@@ -154,7 +176,7 @@ app.whenReady().then(() => {
154176 } ) ;
155177 ipcMain . handle ( 'get-minimized' , ( ) => {
156178 const [ , height ] = mainWindow ?. getMinimumSize ( ) || [ 0 , 0 ] ;
157- return height === 220 ;
179+ return height === WindowSizeMap . minimized . height ;
158180 } ) ;
159181 ipcMain . handle ( 'set-minimized' , ( event , isMinimized : boolean ) => {
160182 if ( isMinimized ) {
0 commit comments