From d035ba0cf73c15a47f159adf76642945be1696a2 Mon Sep 17 00:00:00 2001 From: Joshua Megnauth <48846352+joshuamegnauth54@users.noreply.github.com> Date: Fri, 13 Sep 2024 19:24:03 +0000 Subject: [PATCH] feat(window_management): focus follows cursor delay --- .../src/pages/desktop/window_management.rs | 49 ++++++++++++++++++- i18n/en/cosmic_settings.ftl | 1 + 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/cosmic-settings/src/pages/desktop/window_management.rs b/cosmic-settings/src/pages/desktop/window_management.rs index bcb31aa..9fdd971 100644 --- a/cosmic-settings/src/pages/desktop/window_management.rs +++ b/cosmic-settings/src/pages/desktop/window_management.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-only use cosmic::{ + iced::Length, widget::{self, settings, toggler}, Apply, Element, }; @@ -14,10 +15,12 @@ use slab::Slab; use slotmap::SlotMap; use tracing::error; -#[derive(Copy, Clone, Debug)] +#[derive(Clone, Debug)] pub enum Message { SuperKey(usize), SetFocusFollowsCursor(bool), + SaveFocusFollowsCursorDelay(bool), + SetFocusFollowsCursorDelay(String), SetCursorFollowsFocus(bool), } @@ -26,6 +29,8 @@ pub struct Page { pub super_key_active: Option, comp_config: cosmic_config::Config, focus_follows_cursor: bool, + focus_follows_cursor_delay: u64, + focus_delay_text: String, cursor_follows_focus: bool, } @@ -49,6 +54,15 @@ impl Default for Page { false }); + let focus_follows_cursor_delay = comp_config + .get("focus_follows_cursor_delay") + .inspect_err(|err| { + if !matches!(err, cosmic_config::Error::NoConfigDirectory) { + error!(?err, "Failed to read config 'focus_follows_cursor_delay'") + } + }) + .unwrap_or(250); + Page { super_key_selections: vec![ fl!("super-key", "launcher"), @@ -59,6 +73,8 @@ impl Default for Page { super_key_active: super_key_active_config(), comp_config, focus_follows_cursor, + focus_follows_cursor_delay, + focus_delay_text: format!("{focus_follows_cursor_delay}"), cursor_follows_focus, } } @@ -88,6 +104,25 @@ impl Page { error!(?err, "Failed to set config 'focus_follows_cursor'"); } } + Message::SaveFocusFollowsCursorDelay(save) => { + // Debounce to avoid spam writing config on user input + if save { + if let Err(err) = self.comp_config.set( + "focus_follows_cursor_delay", + self.focus_follows_cursor_delay, + ) { + error!(?err, "Failed to set config 'focus_follows_cursor_delay'"); + } + + self.focus_delay_text = format!("{}", self.focus_follows_cursor_delay); + } + } + Message::SetFocusFollowsCursorDelay(value) => { + if let Ok(delay) = value.parse() { + self.focus_follows_cursor_delay = delay; + } + self.focus_delay_text = value; + } Message::SetCursorFollowsFocus(value) => { self.cursor_follows_focus = value; if let Err(err) = self @@ -194,6 +229,8 @@ pub fn focus_navigation() -> Section { let mut descriptions = Slab::new(); let focus_follows_cursor = descriptions.insert(fl!("focus-navigation", "focus-follows-cursor")); + let focus_follows_cursor_delay = + descriptions.insert(fl!("focus-navigation", "focus-follows-cursor-delay")); let cursor_follows_focus = descriptions.insert(fl!("focus-navigation", "cursor-follows-focus")); Section::default() @@ -211,6 +248,16 @@ pub fn focus_navigation() -> Section { Message::SetFocusFollowsCursor, ), )) + .add(settings::item( + &descriptions[focus_follows_cursor_delay], + widget::editable_input("", &page.focus_delay_text, false, |editing| { + Message::SaveFocusFollowsCursorDelay(!editing) + }) + .select_on_focus(true) + .on_input(Message::SetFocusFollowsCursorDelay) + .on_submit(Message::SaveFocusFollowsCursorDelay(true)) + .width(Length::Fixed(80.0)), + )) .add(settings::item( &descriptions[cursor_follows_focus], toggler( diff --git a/i18n/en/cosmic_settings.ftl b/i18n/en/cosmic_settings.ftl index aa86eaf..b64d034 100644 --- a/i18n/en/cosmic_settings.ftl +++ b/i18n/en/cosmic_settings.ftl @@ -185,6 +185,7 @@ window-controls = Window Controls focus-navigation = Focus Navigation .focus-follows-cursor = Focus follows cursor + .focus-follows-cursor-delay = Focus follows cursor delay in ms .cursor-follows-focus = Cursor follows focus ## Desktop: Workspaces