Skip to main content

blocking_dialog/linux/
pick_files.rs

1// SPDX-FileCopyrightText: 2026 Manuel Quarneti <mq1@ik.me>
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4use crate::{BlockingDialogError, BlockingPickFilesDialog};
5use std::path::PathBuf;
6use std::process::Command;
7
8fn parse_multi_select(raw: &str) -> Vec<PathBuf> {
9    raw.split('|').map(PathBuf::from).collect()
10}
11
12impl<'a> BlockingPickFilesDialog<'a> {
13    pub fn show(&self) -> Result<Vec<PathBuf>, BlockingDialogError> {
14        let mut args = vec!["--file-selection", "--title", self.title];
15
16        if self.multiple {
17            args.push("--multiple");
18        }
19
20        let output = Command::new("zenity").args(args).output()?;
21        let stdout = String::from_utf8_lossy(&output.stdout);
22        let trimmed = stdout.trim();
23
24        if trimmed.is_empty() {
25            Ok(Vec::new())
26        } else {
27            Ok(parse_multi_select(trimmed))
28        }
29    }
30}