delete movementmanager dependency in shortcutsservice

This commit is contained in:
sanio 2025-07-15 14:59:14 +09:00
parent c0cf74273a
commit 698473007a
3 changed files with 28 additions and 22 deletions

View File

@ -8,13 +8,11 @@ class ShortcutsService {
constructor() { constructor() {
this.lastVisibleWindows = new Set(['header']); this.lastVisibleWindows = new Set(['header']);
this.mouseEventsIgnored = false; this.mouseEventsIgnored = false;
this.movementManager = null;
this.windowPool = null; this.windowPool = null;
this.allWindowVisibility = true; this.allWindowVisibility = true;
} }
initialize(movementManager, windowPool) { initialize(windowPool) {
this.movementManager = movementManager;
this.windowPool = windowPool; this.windowPool = windowPool;
internalBridge.on('reregister-shortcuts', () => { internalBridge.on('reregister-shortcuts', () => {
console.log('[ShortcutsService] Reregistering shortcuts due to header state change.'); console.log('[ShortcutsService] Reregistering shortcuts due to header state change.');
@ -138,7 +136,7 @@ class ShortcutsService {
} }
async registerShortcuts(registerOnlyToggleVisibility = false) { async registerShortcuts(registerOnlyToggleVisibility = false) {
if (!this.movementManager || !this.windowPool) { if (!this.windowPool) {
console.error('[Shortcuts] Service not initialized. Cannot register shortcuts.'); console.error('[Shortcuts] Service not initialized. Cannot register shortcuts.');
return; return;
} }
@ -179,7 +177,7 @@ class ShortcutsService {
if (displays.length > 1) { if (displays.length > 1) {
displays.forEach((display, index) => { displays.forEach((display, index) => {
const key = `${modifier}+Shift+${index + 1}`; const key = `${modifier}+Shift+${index + 1}`;
globalShortcut.register(key, () => this.movementManager.moveToDisplay(display.id)); globalShortcut.register(key, () => internalBridge.emit('window:moveToDisplay', { displayId: display.id }));
}); });
} }
@ -190,7 +188,7 @@ class ShortcutsService {
]; ];
edgeDirections.forEach(({ key, direction }) => { edgeDirections.forEach(({ key, direction }) => {
globalShortcut.register(key, () => { globalShortcut.register(key, () => {
if (header && header.isVisible()) this.movementManager.moveToEdge(direction); if (header && header.isVisible()) internalBridge.emit('window:moveToEdge', { direction });
}); });
}); });
@ -232,16 +230,16 @@ class ShortcutsService {
}; };
break; break;
case 'moveUp': case 'moveUp':
callback = () => { if (header && header.isVisible()) this.movementManager.moveStep('up'); }; callback = () => { if (header && header.isVisible()) internalBridge.emit('window:moveStep', { direction: 'up' }); };
break; break;
case 'moveDown': case 'moveDown':
callback = () => { if (header && header.isVisible()) this.movementManager.moveStep('down'); }; callback = () => { if (header && header.isVisible()) internalBridge.emit('window:moveStep', { direction: 'down' }); };
break; break;
case 'moveLeft': case 'moveLeft':
callback = () => { if (header && header.isVisible()) this.movementManager.moveStep('left'); }; callback = () => { if (header && header.isVisible()) internalBridge.emit('window:moveStep', { direction: 'left' }); };
break; break;
case 'moveRight': case 'moveRight':
callback = () => { if (header && header.isVisible()) this.movementManager.moveStep('right'); }; callback = () => { if (header && header.isVisible()) internalBridge.emit('window:moveStep', { direction: 'right' }); };
break; break;
case 'toggleClickThrough': case 'toggleClickThrough':
callback = () => { callback = () => {

View File

@ -171,6 +171,7 @@ export class ShortcutSettingsView extends LitElement {
async handleSave() { async handleSave() {
if (!window.api) return; if (!window.api) return;
this.feedback = {};
const result = await window.api.shortcutSettingsView.saveShortcuts(this.shortcuts); const result = await window.api.shortcutSettingsView.saveShortcuts(this.shortcuts);
if (!result.success) { if (!result.success) {
alert('Failed to save shortcuts: ' + result.error); alert('Failed to save shortcuts: ' + result.error);
@ -179,6 +180,7 @@ export class ShortcutSettingsView extends LitElement {
handleClose() { handleClose() {
if (!window.api) return; if (!window.api) return;
this.feedback = {};
window.api.shortcutSettingsView.closeShortcutSettingsWindow(); window.api.shortcutSettingsView.closeShortcutSettingsWindow();
} }

View File

@ -30,8 +30,6 @@ if (shouldUseLiquidGlass) {
let isContentProtectionOn = true; let isContentProtectionOn = true;
let lastVisibleWindows = new Set(['header']); let lastVisibleWindows = new Set(['header']);
const HEADER_HEIGHT = 47;
const DEFAULT_WINDOW_WIDTH = 353;
let currentHeaderState = 'apikey'; let currentHeaderState = 'apikey';
const windowPool = new Map(); const windowPool = new Map();
@ -47,22 +45,18 @@ function updateLayout() {
} }
let movementManager = null; let movementManager = null;
const FADE_DURATION = 250;
const FADE_FPS = 60;
/** /**
* 윈도우 투명도를 서서히 변경한다.
* @param {BrowserWindow} win * @param {BrowserWindow} win
* @param {number} from * @param {number} from
* @param {number} to * @param {number} to
* @param {number} duration * @param {number} duration
* @param {Function=} onComplete * @param {Function=} onComplete
*/ */
function fadeWindow(win, from, to, duration = FADE_DURATION, onComplete) { function fadeWindow(win, from, to, duration = 250, onComplete) {
if (!win || win.isDestroyed()) return; if (!win || win.isDestroyed()) return;
const steps = Math.max(1, Math.round(duration / (1000 / FADE_FPS))); const FPS = 60;
const steps = Math.max(1, Math.round(duration / (1000 / FPS)));
let currentStep = 0; let currentStep = 0;
win.setOpacity(from); win.setOpacity(from);
@ -83,7 +77,7 @@ function fadeWindow(win, from, to, duration = FADE_DURATION, onComplete) {
win.setOpacity(to); win.setOpacity(to);
onComplete && onComplete(); onComplete && onComplete();
} }
}, 1000 / FADE_FPS); }, 1000 / FPS);
} }
const showSettingsWindow = () => { const showSettingsWindow = () => {
@ -106,6 +100,15 @@ function setupWindowController(windowPool, layoutManager, movementManager) {
internalBridge.on('window:requestToggleAllWindowsVisibility', ({ targetVisibility }) => { internalBridge.on('window:requestToggleAllWindowsVisibility', ({ targetVisibility }) => {
changeAllWindowsVisibility(windowPool, targetVisibility); changeAllWindowsVisibility(windowPool, targetVisibility);
}); });
internalBridge.on('window:moveToDisplay', ({ displayId }) => {
movementManager.moveToDisplay(displayId);
});
internalBridge.on('window:moveToEdge', ({ direction }) => {
movementManager.moveToEdge(direction);
});
internalBridge.on('window:moveStep', ({ direction }) => {
movementManager.moveStep(direction);
});
} }
function changeAllWindowsVisibility(windowPool, targetVisibility) { function changeAllWindowsVisibility(windowPool, targetVisibility) {
@ -302,7 +305,7 @@ async function handleWindowVisibilityRequest(windowPool, layoutManager, movement
} else { } else {
const currentBounds = win.getBounds(); const currentBounds = win.getBounds();
fadeWindow( fadeWindow(
win, 1, 0, FADE_DURATION, win, 1, 0, undefined,
() => win.hide() () => win.hide()
); );
if (name === 'listen') { if (name === 'listen') {
@ -625,6 +628,9 @@ function getDisplayById(displayId) {
function createWindows() { function createWindows() {
const HEADER_HEIGHT = 47;
const DEFAULT_WINDOW_WIDTH = 353;
const primaryDisplay = screen.getPrimaryDisplay(); const primaryDisplay = screen.getPrimaryDisplay();
const { y: workAreaY, width: screenWidth } = primaryDisplay.workArea; const { y: workAreaY, width: screenWidth } = primaryDisplay.workArea;
@ -685,7 +691,7 @@ function createWindows() {
layoutManager = new WindowLayoutManager(windowPool); layoutManager = new WindowLayoutManager(windowPool);
header.webContents.once('dom-ready', () => { header.webContents.once('dom-ready', () => {
shortcutsService.initialize(movementManager, windowPool); shortcutsService.initialize(windowPool);
shortcutsService.registerShortcuts(); shortcutsService.registerShortcuts();
}); });