From 58401c8b6d5f6795d29276756da0718ef3a60137 Mon Sep 17 00:00:00 2001 From: Neko Ayaka Date: Mon, 30 Mar 2026 03:27:47 +0800 Subject: [PATCH] feat(stage-tamagotchi): lock screen and unlock screen api --- .../src/main/services/electron/index.ts | 2 +- .../main/services/electron/powerMonitor.ts | 23 +++++++++++++++++++ .../src/main/windows/shared/window.ts | 4 +++- .../electron-eventa/src/electron/index.ts | 5 ++++ .../src/electron/powerMonitor.ts | 13 +++++++++++ packages/electron-eventa/src/index.ts | 2 +- 6 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 apps/stage-tamagotchi/src/main/services/electron/powerMonitor.ts create mode 100644 packages/electron-eventa/src/electron/powerMonitor.ts diff --git a/apps/stage-tamagotchi/src/main/services/electron/index.ts b/apps/stage-tamagotchi/src/main/services/electron/index.ts index 5a413509d..6b58098a7 100644 --- a/apps/stage-tamagotchi/src/main/services/electron/index.ts +++ b/apps/stage-tamagotchi/src/main/services/electron/index.ts @@ -1,5 +1,5 @@ export * from './app' export * from './auto-updater' +export * from './powerMonitor' export * from './screen' - export * from './window' diff --git a/apps/stage-tamagotchi/src/main/services/electron/powerMonitor.ts b/apps/stage-tamagotchi/src/main/services/electron/powerMonitor.ts new file mode 100644 index 000000000..46e36c6bb --- /dev/null +++ b/apps/stage-tamagotchi/src/main/services/electron/powerMonitor.ts @@ -0,0 +1,23 @@ +import type EventEmitter from 'node:events' + +import type { createContext } from '@moeru/eventa/adapters/electron/main' +import type { BrowserWindow } from 'electron' + +import { electronEvents } from '@proj-airi/electron-eventa' +import { powerMonitor } from 'electron' + +import { onAppBeforeQuit } from '../../libs/bootkit/lifecycle' + +export function createPowerMonitorService(params: { context: ReturnType['context'], window: BrowserWindow }) { + function onOff(eventEmitter: EM, event: E, listener: Parameters[1]) { + eventEmitter.on(event, listener) + onAppBeforeQuit(() => { + eventEmitter.off(event, listener) + }) + } + + onOff(powerMonitor, 'suspend', () => params.context.emit(electronEvents.powerMonitor.suspended, undefined)) + onOff(powerMonitor, 'resume', () => params.context.emit(electronEvents.powerMonitor.resumed, undefined)) + onOff(powerMonitor, 'lock-screen', () => params.context.emit(electronEvents.powerMonitor.lockScreen, undefined)) + onOff(powerMonitor, 'unlock-screen', () => params.context.emit(electronEvents.powerMonitor.unlockScreen, undefined)) +} diff --git a/apps/stage-tamagotchi/src/main/windows/shared/window.ts b/apps/stage-tamagotchi/src/main/windows/shared/window.ts index 74902e57a..e8b92058a 100644 --- a/apps/stage-tamagotchi/src/main/windows/shared/window.ts +++ b/apps/stage-tamagotchi/src/main/windows/shared/window.ts @@ -10,7 +10,7 @@ import { isMacOS } from 'std-env' import { createServerChannelService } from '../../services/airi/channel-server' import { createI18nService } from '../../services/airi/i18n' -import { createAppService, createScreenService, createWindowService } from '../../services/electron' +import { createAppService, createPowerMonitorService, createScreenService, createWindowService } from '../../services/electron' export function toggleWindowShow(window?: BrowserWindow | null): void { if (!window) { @@ -99,6 +99,8 @@ export async function setupBaseWindowElectronInvokes(params: { createScreenService({ context: params.context, window: params.window }) createWindowService({ context: params.context, window: params.window }) createAppService({ context: params.context, window: params.window }) + createPowerMonitorService({ context: params.context, window: params.window }) + await createI18nService({ context: params.context, window: params.window, i18n: params.i18n }) createServerChannelService({ serverChannel: params.serverChannel }) diff --git a/packages/electron-eventa/src/electron/index.ts b/packages/electron-eventa/src/electron/index.ts index 6657e13b5..69d754961 100644 --- a/packages/electron-eventa/src/electron/index.ts +++ b/packages/electron-eventa/src/electron/index.ts @@ -1,4 +1,5 @@ import { app } from './app' +import { powerMonitorEvents } from './powerMonitor' import { screen } from './screen' import { systemPreferences } from './system-preferences' import { window } from './window' @@ -13,3 +14,7 @@ export const electron = { systemPreferences, app, } + +export const electronEvents = { + powerMonitor: powerMonitorEvents, +} diff --git a/packages/electron-eventa/src/electron/powerMonitor.ts b/packages/electron-eventa/src/electron/powerMonitor.ts new file mode 100644 index 000000000..901ec4769 --- /dev/null +++ b/packages/electron-eventa/src/electron/powerMonitor.ts @@ -0,0 +1,13 @@ +import { defineEventa } from '@moeru/eventa' + +const eventSuspended = defineEventa('eventa:event:electron:app:suspended') +const eventResumed = defineEventa('eventa:event:electron:app:resumed') +const eventLockScreen = defineEventa('eventa:event:electron:app:lock-screen') +const eventUnlockScreen = defineEventa('eventa:event:electron:app:unlock-screen') + +export const powerMonitorEvents = { + lockScreen: eventLockScreen, + resumed: eventResumed, + suspended: eventSuspended, + unlockScreen: eventUnlockScreen, +} diff --git a/packages/electron-eventa/src/index.ts b/packages/electron-eventa/src/index.ts index a10f48a0f..0b162b674 100644 --- a/packages/electron-eventa/src/index.ts +++ b/packages/electron-eventa/src/index.ts @@ -9,4 +9,4 @@ export type { ResizeDirection, VibrancyType, } from './electron/index' -export { electron } from './electron/index' +export { electron, electronEvents } from './electron/index'