blocking_dialog/linux/
pick_directory.rs1use super::is_kdialog_available;
5use crate::{BlockingDialogError, BlockingPickDirectoryDialog};
6use raw_window_handle::HasWindowHandle;
7use std::path::PathBuf;
8use std::process::Command;
9
10impl<'a, W: HasWindowHandle> BlockingPickDirectoryDialog<'a, W> {
11 pub fn show(&self) -> Result<Option<PathBuf>, BlockingDialogError> {
12 if is_kdialog_available() {
13 let output = Command::new("kdialog")
14 .args(["--title", self.title, "--getexistingdirectory"])
15 .output()?;
16
17 let stdout = String::from_utf8_lossy(&output.stdout);
18 let trimmed = stdout.trim();
19
20 if trimmed.is_empty() {
21 Ok(None)
22 } else {
23 Ok(Some(PathBuf::from(trimmed)))
24 }
25 } else {
26 let output = Command::new("zenity")
27 .args(["--file-selection", "--directory", "--title", self.title])
28 .output()?;
29
30 let stdout = String::from_utf8_lossy(&output.stdout);
31 let trimmed = stdout.trim();
32
33 if trimmed.is_empty() {
34 Ok(None)
35 } else {
36 Ok(Some(PathBuf::from(trimmed)))
37 }
38 }
39 }
40}