keyboard: Connect special characters dialogs to cosmic-config settings

This commit is contained in:
Ian Douglas Scott 2023-08-09 15:31:30 -07:00 committed by Ian Douglas Scott
parent e4d7c90f30
commit a5fcd5326e
4 changed files with 66 additions and 17 deletions

12
Cargo.lock generated
View file

@ -793,6 +793,7 @@ dependencies = [
"i18n-embed",
"i18n-embed-fl",
"image",
"itertools 0.11.0",
"libcosmic",
"log",
"notify",
@ -2208,7 +2209,7 @@ dependencies = [
"iced_graphics",
"iced_runtime",
"iced_style",
"itertools",
"itertools 0.10.5",
"raw-window-handle 0.5.2",
"smithay-client-toolkit 0.17.0",
"smithay-clipboard",
@ -2506,6 +2507,15 @@ dependencies = [
"either",
]
[[package]]
name = "itertools"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
dependencies = [
"either",
]
[[package]]
name = "jni-sys"
version = "0.3.0"

View file

@ -18,6 +18,7 @@ derive_setters = "0.1.6"
dirs = "5.0.1"
generator = "0.7.4"
i18n-embed-fl = "0.6.7"
itertools = "0.11.0"
libcosmic = {workspace = true}
once_cell = "1.17.2"
regex = "1.8.3"

View file

@ -158,10 +158,11 @@ impl super::Page {
};
let prefix = special_key.prefix();
let current = self
.xkb_options
.xkb
.options
.iter()
.find(|x| x.starts_with(prefix))
.map(String::as_str);
.flat_map(|x| x.split(','))
.find(|x| x.starts_with(prefix));
// TODO description, layout default

View file

@ -1,15 +1,18 @@
use crate::app;
use cosmic::{
cosmic_config::{self, ConfigGet, ConfigSet},
iced::{self, wayland::actions::window::SctkWindowSettings, window},
iced_sctk::commands,
iced_widget::core::layout,
};
use cosmic_settings_page as page;
use itertools::Itertools;
use tracing::error;
pub mod keyboard;
mod mouse;
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
#[derive(Debug, Default, Clone, serde::Deserialize, serde::Serialize)]
pub struct XkbConfig {
pub rules: String,
pub model: String,
@ -34,13 +37,10 @@ pub enum Message {
SpecialCharacterSelect(Option<&'static str>),
}
#[derive(derivative::Derivative)]
#[derivative(Default)]
pub struct Page {
// cosmic_config::Config
config: cosmic_config::Config,
// Mouse
#[derivative(Default(value = "mouse::default_primary_button()"))]
primary_button: cosmic::widget::segmented_button::SingleSelectModel,
acceleration: bool,
natural_scroll: bool,
@ -50,10 +50,44 @@ pub struct Page {
// Keyboard
expanded_source_popover: Option<String>,
#[derivative(Default(value = "keyboard::default_input_sources()"))]
sources: Vec<keyboard::InputSource>,
special_character_dialog: Option<keyboard::SpecialKey>,
xkb_options: Vec<String>,
xkb: XkbConfig,
}
fn get_config<T: Default + serde::de::DeserializeOwned>(
config: &cosmic_config::Config,
key: &str,
) -> T {
config.get(key).unwrap_or_else(|err| {
error!(?err, "Failed to read config '{}'", key);
T::default()
})
}
impl Default for Page {
fn default() -> Self {
let config = cosmic_config::Config::new("com.system76.CosmicComp", 1).unwrap();
let xkb = get_config(&config, "xkb-config");
Self {
config,
// Mouse
primary_button: mouse::default_primary_button(),
acceleration: false,
natural_scroll: false,
double_click_speed: 0,
scroll_speed: 0,
mouse_speed: 0,
// Keyboard
expanded_source_popover: None,
sources: keyboard::default_input_sources(),
special_character_dialog: None,
xkb,
}
}
}
impl Page {
@ -107,14 +141,17 @@ impl Page {
}
Message::SpecialCharacterSelect(id) => {
if let Some(special_key) = self.special_character_dialog {
let options = self.xkb.options.as_deref().unwrap_or("");
let prefix = special_key.prefix();
if let Some(idx) = self.xkb_options.iter().position(|x| x.starts_with(prefix)) {
self.xkb_options.remove(idx);
let new_options = options
.split(',')
.filter(|x| !x.starts_with(prefix))
.chain(id.into_iter())
.join(",");
self.xkb.options = Some(new_options).filter(|x| !x.is_empty());
if let Err(err) = self.config.set("xkb-config", &self.xkb) {
error!(?err, "Failed to set config 'xkb-config'");
}
if let Some(id) = id {
self.xkb_options.push(id.to_string());
}
// TODO set in cosmic-config
}
}
Message::OpenKeyboardShortcuts => {}