diff --git a/ac-electron/main.js b/ac-electron/main.js index ab3a4f031..785341aad 100644 --- a/ac-electron/main.js +++ b/ac-electron/main.js @@ -872,6 +872,14 @@ ipcMain.on('pty-resize', (event, cols, rows) => { } }); +// Global window move handler (for alt+scroll drag in any window) +ipcMain.on('move-window', (event, position) => { + const senderWindow = BrowserWindow.fromWebContents(event.sender); + if (senderWindow) { + senderWindow.setPosition(Math.round(position.x), Math.round(position.y)); + } +}); + ipcMain.handle('switch-mode', async (event, mode) => { // In multi-window mode, we open a new window instead of switching if (mode === 'development') { diff --git a/ac-electron/preload.js b/ac-electron/preload.js index 3a1b0c130..ff1ffb2bc 100644 --- a/ac-electron/preload.js +++ b/ac-electron/preload.js @@ -47,6 +47,9 @@ try { ipcRenderer.on('status', (event, message) => callback(message)); }, + // Window controls + moveWindow: (x, y) => ipcRenderer.send('move-window', { x, y }), + // Platform info platform: process.platform, }); diff --git a/ac-electron/renderer/development.html b/ac-electron/renderer/development.html index e5e2f00bb..e15b3d258 100644 --- a/ac-electron/renderer/development.html +++ b/ac-electron/renderer/development.html @@ -1080,6 +1080,19 @@ webview.src = acUrl('starfield'); } }, 100); + + // ========== Alt + Scroll to Drag Window ========== + document.addEventListener('wheel', (e) => { + // Alt + scroll (two-finger drag with alt) moves the window + if (e.altKey) { + e.preventDefault(); + const currentX = window.screenX; + const currentY = window.screenY; + const newX = currentX - e.deltaX; + const newY = currentY - e.deltaY; + ipcRenderer.send('move-window', { x: Math.round(newX), y: Math.round(newY) }); + } + }, { passive: false }); \ No newline at end of file diff --git a/ac-electron/renderer/flip-view.html b/ac-electron/renderer/flip-view.html index 8d9c800dc..33c3c55dd 100644 --- a/ac-electron/renderer/flip-view.html +++ b/ac-electron/renderer/flip-view.html @@ -552,6 +552,27 @@ document.addEventListener('mouseup', onMouseUp); }); }); + + // ========== Alt + Scroll to Drag Window ========== + let scrollDragActive = false; + let scrollDragStart = { x: 0, y: 0 }; + + document.addEventListener('wheel', (e) => { + // Alt + scroll (two-finger drag with alt) moves the window + if (e.altKey) { + e.preventDefault(); + + // Use deltaX and deltaY to move window + const currentX = window.screenX; + const currentY = window.screenY; + + // Invert and scale the delta for natural dragging feel + const newX = currentX - e.deltaX; + const newY = currentY - e.deltaY; + + ipcRenderer.send('move-window', { x: Math.round(newX), y: Math.round(newY) }); + } + }, { passive: false }); diff --git a/ac-electron/renderer/production.html b/ac-electron/renderer/production.html index 8e3aa5b72..812173e74 100644 --- a/ac-electron/renderer/production.html +++ b/ac-electron/renderer/production.html @@ -46,6 +46,19 @@ webview.openDevTools(); } }); + + // ========== Alt + Scroll to Drag Window ========== + document.addEventListener('wheel', (e) => { + // Alt + scroll (two-finger drag with alt) moves the window + if (e.altKey && window.ac?.moveWindow) { + e.preventDefault(); + const currentX = window.screenX; + const currentY = window.screenY; + const newX = currentX - e.deltaX; + const newY = currentY - e.deltaY; + window.ac.moveWindow(Math.round(newX), Math.round(newY)); + } + }, { passive: false });