feat(electrobun): custom window chrome — no title bar, sidebar drag, edge resize

- titleBarStyle: "hidden" removes native GTK decoration
- Sidebar + right-bar: mousedown starts window drag (skips buttons)
- 8 resize handles (N/S/E/W + 4 corners) with 4px hot zones
- window.setFrame RPC for atomic position+size updates
- Min window size: 600x400
- Cursor feedback: grab on sidebars, directional resize on edges
- Frame persisted to SQLite on drag/resize end (debounced)
This commit is contained in:
Hibryda 2026-03-25 01:52:17 +01:00
parent 1de6c93e01
commit 31338ad949
2 changed files with 106 additions and 5 deletions

View file

@ -120,6 +120,9 @@ const rpc = BrowserView.defineRPC<PtyRPCSchema>({
"window.close": () => { try { mainWindow.close(); return { ok: true }; } catch (err) { console.error("[window.close]", err); return { ok: false }; } },
"window.getFrame": () => { try { return mainWindow.getFrame(); } catch { return { x: 0, y: 0, width: 1400, height: 900 }; } },
"window.setPosition": ({ x, y }: { x: number; y: number }) => { try { mainWindow.setPosition(x, y); return { ok: true }; } catch { return { ok: false }; } },
"window.setFrame": ({ x, y, width, height }: { x: number; y: number; width: number; height: number }) => {
try { mainWindow.setFrame({ x, y, width, height }); return { ok: true }; } catch { return { ok: false }; }
},
},
messages: {},
},
@ -181,7 +184,7 @@ const savedHeight = Number(settingsDb.getSetting("win_height") ?? 900);
mainWindow = new BrowserWindow({
title: "Agent Orchestrator",
titleBarStyle: "default",
titleBarStyle: "hidden",
url,
rpc,
frame: {