diff --git a/packages/gui/package.json b/packages/gui/package.json index ae24c9b..31c78a6 100644 --- a/packages/gui/package.json +++ b/packages/gui/package.json @@ -43,7 +43,8 @@ "sass-loader": "^10.0.4", "vue": "^2.6.11", "vue-json-editor-fix-cn": "^1.4.3", - "vue-router": "^3.4.8" + "vue-router": "^3.4.8", + "@natmri/platform-napi": "0.0.8" }, "devDependencies": { "@vue/cli-plugin-babel": "^4.5.0", diff --git a/packages/gui/src/background.js b/packages/gui/src/background.js index 9bab6ae..b9ef662 100644 --- a/packages/gui/src/background.js +++ b/packages/gui/src/background.js @@ -1,7 +1,8 @@ 'use strict' /* global __static */ import path from 'path' -import { app, protocol, BrowserWindow, Menu, Tray, ipcMain, dialog, powerMonitor, nativeImage, nativeTheme, globalShortcut } from 'electron' +import { app, protocol, BrowserWindow, Menu, Tray, ipcMain, dialog, nativeImage, nativeTheme, globalShortcut } from 'electron' +import { powerMonitor } from './background/powerMonitor' import { createProtocol } from 'vue-cli-plugin-electron-builder/lib' import backend from './bridge/backend' import DevSidecar from '@docmirror/dev-sidecar' diff --git a/packages/gui/src/background/powerMonitor.js b/packages/gui/src/background/powerMonitor.js new file mode 100644 index 0000000..e4e304c --- /dev/null +++ b/packages/gui/src/background/powerMonitor.js @@ -0,0 +1,120 @@ +import { powerMonitor as _powerMonitor } from 'electron/main' +import { createShutdownBlocker, destroyShutdownBlocker } from '@natmri/platform-napi' + +class PowerMonitor { + _listeners = [] + _shutdownCallback = null + + addListener(event, listener) { + return this.on(event, listener) + } + + removeListener(event, listener) { + return this.off(event, listener) + } + + removeAllListeners(event) { + if(event === 'shutdown' && process.platform === 'win32') { + this._listeners = [] + if(this._shutdownCallback) { + destroyShutdownBlocker() + this._shutdownCallback = null + } + } else { + return _powerMonitor.removeAllListeners(event) + } + } + + on(event, listener) { + if(event === 'shutdown' && process.platform === 'win32') { + if(!this._shutdownCallback) { + this._shutdownCallback = async () => { + await Promise.all(this._listeners.map((fn) => fn())) + destroyShutdownBlocker() + } + createShutdownBlocker("正在停止 DevSidecar 代理", this._shutdownCallback) + } + this._listeners.push(listener) + } else { + return _powerMonitor.on(event, listener) + } + } + + off(event, listener) { + if(event === 'shutdown' && process.platform === 'win32') { + this._listeners = this._listeners.filter((fn) => fn !== listener) + } else { + return _powerMonitor.off(event, listener) + } + } + + once(event, listener) { + if(event === 'shutdown' && process.platform === 'win32') { + + } else { + return _powerMonitor.once(event, listener) + } + } + + emit(event, ...args) { + return _powerMonitor.emit(event, ...args) + } + + eventNames() { + return _powerMonitor.eventNames() + } + + getMaxListeners() { + return _powerMonitor.getMaxListeners() + } + + listeners(event) { + return _powerMonitor.listeners(event) + } + + rawListeners(event) { + return _powerMonitor.rawListeners(event) + } + + listenerCount(event, listener) { + return _powerMonitor.listenerCount(event, listener) + } + + /** + * @returns {boolean} + */ + get onBatteryPower() { + return _powerMonitor.onBatteryPower + } + + /** + * @param {number} idleThreshold + * @returns {'active'|'idle'|'locked'|'unknown'} + */ + getSystemIdleState(idleThreshold) { + return _powerMonitor.getSystemIdleState(idleThreshold) + } + + /** + * @returns {number} + */ + getSystemIdleTime() { + return _powerMonitor.getSystemIdleTime() + } + + /** + * @returns {'unknown'|'nominal'|'fair'|'serious'|'critical'} + */ + getCurrentThermalState() { + return _powerMonitor.getCurrentThermalState() + } + + /** + * @returns {boolean} + */ + isOnBatteryPower() { + return _powerMonitor.isOnBatteryPower() + } +} + +export const powerMonitor = new PowerMonitor()