From 10de2465dd7cef49443a0895c7e445d762b75e6d Mon Sep 17 00:00:00 2001 From: starknt <1431880400@qq.com> Date: Fri, 18 Oct 2024 07:10:51 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Windows=E6=93=8D=E4=BD=9C=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=EF=BC=8C=E5=BC=80=E7=9D=80DS=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E9=87=8D=E5=90=AF=E7=94=B5=E8=84=91=E5=90=8E=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E4=B8=8A=E7=BD=91=E7=9A=84=E9=97=AE=E9=A2=98=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=20#109?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/gui/package.json | 3 +- packages/gui/src/background.js | 3 +- packages/gui/src/background/powerMonitor.js | 120 ++++++++++++++++++++ 3 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 packages/gui/src/background/powerMonitor.js 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()