From 661b4873975ccc0cc2c7dd39818371c7a16432d4 Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy Date: Wed, 26 Feb 2025 14:51:30 +0100 Subject: [PATCH] feat: add shortcut for input source switch --- Cargo.lock | 4 +- Cargo.toml | 3 + cosmic-settings/Cargo.toml | 6 +- .../src/pages/input/keyboard/mod.rs | 68 +++++++++++++------ .../pages/input/keyboard/shortcuts/common.rs | 3 + .../pages/input/keyboard/shortcuts/custom.rs | 3 + .../keyboard/shortcuts/manage_windows.rs | 3 + .../src/pages/input/keyboard/shortcuts/mod.rs | 4 ++ .../input/keyboard/shortcuts/move_window.rs | 3 + .../src/pages/input/keyboard/shortcuts/nav.rs | 3 + .../pages/input/keyboard/shortcuts/system.rs | 4 ++ .../pages/input/keyboard/shortcuts/tiling.rs | 3 + cosmic-settings/src/pages/input/mod.rs | 3 + cosmic-settings/src/pages/input/mouse.rs | 3 + cosmic-settings/src/pages/input/touchpad.rs | 3 + i18n/en/cosmic_settings.ftl | 1 + 16 files changed, 93 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 62ab9da..55cca4d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1731,7 +1731,7 @@ dependencies = [ [[package]] name = "cosmic-settings-config" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-settings-daemon#58ff27f9723cd68b6e143b7acadcfe20324ea83c" +source = "git+https://github.com/pop-os/cosmic-settings-daemon#e2aa1056900d6f8c9c7555c0401aa7c99281eb06" dependencies = [ "cosmic-config", "ron 0.9.0-alpha.1", @@ -8041,7 +8041,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 0d596ce..bc7526b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,6 +52,9 @@ lto = "thin" cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols//", rev = "ed2a481" } cosmic-client-toolkit = { git = "https://github.com/pop-os/cosmic-protocols//", rev = "ed2a481" } +# [patch.'https://github.com/pop-os/cosmic-settings-daemon'] +# cosmic-settings-config = { git = "https://github.com/pop-os/cosmic-settings-daemon//", branch = "input_nobuild" } + # For development and testing purposes # [patch.'https://github.com/pop-os/libcosmic'] # libcosmic = { git = "https://github.com/pop-os/libcosmic//", branch = "font" } diff --git a/cosmic-settings/Cargo.toml b/cosmic-settings/Cargo.toml index 97ad2ff..02d6c30 100644 --- a/cosmic-settings/Cargo.toml +++ b/cosmic-settings/Cargo.toml @@ -132,7 +132,11 @@ linux = [ # Pages page-accessibility = ["dep:cosmic-protocols", "dep:sctk"] page-about = ["dep:cosmic-settings-system", "dep:hostname1-zbus", "dep:zbus"] -page-bluetooth = ["dep:bluez-zbus", "dep:zbus", "dep:cosmic-settings-subscriptions"] +page-bluetooth = [ + "dep:bluez-zbus", + "dep:zbus", + "dep:cosmic-settings-subscriptions", +] page-date = ["dep:timedate-zbus", "dep:zbus"] page-default-apps = ["dep:mime-apps"] page-input = [ diff --git a/cosmic-settings/src/pages/input/keyboard/mod.rs b/cosmic-settings/src/pages/input/keyboard/mod.rs index e29d063..77dfa7f 100644 --- a/cosmic-settings/src/pages/input/keyboard/mod.rs +++ b/cosmic-settings/src/pages/input/keyboard/mod.rs @@ -1,3 +1,6 @@ +// Copyright 2023 System76 +// SPDX-License-Identifier: GPL-3.0-only + pub mod shortcuts; use std::cmp; @@ -76,6 +79,7 @@ pub enum SourceContext { pub type Locale = String; pub type Variant = String; pub type Description = String; + #[derive(Clone, Debug, PartialEq, Eq)] pub enum LayoutSource { Base, @@ -89,6 +93,9 @@ const KB_REPEAT_DELAY_MIN: u32 = 200; const KB_REPEAT_RATE_MAX: u32 = 45; const KB_REPEAT_RATE_MIN: u32 = 5; +const COSMIC_COMP_CONFIG: &str = "com.system76.CosmicComp"; +const COSMIC_COMP_CONFIG_VERSION: u64 = 1; + pub struct Page { entity: page::Entity, config: cosmic_config::Config, @@ -103,7 +110,8 @@ pub struct Page { impl Default for Page { fn default() -> Self { - let config = cosmic_config::Config::new("com.system76.CosmicComp", 1).unwrap(); + let config = + cosmic_config::Config::new(COSMIC_COMP_CONFIG, COSMIC_COMP_CONFIG_VERSION).unwrap(); Self { entity: page::Entity::null(), @@ -209,7 +217,7 @@ fn popover_menu(id: DefaultKey) -> cosmic::Element<'static, Message> { color: background.component.divider.into(), width: 1.0, radius: cosmic.corner_radii.radius_s.into(), - ..Default::default() + ..Border::default() }, shadow: Default::default(), } @@ -609,26 +617,20 @@ impl Page { } fn update_xkb_config(&mut self) { - let mut new_layout = String::new(); - let mut new_variant = String::new(); + let result = update_xkb_config( + &self.config, + &mut self.xkb, + &mut self + .active_layouts + .iter() + .filter_map(|id| self.keyboard_layouts.get(*id)) + .map(|(locale, variant, _description, _source)| { + (locale.as_str(), variant.as_str()) + }), + ); - for id in &self.active_layouts { - if let Some((locale, variant, _description, _source)) = self.keyboard_layouts.get(*id) { - new_layout.push_str(locale); - new_layout.push(','); - new_variant.push_str(variant); - new_variant.push(','); - } - } - - let _excess_comma = new_layout.pop(); - let _excess_comma = new_variant.pop(); - - self.xkb.layout = new_layout; - self.xkb.variant = new_variant; - - if let Err(err) = self.config.set("xkb_config", &self.xkb) { - tracing::error!(?err, "Failed to set config 'xkb_config'"); + if let Err(why) = result { + tracing::error!(?why, "Failed to set config 'xkb_config'"); } } } @@ -792,3 +794,27 @@ fn keyboard_typing_assist() -> Section { .map(crate::pages::Message::Keyboard) }) } + +fn update_xkb_config( + config: &cosmic_config::Config, + xkb: &mut XkbConfig, + active_layouts: &mut dyn Iterator, +) -> Result<(), cosmic_config::Error> { + let mut new_layout = String::new(); + let mut new_variant = String::new(); + + for (locale, variant) in active_layouts { + new_layout.push_str(locale); + new_layout.push(','); + new_variant.push_str(variant); + new_variant.push(','); + } + + let _excess_comma = new_layout.pop(); + let _excess_comma = new_variant.pop(); + + xkb.layout = new_layout; + xkb.variant = new_variant; + + config.set("xkb_config", xkb) +} diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs index c8fe2c1..f304680 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs @@ -1,3 +1,6 @@ +// Copyright 2024 System76 +// SPDX-License-Identifier: GPL-3.0-only + use cosmic::iced::{Alignment, Length}; use cosmic::widget::{self, button, icon, settings, text}; use cosmic::{theme, Apply, Element, Task}; diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs index 3f9358f..f13b591 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs @@ -1,3 +1,6 @@ +// Copyright 2024 System76 +// SPDX-License-Identifier: GPL-3.0-only +// use std::str::FromStr; use super::{ShortcutBinding, ShortcutMessage, ShortcutModel}; diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/manage_windows.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/manage_windows.rs index 0109603..403cb42 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/manage_windows.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/manage_windows.rs @@ -1,3 +1,6 @@ +// Copyright 2024 System76 +// SPDX-License-Identifier: GPL-3.0-only + use super::{ShortcutMessage, ShortcutModel}; use cosmic::{Element, Task}; use cosmic_settings_config::shortcuts::action::ResizeDirection; diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs index f93dfc4..f3f09ef 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs @@ -1,3 +1,6 @@ +// Copyright 2024 System76 +// SPDX-License-Identifier: GPL-3.0-only + mod common; pub use common::{Model, ShortcutBinding, ShortcutMessage, ShortcutModel}; @@ -649,6 +652,7 @@ fn localize_action(action: &Action) -> String { SystemAction::AppLibrary => fl!("system-shortcut", "app-library"), SystemAction::BrightnessDown => fl!("system-shortcut", "brightness-down"), SystemAction::BrightnessUp => fl!("system-shortcut", "brightness-up"), + SystemAction::InputSourceSwitch => fl!("input-source-switch"), SystemAction::HomeFolder => fl!("system-shortcut", "home-folder"), SystemAction::KeyboardBrightnessDown => { fl!("system-shortcut", "keyboard-brightness-down") diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/move_window.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/move_window.rs index fdaa84b..2efa75d 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/move_window.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/move_window.rs @@ -1,3 +1,6 @@ +// Copyright 2024 System76 +// SPDX-License-Identifier: GPL-3.0-only +// use super::{ShortcutMessage, ShortcutModel}; use cosmic::{Element, Task}; use cosmic_settings_config::shortcuts::action::Direction; diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/nav.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/nav.rs index 81ce0b4..5acdf6d 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/nav.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/nav.rs @@ -1,3 +1,6 @@ +// Copyright 2024 System76 +// SPDX-License-Identifier: GPL-3.0-only + use super::{ShortcutMessage, ShortcutModel}; use cosmic::{Element, Task}; use cosmic_settings_config::shortcuts::action::{Direction, FocusDirection}; diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/system.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/system.rs index e36e56e..b4b5163 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/system.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/system.rs @@ -1,3 +1,6 @@ +// Copyright 2024 System76 +// SPDX-License-Identifier: GPL-3.0-only + use super::{ShortcutMessage, ShortcutModel}; use cosmic::{Element, Task}; use cosmic_settings_config::shortcuts::action::System as SystemAction; @@ -94,6 +97,7 @@ pub const fn actions() -> &'static [Action] { Action::System(SystemAction::BrightnessUp), Action::System(SystemAction::KeyboardBrightnessDown), Action::System(SystemAction::KeyboardBrightnessUp), + Action::System(SystemAction::InputSourceSwitch), Action::System(SystemAction::Screenshot), Action::System(SystemAction::Terminal), Action::System(SystemAction::HomeFolder), diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/tiling.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/tiling.rs index 8832974..7467327 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/tiling.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/tiling.rs @@ -1,3 +1,6 @@ +// Copyright 2024 System76 +// SPDX-License-Identifier: GPL-3.0-only + use super::{ShortcutMessage, ShortcutModel}; use cosmic::{Element, Task}; use cosmic_settings_config::shortcuts::action::Orientation; diff --git a/cosmic-settings/src/pages/input/mod.rs b/cosmic-settings/src/pages/input/mod.rs index 6b8aa74..5d169bb 100644 --- a/cosmic-settings/src/pages/input/mod.rs +++ b/cosmic-settings/src/pages/input/mod.rs @@ -1,3 +1,6 @@ +// Copyright 2023 System76 +// SPDX-License-Identifier: GPL-3.0-only + use crate::app; use cosmic::{ cosmic_config::{self, ConfigGet, ConfigSet}, diff --git a/cosmic-settings/src/pages/input/mouse.rs b/cosmic-settings/src/pages/input/mouse.rs index f055aef..dacc311 100644 --- a/cosmic-settings/src/pages/input/mouse.rs +++ b/cosmic-settings/src/pages/input/mouse.rs @@ -1,3 +1,6 @@ +// Copyright 2023 System76 +// SPDX-License-Identifier: GPL-3.0-only + use cosmic::iced::{Alignment, Length}; use cosmic::widget::{self, row, settings, text}; use cosmic::{Apply, Element}; diff --git a/cosmic-settings/src/pages/input/touchpad.rs b/cosmic-settings/src/pages/input/touchpad.rs index 4118ddc..cb12c30 100644 --- a/cosmic-settings/src/pages/input/touchpad.rs +++ b/cosmic-settings/src/pages/input/touchpad.rs @@ -1,3 +1,6 @@ +// Copyright 2023 System76 +// SPDX-License-Identifier: GPL-3.0-only + use cosmic::cosmic_config::ConfigGet; use cosmic::iced::{Alignment, Length}; use cosmic::widget::{self, row, settings, text}; diff --git a/i18n/en/cosmic_settings.ftl b/i18n/en/cosmic_settings.ftl index dcb18fa..458b66f 100644 --- a/i18n/en/cosmic_settings.ftl +++ b/i18n/en/cosmic_settings.ftl @@ -560,6 +560,7 @@ command = Command custom = Custom debug = Debug disabled = Disabled +input-source-switch = Switch keyboard language input source migrate-workspace-prev = Migrate workspace to previous output migrate-workspace-next = Migrate workspace to next output migrate-workspace = Migrate workspace to output { $direction ->