feat(window_management): focus follows cursor delay
This commit is contained in:
parent
0c5645e6f1
commit
d035ba0cf7
2 changed files with 49 additions and 1 deletions
|
|
@ -2,6 +2,7 @@
|
||||||
// SPDX-License-Identifier: GPL-3.0-only
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
use cosmic::{
|
use cosmic::{
|
||||||
|
iced::Length,
|
||||||
widget::{self, settings, toggler},
|
widget::{self, settings, toggler},
|
||||||
Apply, Element,
|
Apply, Element,
|
||||||
};
|
};
|
||||||
|
|
@ -14,10 +15,12 @@ use slab::Slab;
|
||||||
use slotmap::SlotMap;
|
use slotmap::SlotMap;
|
||||||
use tracing::error;
|
use tracing::error;
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum Message {
|
pub enum Message {
|
||||||
SuperKey(usize),
|
SuperKey(usize),
|
||||||
SetFocusFollowsCursor(bool),
|
SetFocusFollowsCursor(bool),
|
||||||
|
SaveFocusFollowsCursorDelay(bool),
|
||||||
|
SetFocusFollowsCursorDelay(String),
|
||||||
SetCursorFollowsFocus(bool),
|
SetCursorFollowsFocus(bool),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -26,6 +29,8 @@ pub struct Page {
|
||||||
pub super_key_active: Option<usize>,
|
pub super_key_active: Option<usize>,
|
||||||
comp_config: cosmic_config::Config,
|
comp_config: cosmic_config::Config,
|
||||||
focus_follows_cursor: bool,
|
focus_follows_cursor: bool,
|
||||||
|
focus_follows_cursor_delay: u64,
|
||||||
|
focus_delay_text: String,
|
||||||
cursor_follows_focus: bool,
|
cursor_follows_focus: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -49,6 +54,15 @@ impl Default for Page {
|
||||||
false
|
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 {
|
Page {
|
||||||
super_key_selections: vec![
|
super_key_selections: vec![
|
||||||
fl!("super-key", "launcher"),
|
fl!("super-key", "launcher"),
|
||||||
|
|
@ -59,6 +73,8 @@ impl Default for Page {
|
||||||
super_key_active: super_key_active_config(),
|
super_key_active: super_key_active_config(),
|
||||||
comp_config,
|
comp_config,
|
||||||
focus_follows_cursor,
|
focus_follows_cursor,
|
||||||
|
focus_follows_cursor_delay,
|
||||||
|
focus_delay_text: format!("{focus_follows_cursor_delay}"),
|
||||||
cursor_follows_focus,
|
cursor_follows_focus,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -88,6 +104,25 @@ impl Page {
|
||||||
error!(?err, "Failed to set config 'focus_follows_cursor'");
|
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) => {
|
Message::SetCursorFollowsFocus(value) => {
|
||||||
self.cursor_follows_focus = value;
|
self.cursor_follows_focus = value;
|
||||||
if let Err(err) = self
|
if let Err(err) = self
|
||||||
|
|
@ -194,6 +229,8 @@ pub fn focus_navigation() -> Section<crate::pages::Message> {
|
||||||
let mut descriptions = Slab::new();
|
let mut descriptions = Slab::new();
|
||||||
|
|
||||||
let focus_follows_cursor = descriptions.insert(fl!("focus-navigation", "focus-follows-cursor"));
|
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"));
|
let cursor_follows_focus = descriptions.insert(fl!("focus-navigation", "cursor-follows-focus"));
|
||||||
|
|
||||||
Section::default()
|
Section::default()
|
||||||
|
|
@ -211,6 +248,16 @@ pub fn focus_navigation() -> Section<crate::pages::Message> {
|
||||||
Message::SetFocusFollowsCursor,
|
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(
|
.add(settings::item(
|
||||||
&descriptions[cursor_follows_focus],
|
&descriptions[cursor_follows_focus],
|
||||||
toggler(
|
toggler(
|
||||||
|
|
|
||||||
|
|
@ -185,6 +185,7 @@ window-controls = Window Controls
|
||||||
|
|
||||||
focus-navigation = Focus Navigation
|
focus-navigation = Focus Navigation
|
||||||
.focus-follows-cursor = Focus follows cursor
|
.focus-follows-cursor = Focus follows cursor
|
||||||
|
.focus-follows-cursor-delay = Focus follows cursor delay in ms
|
||||||
.cursor-follows-focus = Cursor follows focus
|
.cursor-follows-focus = Cursor follows focus
|
||||||
|
|
||||||
## Desktop: Workspaces
|
## Desktop: Workspaces
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue