input: Use cosmic-config/cosmic-comp-config for mouse settings

Double click speed is not handled currently. That requires toolkit
support.
This commit is contained in:
Ian Douglas Scott 2023-09-01 15:17:47 -07:00
parent 750cd299b2
commit 69b5c3148f
4 changed files with 107 additions and 34 deletions

2
Cargo.lock generated
View file

@ -735,7 +735,7 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-comp-config" name = "cosmic-comp-config"
version = "0.1.0" 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 = [ dependencies = [
"input", "input",
"serde", "serde",

View file

@ -18,7 +18,6 @@ git = "https://github.com/pop-os/cosmic-bg"
[workspace.dependencies.cosmic-comp-config] [workspace.dependencies.cosmic-comp-config]
git = "https://github.com/pop-os/cosmic-comp" git = "https://github.com/pop-os/cosmic-comp"
branch = "cosmic-comp-config"
# path = "../cosmic-comp/cosmic-comp-config" # path = "../cosmic-comp/cosmic-comp-config"
[workspace.dependencies.cosmic-panel-config] [workspace.dependencies.cosmic-panel-config]

View file

@ -5,7 +5,10 @@ use cosmic::{
iced_sctk::commands, iced_sctk::commands,
iced_widget::core::layout, iced_widget::core::layout,
}; };
use cosmic_comp_config::XkbConfig; use cosmic_comp_config::{
input::{AccelProfile, InputConfig},
XkbConfig,
};
use cosmic_settings_page as page; use cosmic_settings_page as page;
use itertools::Itertools; use itertools::Itertools;
use tracing::error; use tracing::error;
@ -17,9 +20,9 @@ mod mouse;
pub enum Message { pub enum Message {
SetAcceleration(bool), SetAcceleration(bool),
SetNaturalScroll(bool), SetNaturalScroll(bool),
SetScrollSpeed(u32), SetScrollFactor(f64),
SetDoubleClickSpeed(u32), SetDoubleClickSpeed(u32),
SetMouseSpeed(u32), SetMouseSpeed(f64),
PrimaryButtonSelected(cosmic::widget::segmented_button::Entity), PrimaryButtonSelected(cosmic::widget::segmented_button::Entity),
// seperate close message, to make sure another isn't closed? // seperate close message, to make sure another isn't closed?
ExpandInputSourcePopover(Option<String>), ExpandInputSourcePopover(Option<String>),
@ -30,14 +33,12 @@ pub enum Message {
pub struct Page { pub struct Page {
config: cosmic_config::Config, config: cosmic_config::Config,
input_default: InputConfig,
#[allow(dead_code)]
input_touchpad: InputConfig,
// Mouse // Mouse
primary_button: cosmic::widget::segmented_button::SingleSelectModel, primary_button: cosmic::widget::segmented_button::SingleSelectModel,
acceleration: bool,
natural_scroll: bool,
double_click_speed: u32,
scroll_speed: u32,
mouse_speed: u32,
// Keyboard // Keyboard
expanded_source_popover: Option<String>, expanded_source_popover: Option<String>,
@ -59,18 +60,25 @@ fn get_config<T: Default + serde::de::DeserializeOwned>(
impl Default for Page { impl Default for Page {
fn default() -> Self { fn default() -> Self {
let config = cosmic_config::Config::new("com.system76.CosmicComp", 1).unwrap(); 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 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 { Self {
config, config,
input_default,
input_touchpad,
// Mouse // Mouse
primary_button: mouse::default_primary_button(), primary_button,
acceleration: false,
natural_scroll: false,
double_click_speed: 0,
scroll_speed: 0,
mouse_speed: 0,
// Keyboard // Keyboard
expanded_source_popover: None, expanded_source_popover: None,
@ -86,22 +94,57 @@ impl Page {
pub fn update(&mut self, message: Message) -> iced::Command<app::Message> { pub fn update(&mut self, message: Message) -> iced::Command<app::Message> {
match message { match message {
Message::SetAcceleration(value) => { 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) => { 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) => { Message::SetScrollFactor(value) => {
self.scroll_speed = 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) => { Message::SetDoubleClickSpeed(_value) => {
self.double_click_speed = value; // TODO
} }
Message::SetMouseSpeed(value) => { 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) => { Message::PrimaryButtonSelected(entity) => {
self.primary_button.activate(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) => { Message::ExpandInputSourcePopover(value) => {
self.expanded_source_popover = value; self.expanded_source_popover = value;

View file

@ -2,6 +2,7 @@ use apply::Apply;
use cosmic::iced::widget; use cosmic::iced::widget;
use cosmic::widget::settings; use cosmic::widget::settings;
use cosmic::Element; use cosmic::Element;
use cosmic_comp_config::input::AccelProfile;
use cosmic_settings_page::Section; use cosmic_settings_page::Section;
use cosmic_settings_page::{self as page, section}; use cosmic_settings_page::{self as page, section};
use slotmap::SlotMap; use slotmap::SlotMap;
@ -63,24 +64,33 @@ fn mouse() -> Section<crate::pages::Message> {
)) ))
.add( .add(
settings::item::builder(&descriptions[1]).control(widget::slider( settings::item::builder(&descriptions[1]).control(widget::slider(
0..=100, 0.0..=100.0,
input.mouse_speed, (input
Message::SetMouseSpeed, .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( .add(
settings::item::builder(&descriptions[2]) settings::item::builder(&descriptions[2])
.description(&descriptions[3]) .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( .add(
settings::item::builder(&descriptions[4]) settings::item::builder(&descriptions[4])
.description(&descriptions[5]) .description(&descriptions[5])
.control(widget::slider( .control(widget::slider(0..=100, 0, Message::SetDoubleClickSpeed)),
0..=100,
input.double_click_speed,
Message::SetDoubleClickSpeed,
)),
) )
.apply(Element::from) .apply(Element::from)
.map(crate::pages::Message::Input) .map(crate::pages::Message::Input)
@ -104,12 +114,33 @@ fn scrolling() -> Section<crate::pages::Message> {
.add(settings::item( .add(settings::item(
&descriptions[0], &descriptions[0],
// TODO show numeric value // 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( .add(
settings::item::builder(&descriptions[1]) settings::item::builder(&descriptions[1])
.description(&descriptions[2]) .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) .apply(Element::from)
.map(crate::pages::Message::Input) .map(crate::pages::Message::Input)