Добавлена работа в трее и версия 0.6.1
Приложение теперь может сворачиваться в трей вместо закрытия: обход продолжает работать в фоне, иконка в трее показывает статус и позволяет включить/выключить обход без открытия окна. Добавлен автозапуск самого приложения вместе с системой (свёрнутым в трей).
This commit is contained in:
+45
-14
@@ -1,8 +1,11 @@
|
||||
import { app, BrowserWindow } from 'electron'
|
||||
import { app } from 'electron'
|
||||
import { electronApp, optimizer } from '@electron-toolkit/utils'
|
||||
import { createWindow } from './window'
|
||||
import { shouldStartHidden } from './app-autostart'
|
||||
import { beginQuit, createWindow, showMainWindow } from './window'
|
||||
import { showFirstRunSupportDialog } from './first-run'
|
||||
import { registerIpcHandlers } from './ipc'
|
||||
import { loadSettings } from './settings'
|
||||
import { createTray } from './tray'
|
||||
import { disposeZapret, recoverZapret } from './zapret'
|
||||
import { elevatedTaskDir, runElevatedServiceTask } from './zapret/elevated-task.win32'
|
||||
|
||||
@@ -22,16 +25,11 @@ if (elevatedTask) {
|
||||
app.quit()
|
||||
} else {
|
||||
app.on('second-instance', () => {
|
||||
const [window] = BrowserWindow.getAllWindows()
|
||||
if (!window) {
|
||||
createWindow()
|
||||
return
|
||||
}
|
||||
if (window.isMinimized()) window.restore()
|
||||
window.focus()
|
||||
// Окна может не быть вовсе: приложение живёт в трее, в том числе стартовав свёрнутым.
|
||||
showMainWindow()
|
||||
})
|
||||
|
||||
app.whenReady().then(() => {
|
||||
app.whenReady().then(async () => {
|
||||
// Нужно Windows для группировки в панели задач и уведомлений.
|
||||
electronApp.setAppUserModelId(APP_ID)
|
||||
|
||||
@@ -40,23 +38,54 @@ if (elevatedTask) {
|
||||
optimizer.watchWindowShortcuts(window)
|
||||
})
|
||||
|
||||
// Настройки читаем один раз здесь: их ждут и recoverZapret (выбранная стратегия),
|
||||
// и окно (прятать ли его в трей по закрытию).
|
||||
await loadSettings()
|
||||
|
||||
registerIpcHandlers()
|
||||
|
||||
// Трей создаём до окна: окно спрашивает у него, есть ли куда прятаться по закрытию.
|
||||
createTray({
|
||||
showWindow: () => {
|
||||
showMainWindow()
|
||||
},
|
||||
quit: () => {
|
||||
beginQuit()
|
||||
app.quit()
|
||||
}
|
||||
})
|
||||
|
||||
// Запуск из автозапуска системы — приложение садится в трей, окно не показываем.
|
||||
const startHidden = shouldStartHidden()
|
||||
|
||||
// На macOS чинит прокси, оставшийся от аварийно завершённого прошлого запуска,
|
||||
// до того как окно вообще откроется.
|
||||
void recoverZapret().then(() => {
|
||||
const window = createWindow()
|
||||
const window = createWindow({ show: !startHidden })
|
||||
// Ждём первого кадра: диалог должен появиться поверх готового окна, а не пустого.
|
||||
window.once('ready-to-show', () => void showFirstRunSupportDialog(window))
|
||||
// Свёрнутому в трей приложению показывать модальное окно некуда — пользователь его
|
||||
// не увидит и не закроет, а метку «уже показывали» диалог поставит.
|
||||
if (!startHidden) {
|
||||
window.once('ready-to-show', () => void showFirstRunSupportDialog(window))
|
||||
}
|
||||
})
|
||||
|
||||
// macOS: клик по иконке в доке при закрытых окнах открывает окно заново.
|
||||
// macOS: клик по иконке в доке (в том числе при закрытых окнах) открывает окно.
|
||||
// Система шлёт это событие и при самом запуске приложения — на первое из них при
|
||||
// свёрнутом старте не реагируем, иначе автозапуск сразу же показал бы окно.
|
||||
let ignoreActivate = startHidden
|
||||
app.on('activate', () => {
|
||||
if (BrowserWindow.getAllWindows().length === 0) createWindow()
|
||||
if (ignoreActivate) {
|
||||
ignoreActivate = false
|
||||
return
|
||||
}
|
||||
showMainWindow()
|
||||
})
|
||||
})
|
||||
|
||||
// Windows / Linux: закрыли последнее окно — вышли. macOS: приложение живёт до Cmd+Q.
|
||||
// При включённом «сворачивать в трей» окно не закрывается, а прячется, и сюда мы не попадаем
|
||||
// (см. обработчик `close` в window.ts).
|
||||
app.on('window-all-closed', () => {
|
||||
if (process.platform !== 'darwin') {
|
||||
app.quit()
|
||||
@@ -67,6 +96,8 @@ if (elevatedTask) {
|
||||
// иначе процесс останется висеть, а на macOS ещё и интернет пропадёт.
|
||||
let zapretCleaned = false
|
||||
app.on('before-quit', (event) => {
|
||||
// С этого момента закрытие окна означает выход, а не сворачивание в трей.
|
||||
beginQuit()
|
||||
if (zapretCleaned) return
|
||||
event.preventDefault()
|
||||
void disposeZapret().finally(() => {
|
||||
|
||||
Reference in New Issue
Block a user