From cc4b0579931718718780d2e29245eae08bf00f37 Mon Sep 17 00:00:00 2001 From: CJ Pais Date: Thu, 15 May 2025 13:42:31 -0700 Subject: [PATCH] basically label option nicely on macOS as well as fix command not being sent properly. --- bun.lockb | Bin 65446 -> 65841 bytes package.json | 1 + src-tauri/Cargo.lock | 90 +++++++++++++++--- src-tauri/Cargo.toml | 1 + src-tauri/src/lib.rs | 1 + src/components/settings/KeyboardShortcuts.tsx | 76 +++++++++++++-- 6 files changed, 150 insertions(+), 19 deletions(-) diff --git a/bun.lockb b/bun.lockb index 64ec2cf348505d79ad69c6bb7c0ed7c641ec5fa6..39652e83085393c7e1a50de9c2e188cacff58d69 100755 GIT binary patch delta 10176 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 diff --git a/package.json b/package.json index d4f3972..b4ab0d4 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@tauri-apps/plugin-clipboard-manager": "~2", "@tauri-apps/plugin-global-shortcut": "~2", "@tauri-apps/plugin-opener": "^2", + "@tauri-apps/plugin-os": "~2", "@tauri-apps/plugin-store": "~2", "@tauri-apps/plugin-stronghold": "~2", "@tauri-apps/plugin-upload": "~2", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index af0061c..f160ebd 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -213,7 +213,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix", + "rustix 0.38.44", "slab", "tracing", "windows-sys 0.59.0", @@ -245,7 +245,7 @@ dependencies = [ "cfg-if", "event-listener", "futures-lite", - "rustix", + "rustix 0.38.44", "tracing", ] @@ -272,7 +272,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix", + "rustix 0.38.44", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -1745,6 +1745,16 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "gethostname" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc257fdb4038301ce4b9cd1b3b51704509692bb3ff716a410cbd07925d9dae55" +dependencies = [ + "rustix 1.0.7", + "windows-targets 0.52.6", +] + [[package]] name = "getrandom" version = "0.1.16" @@ -1982,6 +1992,7 @@ dependencies = [ "tauri-plugin-global-shortcut", "tauri-plugin-macos-permissions", "tauri-plugin-opener", + "tauri-plugin-os", "tauri-plugin-single-instance", "tauri-plugin-store", "tokio", @@ -2663,6 +2674,12 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + [[package]] name = "litemap" version = "0.7.4" @@ -3357,6 +3374,17 @@ dependencies = [ "ureq", ] +[[package]] +name = "os_info" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fc863e2ca13dc2d5c34fb22ea4a588248ac14db929616ba65c45f21744b1e9" +dependencies = [ + "log", + "serde", + "windows-sys 0.52.0", +] + [[package]] name = "pango" version = "0.18.3" @@ -3622,7 +3650,7 @@ dependencies = [ "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix", + "rustix 0.38.44", "tracing", "windows-sys 0.59.0", ] @@ -4134,7 +4162,20 @@ dependencies = [ "bitflags 2.8.0", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags 2.8.0", + "errno", + "libc", + "linux-raw-sys 0.9.4", "windows-sys 0.59.0", ] @@ -4684,6 +4725,15 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "sys-locale" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +dependencies = [ + "libc", +] + [[package]] name = "system-deps" version = "6.2.2" @@ -4973,6 +5023,24 @@ dependencies = [ "zbus", ] +[[package]] +name = "tauri-plugin-os" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "424f19432397850c2ddd42aa58078630c15287bbce3866eb1d90e7dbee680637" +dependencies = [ + "gethostname 1.0.2", + "log", + "os_info", + "serde", + "serde_json", + "serialize-to-javascript", + "sys-locale", + "tauri", + "tauri-plugin", + "thiserror 2.0.11", +] + [[package]] name = "tauri-plugin-single-instance" version = "2.2.1" @@ -5106,7 +5174,7 @@ dependencies = [ "fastrand", "getrandom 0.3.1", "once_cell", - "rustix", + "rustix 0.38.44", "windows-sys 0.59.0", ] @@ -5899,7 +5967,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix", + "rustix 0.38.44", ] [[package]] @@ -6512,8 +6580,8 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ - "gethostname", - "rustix", + "gethostname 0.4.3", + "rustix 0.38.44", "x11rb-protocol", ] @@ -6530,8 +6598,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" dependencies = [ "libc", - "linux-raw-sys", - "rustix", + "linux-raw-sys 0.4.15", + "rustix 0.38.44", ] [[package]] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 33871fc..bffb3e9 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -38,6 +38,7 @@ log = "0.4.25" tokio = "1.43.0" vad-rs = "0.1.5" tauri-plugin-store = "2" +tauri-plugin-os = "2" [target.'cfg(target_os = "macos")'.dependencies] whisper-rs = { version = "0.13.2", features = ["metal"] } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index fd056ee..d7eb3ec 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -27,6 +27,7 @@ pub fn run() { env_logger::init(); tauri::Builder::default() + .plugin(tauri_plugin_os::init()) .plugin(tauri_plugin_clipboard_manager::init()) .plugin(tauri_plugin_autostart::init( MacosLauncher::LaunchAgent, diff --git a/src/components/settings/KeyboardShortcuts.tsx b/src/components/settings/KeyboardShortcuts.tsx index dc36d03..9c5609f 100644 --- a/src/components/settings/KeyboardShortcuts.tsx +++ b/src/components/settings/KeyboardShortcuts.tsx @@ -7,6 +7,7 @@ import { ShortcutBindingsMap, } from "../../lib/types"; import { invoke } from "@tauri-apps/api/core"; +import { type } from "@tauri-apps/plugin-os"; import keycode from "keycode"; import ResetIcon from "../icons/ResetIcon"; @@ -16,11 +17,58 @@ export const KeyboardShortcuts: React.FC = () => { const [keyPressed, setKeyPressed] = useState([]); const [recordedKeys, setRecordedKeys] = useState([]); const [editingShortcutId, setEditingShortcutId] = useState( - null + null, ); const [originalBinding, setOriginalBinding] = useState(""); + const [isMacOS, setIsMacOS] = useState(false); const shortcutRefs = useRef>(new Map()); + // Check if running on macOS + useEffect(() => { + const checkOsType = async () => { + try { + const osType = type(); + setIsMacOS(osType === "macos"); + } catch (error) { + console.error("Error detecting OS type:", error); + setIsMacOS(false); + } + }; + + checkOsType(); + }, []); + + // Normalize modifier keys (unify left/right variants) + const normalizeKey = (key: string): string => { + // Handle left/right variants of modifier keys + if (key.startsWith("left ") || key.startsWith("right ")) { + const parts = key.split(" "); + if (parts.length === 2) { + // Return just the modifier name without left/right prefix + return parts[1]; + } + } + return key; + }; + + // Format keys for macOS display + const formatMacOSKeys = (key: string): string => { + if (!isMacOS) return key; // Only format for macOS + + const keyMap: Record = { + alt: "option", + }; + + return keyMap[key.toLowerCase()] || key; + }; + + // Format a key combination for display + const formatKeyCombination = (combination: string): string => { + if (!isMacOS) return combination; // Only format for macOS + + return combination.split("+").map(formatMacOSKeys).join(" + "); + }; + useEffect(() => { load("settings_store.json", { autoSave: false }).then((r) => { console.log("loaded store", r); @@ -43,8 +91,11 @@ export const KeyboardShortcuts: React.FC = () => { const handleKeyDown = (e: KeyboardEvent) => { e.preventDefault(); - const key = keycode(e).toLowerCase(); - console.log("You pressed", key); + // Get the key and normalize it (unify left/right modifiers) + const rawKey = keycode(e).toLowerCase(); + const key = normalizeKey(rawKey); + + console.log("You pressed", rawKey, "normalized to", key); if (!keyPressed.includes(key)) { setKeyPressed((prev) => [...prev, key]); @@ -58,7 +109,9 @@ export const KeyboardShortcuts: React.FC = () => { const handleKeyUp = (e: KeyboardEvent) => { e.preventDefault(); - const key = keycode(e).toLowerCase(); + // Get the key and normalize it + const rawKey = keycode(e).toLowerCase(); + const key = normalizeKey(rawKey); // Remove from currently pressed keys setKeyPressed((prev) => prev.filter((k) => k !== key)); @@ -138,7 +191,14 @@ export const KeyboardShortcuts: React.FC = () => { // Format the current shortcut keys being recorded const formatCurrentKeys = () => { - return recordedKeys.length > 0 ? recordedKeys.join("+") : "Press keys..."; + if (recordedKeys.length === 0) return "Press keys..."; + + if (!isMacOS) { + return recordedKeys.join("+"); + } + + // Map each key to its macOS-friendly name for display + return recordedKeys.map(formatMacOSKeys).join(" + "); }; // Store references to shortcut elements @@ -185,16 +245,16 @@ export const KeyboardShortcuts: React.FC = () => { {editingShortcutId === id ? (
setShortcutRef(id, ref)} - className="px-2 py-1 text-sm font-semibold border border-logo-primary bg-logo-primary/30 rounded min-w-[100px] text-center" + className="px-2 py-1 text-sm font-semibold border border-logo-primary bg-logo-primary/30 rounded min-w-[120px] text-center" > {formatCurrentKeys()}
) : (
startRecording(id)} > - {binding.current_binding} + {formatKeyCombination(binding.current_binding)}
)}