diff --git a/cosmic-settings/src/pages/desktop/window_management.rs b/cosmic-settings/src/pages/desktop/window_management.rs index 8bd5f0b..f76d905 100644 --- a/cosmic-settings/src/pages/desktop/window_management.rs +++ b/cosmic-settings/src/pages/desktop/window_management.rs @@ -12,19 +12,43 @@ use cosmic_settings_page::Section; use cosmic_settings_page::{self as page, section}; use slab::Slab; use slotmap::SlotMap; +use tracing::error; #[derive(Copy, Clone, Debug)] pub enum Message { SuperKey(usize), + SetFocusFollowsCursor(bool), + SetCursorFollowsFocus(bool), } pub struct Page { pub super_key_selections: Vec, pub super_key_active: Option, + comp_config: cosmic_config::Config, + focus_follows_cursor: bool, + cursor_follows_focus: bool, } impl Default for Page { fn default() -> Self { + let comp_config = cosmic_config::Config::new("com.system76.CosmicComp", 1).unwrap(); + let focus_follows_cursor = comp_config + .get("focus_follows_cursor") + .unwrap_or_else(|err| { + if !matches!(err, cosmic_config::Error::NoConfigDirectory) { + error!(?err, "Failed to read config 'focus_follows_cursor'"); + } + false + }); + let cursor_follows_focus = comp_config + .get("cursor_follows_focus") + .unwrap_or_else(|err| { + if !matches!(err, cosmic_config::Error::NoConfigDirectory) { + error!(?err, "Failed to read config 'cursor_follows_focus'"); + } + false + }); + Page { super_key_selections: vec![ fl!("super-key", "launcher"), @@ -32,6 +56,9 @@ impl Default for Page { fl!("super-key", "applications"), ], super_key_active: super_key_active_config(), + comp_config, + focus_follows_cursor, + cursor_follows_focus, } } } @@ -50,6 +77,24 @@ impl Page { self.super_key_active = Some(id); super_key_set(action); } + Message::SetFocusFollowsCursor(value) => { + self.focus_follows_cursor = value; + if let Err(err) = self + .comp_config + .set("focus_follows_cursor", &self.focus_follows_cursor) + { + error!(?err, "Failed to set config 'focus_follows_cursor'"); + } + } + Message::SetCursorFollowsFocus(value) => { + self.cursor_follows_focus = value; + if let Err(err) = self + .comp_config + .set("cursor_follows_focus", &self.cursor_follows_focus) + { + error!(?err, "Failed to set config 'cursor_follows_focus'"); + } + } } } } @@ -63,6 +108,7 @@ impl page::Page for Page { Some(vec![ sections.insert(super_key_action()), sections.insert(window_controls()), + sections.insert(focus_navigation()), ]) } @@ -141,6 +187,40 @@ pub fn window_controls() -> Section { }) } +pub fn focus_navigation() -> Section { + let mut descriptions = Slab::new(); + + let focus_follows_cursor = descriptions.insert(fl!("focus-navigation", "focus-follows-cursor")); + let cursor_follows_focus = descriptions.insert(fl!("focus-navigation", "cursor-follows-focus")); + + Section::default() + .title(fl!("focus-navigation")) + .descriptions(descriptions) + .view::(move |_binder, page, section| { + let descriptions = §ion.descriptions; + + settings::view_section(§ion.title) + .add(settings::item( + &descriptions[focus_follows_cursor], + toggler( + None, + page.focus_follows_cursor, + Message::SetFocusFollowsCursor, + ), + )) + .add(settings::item( + &descriptions[cursor_follows_focus], + toggler( + None, + page.cursor_follows_focus, + Message::SetCursorFollowsFocus, + ), + )) + .apply(Element::from) + .map(crate::pages::Message::WindowManagement) + }) +} + fn super_key_active_config() -> Option { let super_binding = Binding::new(shortcuts::Modifiers::new().logo(), None); diff --git a/cosmic-settings/src/pages/display/mod.rs b/cosmic-settings/src/pages/display/mod.rs index 2adb5b0..1683b95 100644 --- a/cosmic-settings/src/pages/display/mod.rs +++ b/cosmic-settings/src/pages/display/mod.rs @@ -1164,6 +1164,7 @@ pub fn legacy_applications() -> Section { Some(page.comp_config_descale_xwayland), Message::SetXwaylandDescaling, ) + .width(Length::Fill) .into()])) .add(widget::settings::item_row(vec![widget::radio( widget::column() @@ -1173,6 +1174,7 @@ pub fn legacy_applications() -> Section { Some(page.comp_config_descale_xwayland), Message::SetXwaylandDescaling, ) + .width(Length::Fill) .into()])) .apply(Element::from) .map(crate::pages::Message::Displays) diff --git a/cosmic-settings/src/pages/input/keyboard/mod.rs b/cosmic-settings/src/pages/input/keyboard/mod.rs index dd2140c..cafaa0a 100644 --- a/cosmic-settings/src/pages/input/keyboard/mod.rs +++ b/cosmic-settings/src/pages/input/keyboard/mod.rs @@ -162,7 +162,7 @@ fn popover_menu(id: DefaultKey) -> cosmic::Element<'static, Message> { SourceContext::MoveDown, ) .into(), - cosmic::widget::divider::horizontal::light().into(), + cosmic::widget::divider::horizontal::default().into(), popover_menu_row( id, fl!("keyboard-sources", "settings"), @@ -177,6 +177,7 @@ fn popover_menu(id: DefaultKey) -> cosmic::Element<'static, Message> { .into(), popover_menu_row(id, fl!("keyboard-sources", "remove"), SourceContext::Remove).into(), ]) + .padding(8) .width(Length::Shrink) .height(Length::Shrink) .apply(cosmic::widget::container) diff --git a/i18n/en/cosmic_settings.ftl b/i18n/en/cosmic_settings.ftl index ea1c402..b076311 100644 --- a/i18n/en/cosmic_settings.ftl +++ b/i18n/en/cosmic_settings.ftl @@ -182,6 +182,10 @@ window-controls = Window Controls .maximize = Show maximize button .minimize = Show minimize button +focus-navigation = Focus Navigation + .focus-follows-cursor = Focus follows cursor + .cursor-follows-focus = Cursor follows focus + ## Desktop: Workspaces workspaces = Workspaces