Skip to main content

blocking_dialog/linux/
pick_directory.rs

1// SPDX-FileCopyrightText: 2026 Manuel Quarneti <mq1@ik.me>
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4use 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}