feat(stage-tamagotchi): port useful screen related getters from electron

This commit is contained in:
Neko Ayaka
2025-10-18 21:00:29 +08:00
parent ac90e2e976
commit 8733fafb8e
9 changed files with 59 additions and 18 deletions
@@ -0,0 +1 @@
export * from './screen'
@@ -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<typeof createContext>['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())
}
@@ -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()))
}
@@ -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' }))
}
@@ -0,0 +1,5 @@
import { screen } from './screen'
export const electron = {
screen,
}
@@ -0,0 +1,21 @@
import type { Display, screen as electronScreen } from 'electron'
import { defineInvokeEventa } from '@unbird/eventa'
const getAllDisplays = defineInvokeEventa<Display[]>('eventa:invoke:electron:screen:get-all-displays')
const getPrimaryDisplay = defineInvokeEventa<Display>('eventa:invoke:electron:screen:get-primary-display')
const getCursorScreenPoint = defineInvokeEventa<ReturnType<typeof electronScreen.getCursorScreenPoint>>('eventa:invoke:electron:screen:get-cursor-screen-point')
const dipToScreenPoint = defineInvokeEventa<ReturnType<typeof electronScreen.dipToScreenPoint>, Parameters<typeof electronScreen.dipToScreenPoint>[0]>('eventa:invoke:electron:screen:dip-to-screen-point')
const dipToScreenRect = defineInvokeEventa<ReturnType<typeof electronScreen.dipToScreenRect>, Parameters<typeof electronScreen.dipToScreenRect>[1]>('eventa:invoke:electron:screen:dip-to-screen-rect')
const screenToDipPoint = defineInvokeEventa<ReturnType<typeof electronScreen.screenToDipPoint>, Parameters<typeof electronScreen.screenToDipPoint>[0]>('eventa:invoke:electron:screen:screen-to-dip-point')
const screenToDipRect = defineInvokeEventa<ReturnType<typeof electronScreen.screenToDipRect>, Parameters<typeof electronScreen.screenToDipRect>[1]>('eventa:invoke:electron:screen:screen-to-dip-rect')
export const screen = {
getAllDisplays,
getPrimaryDisplay,
getCursorScreenPoint,
dipToScreenPoint,
dipToScreenRect,
screenToDipPoint,
screenToDipRect,
}
+8 -17
View File
@@ -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<Point>('electron:eventa:event:mouse-position')
export const electronStartTrackMousePosition = defineInvokeEventa('electron:eventa:invoke:start-tracking-mouse-position')
export const electronStartDraggingWindow = defineInvokeEventa<void, void>('electron:eventa:invoke:start-dragging-window')
export const electronOpenMainDevtools = defineInvokeEventa<void, void>('electron:eventa:invoke:windows:main:devtools:open')
export const electronOpenSettings = defineInvokeEventa<void, void>('electron:eventa:invoke:windows:settings:open')
export const electronOpenSettingsDevtools = defineInvokeEventa<void, void>('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'
+1 -1
View File
@@ -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,