diff --git a/Cargo.lock b/Cargo.lock index 0ebf91f..17b066e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1730,6 +1730,7 @@ dependencies = [ "udev", "upower_dbus", "url", + "which", "xkb-data", "xkeysym", "zbus 5.13.2", @@ -2398,6 +2399,12 @@ dependencies = [ "syn 2.0.114", ] +[[package]] +name = "env_home" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe" + [[package]] name = "equator" version = "0.4.2" @@ -8424,6 +8431,17 @@ dependencies = [ "web-sys", ] +[[package]] +name = "which" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fabb953106c3c8eea8306e4393700d7657561cb43122571b172bbfb7c7ba1d" +dependencies = [ + "env_home", + "rustix 1.1.3", + "winsafe", +] + [[package]] name = "widestring" version = "1.2.1" @@ -9072,6 +9090,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "winsafe" +version = "0.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" + [[package]] name = "wit-bindgen" version = "0.46.0" diff --git a/cosmic-settings/Cargo.toml b/cosmic-settings/Cargo.toml index aec1602..566982c 100644 --- a/cosmic-settings/Cargo.toml +++ b/cosmic-settings/Cargo.toml @@ -92,6 +92,7 @@ gettext-rs = { version = "0.7.7", features = [ ], optional = true } num-traits = "0.2" pwhash = "1" +which = "8.0.0" [dependencies.icu] version = "2.1.1" diff --git a/cosmic-settings/src/pages/time/region.rs b/cosmic-settings/src/pages/time/region.rs index 8359845..e170192 100644 --- a/cosmic-settings/src/pages/time/region.rs +++ b/cosmic-settings/src/pages/time/region.rs @@ -26,6 +26,8 @@ use icu::{ use locales_rs as locale; use slotmap::{DefaultKey, SlotMap}; +static GNOME_LANGUAGE_SELECTOR: &str = "gnome-language-selector"; + #[derive(Clone, Debug)] pub enum Message { AddLanguage(DefaultKey), @@ -99,6 +101,7 @@ pub struct PageRefresh { region: Option, available_languages: SlotMap, system_locales: BTreeMap, + language_selector_available: bool, } #[derive(Default)] @@ -113,6 +116,8 @@ pub struct Page { registry: Option, expanded_source_popover: Option, add_language_search: String, + /// Whether gnome-language-selector is in the path. + language_selector_available: bool, /// Cached LC_NUMERIC locale in icu locale format. numeric_locale: Option, /// Cached LC_TIME locale in icu locale format. @@ -165,22 +170,27 @@ impl page::Page for Page { .on_clear(Message::AddLanguageSearch(String::new())) .apply(Element::from) .map(crate::pages::Message::from); - let install_additional_button = - widget::button::standard(fl!("install-additional-languages")) - .on_press(Message::InstallAdditionalLanguages) - .apply(widget::container) - .width(Length::Fill) - .align_x(Alignment::End) - .apply(Element::from) - .map(crate::pages::Message::from); - - context_drawer( + let drawer = context_drawer( self.add_language_view().map(crate::pages::Message::from), crate::pages::Message::CloseContextDrawer, ) .title(fl!("add-language", "context")) - .header(search) - .footer(install_additional_button) + .header(search); + + if self.language_selector_available { + let install_additional_button = + widget::button::standard(fl!("install-additional-languages")) + .on_press(Message::InstallAdditionalLanguages) + .apply(widget::container) + .width(Length::Fill) + .align_x(Alignment::End) + .apply(Element::from) + .map(crate::pages::Message::from); + + drawer.footer(install_additional_button) + } else { + drawer + } } ContextView::Region => { let search = widget::search_input("", &self.add_language_search) @@ -259,7 +269,7 @@ impl Page { Message::InstallAdditionalLanguages => { return cosmic::task::future(async move { - _ = tokio::process::Command::new("gnome-language-selector") + _ = tokio::process::Command::new(GNOME_LANGUAGE_SELECTOR) .status() .await; @@ -275,6 +285,7 @@ impl Page { self.language = page_refresh.language; self.region = page_refresh.region; self.registry = Some(page_refresh.registry.0); + self.language_selector_available = page_refresh.language_selector_available; self.numeric_locale = self.icu_locale_from_env("LC_NUMERIC"); self.time_locale = self.icu_locale_from_env("LC_TIME"); } @@ -765,6 +776,8 @@ pub async fn page_reload() -> eyre::Result { available_languages.insert(language); } + let language_selector_available = which::which(GNOME_LANGUAGE_SELECTOR).is_ok(); + Ok(PageRefresh { config, registry: Registry(registry), @@ -772,6 +785,7 @@ pub async fn page_reload() -> eyre::Result { region, available_languages, system_locales, + language_selector_available, }) }