From dc754cbc9763b3ea6979ed55bd4e8030fe073078 Mon Sep 17 00:00:00 2001 From: Robin Krahl Date: Fri, 11 Jan 2019 01:54:49 +0000 Subject: Check DISPLAY environment variable in default_backend This patch changes the default_backend to also check the DISPLAY environment variable. If it is set, there probably is a X server running, so we try to use the zenity backend. Otherwise, the dialog backend is used. --- CHANGELOG.md | 2 +- src/backends/mod.rs | 14 ++++++++++++++ src/backends/zenity.rs | 4 ++++ src/lib.rs | 12 ++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 695a4ad..b11008c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Unreleased - Refactor `default_backend` to return a `Box`. -- Check the `DIALOG` environment variable in `default_backend`. +- Check the `DIALOG` and `DISPLAY` environment variables in `default_backend`. # v0.1.1 (2019-01-11) - Add the `Password` dialog box. diff --git a/src/backends/mod.rs b/src/backends/mod.rs index 20cb8c1..f5af7ef 100644 --- a/src/backends/mod.rs +++ b/src/backends/mod.rs @@ -7,6 +7,9 @@ mod zenity; pub use crate::backends::dialog::Dialog; pub use crate::backends::zenity::Zenity; +use std::env; +use std::path; + use crate::Result; /// A dialog backend. @@ -32,6 +35,17 @@ pub trait Backend { fn show_question(&self, question: &super::Question) -> Result; } +pub(crate) fn is_available(name: &str) -> bool { + if let Ok(path) = env::var("PATH") { + for part in path.split(":") { + if path::Path::new(part).join(name).exists() { + return true; + } + } + } + false +} + pub(crate) fn from_str(s: &str) -> Option> { match s.to_lowercase().as_ref() { "dialog" => Some(Box::new(Dialog::new())), diff --git a/src/backends/zenity.rs b/src/backends/zenity.rs index 4bf862b..0730c64 100644 --- a/src/backends/zenity.rs +++ b/src/backends/zenity.rs @@ -59,6 +59,10 @@ impl Zenity { self.timeout = Some(timeout.to_string()); } + pub(crate) fn is_available() -> bool { + super::is_available("zenity") + } + fn execute(&self, args: Vec<&str>, title: &Option) -> Result { let mut command = process::Command::new("zenity"); diff --git a/src/lib.rs b/src/lib.rs index 3a6a090..80cabb5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -341,9 +341,13 @@ impl DialogBox for Question { /// - If the `DIALOG` environment variable is set to a valid backend name, this backend is used. /// A valid backend name is the name of a struct in the `backends` module implementing the /// `Backend` trait in any case. +/// - If the `DISPLAY` environment variable is set, the first available backend from this list is +/// used: +/// - [`Zenity`][] /// - Otherwise, a [`Dialog`][] instance is returned. /// /// [`Dialog`]: backends/struct.Dialog.html +/// [`Zenity`]: backends/struct.Zenity.html pub fn default_backend() -> Box { if let Ok(backend) = env::var("DIALOG") { if let Some(backend) = backends::from_str(&backend) { @@ -351,5 +355,13 @@ pub fn default_backend() -> Box { } } + if let Ok(display) = env::var("DISPLAY") { + if !display.is_empty() { + if backends::Zenity::is_available() { + return Box::new(backends::Zenity::new()); + } + } + } + Box::new(backends::Dialog::new()) } -- cgit v1.2.1