From 8733fafb8e518340b92c50a59eb1b15bcf87012e Mon Sep 17 00:00:00 2001 From: Neko Ayaka Date: Sat, 18 Oct 2025 21:00:29 +0800 Subject: [PATCH] feat(stage-tamagotchi): port useful screen related getters from electron --- .../src/main/services/electron/index.ts | 1 + .../src/main/services/electron/screen.ts | 17 +++++++++++++ .../main/windows/main/rpc/index.electron.ts | 3 +++ .../windows/settings/rpc/index.electron.ts | 3 +++ .../{electron.d.ts => electron-renderer.d.ts} | 0 .../src/shared/electron/index.ts | 5 ++++ .../src/shared/electron/screen.ts | 21 ++++++++++++++++ apps/stage-tamagotchi/src/shared/eventa.ts | 25 ++++++------------- apps/stage-tamagotchi/tsconfig.web.json | 2 +- 9 files changed, 59 insertions(+), 18 deletions(-) create mode 100644 apps/stage-tamagotchi/src/main/services/electron/index.ts create mode 100644 apps/stage-tamagotchi/src/main/services/electron/screen.ts rename apps/stage-tamagotchi/src/renderer/{electron.d.ts => electron-renderer.d.ts} (100%) create mode 100644 apps/stage-tamagotchi/src/shared/electron/index.ts create mode 100644 apps/stage-tamagotchi/src/shared/electron/screen.ts diff --git a/apps/stage-tamagotchi/src/main/services/electron/index.ts b/apps/stage-tamagotchi/src/main/services/electron/index.ts new file mode 100644 index 000000000..1e648f4d7 --- /dev/null +++ b/apps/stage-tamagotchi/src/main/services/electron/index.ts @@ -0,0 +1 @@ +export * from './screen' diff --git a/apps/stage-tamagotchi/src/main/services/electron/screen.ts b/apps/stage-tamagotchi/src/main/services/electron/screen.ts new file mode 100644 index 000000000..91ae084f9 --- /dev/null +++ b/apps/stage-tamagotchi/src/main/services/electron/screen.ts @@ -0,0 +1,17 @@ +import type { createContext } from '@unbird/eventa/adapters/electron/main' +import type { BrowserWindow } from 'electron' + +import { defineInvokeHandler } from '@unbird/eventa' +import { screen } from 'electron' + +import { electron } from '../../../shared/eventa' + +export function createScreenService(params: { context: ReturnType['context'], window: BrowserWindow }) { + defineInvokeHandler(params.context, electron.screen.getAllDisplays, () => screen.getAllDisplays()) + defineInvokeHandler(params.context, electron.screen.getPrimaryDisplay, () => screen.getPrimaryDisplay()) + defineInvokeHandler(params.context, electron.screen.dipToScreenPoint, point => screen.dipToScreenPoint(point)) + defineInvokeHandler(params.context, electron.screen.dipToScreenRect, rect => screen.dipToScreenRect(params.window, rect)) + defineInvokeHandler(params.context, electron.screen.screenToDipPoint, point => screen.screenToDipPoint(point)) + defineInvokeHandler(params.context, electron.screen.screenToDipRect, rect => screen.screenToDipRect(params.window, rect)) + defineInvokeHandler(params.context, electron.screen.getCursorScreenPoint, () => screen.getCursorScreenPoint()) +} diff --git a/apps/stage-tamagotchi/src/main/windows/main/rpc/index.electron.ts b/apps/stage-tamagotchi/src/main/windows/main/rpc/index.electron.ts index 116cc7d1f..bea5732a0 100644 --- a/apps/stage-tamagotchi/src/main/windows/main/rpc/index.electron.ts +++ b/apps/stage-tamagotchi/src/main/windows/main/rpc/index.electron.ts @@ -5,6 +5,7 @@ import { createContext } from '@unbird/eventa/adapters/electron/main' import { ipcMain } from 'electron' import { electronOpenMainDevtools, electronOpenSettings } from '../../../../shared/eventa' +import { createScreenService } from '../../../services/electron' import { createFadeOnHoverService } from '../../../services/fade-on-hover' import { createMouseService } from '../../../services/misc/mouse' import { toggleWindowShow } from '../../shared' @@ -14,6 +15,8 @@ export function setupMainWindowElectronInvokes(params: { window: BrowserWindow, createFadeOnHoverService(context) createMouseService(context) + createScreenService({ context, window: params.window }) + defineInvokeHandler(context, electronOpenMainDevtools, () => params.window.webContents.openDevTools({ mode: 'detach' })) defineInvokeHandler(context, electronOpenSettings, async () => toggleWindowShow(await params.settingsWindow())) } diff --git a/apps/stage-tamagotchi/src/main/windows/settings/rpc/index.electron.ts b/apps/stage-tamagotchi/src/main/windows/settings/rpc/index.electron.ts index 429ca2d0d..90a7dc618 100644 --- a/apps/stage-tamagotchi/src/main/windows/settings/rpc/index.electron.ts +++ b/apps/stage-tamagotchi/src/main/windows/settings/rpc/index.electron.ts @@ -5,11 +5,14 @@ import { createContext } from '@unbird/eventa/adapters/electron/main' import { ipcMain } from 'electron' import { electronOpenSettingsDevtools } from '../../../../shared/eventa' +import { createScreenService } from '../../../services/electron' import { createFadeOnHoverService } from '../../../services/fade-on-hover' export async function setupSettingsWindowInvokes(params: { settingsWindow: BrowserWindow }) { const { context } = createContext(ipcMain, params.settingsWindow) createFadeOnHoverService(context) + createScreenService({ context, window: params.settingsWindow }) + defineInvokeHandler(context, electronOpenSettingsDevtools, async () => params.settingsWindow.webContents.openDevTools({ mode: 'detach' })) } diff --git a/apps/stage-tamagotchi/src/renderer/electron.d.ts b/apps/stage-tamagotchi/src/renderer/electron-renderer.d.ts similarity index 100% rename from apps/stage-tamagotchi/src/renderer/electron.d.ts rename to apps/stage-tamagotchi/src/renderer/electron-renderer.d.ts diff --git a/apps/stage-tamagotchi/src/shared/electron/index.ts b/apps/stage-tamagotchi/src/shared/electron/index.ts new file mode 100644 index 000000000..aa929d34b --- /dev/null +++ b/apps/stage-tamagotchi/src/shared/electron/index.ts @@ -0,0 +1,5 @@ +import { screen } from './screen' + +export const electron = { + screen, +} diff --git a/apps/stage-tamagotchi/src/shared/electron/screen.ts b/apps/stage-tamagotchi/src/shared/electron/screen.ts new file mode 100644 index 000000000..387c14822 --- /dev/null +++ b/apps/stage-tamagotchi/src/shared/electron/screen.ts @@ -0,0 +1,21 @@ +import type { Display, screen as electronScreen } from 'electron' + +import { defineInvokeEventa } from '@unbird/eventa' + +const getAllDisplays = defineInvokeEventa('eventa:invoke:electron:screen:get-all-displays') +const getPrimaryDisplay = defineInvokeEventa('eventa:invoke:electron:screen:get-primary-display') +const getCursorScreenPoint = defineInvokeEventa>('eventa:invoke:electron:screen:get-cursor-screen-point') +const dipToScreenPoint = defineInvokeEventa, Parameters[0]>('eventa:invoke:electron:screen:dip-to-screen-point') +const dipToScreenRect = defineInvokeEventa, Parameters[1]>('eventa:invoke:electron:screen:dip-to-screen-rect') +const screenToDipPoint = defineInvokeEventa, Parameters[0]>('eventa:invoke:electron:screen:screen-to-dip-point') +const screenToDipRect = defineInvokeEventa, Parameters[1]>('eventa:invoke:electron:screen:screen-to-dip-rect') + +export const screen = { + getAllDisplays, + getPrimaryDisplay, + getCursorScreenPoint, + dipToScreenPoint, + dipToScreenRect, + screenToDipPoint, + screenToDipRect, +} diff --git a/apps/stage-tamagotchi/src/shared/eventa.ts b/apps/stage-tamagotchi/src/shared/eventa.ts index 9366d68ec..3f0031f80 100644 --- a/apps/stage-tamagotchi/src/shared/eventa.ts +++ b/apps/stage-tamagotchi/src/shared/eventa.ts @@ -1,21 +1,12 @@ -import { defineEventa, defineInvokeEventa } from '@unbird/eventa' +import type { Point } from 'electron' -// TODO: currently, if we use `/shared` path, both web & node tsconfig.json -// will include, while web gets higher priority in including files, this results -// in type error for `electron` module, even for type only import, here the -// `Point` interface cannot be imported directly due to this reason. -// -// We have to find a better way (better without sub-package) to share code between -// main & preload & renderer process. -interface Point { - // Docs: https://electronjs.org/docs/api/structures/point - x: number - y: number -} +import { defineEventa, defineInvokeEventa } from '@unbird/eventa' export const electronMousePosition = defineEventa('electron:eventa:event:mouse-position') export const electronStartTrackMousePosition = defineInvokeEventa('electron:eventa:invoke:start-tracking-mouse-position') -export const electronStartDraggingWindow = defineInvokeEventa('electron:eventa:invoke:start-dragging-window') -export const electronOpenMainDevtools = defineInvokeEventa('electron:eventa:invoke:windows:main:devtools:open') -export const electronOpenSettings = defineInvokeEventa('electron:eventa:invoke:windows:settings:open') -export const electronOpenSettingsDevtools = defineInvokeEventa('electron:eventa:invoke:windows:settings:devtools:open') +export const electronStartDraggingWindow = defineInvokeEventa('electron:eventa:invoke:start-dragging-window') +export const electronOpenMainDevtools = defineInvokeEventa('electron:eventa:invoke:windows:main:devtools:open') +export const electronOpenSettings = defineInvokeEventa('electron:eventa:invoke:windows:settings:open') +export const electronOpenSettingsDevtools = defineInvokeEventa('electron:eventa:invoke:windows:settings:devtools:open') + +export { electron } from './electron' diff --git a/apps/stage-tamagotchi/tsconfig.web.json b/apps/stage-tamagotchi/tsconfig.web.json index 29afe5f46..866dbdbec 100644 --- a/apps/stage-tamagotchi/tsconfig.web.json +++ b/apps/stage-tamagotchi/tsconfig.web.json @@ -26,7 +26,7 @@ "unplugin-vue-router/client", "@types/audioworklet", "unplugin-info/client", - "./src/renderer/electron.d.ts" + "./src/renderer/electron-renderer.d.ts" ], "allowJs": true, "strict": true,