From e3e1c5b204d33483989277b0374212578ec72165 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Sat, 27 Sep 2025 20:35:51 -0400 Subject: [PATCH] fix(shortcuts): handling of super modifier and search --- Cargo.lock | 2 +- cosmic-settings/Cargo.toml | 3 +- .../pages/input/keyboard/shortcuts/common.rs | 29 +++++++---- .../pages/input/keyboard/shortcuts/custom.rs | 49 +++++++++++++++---- .../src/pages/input/keyboard/shortcuts/mod.rs | 10 ++++ 5 files changed, 72 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9e0ddcf..61fa5d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1745,7 +1745,7 @@ dependencies = [ [[package]] name = "cosmic-settings-config" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-settings-daemon#8b3343794fb572e86fb835ec3b81648d67502288" +source = "git+https://github.com/pop-os/cosmic-settings-daemon?branch=fix-super-binding#d10f77afc1f4d7adce53caaa00079c621aed59f1" dependencies = [ "cosmic-config", "ron 0.11.0", diff --git a/cosmic-settings/Cargo.toml b/cosmic-settings/Cargo.toml index 119b5aa..e62eec5 100644 --- a/cosmic-settings/Cargo.toml +++ b/cosmic-settings/Cargo.toml @@ -22,7 +22,8 @@ cosmic-panel-config = { workspace = true, optional = true } cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols", optional = true } cosmic-randr-shell.workspace = true cosmic-randr = { workspace = true, optional = true } -cosmic-settings-config = { git = "https://github.com/pop-os/cosmic-settings-daemon", optional = true } +cosmic-settings-config = { git = "https://github.com/pop-os/cosmic-settings-daemon", optional = true, branch = "fix-super-binding" } +# cosmic-settings-config = { path = "../../cosmic-settings-daemon/config", optional = true } cosmic-settings-page = { path = "../page" } cosmic-settings-subscriptions = { workspace = true, optional = true } cosmic-settings-system = { path = "../pages/system", optional = true } diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs index 9fcca56..e1a2c91 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/common.rs @@ -529,16 +529,25 @@ impl Model { let old = std::mem::replace(&mut shortcut.pending.modifiers, cfg_modifiers); - if shortcut.pending.keycode.is_none() - && modifiers.is_empty() - && (old.alt || old.ctrl || old.shift || old.logo) - { - self.editing = None; - shortcut.reset(); - return Task::batch(vec![ - cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()), - iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard() - ]); + if shortcut.pending.keycode.is_none() && modifiers.is_empty() { + if old.logo { + shortcut.pending.modifiers = old; + shortcut.input = shortcut.pending.to_string(); + // XX for now avoid applying the keycode + shortcut.binding.keycode = None; + return Task::batch(vec![ + iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(), + self.submit_binding(id), + cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()), + ]); + } else if old.alt || old.ctrl || old.shift { + self.editing = None; + shortcut.reset(); + return Task::batch(vec![ + cosmic::widget::text_input::focus(self.add_keybindings_button_id.clone()), + iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard() + ]); + } } shortcut.input = shortcut.pending.to_string(); } diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs index 639a995..250907d 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/custom.rs @@ -248,16 +248,47 @@ impl Page { let old = std::mem::replace(&mut self.add_shortcut.binding.modifiers, cfg_modifiers); - if self.add_shortcut.binding.keycode.is_none() - && modifiers.is_empty() - && (old.alt || old.ctrl || old.shift || old.logo) - { - self.add_shortcut = Default::default(); - _ = self.model.on_enter(); + if self.add_shortcut.binding.keycode.is_none() && modifiers.is_empty() { + if old.logo { + // XX for now avoid applying the keycode + let binding = Binding { + modifiers: self.add_shortcut.binding.modifiers.clone(), + key: self.add_shortcut.binding.key, + keycode: None, + description: None, + }; + let Some(k) = self + .add_shortcut + .keys + .get_mut(self.add_shortcut.editing.unwrap()) + else { + return iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(); + }; + k.0 = binding.to_string(); - return Task::batch(vec![ - iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard() - ]); + if self.add_shortcut.name.trim().is_empty() + || self.add_shortcut.task.trim().is_empty() + { + return Task::batch(vec![ + widget::text_input::focus(widget::Id::unique()), + iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(), + ]); + } + self.add_shortcut(binding); + _ = self.model.on_enter(); + + return Task::batch(vec![ + widget::text_input::focus(widget::Id::unique()), + iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard(), + ]); + } else if (old.alt || old.ctrl || old.shift) { + self.add_shortcut = Default::default(); + _ = self.model.on_enter(); + + return Task::batch(vec![ + iced_winit::platform_specific::commands::keyboard_shortcuts_inhibit::inhibit_shortcuts(false).discard() + ]); + } } if let Some(k) = self .add_shortcut diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs index ae2f0d9..dfe36ed 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs @@ -158,6 +158,16 @@ impl page::Page for Page { self.clear(); Task::none() } + + #[cfg(feature = "wayland")] + fn subscription( + &self, + core: &cosmic::Core, + ) -> cosmic::iced::Subscription { + self.search_model + .subscription(core) + .map(|m| crate::pages::Message::KeyboardShortcuts(Message::SearchShortcut(m))) + } } impl Page {