From 09c5525fb5fab8f603ef05d7da6e1b0cf867c652 Mon Sep 17 00:00:00 2001 From: unsecretised Date: Thu, 1 Jan 2026 22:55:54 +0800 Subject: [PATCH 1/4] Fix indexing issue --- src/app/tile/elm.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/tile/elm.rs b/src/app/tile/elm.rs index 3bc3cc2..39c42a7 100644 --- a/src/app/tile/elm.rs +++ b/src/app/tile/elm.rs @@ -29,13 +29,13 @@ pub fn new(keybind_id: u32, config: &Config) -> (Tile, Task) { let store_icons = config.theme.show_icons; - let user_local_path = std::env::var("home").unwrap() + "/applications/"; + let user_local_path = std::env::var("HOME").unwrap() + "/Applications/"; let paths = vec![ - "/applications/", + "/Applications/", user_local_path.as_str(), - "/system/applications/", - "/system/applications/utilities/", + "/System/Applications/", + "/System/Applications/Utilities/", ]; let mut options: Vec = paths From 2c81448ca8cdaab4c8d7616cfaf6b0b546329065 Mon Sep 17 00:00:00 2001 From: unsecretised Date: Thu, 1 Jan 2026 22:56:28 +0800 Subject: [PATCH 2/4] use `Code` rather than loading it myself --- src/config.rs | 6 ++- src/main.rs | 11 +++-- src/utils.rs | 128 -------------------------------------------------- 3 files changed, 11 insertions(+), 134 deletions(-) diff --git a/src/config.rs b/src/config.rs index d074d7a..1b104dc 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,6 +1,8 @@ //! This is the config file type definitions for rustcast use std::{path::Path, sync::Arc}; +use global_hotkey::hotkey::Code; + use iced::{theme::Custom, widget::image::Handle}; use serde::{Deserialize, Serialize}; @@ -11,7 +13,7 @@ use crate::{app::apps::App, commands::Function, utils::handle_from_icns}; #[serde(default)] pub struct Config { pub toggle_mod: String, - pub toggle_key: String, + pub toggle_key: Code, pub buffer_rules: Buffer, pub theme: Theme, pub placeholder: String, @@ -24,7 +26,7 @@ impl Default for Config { fn default() -> Self { Self { toggle_mod: "ALT".to_string(), - toggle_key: "Space".to_string(), + toggle_key: Code::Space, buffer_rules: Buffer::default(), theme: Theme::default(), placeholder: String::from("Time to be productive!"), diff --git a/src/main.rs b/src/main.rs index 6f7069d..741044c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,11 +8,11 @@ mod utils; use std::path::Path; -use crate::{app::tile::Tile, config::Config, utils::to_key_code}; +use crate::{app::tile::Tile, config::Config}; use global_hotkey::{ GlobalHotKeyManager, - hotkey::{Code, HotKey, Modifiers}, + hotkey::{HotKey, Modifiers}, }; fn main() -> iced::Result { @@ -41,11 +41,14 @@ fn main() -> iced::Result { let show_hide = HotKey::new( Some(Modifiers::from_name(&config.toggle_mod).unwrap_or(Modifiers::ALT)), - to_key_code(&config.toggle_key).unwrap_or(Code::Space), + config.toggle_key, ); + // Hotkeys are stored as a vec so that hyperkey support can be added later + let hotkeys = vec![show_hide]; + manager - .register_all(&[show_hide]) + .register_all(&hotkeys) .expect("Unable to register hotkey"); iced::daemon( diff --git a/src/utils.rs b/src/utils.rs index 53717ea..f0f360a 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -6,7 +6,6 @@ use std::{ process::exit, }; -use global_hotkey::hotkey::Code; use iced::widget::image::Handle; use icns::IconFamily; use image::RgbaImage; @@ -171,130 +170,3 @@ pub(crate) fn get_installed_apps(dir: impl AsRef, store_icons: bool) -> Ve }) .collect() } - -/// This converts a string to a [`Code`] enum so that it can be used as a hotkey -pub fn to_key_code(key_str: &str) -> Option { - match key_str.to_lowercase().as_str() { - // Letters - "a" => Some(Code::KeyA), - "b" => Some(Code::KeyB), - "c" => Some(Code::KeyC), - "d" => Some(Code::KeyD), - "e" => Some(Code::KeyE), - "f" => Some(Code::KeyF), - "g" => Some(Code::KeyG), - "h" => Some(Code::KeyH), - "i" => Some(Code::KeyI), - "j" => Some(Code::KeyJ), - "k" => Some(Code::KeyK), - "l" => Some(Code::KeyL), - "m" => Some(Code::KeyM), - "n" => Some(Code::KeyN), - "o" => Some(Code::KeyO), - "p" => Some(Code::KeyP), - "q" => Some(Code::KeyQ), - "r" => Some(Code::KeyR), - "s" => Some(Code::KeyS), - "t" => Some(Code::KeyT), - "u" => Some(Code::KeyU), - "v" => Some(Code::KeyV), - "w" => Some(Code::KeyW), - "x" => Some(Code::KeyX), - "y" => Some(Code::KeyY), - "z" => Some(Code::KeyZ), - - // Digits (main row) - "0" => Some(Code::Digit0), - "1" => Some(Code::Digit1), - "2" => Some(Code::Digit2), - "3" => Some(Code::Digit3), - "4" => Some(Code::Digit4), - "5" => Some(Code::Digit5), - "6" => Some(Code::Digit6), - "7" => Some(Code::Digit7), - "8" => Some(Code::Digit8), - "9" => Some(Code::Digit9), - - // Function keys - "f1" => Some(Code::F1), - "f2" => Some(Code::F2), - "f3" => Some(Code::F3), - "f4" => Some(Code::F4), - "f5" => Some(Code::F5), - "f6" => Some(Code::F6), - "f7" => Some(Code::F7), - "f8" => Some(Code::F8), - "f9" => Some(Code::F9), - "f10" => Some(Code::F10), - "f11" => Some(Code::F11), - "f12" => Some(Code::F12), - - // Arrows - "up" | "arrowup" => Some(Code::ArrowUp), - "down" | "arrowdown" => Some(Code::ArrowDown), - "left" | "arrowleft" => Some(Code::ArrowLeft), - "right" | "arrowright" => Some(Code::ArrowRight), - - // Modifiers - "shift" | "lshift" => Some(Code::ShiftLeft), - "rshift" => Some(Code::ShiftRight), - "ctrl" | "control" | "lctrl" => Some(Code::ControlLeft), - "rctrl" => Some(Code::ControlRight), - "alt" | "lalt" => Some(Code::AltLeft), - "ralt" => Some(Code::AltRight), - "meta" | "super" | "win" | "lmeta" => Some(Code::MetaLeft), - "rmeta" => Some(Code::MetaRight), - - // Whitespace / editing - "space" => Some(Code::Space), - "enter" => Some(Code::Enter), - "tab" => Some(Code::Tab), - "backspace" => Some(Code::Backspace), - "delete" => Some(Code::Delete), - "insert" => Some(Code::Insert), - "escape" | "esc" => Some(Code::Escape), - - // Punctuation (US layout-style names) - "-" | "minus" => Some(Code::Minus), - "=" | "equal" => Some(Code::Equal), - "[" | "bracketleft" => Some(Code::BracketLeft), - "]" | "bracketright" => Some(Code::BracketRight), - "\\" | "backslash" => Some(Code::Backslash), - ";" | "semicolon" => Some(Code::Semicolon), - "'" | "quote" => Some(Code::Quote), - "," | "comma" => Some(Code::Comma), - "." | "period" => Some(Code::Period), - "/" | "slash" => Some(Code::Slash), - "`" | "backquote" | "grave" => Some(Code::Backquote), - - // Numpad - "numpad0" => Some(Code::Numpad0), - "numpad1" => Some(Code::Numpad1), - "numpad2" => Some(Code::Numpad2), - "numpad3" => Some(Code::Numpad3), - "numpad4" => Some(Code::Numpad4), - "numpad5" => Some(Code::Numpad5), - "numpad6" => Some(Code::Numpad6), - "numpad7" => Some(Code::Numpad7), - "numpad8" => Some(Code::Numpad8), - "numpad9" => Some(Code::Numpad9), - "numpadadd" | "numadd" | "kp+" => Some(Code::NumpadAdd), - "numpadsubtract" | "numsub" | "kp-" => Some(Code::NumpadSubtract), - "numpadmultiply" | "nummul" | "kp*" => Some(Code::NumpadMultiply), - "numpaddivide" | "numdiv" | "kp/" => Some(Code::NumpadDivide), - "numpaddecimal" | "numdecimal" | "kp." => Some(Code::NumpadDecimal), - "numpadenter" | "numenter" => Some(Code::NumpadEnter), - - // Navigation / misc - "home" => Some(Code::Home), - "end" => Some(Code::End), - "pageup" => Some(Code::PageUp), - "pagedown" => Some(Code::PageDown), - "capslock" => Some(Code::CapsLock), - "scrolllock" => Some(Code::ScrollLock), - "numlock" => Some(Code::NumLock), - "pause" => Some(Code::Pause), - - _ => None, - } -} From 2c8b51cfca94ab937ebd992a00bf21ec4f6cd9a8 Mon Sep 17 00:00:00 2001 From: unsecretised Date: Thu, 1 Jan 2026 23:08:24 +0800 Subject: [PATCH 3/4] only return focus to previous app when it should --- src/app.rs | 1 + src/app/tile/update.rs | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/app.rs b/src/app.rs index f6011d6..966a5db 100644 --- a/src/app.rs +++ b/src/app.rs @@ -31,6 +31,7 @@ pub enum Message { KeyPressed(u32), HideWindow(Id), RunFunction(Function), + ReturnFocus, ClearSearchResults, WindowFocusChanged(Id, bool), ClearSearchQuery, diff --git a/src/app/tile/update.rs b/src/app/tile/update.rs index 49f76fd..c4d091f 100644 --- a/src/app/tile/update.rs +++ b/src/app/tile/update.rs @@ -154,6 +154,7 @@ pub fn handle_update(tile: &mut Tile, message: Message) -> Task { } else { Message::_Nothing }), + Task::done(Message::ReturnFocus), ]) } } else { @@ -164,23 +165,34 @@ pub fn handle_update(tile: &mut Tile, message: Message) -> Task { Message::RunFunction(command) => { command.execute(&tile.config, &tile.query); + let return_focus_task = match &command { + Function::OpenApp(_) | Function::OpenPrefPane | Function::GoogleSearch(_) => Task::none(), + _ => Task::done(Message::ReturnFocus), + }; + if tile.config.buffer_rules.clear_on_enter { window::latest() .map(|x| x.unwrap()) .map(Message::HideWindow) .chain(Task::done(Message::ClearSearchQuery)) + .chain(return_focus_task) } else { Task::none() } } Message::HideWindow(a) => { - tile.restore_frontmost(); tile.visible = false; tile.focused = false; tile.page = Page::Main; Task::batch([window::close(a), Task::done(Message::ClearSearchResults)]) } + + Message::ReturnFocus => { + tile.restore_frontmost(); + Task::none() + } + Message::ClearSearchResults => { tile.results = vec![]; Task::none() From 9465e8ea880fa78cf08fe042269bc68351fc0ada Mon Sep 17 00:00:00 2001 From: unsecretised Date: Thu, 1 Jan 2026 23:11:12 +0800 Subject: [PATCH 4/4] Formatting -_- --- src/app/tile/update.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/tile/update.rs b/src/app/tile/update.rs index c4d091f..fd6d133 100644 --- a/src/app/tile/update.rs +++ b/src/app/tile/update.rs @@ -166,7 +166,9 @@ pub fn handle_update(tile: &mut Tile, message: Message) -> Task { command.execute(&tile.config, &tile.query); let return_focus_task = match &command { - Function::OpenApp(_) | Function::OpenPrefPane | Function::GoogleSearch(_) => Task::none(), + Function::OpenApp(_) | Function::OpenPrefPane | Function::GoogleSearch(_) => { + Task::none() + } _ => Task::done(Message::ReturnFocus), };