use std::error::Error;
use std::process::Command;
pub fn open(url: &str) -> Result<(), Box<dyn Error>> {
match guess_desktop_env() {
"kde" => run("kde-open", vec![url]).or_else(|_| run("kde-open5", vec![url])),
"gnome" => run("gio", vec!["open", url])
.or_else(|_| run("gvfs-open", vec![url]))
.or_else(|_| run("gnome-open", vec![url])),
"mate" => run("gio", vec!["open", url])
.or_else(|_| run("gvfs-open", vec![url]))
.or_else(|_| run("mate-open", vec![url])),
"xfce" => run("exo-open", vec![url])
.or_else(|_| run("gio", vec!["open", url]))
.or_else(|_| run("gvfs-open", vec![url])),
_ => run("xdg-open", vec![url]),
}?;
Ok(())
}
fn guess_desktop_env() -> &'static str {
let unknown = "unknown";
let xcd: String = std::env::var("XDG_CURRENT_DESKTOP")
.unwrap_or_else(|_| unknown.into())
.to_ascii_lowercase();
let dsession: String = std::env::var("DESKTOP_SESSION")
.unwrap_or_else(|_| unknown.into())
.to_ascii_lowercase();
if xcd.contains("gnome") || xcd.contains("cinnamon") || dsession.contains("gnome") {
"gnome"
} else if xcd.contains("kde")
|| std::env::var("KDE_FULL_SESSION").is_ok()
|| std::env::var("KDE_SESSION_VERSION").is_ok()
{
"kde"
} else if xcd.contains("mate") || dsession.contains("mate") {
"mate"
} else if xcd.contains("xfce") || dsession.contains("xfce") {
"xfce"
} else {
unknown
}
}
fn run(handler: &str, options: Vec<&str>) -> Result<(), Box<dyn Error>> {
Command::new(handler).args(options).spawn()?;
Ok(())
}