feat(electrobun): native GTK drag/resize via gtk_window_begin_resize_drag

- gtk-window.ts: FFI wrapper calling libgtk-3.so.0 directly via bun:ffi
- begin_resize_drag: delegates resize to window manager (zero CPU, smooth)
- begin_move_drag: delegates move to window manager (replaces JS drag)
- Removed all JavaScript-based drag/resize logic (no mousemove/mouseup)
- RPC: window.beginResize + window.beginMove
- Resize handles: 4px edges + 8px corners with proper cursors
This commit is contained in:
Hibryda 2026-03-25 02:23:24 +01:00
parent 48d32f6f28
commit 9da9d96ebd
4 changed files with 149 additions and 72 deletions

View file

@ -108,6 +108,24 @@ const rpc = BrowserView.defineRPC<PtyRPCSchema>({
...providerHandlers,
...miscHandlers,
// GTK native drag/resize — delegates to window manager (zero CPU)
"window.beginResize": ({ edge, button, rootX, rootY }: { edge: string; button: number; rootX: number; rootY: number }) => {
try {
const { beginResizeDrag, edgeStringToGdk } = require("./gtk-window.ts");
const gdkEdge = edgeStringToGdk(edge);
if (gdkEdge === null) return { ok: false, error: `Unknown edge: ${edge}` };
const ok = beginResizeDrag((mainWindow as any).ptr, gdkEdge, button, rootX, rootY);
return { ok };
} catch (err) { console.error("[window.beginResize]", err); return { ok: false }; }
},
"window.beginMove": ({ button, rootX, rootY }: { button: number; rootX: number; rootY: number }) => {
try {
const { beginMoveDrag } = require("./gtk-window.ts");
const ok = beginMoveDrag((mainWindow as any).ptr, button, rootX, rootY);
return { ok };
} catch (err) { console.error("[window.beginMove]", err); return { ok: false }; }
},
// Window controls — need mainWindow closure, stay inline
"window.minimize": () => { try { mainWindow.minimize(); return { ok: true }; } catch (err) { console.error("[window.minimize]", err); return { ok: false }; } },
"window.maximize": () => {