Skip to content

Commit 7955b16

Browse files
committed
cosmic-comp-config crate, and default input config
This adds a `input-default` setting, which is used for input settings if a device isn't set in `input-devices`. More awkwardly, it also adds an `input-touchpad` setting, which is used instead of `input-default` for touchpad devices, so we can separate mouse and touchpad settings even though they use the same capability and settings. This no longer sets the input config, and only reads it. If we add a UI for per-device config, we'll need some IPC mechanism to list connected devices. (Assuming cosmic-settings can't use libinput directly for that.) This moves `InputConfig` and `XkbConfig` to a new `cosmic-comp-config` crate, so they can be used in `cosmic-settings`.
1 parent d259fb2 commit 7955b16

File tree

9 files changed

+525
-457
lines changed

9 files changed

+525
-457
lines changed

Cargo.lock

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ edition = "2021"
55
license = "GPL-3.0-only"
66
authors = ["Victoria Brekenfeld"]
77

8+
[workspace]
9+
members = [
10+
"cosmic-comp-config"
11+
]
12+
813
[dependencies]
914
apply = "0.3.0"
1015
anyhow = { version = "1.0.51", features = ["backtrace"] }
@@ -30,6 +35,7 @@ ron = "0.7"
3035
libsystemd = { version = "0.5", optional = true }
3136
wayland-backend = "0.1.0"
3237
wayland-scanner = "0.30.0"
38+
cosmic-comp-config = { path = "cosmic-comp-config" }
3339
cosmic-config = { git = "https://github.com/pop-os/libcosmic/", rev = "4895b0c", features = ["calloop"] }
3440
cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols", branch = "main", default-features = false, features = ["server"] }
3541
libcosmic = { git = "https://github.com/pop-os/libcosmic/", rev = "4895b0c", default-features = false }

cosmic-comp-config/Cargo.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "cosmic-comp-config"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
input = "0.8.3"
8+
serde = { version = "1", features = ["derive"] }

cosmic-comp-config/src/input.rs

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
// SPDX-License-Identifier: GPL-3.0-only
2+
3+
#![allow(non_snake_case)]
4+
5+
use input::{AccelProfile, ClickMethod, ScrollMethod, TapButtonMap};
6+
use serde::{Deserialize, Serialize};
7+
8+
#[derive(Debug, Default, Deserialize, Serialize)]
9+
pub struct InputConfig {
10+
pub state: DeviceState,
11+
#[serde(skip_serializing_if = "Option::is_none", default)]
12+
pub acceleration: Option<AccelConfig>,
13+
#[serde(skip_serializing_if = "Option::is_none", default)]
14+
pub calibration: Option<[f32; 6]>,
15+
#[serde(with = "ClickMethodDef")]
16+
#[serde(skip_serializing_if = "Option::is_none", default)]
17+
pub click_method: Option<ClickMethod>,
18+
#[serde(skip_serializing_if = "Option::is_none", default)]
19+
pub disable_while_typing: Option<bool>,
20+
#[serde(skip_serializing_if = "Option::is_none", default)]
21+
pub left_handed: Option<bool>,
22+
#[serde(skip_serializing_if = "Option::is_none", default)]
23+
pub middle_button_emulation: Option<bool>,
24+
#[serde(skip_serializing_if = "Option::is_none", default)]
25+
pub rotation_angle: Option<u32>,
26+
#[serde(skip_serializing_if = "Option::is_none", default)]
27+
pub scroll_config: Option<ScrollConfig>,
28+
#[serde(skip_serializing_if = "Option::is_none", default)]
29+
pub tap_config: Option<TapConfig>,
30+
}
31+
32+
#[derive(Debug, Deserialize, Serialize)]
33+
pub struct AccelConfig {
34+
#[serde(with = "AccelProfileDef")]
35+
pub profile: Option<AccelProfile>,
36+
pub speed: f64,
37+
}
38+
39+
#[derive(Debug, Deserialize, Serialize)]
40+
pub struct ScrollConfig {
41+
#[serde(with = "ScrollMethodDef")]
42+
pub method: Option<ScrollMethod>,
43+
pub natural_scroll: Option<bool>,
44+
pub scroll_button: Option<u32>,
45+
}
46+
47+
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
48+
pub enum DeviceState {
49+
Enabled,
50+
Disabled,
51+
DisabledOnExternalMouse,
52+
}
53+
54+
impl Default for DeviceState {
55+
fn default() -> Self {
56+
Self::Enabled
57+
}
58+
}
59+
60+
#[derive(Debug, Serialize, Deserialize)]
61+
pub struct TapConfig {
62+
pub enabled: bool,
63+
#[serde(with = "TapButtonMapDef")]
64+
pub button_map: Option<TapButtonMap>,
65+
pub drag: bool,
66+
pub drag_lock: bool,
67+
}
68+
69+
mod ClickMethodDef {
70+
use input::ClickMethod as ClickMethodOrig;
71+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
72+
73+
#[derive(Debug, Serialize, Deserialize)]
74+
pub enum ClickMethod {
75+
ButtonAreas,
76+
Clickfinger,
77+
}
78+
79+
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<ClickMethodOrig>, D::Error>
80+
where
81+
D: Deserializer<'de>,
82+
{
83+
let o = Option::deserialize(deserializer)?;
84+
Ok(o.map(|x| match x {
85+
ClickMethod::ButtonAreas => ClickMethodOrig::ButtonAreas,
86+
ClickMethod::Clickfinger => ClickMethodOrig::Clickfinger,
87+
}))
88+
}
89+
90+
pub fn serialize<S>(arg: &Option<ClickMethodOrig>, ser: S) -> Result<S::Ok, S::Error>
91+
where
92+
S: Serializer,
93+
{
94+
let arg = match arg {
95+
Some(ClickMethodOrig::ButtonAreas) => Some(ClickMethod::ButtonAreas),
96+
Some(ClickMethodOrig::Clickfinger) => Some(ClickMethod::Clickfinger),
97+
Some(_) | None => None,
98+
};
99+
Option::serialize(&arg, ser)
100+
}
101+
}
102+
103+
mod AccelProfileDef {
104+
use input::AccelProfile as AccelProfileOrig;
105+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
106+
107+
#[derive(Debug, Serialize, Deserialize)]
108+
enum AccelProfile {
109+
Flat,
110+
Adaptive,
111+
}
112+
113+
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<AccelProfileOrig>, D::Error>
114+
where
115+
D: Deserializer<'de>,
116+
{
117+
let o = Option::deserialize(deserializer)?;
118+
Ok(o.map(|x| match x {
119+
AccelProfile::Flat => AccelProfileOrig::Flat,
120+
AccelProfile::Adaptive => AccelProfileOrig::Adaptive,
121+
}))
122+
}
123+
124+
pub fn serialize<S>(arg: &Option<AccelProfileOrig>, ser: S) -> Result<S::Ok, S::Error>
125+
where
126+
S: Serializer,
127+
{
128+
let arg = match arg {
129+
Some(AccelProfileOrig::Flat) => Some(AccelProfile::Flat),
130+
Some(AccelProfileOrig::Adaptive) => Some(AccelProfile::Adaptive),
131+
Some(_) | None => None,
132+
};
133+
Option::serialize(&arg, ser)
134+
}
135+
}
136+
137+
mod ScrollMethodDef {
138+
use input::ScrollMethod as ScrollMethodOrig;
139+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
140+
141+
#[derive(Debug, Serialize, Deserialize)]
142+
pub enum ScrollMethod {
143+
NoScroll,
144+
TwoFinger,
145+
Edge,
146+
OnButtonDown,
147+
}
148+
149+
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<ScrollMethodOrig>, D::Error>
150+
where
151+
D: Deserializer<'de>,
152+
{
153+
let o = Option::deserialize(deserializer)?;
154+
Ok(o.map(|x| match x {
155+
ScrollMethod::NoScroll => ScrollMethodOrig::NoScroll,
156+
ScrollMethod::TwoFinger => ScrollMethodOrig::TwoFinger,
157+
ScrollMethod::Edge => ScrollMethodOrig::Edge,
158+
ScrollMethod::OnButtonDown => ScrollMethodOrig::OnButtonDown,
159+
}))
160+
}
161+
162+
pub fn serialize<S>(arg: &Option<ScrollMethodOrig>, ser: S) -> Result<S::Ok, S::Error>
163+
where
164+
S: Serializer,
165+
{
166+
let arg = match arg {
167+
Some(ScrollMethodOrig::NoScroll) => Some(ScrollMethod::NoScroll),
168+
Some(ScrollMethodOrig::TwoFinger) => Some(ScrollMethod::TwoFinger),
169+
Some(ScrollMethodOrig::Edge) => Some(ScrollMethod::Edge),
170+
Some(ScrollMethodOrig::OnButtonDown) => Some(ScrollMethod::OnButtonDown),
171+
Some(_) | None => None,
172+
};
173+
Option::serialize(&arg, ser)
174+
}
175+
}
176+
177+
mod TapButtonMapDef {
178+
use input::TapButtonMap as TapButtonMapOrig;
179+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
180+
181+
#[derive(Debug, Serialize, Deserialize)]
182+
pub enum TapButtonMap {
183+
LeftRightMiddle,
184+
LeftMiddleRight,
185+
}
186+
187+
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<TapButtonMapOrig>, D::Error>
188+
where
189+
D: Deserializer<'de>,
190+
{
191+
let o = Option::deserialize(deserializer)?;
192+
Ok(o.map(|x| match x {
193+
TapButtonMap::LeftRightMiddle => TapButtonMapOrig::LeftRightMiddle,
194+
TapButtonMap::LeftMiddleRight => TapButtonMapOrig::LeftMiddleRight,
195+
}))
196+
}
197+
198+
pub fn serialize<S>(arg: &Option<TapButtonMapOrig>, ser: S) -> Result<S::Ok, S::Error>
199+
where
200+
S: Serializer,
201+
{
202+
let arg = match arg {
203+
Some(TapButtonMapOrig::LeftRightMiddle) => Some(TapButtonMap::LeftRightMiddle),
204+
Some(TapButtonMapOrig::LeftMiddleRight) => Some(TapButtonMap::LeftMiddleRight),
205+
Some(_) | None => None,
206+
};
207+
Option::serialize(&arg, ser)
208+
}
209+
}

cosmic-comp-config/src/lib.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// SPDX-License-Identifier: GPL-3.0-only
2+
3+
use serde::{Deserialize, Serialize};
4+
5+
pub mod input;
6+
7+
#[derive(Debug, Clone, Deserialize, Serialize)]
8+
pub struct XkbConfig {
9+
pub rules: String,
10+
pub model: String,
11+
pub layout: String,
12+
pub variant: String,
13+
pub options: Option<String>,
14+
}
15+
16+
impl Default for XkbConfig {
17+
fn default() -> XkbConfig {
18+
XkbConfig {
19+
rules: String::new(),
20+
model: String::new(),
21+
layout: String::new(),
22+
variant: String::new(),
23+
options: None,
24+
}
25+
}
26+
}

0 commit comments

Comments
 (0)