From 908432d32b19f659c790ffa70e81647868877b27 Mon Sep 17 00:00:00 2001 From: Jason Hansen Date: Wed, 28 May 2025 09:19:37 -0600 Subject: [PATCH] feat(shortcuts): search by key bindings --- Cargo.lock | 73 +++---------------- .../src/pages/applications/default_apps.rs | 19 ++--- cosmic-settings/src/pages/display/mod.rs | 2 +- .../src/pages/input/keyboard/shortcuts/mod.rs | 27 ++++++- 4 files changed, 47 insertions(+), 74 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 20cba70..c03bc3a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1516,7 +1516,7 @@ dependencies = [ [[package]] name = "cosmic-config" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#1fce5df160f595d1b1e5a8e2bb2a24775419f82d" +source = "git+https://github.com/pop-os/libcosmic#a55ed23ba8d8f8f72599daf0824074986057bdff" dependencies = [ "atomicwrites", "cosmic-config-derive", @@ -1538,7 +1538,7 @@ dependencies = [ [[package]] name = "cosmic-config-derive" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#1fce5df160f595d1b1e5a8e2bb2a24775419f82d" +source = "git+https://github.com/pop-os/libcosmic#a55ed23ba8d8f8f72599daf0824074986057bdff" dependencies = [ "quote", "syn 1.0.109", @@ -1740,7 +1740,7 @@ dependencies = [ [[package]] name = "cosmic-settings-config" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-settings-daemon#ed1bc9e39e0380ea7e40233bb63960eeb674be34" +source = "git+https://github.com/pop-os/cosmic-settings-daemon#eb886de5527f9b5d2f225708d63d9d36fbb63a64" dependencies = [ "cosmic-config", "ron 0.9.0", @@ -1762,7 +1762,7 @@ dependencies = [ [[package]] name = "cosmic-settings-daemon-config" version = "0.1.0" -source = "git+https://github.com/pop-os/cosmic-settings-daemon#ed1bc9e39e0380ea7e40233bb63960eeb674be34" +source = "git+https://github.com/pop-os/cosmic-settings-daemon#eb886de5527f9b5d2f225708d63d9d36fbb63a64" dependencies = [ "cosmic-config", "ron 0.8.1", @@ -3229,7 +3229,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.61.2", + "windows-core 0.57.0", ] [[package]] @@ -3262,7 +3262,7 @@ dependencies = [ [[package]] name = "iced_accessibility" version = "0.1.0" -source = "git+https://github.com/pop-os/libcosmic#1fce5df160f595d1b1e5a8e2bb2a24775419f82d" +source = "git+https://github.com/pop-os/libcosmic#a55ed23ba8d8f8f72599daf0824074986057bdff" dependencies = [ "accesskit", "accesskit_winit", @@ -3271,7 +3271,7 @@ dependencies = [ [[package]] name = "iced_core" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#1fce5df160f595d1b1e5a8e2bb2a24775419f82d" +source = "git+https://github.com/pop-os/libcosmic#a55ed23ba8d8f8f72599daf0824074986057bdff" dependencies = [ "bitflags 2.9.1", "bytes", @@ -3296,7 +3296,7 @@ dependencies = [ [[package]] name = "iced_futures" version = "0.14.0-dev" -source = "git+https://github.com/pop-os/libcosmic#1fce5df160f595d1b1e5a8e2bb2a24775419f82d" +source = "git+https://github.com/pop-os/libcosmic#a55ed23ba8d8f8f72599daf0824074986057bdff" dependencies = [ "futures", "iced_core", @@ -8451,7 +8451,7 @@ version = "0.54.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" dependencies = [ - "windows-result 0.1.2", + "windows-result", "windows-targets 0.52.6", ] @@ -8463,23 +8463,10 @@ checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" dependencies = [ "windows-implement 0.57.0", "windows-interface 0.57.0", - "windows-result 0.1.2", + "windows-result", "windows-targets 0.52.6", ] -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement 0.60.0", - "windows-interface 0.59.1", - "windows-link", - "windows-result 0.3.4", - "windows-strings", -] - [[package]] name = "windows-implement" version = "0.53.0" @@ -8502,17 +8489,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "windows-interface" version = "0.53.0" @@ -8535,17 +8511,6 @@ dependencies = [ "syn 2.0.101", ] -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", -] - [[package]] name = "windows-link" version = "0.1.1" @@ -8561,24 +8526,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-sys" version = "0.45.0" diff --git a/cosmic-settings/src/pages/applications/default_apps.rs b/cosmic-settings/src/pages/applications/default_apps.rs index d8f4fa2..27233b8 100644 --- a/cosmic-settings/src/pages/applications/default_apps.rs +++ b/cosmic-settings/src/pages/applications/default_apps.rs @@ -3,6 +3,7 @@ // SPDX-License-Identifier: GPL-3.0-only use std::{ + borrow::Cow, collections::{BTreeMap, BTreeSet}, path::{Path, PathBuf}, sync::Arc, @@ -300,7 +301,7 @@ fn apps() -> Section { Message::Surface, |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), ) - .icons(&meta.icons), + .icons(Cow::Borrowed(&meta.icons)), ) .min_item_width(300.0) }) @@ -316,7 +317,7 @@ fn apps() -> Section { Message::Surface, |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), ) - .icons(&meta.icons), + .icons(Cow::Borrowed(&meta.icons)), ) }) .add({ @@ -331,7 +332,7 @@ fn apps() -> Section { Message::Surface, |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), ) - .icons(&meta.icons), + .icons(Cow::Borrowed(&meta.icons)), ) }) .add({ @@ -346,7 +347,7 @@ fn apps() -> Section { Message::Surface, |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), ) - .icons(&meta.icons), + .icons(Cow::Borrowed(&meta.icons)), ) }) .add({ @@ -361,7 +362,7 @@ fn apps() -> Section { Message::Surface, |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), ) - .icons(&meta.icons), + .icons(Cow::Borrowed(&meta.icons)), ) }) .add({ @@ -376,7 +377,7 @@ fn apps() -> Section { Message::Surface, |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), ) - .icons(&meta.icons), + .icons(Cow::Borrowed(&meta.icons)), ) }) .add({ @@ -391,7 +392,7 @@ fn apps() -> Section { Message::Surface, |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), ) - .icons(&meta.icons), + .icons(Cow::Borrowed(&meta.icons)), ) }) .add({ @@ -406,7 +407,7 @@ fn apps() -> Section { Message::Surface, |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), ) - .icons(&meta.icons), + .icons(Cow::Borrowed(&meta.icons)), ) }) .add({ @@ -421,7 +422,7 @@ fn apps() -> Section { Message::Surface, |a| crate::app::Message::PageMessage(crate::pages::Message::DefaultApps(a)), ) - .icons(&meta.icons), + .icons(Cow::Borrowed(&meta.icons)), ) }) .apply(Element::from) diff --git a/cosmic-settings/src/pages/display/mod.rs b/cosmic-settings/src/pages/display/mod.rs index 6a52e81..15bcf1b 100644 --- a/cosmic-settings/src/pages/display/mod.rs +++ b/cosmic-settings/src/pages/display/mod.rs @@ -1276,7 +1276,7 @@ pub fn display_configuration() -> Section { widget::settings::item( &descriptions[scale], dropdown::popup_dropdown( - &DPI_SCALE_LABELS, + DPI_SCALE_LABELS.as_slice(), page.cache.scale_selected, Message::Scale, cosmic::iced::window::Id::RESERVED, diff --git a/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs b/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs index 7764179..2825c9e 100644 --- a/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs +++ b/cosmic-settings/src/pages/input/keyboard/shortcuts/mod.rs @@ -25,9 +25,11 @@ use cosmic_settings_config::shortcuts::{self, Action, Shortcuts}; use cosmic_settings_page::Section; use cosmic_settings_page::{self as page, section}; use itertools::Itertools; +use sctk::seat::keyboard::Keysym; use shortcuts::action::System as SystemAction; use slab::Slab; use slotmap::{DefaultKey, Key, SecondaryMap, SlotMap}; +use std::collections::BTreeSet; use std::io; pub struct Page { @@ -320,6 +322,10 @@ impl Search { let id = self.actions.insert(action.clone()); self.localized.insert(id, localized); } + // Remove unicode isolation characters to fix searching localized text that has them. + for (_, localized) in self.localized.iter_mut() { + *localized = localized.replace("\u{2068}", "").replace("\u{2069}", ""); + } } fn retrieve_custom_actions(&self) -> Vec<(Binding, Action)> { @@ -341,10 +347,29 @@ impl Search { } fn shortcut_models(&mut self) -> Slab { + let shortcut_search_actions = match Binding::from_str_partial(&self.input) { + Ok(input_binding) => self + .shortcuts + .iter() + .filter_map(|(binding, action)| { + if input_binding.is_subset(binding) { + Some(action) + } else { + None + } + }) + .collect::>(), + Err(_) => Default::default(), + }; + let input = self.input.to_lowercase(); + self.actions .iter() - .filter(|(id, _)| self.localized[*id].to_lowercase().contains(&input)) + .filter(|(id, action)| { + self.localized[*id].to_lowercase().contains(&input) + || shortcut_search_actions.contains(action) + }) .fold(Slab::new(), |mut slab, (_, action)| { slab.insert(ShortcutModel::new( &self.defaults,