diff --git a/cosmic-settings/src/pages/applications/legacy_applications.rs b/cosmic-settings/src/pages/applications/legacy_applications.rs index 27dd52f..a84a57a 100644 --- a/cosmic-settings/src/pages/applications/legacy_applications.rs +++ b/cosmic-settings/src/pages/applications/legacy_applications.rs @@ -7,6 +7,7 @@ use cosmic::{ iced::Length, widget::{self, text}, }; +use cosmic_comp_config::{EavesdroppingKeyboardMode, XwaylandEavesdropping}; use cosmic_settings_page::Section; use cosmic_settings_page::{self as page, section}; use slab::Slab; @@ -16,11 +17,14 @@ use tracing::error; #[derive(Clone, Debug)] pub enum Message { SetXwaylandDescaling(bool), + SetXwaylandKeyboardMode(EavesdroppingKeyboardMode), + SetXwaylandMouseButtonMode(bool), } pub struct Page { comp_config: cosmic_config::Config, comp_config_descale_xwayland: bool, + comp_config_xwayland_eavesdropping: XwaylandEavesdropping, } impl Default for Page { @@ -34,9 +38,20 @@ impl Default for Page { false }); + let comp_config_xwayland_eavesdropping = comp_config + .get("xwayland_eavesdropping") + .unwrap_or_else(|err| { + if err.is_err() { + error!(?err, "Failed to read config 'xwayland_eavesdropping'"); + } + + Default::default() + }); + Self { comp_config, comp_config_descale_xwayland, + comp_config_xwayland_eavesdropping, } } } @@ -46,10 +61,10 @@ impl page::Page for Page { &self, sections: &mut SlotMap>, ) -> Option { - Some(vec![sections.insert( - // Xwayland scaling options - legacy_application_scaling(), - )]) + Some(vec![ + sections.insert(legacy_application_global_shortcuts()), + sections.insert(legacy_application_scaling()), + ]) } fn info(&self) -> page::Info { @@ -76,10 +91,104 @@ impl Page { error!(?err, "Failed to set config 'descale_xwayland'"); } } + Message::SetXwaylandKeyboardMode(mode) => { + self.comp_config_xwayland_eavesdropping.keyboard = mode; + if let Err(err) = self.comp_config.set( + "xwayland_eavesdropping", + self.comp_config_xwayland_eavesdropping, + ) { + error!(?err, "Failed to set config 'xwayland_eavesdropping'"); + } + } + Message::SetXwaylandMouseButtonMode(mode) => { + self.comp_config_xwayland_eavesdropping.pointer = mode; + if let Err(err) = self.comp_config.set( + "xwayland_eavesdropping", + self.comp_config_xwayland_eavesdropping, + ) { + error!(?err, "Failed to set config 'xwayland_eavesdropping'"); + } + } } } } +pub fn legacy_application_global_shortcuts() -> Section { + let mut descriptions = Slab::new(); + + let desc = descriptions.insert(fl!("legacy-app-global-shortcuts", "desc")); + let none = descriptions.insert(fl!("legacy-app-global-shortcuts", "none")); + let modifiers = descriptions.insert(fl!("legacy-app-global-shortcuts", "modifiers")); + let combination = descriptions.insert(fl!("legacy-app-global-shortcuts", "combination")); + let all = descriptions.insert(fl!("legacy-app-global-shortcuts", "all")); + let mouse = descriptions.insert(fl!("legacy-app-global-shortcuts", "mouse")); + + Section::default() + .title(fl!("legacy-app-global-shortcuts")) + .descriptions(descriptions) + .view::(move |_binder, page, section| { + let title = widget::text::body(§ion.title).font(cosmic::font::bold()); + let description = widget::text::body(§ion.descriptions[desc]); + + let content = widget::settings::section() + .add(widget::settings::item_row(vec![ + widget::radio( + text::body(§ion.descriptions[none]), + EavesdroppingKeyboardMode::None, + Some(page.comp_config_xwayland_eavesdropping.keyboard), + Message::SetXwaylandKeyboardMode, + ) + .width(Length::Fill) + .into(), + ])) + .add(widget::settings::item_row(vec![ + widget::radio( + text::body(§ion.descriptions[modifiers]), + EavesdroppingKeyboardMode::Modifiers, + Some(page.comp_config_xwayland_eavesdropping.keyboard), + Message::SetXwaylandKeyboardMode, + ) + .width(Length::Fill) + .into(), + ])) + .add(widget::settings::item_row(vec![ + widget::radio( + text::body(§ion.descriptions[combination]), + EavesdroppingKeyboardMode::Combinations, + Some(page.comp_config_xwayland_eavesdropping.keyboard), + Message::SetXwaylandKeyboardMode, + ) + .width(Length::Fill) + .into(), + ])) + .add(widget::settings::item_row(vec![ + widget::radio( + text::body(§ion.descriptions[all]), + EavesdroppingKeyboardMode::All, + Some(page.comp_config_xwayland_eavesdropping.keyboard), + Message::SetXwaylandKeyboardMode, + ) + .width(Length::Fill) + .into(), + ])) + .add(widget::settings::item( + §ion.descriptions[mouse], + widget::toggler(page.comp_config_xwayland_eavesdropping.pointer) + .on_toggle(Message::SetXwaylandMouseButtonMode), + )) + .apply(Element::from) + .map(crate::pages::Message::LegacyApplications); + + widget::column::with_capacity(3) + .push(title) + .push(description) + .push(content) + .spacing(cosmic::theme::active().cosmic().spacing.space_xxs) + .apply(cosmic::Element::from) + .map(Into::into) + }) +} + pub fn legacy_application_scaling() -> Section { let mut descriptions = Slab::new(); diff --git a/i18n/en/cosmic_settings.ftl b/i18n/en/cosmic_settings.ftl index e4e489e..31235e6 100644 --- a/i18n/en/cosmic_settings.ftl +++ b/i18n/en/cosmic_settings.ftl @@ -825,6 +825,14 @@ startup-apps = Startup Applications legacy-applications = X11 Applications Compatibility .desc = X11 Window system application scaling and Global shortcuts. +legacy-app-global-shortcuts = Global Shortcuts in X11 Applications + .desc = Global shortcuts allows keystrokes and mouse button events performed in applications to be recognized by other applications for features like push-to-talk or push-to-mute. By default, this is disabled in X11 applications to ensure other applications can’t monitor for keyboard and mouse events containing sensitive information. + .none = No keys + .modifiers = Modifiers (Super, Shift, Control, Alt) + .combination = All keys while modifiers Super, Control or Alt are being pressed + .all = All keys + .mouse = Mouse button events in X11 applications + legacy-app-scaling = X11 Window System Application Scaling .scaled-by-system = Scale all X11 Applications .system-description = X11 applications will appear blurry on HiDPI screens.