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:
parent
750cd299b2
commit
69b5c3148f
4 changed files with 107 additions and 34 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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]
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue