Skip to content

Commit 8733faf

Browse files
committed
feat(stage-tamagotchi): port useful screen related getters from electron
1 parent ac90e2e commit 8733faf

File tree

9 files changed

+59
-18
lines changed

9 files changed

+59
-18
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './screen'
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { createContext } from '@unbird/eventa/adapters/electron/main'
2+
import type { BrowserWindow } from 'electron'
3+
4+
import { defineInvokeHandler } from '@unbird/eventa'
5+
import { screen } from 'electron'
6+
7+
import { electron } from '../../../shared/eventa'
8+
9+
export function createScreenService(params: { context: ReturnType<typeof createContext>['context'], window: BrowserWindow }) {
10+
defineInvokeHandler(params.context, electron.screen.getAllDisplays, () => screen.getAllDisplays())
11+
defineInvokeHandler(params.context, electron.screen.getPrimaryDisplay, () => screen.getPrimaryDisplay())
12+
defineInvokeHandler(params.context, electron.screen.dipToScreenPoint, point => screen.dipToScreenPoint(point))
13+
defineInvokeHandler(params.context, electron.screen.dipToScreenRect, rect => screen.dipToScreenRect(params.window, rect))
14+
defineInvokeHandler(params.context, electron.screen.screenToDipPoint, point => screen.screenToDipPoint(point))
15+
defineInvokeHandler(params.context, electron.screen.screenToDipRect, rect => screen.screenToDipRect(params.window, rect))
16+
defineInvokeHandler(params.context, electron.screen.getCursorScreenPoint, () => screen.getCursorScreenPoint())
17+
}

apps/stage-tamagotchi/src/main/windows/main/rpc/index.electron.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { createContext } from '@unbird/eventa/adapters/electron/main'
55
import { ipcMain } from 'electron'
66

