fix(electrobun): native folder picker via zenity — proper dark theme + folder mode

- Uses zenity --file-selection --directory for proper GTK folder chooser
  (correct "Select Project Folder" title, dirs sorted first, dark theme)
- Falls back to Electrobun Utils.openFileDialog if zenity unavailable
- RPC timeout increased to 120s (native dialogs block until user closes)
- zenity respects system GTK theme + color-scheme prefer-dark
This commit is contained in:
Hibryda 2026-03-22 12:19:19 +01:00
parent 41d5cc3c12
commit d444e8aecd

View file

@ -105,7 +105,7 @@ const gitHandlers = createGitHandlers();
// ── RPC definition ─────────────────────────────────────────────────────────
const rpc = BrowserView.defineRPC<PtyRPCSchema>({
maxRequestTime: 15_000,
maxRequestTime: 120_000, // 2 min — native dialogs block until user closes
handlers: {
requests: {
// PTY
@ -128,17 +128,30 @@ const rpc = BrowserView.defineRPC<PtyRPCSchema>({
// Git
...gitHandlers,
// Native folder picker dialog
// Native folder picker dialog via zenity (proper GTK folder chooser)
"files.pickDirectory": async ({ startingFolder }) => {
try {
const paths = await Utils.openFileDialog({
startingFolder: startingFolder || "~/",
canChooseFiles: false,
canChooseDirectory: true,
allowsMultipleSelection: false,
});
return { path: paths?.[0] ?? null };
} catch { return { path: null }; }
const { execSync } = await import("child_process");
const start = startingFolder?.replace(/^~/, process.env.HOME || "/home") || process.env.HOME || "/home";
// zenity --file-selection --directory gives a proper "Select Folder" dialog
// with dark theme support, dirs sorted first, and correct title
const result = execSync(
`zenity --file-selection --directory --title="Select Project Folder" --filename="${start}/"`,
{ encoding: "utf-8", timeout: 120_000 }
).trim();
return { path: result || null };
} catch {
// User cancelled or zenity not found — try Electrobun fallback
try {
const paths = await Utils.openFileDialog({
startingFolder: startingFolder || "~/",
canChooseFiles: false,
canChooseDirectory: true,
allowsMultipleSelection: false,
});
return { path: paths?.[0] ?? null };
} catch { return { path: null }; }
}
},
// Home directory