Files
2026-06-19 18:45:55 +08:00

98 lines
2.8 KiB
TypeScript

import {screen} from "electron";
type PositionCache = {
x: 0;
y: 0;
screenWidth: 0;
screenHeight: 0;
id: -1;
};
export const AppPosition = {
caches: {} as Record<string, PositionCache>,
getCache(name: string): PositionCache {
if (!this.caches[name]) {
this.caches[name] = {
x: 0,
y: 0,
screenWidth: 0,
screenHeight: 0,
id: -1,
};
}
return this.caches[name];
},
get(
name: string,
calculator?: (
screenX: number,
screenY: number,
screenWidth: number,
screenHeight: number
) => {
x: number;
y: number;
}
): {
x: number;
y: number;
} {
const cache = this.getCache(name);
const {x, y} = screen.getCursorScreenPoint();
const currentDisplay = screen.getDisplayNearestPoint({x, y});
if (cache.id !== currentDisplay.id) {
cache.id = currentDisplay.id;
cache.screenWidth = currentDisplay.workArea.width;
cache.screenHeight = currentDisplay.workArea.height;
if (!calculator) {
calculator = (screenX: number, screenY: number, screenWidth: number, screenHeight: number) => {
// console.log('calculator', {screenX, screenY, screenWidth, screenHeight});
return {
x: screenX + screenWidth / 10,
y: screenY + screenHeight / 10,
};
};
}
const res = calculator(
currentDisplay.workArea.x,
currentDisplay.workArea.y,
cache.screenWidth,
cache.screenHeight
);
cache.x = parseInt(String(res.x));
cache.y = parseInt(String(res.y));
}
return {
x: cache.x,
y: cache.y,
};
},
set(name: string, x: number, y: number): void {
const cache = this.getCache(name);
cache.x = x;
cache.y = y;
},
getContextMenuPosition(
boxWidth: number,
boxHeight: number
): {
x: number;
y: number;
} {
const {x, y} = screen.getCursorScreenPoint();
const currentDisplay = screen.getDisplayNearestPoint({x, y});
let resultX = x;
let resultY = y;
if (currentDisplay.workArea.width - x < boxWidth) {
resultX = currentDisplay.workArea.width - boxWidth;
}
if (currentDisplay.workArea.height - y < boxHeight) {
resultY = currentDisplay.workArea.height - boxHeight;
}
return {
x: resultX,
y: resultY,
};
},
};