77
import { electronOpenMainDevtools, electronOpenSettings } from '../../../../shared/eventa'
8+
import { createScreenService } from '../../../services/electron'
89
import { createFadeOnHoverService } from '../../../services/fade-on-hover'
910
import { createMouseService } from '../../../services/misc/mouse'
1011
import { toggleWindowShow } from '../../shared'
@@ -14,6 +15,8 @@ export function setupMainWindowElectronInvokes(params: { window: BrowserWindow,
1415

1516
createFadeOnHoverService(context)
1617
createMouseService(context)
18+
createScreenService({ context, window: params.window })
19+
1720
defineInvokeHandler(context, electronOpenMainDevtools, () => params.window.webContents.openDevTools({ mode: 'detach' }))
1821
defineInvokeHandler(context, electronOpenSettings, async () => toggleWindowShow(await params.settingsWindow()))
1922
}

apps/stage-tamagotchi/src/main/windows/settings/rpc/index.electron.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@ import { createContext } from '@unbird/eventa/adapters/electron/main'
55
import { ipcMain } from 'electron'
66

77
import { electronOpenSettingsDevtools } from '../../../../shared/eventa'
8+
import { createScreenService } from '../../../services/electron'
89
import { createFadeOnHoverService } from '../../../services/fade-on-hover'
910

1011
export async function setupSettingsWindowInvokes(params: { settingsWindow: BrowserWindow }) {
1112
const { context } = createContext(ipcMain, params.settingsWindow)
1213

1314
createFadeOnHoverService(context)
15+
createScreenService({ context, window: params.settingsWindow })
16+
1417
defineInvokeHandler(context, electronOpenSettingsDevtools, async () => params.settingsWindow.webContents.openDevTools({ mode: 'detach' }))
1518
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { screen } from './screen'
2+
3+
export const electron = {
4+
screen,
5+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import type { Display, screen as electronScreen } from 'electron'
2+
3+
import { defineInvokeEventa } from '@unbird/eventa'
4+
5+
const getAllDisplays = defineInvokeEventa<Display[]>('eventa:invoke:electron:screen:get-all-displays')
6+
const getPrimaryDisplay = defineInvokeEventa<Display>('eventa:invoke:electron:screen:get-primary-display')
7+
const getCursorScreenPoint = defineInvokeEventa<ReturnType<typeof electronScreen.getCursorScreenPoint>>('eventa:invoke:electron:screen:get-cursor-screen-point')
8+
const dipToScreenPoint = defineInvokeEventa<ReturnType<typeof electronScreen.dipToScreenPoint>, Parameters<typeof electronScreen.dipToScreenPoint>[0]>('eventa:invoke:electron:screen:dip-to-screen-point')
9+
const dipToScreenRect = defineInvokeEventa<ReturnType<typeof electronScreen.dipToScreenRect>, Parameters<typeof electronScreen.dipToScreenRect>[1]>('eventa:invoke:electron:screen:dip-to-screen-rect')
10+
const screenToDipPoint = defineInvokeEventa<ReturnType<typeof electronScreen.screenToDipPoint>, Parameters<typeof electronScreen.screenToDipPoint>[0]>('eventa:invoke:electron:screen:screen-to-dip-point')
11+
const screenToDipRect = defineInvokeEventa<ReturnType<typeof electronScreen.screenToDipRect>, Parameters<typeof electronScreen.screenToDipRect>[1]>('eventa:invoke:electron:screen:screen-to-dip-rect')
12+
13+
export const screen = {
14+
getAllDisplays,
15+
getPrimaryDisplay,
16+
getCursorScreenPoint,
17+
dipToScreenPoint,
18+
dipToScreenRect,
19+
screenToDipPoint,
20+
screenToDipRect,
21+
}
Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,12 @@
1-
import { defineEventa, defineInvokeEventa } from '@unbird/eventa'
1+
import type { Point } from 'electron'
22

3-
// TODO: currently, if we use `/shared` path, both web & node tsconfig.json
4-
// will include, while web gets higher priority in including files, this results
5-
// in type error for `electron` module, even for type only import, here the
6-
// `Point` interface cannot be imported directly due to this reason.
7-
//
8-
// We have to find a better way (better without sub-package) to share code between
9-
// main & preload & renderer process.
10-
interface Point {
11-
// Docs: https://electronjs.org/docs/api/structures/point
12-
x: number
13-
y: number
14-
}
3+
import { defineEventa, defineInvokeEventa } from '@unbird/eventa'
154

165
export const electronMousePosition = defineEventa<Point>('electron:eventa:event:mouse-position')
176
export const electronStartTrackMousePosition = defineInvokeEventa('electron:eventa:invoke:start-tracking-mouse-position')
18-
export const electronStartDraggingWindow = defineInvokeEventa<void, void>('electron:eventa:invoke:start-dragging-window')
19-
export const electronOpenMainDevtools = defineInvokeEventa<void, void>('electron:eventa:invoke:windows:main:devtools:open')
20-
export const electronOpenSettings = defineInvokeEventa<void, void>('electron:eventa:invoke:windows:settings:open')
21-
export const electronOpenSettingsDevtools = defineInvokeEventa<void, void>('electron:eventa:invoke:windows:settings:devtools:open')
7+
export const electronStartDraggingWindow = defineInvokeEventa('electron:eventa:invoke:start-dragging-window')
8+
export const electronOpenMainDevtools = defineInvokeEventa('electron:eventa:invoke:windows:main:devtools:open')
9+
export const electronOpenSettings = defineInvokeEventa('electron:eventa:invoke:windows:settings:open')
10+
export const electronOpenSettingsDevtools = defineInvokeEventa('electron:eventa:invoke:windows:settings:devtools:open')
11+
12+
export { electron } from './electron'

apps/stage-tamagotchi/tsconfig.web.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"unplugin-vue-router/client",
2727
"@types/audioworklet",
2828
"unplugin-info/client",
29-
"./src/renderer/electron.d.ts"
29+
"./src/renderer/electron-renderer.d.ts"
3030
],
3131
"allowJs": true,
3232
"strict": true,

0 commit comments

Comments
 (0)