fix(electrobun): remove all -webkit-app-region, use JS window drag on AGOR title

This commit is contained in:
Hibryda 2026-03-20 06:50:47 +01:00
parent fe441a86fe
commit 03e1f18282
6 changed files with 73 additions and 22 deletions

View file

@ -232246,6 +232246,14 @@ var rpc = BrowserView.defineRPC({
return { x: 0, y: 0, width: 1400, height: 900 };
}
},
"window.setPosition": ({ x, y }) => {
try {
mainWindow.setPosition(x, y);
return { ok: true };
} catch {
return { ok: false };
}
},
"keybindings.getAll": () => {
try {
return { keybindings: settingsDb.getKeybindings() };

View file

@ -4,8 +4,8 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Svelte App</title>
<script type="module" crossorigin src="/assets/index-OTfWrRGk.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DsPvEluY.css">
<script type="module" crossorigin src="/assets/index-DyX_7OUK.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-CYr5v29h.css">
</head>
<body>
<div id="app"></div>

View file

@ -308,6 +308,15 @@ const rpc = BrowserView.defineRPC<PtyRPCSchema>({
}
},
"window.setPosition": ({ x, y }: { x: number; y: number }) => {
try {
mainWindow.setPosition(x, y);
return { ok: true };
} catch {
return { ok: false };
}
},
// ── Keybinding handlers ──────────────────────────────────────────────
"keybindings.getAll": () => {

View file

@ -205,6 +205,39 @@
return () => clearInterval(id);
});
// ── JS-based window drag (replaces broken -webkit-app-region on WebKitGTK) ──
let isDraggingWindow = false;
let dragStartX = 0;
let dragStartY = 0;
let winStartX = 0;
let winStartY = 0;
function onDragStart(e: MouseEvent) {
isDraggingWindow = true;
dragStartX = e.screenX;
dragStartY = e.screenY;
appRpc?.request["window.getFrame"]({}).then((frame: any) => {
winStartX = frame.x;
winStartY = frame.y;
}).catch(() => {});
window.addEventListener('mousemove', onDragMove);
window.addEventListener('mouseup', onDragEnd);
}
function onDragMove(e: MouseEvent) {
if (!isDraggingWindow) return;
const dx = e.screenX - dragStartX;
const dy = e.screenY - dragStartY;
appRpc?.request["window.setPosition"]?.({ x: winStartX + dx, y: winStartY + dy })?.catch?.(() => {});
}
function onDragEnd() {
isDraggingWindow = false;
window.removeEventListener('mousemove', onDragMove);
window.removeEventListener('mouseup', onDragEnd);
saveWindowFrame();
}
// ── Window frame persistence (debounced 500ms) ─────────────────
let frameSaveTimer: ReturnType<typeof setTimeout> | null = null;
function saveWindowFrame() {
@ -275,7 +308,8 @@
<!-- Left sidebar icon rail -->
<aside class="sidebar" role="navigation" aria-label="Primary navigation">
<!-- AGOR vertical title -->
<div class="agor-title" aria-hidden="true">AGOR</div>
<!-- svelte-ignore a11y_no_static_element_interactions -->
<div class="agor-title" aria-hidden="true" onmousedown={onDragStart}>AGOR</div>
<!-- Group icons — numbered circles -->
<div class="sidebar-groups" role="list" aria-label="Project groups">
@ -512,7 +546,7 @@
padding: 1rem 0;
user-select: none;
flex-shrink: 0;
-webkit-app-region: drag; /* Only AGOR title is draggable — safe, small area */
/* NO -webkit-app-region — broken on WebKitGTK (captures all clicks in window) */
cursor: grab;
}
@ -695,7 +729,7 @@
transition: background 0.12s, color 0.12s;
padding: 0;
font-family: var(--ui-font-family);
-webkit-app-region: no-drag;
/* no-drag not needed — all -webkit-app-region removed */
}
.wc-btn:hover { background: var(--ctp-surface0); color: var(--ctp-text); }