diff --git a/cosmic-settings/src/pages/desktop/window_management.rs b/cosmic-settings/src/pages/desktop/window_management.rs index 4d068940a..5e83e31e2 100644 --- a/cosmic-settings/src/pages/desktop/window_management.rs +++ b/cosmic-settings/src/pages/desktop/window_management.rs @@ -17,6 +17,7 @@ pub enum Message { SuperKey(usize), CompConfigUpdate(Box), SetFocusFollowsCursor(bool), + SetFocusFollowsCursorRaise(bool), SaveFocusFollowsCursorDelay(bool), SetFocusFollowsCursorDelay(String), SetCursorFollowsFocus(bool), @@ -32,6 +33,9 @@ pub struct Page { pub super_key_active: Option, comp_config: cosmic_config::Config, focus_follows_cursor: bool, + // Whether a window focused by the cursor is also raised. Only meaningful + // when `focus_follows_cursor` is enabled. + focus_follows_cursor_raise: bool, focus_follows_cursor_delay: u64, focus_delay_text: String, cursor_follows_focus: bool, @@ -50,6 +54,16 @@ impl Default for Page { } false }); + // Defaults to true so that turning on focus-follows-cursor keeps the + // historical "focus and raise" behaviour unless the user opts out. + let focus_follows_cursor_raise = comp_config + .get("focus_follows_cursor_raise") + .unwrap_or_else(|err| { + if err.is_err() { + error!(?err, "Failed to read config 'focus_follows_cursor_raise'"); + } + true + }); let cursor_follows_focus = comp_config .get("cursor_follows_focus") .unwrap_or_else(|err| { @@ -96,6 +110,7 @@ impl Default for Page { super_key_active: super_key_active_config(), comp_config, focus_follows_cursor, + focus_follows_cursor_raise, focus_follows_cursor_delay, focus_delay_text: format!("{focus_follows_cursor_delay}"), cursor_follows_focus, @@ -129,6 +144,15 @@ impl Page { error!(?err, "Failed to set config 'focus_follows_cursor'"); } } + Message::SetFocusFollowsCursorRaise(value) => { + self.focus_follows_cursor_raise = value; + if let Err(err) = self.comp_config.set( + "focus_follows_cursor_raise", + self.focus_follows_cursor_raise, + ) { + error!(?err, "Failed to set config 'focus_follows_cursor_raise'"); + } + } Message::SaveFocusFollowsCursorDelay(save) => { // Debounce to avoid spam writing config on user input if save { @@ -300,6 +324,7 @@ pub fn window_controls() -> Section { pub fn focus_navigation() -> Section { crate::slab!(descriptions { focus_follows_cursor = fl!("focus-navigation", "focus-follows-cursor"); + focus_follows_cursor_raise = fl!("focus-navigation", "focus-follows-cursor-raise"); focus_follows_cursor_delay = fl!("focus-navigation", "focus-follows-cursor-delay"); cursor_follows_focus = fl!("focus-navigation", "cursor-follows-focus"); }); @@ -316,6 +341,15 @@ pub fn focus_navigation() -> Section { settings::item::builder(&descriptions[focus_follows_cursor]) .toggler(page.focus_follows_cursor, Message::SetFocusFollowsCursor), ) + // Sub-option of focus-follows-cursor: only shown while + // focus-follows-cursor is on, since raising has no effect + // without follow-cursor focus. + .add_maybe(page.focus_follows_cursor.then(|| { + settings::item::builder(&descriptions[focus_follows_cursor_raise]).toggler( + page.focus_follows_cursor_raise, + Message::SetFocusFollowsCursorRaise, + ) + })) .add(settings::item( &descriptions[focus_follows_cursor_delay], widget::editable_input("", &page.focus_delay_text, false, |editing| { diff --git a/i18n/en/cosmic_settings.ftl b/i18n/en/cosmic_settings.ftl index b77f075d6..03b680636 100644 --- a/i18n/en/cosmic_settings.ftl +++ b/i18n/en/cosmic_settings.ftl @@ -508,6 +508,7 @@ window-controls = Window controls focus-navigation = Focus navigation .focus-follows-cursor = Focus follows cursor + .focus-follows-cursor-raise = Raise window on focus .focus-follows-cursor-delay = Focus follows cursor delay in ms .cursor-follows-focus = Cursor follows focus