fix(shortcuts): handling of super modifier and search

This commit is contained in:
Ashley Wulber 2025-09-27 20:35:51 -04:00 committed by Ashley Wulber
parent 252a2d5938
commit e3e1c5b204
5 changed files with 72 additions and 21 deletions

2
Cargo.lock generated
View file

@ -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",

View file

@ -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 }

View file

@ -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();
}

View file

@ -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

View file

@ -158,6 +158,16 @@ impl page::Page<crate::pages::Message> for Page {
self.clear();
Task::none()
}
#[cfg(feature = "wayland")]
fn subscription(
&self,
core: &cosmic::Core,
) -> cosmic::iced::Subscription<crate::pages::Message> {
self.search_model
.subscription(core)
.map(|m| crate::pages::Message::KeyboardShortcuts(Message::SearchShortcut(m)))
}
}
impl Page {