From 69b5c3148f7c91027d9b16209404f0c6d29a1938 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Fri, 1 Sep 2023 15:17:47 -0700 Subject: [PATCH] input: Use `cosmic-config`/`cosmic-comp-config` for mouse settings Double click speed is not handled currently. That requires toolkit support. --- Cargo.lock | 2 +- Cargo.toml | 1 - app/src/pages/input/mod.rs | 85 +++++++++++++++++++++++++++--------- app/src/pages/input/mouse.rs | 53 +++++++++++++++++----- 4 files changed, 107 insertions(+), 34 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bc4b83e..ce96342 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -735,7 +735,7 @@ dependencies = [ [[package]] name = "cosmic-comp-config" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-comp?branch=cosmic-comp-config#7955b16bd56122d021b762153e86dd90158d18e2" +source = "git+https://github.com/pop-os/cosmic-comp#1392fc7c953678a14825ba3d1e5619d38c1946c7" dependencies = [ "input", "serde", diff --git a/Cargo.toml b/Cargo.toml index d8b5b7a..6199186 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,6 @@ git = "https://github.com/pop-os/cosmic-bg" [workspace.dependencies.cosmic-comp-config] git = "https://github.com/pop-os/cosmic-comp" -branch = "cosmic-comp-config" # path = "../cosmic-comp/cosmic-comp-config" [workspace.dependencies.cosmic-panel-config] diff --git a/app/src/pages/input/mod.rs b/app/src/pages/input/mod.rs index c2b66a2..a73b5f0 100644 --- a/app/src/pages/input/mod.rs +++ b/app/src/pages/input/mod.rs @@ -5,7 +5,10 @@ use cosmic::{ iced_sctk::commands, iced_widget::core::layout, }; -use cosmic_comp_config::XkbConfig; +use cosmic_comp_config::{ + input::{AccelProfile, InputConfig}, + XkbConfig, +}; use cosmic_settings_page as page; use itertools::Itertools; use tracing::error; @@ -17,9 +20,9 @@ mod mouse; pub enum Message { SetAcceleration(bool), SetNaturalScroll(bool), - SetScrollSpeed(u32), + SetScrollFactor(f64), SetDoubleClickSpeed(u32), - SetMouseSpeed(u32), + SetMouseSpeed(f64), PrimaryButtonSelected(cosmic::widget::segmented_button::Entity), // seperate close message, to make sure another isn't closed? ExpandInputSourcePopover(Option), @@ -30,14 +33,12 @@ pub enum Message { pub struct Page { config: cosmic_config::Config, + input_default: InputConfig, + #[allow(dead_code)] + input_touchpad: InputConfig, // Mouse primary_button: cosmic::widget::segmented_button::SingleSelectModel, - acceleration: bool, - natural_scroll: bool, - double_click_speed: u32, - scroll_speed: u32, - mouse_speed: u32, // Keyboard expanded_source_popover: Option, @@ -59,18 +60,25 @@ fn get_config( impl Default for Page { fn default() -> Self { let config = cosmic_config::Config::new("com.system76.CosmicComp", 1).unwrap(); + let input_default: InputConfig = get_config(&config, "input-default"); + let input_touchpad = get_config(&config, "input-touchpad"); let xkb = get_config(&config, "xkb-config"); + let mut primary_button = mouse::default_primary_button(); + let idx = if input_default.left_handed.unwrap_or(false) { + 0 + } else { + 1 + }; + primary_button.activate_position(idx); + Self { config, + input_default, + input_touchpad, // Mouse - primary_button: mouse::default_primary_button(), - acceleration: false, - natural_scroll: false, - double_click_speed: 0, - scroll_speed: 0, - mouse_speed: 0, + primary_button, // Keyboard expanded_source_popover: None, @@ -86,22 +94,57 @@ impl Page { pub fn update(&mut self, message: Message) -> iced::Command { match message { Message::SetAcceleration(value) => { - self.acceleration = value; + let profile = if value { + AccelProfile::Adaptive + } else { + AccelProfile::Flat + }; + self.input_default + .acceleration + .get_or_insert(Default::default()) + .profile = Some(profile); + if let Err(err) = self.config.set("input-default", &self.input_default) { + error!(?err, "Failed to set config 'input-default'"); + } } Message::SetNaturalScroll(value) => { - self.natural_scroll = value; + self.input_default + .scroll_config + .get_or_insert(Default::default()) + .natural_scroll = Some(value); + if let Err(err) = self.config.set("input-default", &self.input_default) { + error!(?err, "Failed to set config 'input-default'"); + } } - Message::SetScrollSpeed(value) => { - self.scroll_speed = value; + Message::SetScrollFactor(value) => { + self.input_default + .scroll_config + .get_or_insert(Default::default()) + .scroll_factor = Some(value); + if let Err(err) = self.config.set("input-default", &self.input_default) { + error!(?err, "Failed to set config 'input-default'"); + } } - Message::SetDoubleClickSpeed(value) => { - self.double_click_speed = value; + Message::SetDoubleClickSpeed(_value) => { + // TODO } Message::SetMouseSpeed(value) => { - self.mouse_speed = value; + self.input_default + .acceleration + .get_or_insert(Default::default()) + .speed = value; + if let Err(err) = self.config.set("input-default", &self.input_default) { + error!(?err, "Failed to set config 'input-default'"); + } } Message::PrimaryButtonSelected(entity) => { self.primary_button.activate(entity); + let left_entity = self.primary_button.entity_at(1).unwrap(); + let left_handed = self.primary_button.active() == left_entity; + self.input_default.left_handed = Some(left_handed); + if let Err(err) = self.config.set("input-default", &self.input_default) { + error!(?err, "Failed to set config 'input-default'"); + } } Message::ExpandInputSourcePopover(value) => { self.expanded_source_popover = value; diff --git a/app/src/pages/input/mouse.rs b/app/src/pages/input/mouse.rs index 7341059..dea7766 100644 --- a/app/src/pages/input/mouse.rs +++ b/app/src/pages/input/mouse.rs @@ -2,6 +2,7 @@ use apply::Apply; use cosmic::iced::widget; use cosmic::widget::settings; use cosmic::Element; +use cosmic_comp_config::input::AccelProfile; use cosmic_settings_page::Section; use cosmic_settings_page::{self as page, section}; use slotmap::SlotMap; @@ -63,24 +64,33 @@ fn mouse() -> Section { )) .add( settings::item::builder(&descriptions[1]).control(widget::slider( - 0..=100, - input.mouse_speed, - Message::SetMouseSpeed, + 0.0..=100.0, + (input + .input_default + .acceleration + .as_ref() + .map_or(0.0, |x| x.speed) + + 1.0) + * 50.0, + |value| Message::SetMouseSpeed((value / 50.0) - 1.0), )), ) .add( settings::item::builder(&descriptions[2]) .description(&descriptions[3]) - .toggler(input.acceleration, Message::SetAcceleration), + .toggler( + input + .input_default + .acceleration + .as_ref() + .map_or(true, |x| x.profile == Some(AccelProfile::Adaptive)), + Message::SetAcceleration, + ), ) .add( settings::item::builder(&descriptions[4]) .description(&descriptions[5]) - .control(widget::slider( - 0..=100, - input.double_click_speed, - Message::SetDoubleClickSpeed, - )), + .control(widget::slider(0..=100, 0, Message::SetDoubleClickSpeed)), ) .apply(Element::from) .map(crate::pages::Message::Input) @@ -104,12 +114,33 @@ fn scrolling() -> Section { .add(settings::item( &descriptions[0], // TODO show numeric value - widget::slider(0..=100, input.scroll_speed, Message::SetScrollSpeed), + // TODO desired range? + widget::slider( + 1.0..=100.0, + input + .input_default + .scroll_config + .as_ref() + .and_then(|x| x.scroll_factor) + .unwrap_or(1.) + .log(2.) + * 10.0 + + 50.0, + |value| Message::SetScrollFactor(2f64.powf((value - 50.0) / 10.0)), + ), )) .add( settings::item::builder(&descriptions[1]) .description(&descriptions[2]) - .toggler(input.natural_scroll, Message::SetNaturalScroll), + .toggler( + input + .input_default + .scroll_config + .as_ref() + .and_then(|x| x.natural_scroll) + .unwrap_or(false), + Message::SetNaturalScroll, + ), ) .apply(Element::from) .map(crate::pages::Message::Input)