From 67e7641dea1ed26a22ecc7473eee9bda94dd8b87 Mon Sep 17 00:00:00 2001 From: Colton Hurst Date: Thu, 29 May 2025 11:17:55 -0400 Subject: [PATCH] PM-21845: Successful register_hotkey() call --- apps/desktop/desktop_native/Cargo.lock | 48 ++++++++++--------- .../desktop_native/autotype/Cargo.toml | 5 +- .../desktop_native/autotype/src/lib.rs | 22 +++------ apps/desktop/desktop_native/napi/Cargo.toml | 1 + apps/desktop/desktop_native/napi/index.d.ts | 3 ++ .../napi/src/autotype_internal/dummy.rs | 3 ++ .../napi/src/autotype_internal/mod.rs | 4 ++ .../napi/src/autotype_internal/windows.rs | 3 ++ apps/desktop/desktop_native/napi/src/lib.rs | 11 +++++ apps/desktop/src/entry.ts | 6 +++ package-lock.json | 30 ++++++++++++ 11 files changed, 95 insertions(+), 41 deletions(-) create mode 100644 apps/desktop/desktop_native/napi/src/autotype_internal/dummy.rs create mode 100644 apps/desktop/desktop_native/napi/src/autotype_internal/mod.rs create mode 100644 apps/desktop/desktop_native/napi/src/autotype_internal/windows.rs diff --git a/apps/desktop/desktop_native/Cargo.lock b/apps/desktop/desktop_native/Cargo.lock index d4646ba59eb..c2f0770bc58 100644 --- a/apps/desktop/desktop_native/Cargo.lock +++ b/apps/desktop/desktop_native/Cargo.lock @@ -366,8 +366,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" name = "autotype" version = "0.0.0" dependencies = [ - "windows 0.61.1 (git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8)", + "windows 0.61.1 (git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7)", "windows-core 0.61.2", + "windows-result 0.3.4", ] [[package]] @@ -918,6 +919,7 @@ name = "desktop_napi" version = "0.0.0" dependencies = [ "anyhow", + "autotype", "base64", "desktop_core", "hex", @@ -3546,13 +3548,13 @@ dependencies = [ [[package]] name = "windows" version = "0.61.1" -source = "git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8#d09b4681de02560cf05bd3e57d7ea56b73f3b2f8" +source = "git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7#bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7" dependencies = [ - "windows-collections 0.2.0 (git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8)", + "windows-collections 0.2.0 (git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7)", "windows-core 0.61.2", "windows-future 0.2.1", - "windows-link 0.1.1 (git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8)", - "windows-numerics 0.2.0 (git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8)", + "windows-link 0.1.1 (git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7)", + "windows-numerics 0.2.0 (git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7)", ] [[package]] @@ -3567,7 +3569,7 @@ dependencies = [ [[package]] name = "windows-collections" version = "0.2.0" -source = "git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8#d09b4681de02560cf05bd3e57d7ea56b73f3b2f8" +source = "git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7#bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7" dependencies = [ "windows-core 0.61.2", ] @@ -3600,11 +3602,11 @@ dependencies = [ [[package]] name = "windows-core" version = "0.61.2" -source = "git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8#d09b4681de02560cf05bd3e57d7ea56b73f3b2f8" +source = "git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7#bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7" dependencies = [ - "windows-implement 0.60.0 (git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8)", - "windows-interface 0.59.1 (git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8)", - "windows-link 0.1.1 (git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8)", + "windows-implement 0.60.0 (git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7)", + "windows-interface 0.59.1 (git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7)", + "windows-link 0.1.1 (git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7)", "windows-result 0.3.4", "windows-strings 0.4.2", ] @@ -3622,10 +3624,10 @@ dependencies = [ [[package]] name = "windows-future" version = "0.2.1" -source = "git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8#d09b4681de02560cf05bd3e57d7ea56b73f3b2f8" +source = "git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7#bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7" dependencies = [ "windows-core 0.61.2", - "windows-link 0.1.1 (git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8)", + "windows-link 0.1.1 (git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7)", "windows-threading", ] @@ -3654,7 +3656,7 @@ dependencies = [ [[package]] name = "windows-implement" version = "0.60.0" -source = "git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8#d09b4681de02560cf05bd3e57d7ea56b73f3b2f8" +source = "git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7#bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7" dependencies = [ "proc-macro2", "quote", @@ -3686,7 +3688,7 @@ dependencies = [ [[package]] name = "windows-interface" version = "0.59.1" -source = "git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8#d09b4681de02560cf05bd3e57d7ea56b73f3b2f8" +source = "git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7#bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7" dependencies = [ "proc-macro2", "quote", @@ -3702,7 +3704,7 @@ checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" [[package]] name = "windows-link" version = "0.1.1" -source = "git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8#d09b4681de02560cf05bd3e57d7ea56b73f3b2f8" +source = "git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7#bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7" [[package]] name = "windows-numerics" @@ -3717,10 +3719,10 @@ dependencies = [ [[package]] name = "windows-numerics" version = "0.2.0" -source = "git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8#d09b4681de02560cf05bd3e57d7ea56b73f3b2f8" +source = "git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7#bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7" dependencies = [ "windows-core 0.61.2", - "windows-link 0.1.1 (git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8)", + "windows-link 0.1.1 (git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7)", ] [[package]] @@ -3755,9 +3757,9 @@ dependencies = [ [[package]] name = "windows-result" version = "0.3.4" -source = "git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8#d09b4681de02560cf05bd3e57d7ea56b73f3b2f8" +source = "git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7#bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7" dependencies = [ - "windows-link 0.1.1 (git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8)", + "windows-link 0.1.1 (git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7)", ] [[package]] @@ -3772,9 +3774,9 @@ dependencies = [ [[package]] name = "windows-strings" version = "0.4.2" -source = "git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8#d09b4681de02560cf05bd3e57d7ea56b73f3b2f8" +source = "git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7#bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7" dependencies = [ - "windows-link 0.1.1 (git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8)", + "windows-link 0.1.1 (git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7)", ] [[package]] @@ -3829,9 +3831,9 @@ dependencies = [ [[package]] name = "windows-threading" version = "0.1.0" -source = "git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8#d09b4681de02560cf05bd3e57d7ea56b73f3b2f8" +source = "git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7#bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7" dependencies = [ - "windows-link 0.1.1 (git+https://github.com/microsoft/windows-rs.git?rev=d09b4681de02560cf05bd3e57d7ea56b73f3b2f8)", + "windows-link 0.1.1 (git+https://github.com/microsoft/windows-rs.git?rev=bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7)", ] [[package]] diff --git a/apps/desktop/desktop_native/autotype/Cargo.toml b/apps/desktop/desktop_native/autotype/Cargo.toml index 2eff77c3a12..64da291485c 100644 --- a/apps/desktop/desktop_native/autotype/Cargo.toml +++ b/apps/desktop/desktop_native/autotype/Cargo.toml @@ -6,5 +6,6 @@ edition.workspace = true publish.workspace = true [dependencies] -windows = { git = "https://github.com/microsoft/windows-rs.git", rev = "d09b4681de02560cf05bd3e57d7ea56b73f3b2f8", features = ["Win32_UI_Input_KeyboardAndMouse"] } -windows-core = { git = "https://github.com/microsoft/windows-rs.git", rev = "d09b4681de02560cf05bd3e57d7ea56b73f3b2f8" } +windows = { git = "https://github.com/microsoft/windows-rs.git", rev = "bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7", features = ["Win32_UI_Input_KeyboardAndMouse"] } +windows-core = { git = "https://github.com/microsoft/windows-rs.git", rev = "bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7" } +windows-result = { git = "https://github.com/microsoft/windows-rs.git", rev = "bbe2bf3a5a020893e785ca79b0a09fc8770ba7e7" } diff --git a/apps/desktop/desktop_native/autotype/src/lib.rs b/apps/desktop/desktop_native/autotype/src/lib.rs index a8308d6c749..1becf2ce44f 100644 --- a/apps/desktop/desktop_native/autotype/src/lib.rs +++ b/apps/desktop/desktop_native/autotype/src/lib.rs @@ -1,4 +1,5 @@ use windows::Win32::UI::Input::KeyboardAndMouse::{RegisterHotKey, HOT_KEY_MODIFIERS, MOD_ALT}; +use windows_result::*; /* A safe wrapper around the unsafe RegisterHotKey Win32 function. @@ -6,23 +7,12 @@ use windows::Win32::UI::Input::KeyboardAndMouse::{RegisterHotKey, HOT_KEY_MODIFI https://microsoft.github.io/windows-docs-rs/doc/windows/Win32/UI/Input/KeyboardAndMouse/fn.RegisterHotKey.html https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-registerhotkey */ -pub fn register_hotkey() -> std::result::Result<(), String> { +pub fn register_hotkey() -> std::result::Result { let r = unsafe { RegisterHotKey(None, 1, MOD_ALT, 42) }; // ALT + b - Ok(()) -} - -pub fn add(left: u64, right: u64) -> u64 { - left + right -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); + if let windows_result::Result::Err(e) = r { + return std::result::Result::Err(e.message()); } + + Ok(String::from("it works!")) } diff --git a/apps/desktop/desktop_native/napi/Cargo.toml b/apps/desktop/desktop_native/napi/Cargo.toml index 669f166e748..0195448fd3e 100644 --- a/apps/desktop/desktop_native/napi/Cargo.toml +++ b/apps/desktop/desktop_native/napi/Cargo.toml @@ -30,6 +30,7 @@ tokio-stream = { workspace = true } [target.'cfg(windows)'.dependencies] windows-registry = { workspace = true } windows_plugin_authenticator = { path = "../windows_plugin_authenticator" } +autotype = { path = "../autotype" } [build-dependencies] napi-build = { workspace = true } diff --git a/apps/desktop/desktop_native/napi/index.d.ts b/apps/desktop/desktop_native/napi/index.d.ts index b3c6f715e98..db187595e68 100644 --- a/apps/desktop/desktop_native/napi/index.d.ts +++ b/apps/desktop/desktop_native/napi/index.d.ts @@ -198,3 +198,6 @@ export declare namespace logging { } export function initNapiLog(jsLogFn: (err: Error | null, arg0: LogLevel, arg1: string) => any): void } +export declare namespace autotype { + export function registerHotkey(): string +} diff --git a/apps/desktop/desktop_native/napi/src/autotype_internal/dummy.rs b/apps/desktop/desktop_native/napi/src/autotype_internal/dummy.rs new file mode 100644 index 00000000000..f017a01c33e --- /dev/null +++ b/apps/desktop/desktop_native/napi/src/autotype_internal/dummy.rs @@ -0,0 +1,3 @@ +pub fn register() -> std::result::Result { + bail!("Not implemented") +} diff --git a/apps/desktop/desktop_native/napi/src/autotype_internal/mod.rs b/apps/desktop/desktop_native/napi/src/autotype_internal/mod.rs new file mode 100644 index 00000000000..68929408ec7 --- /dev/null +++ b/apps/desktop/desktop_native/napi/src/autotype_internal/mod.rs @@ -0,0 +1,4 @@ +#[cfg_attr(target_os = "windows", path = "windows.rs")] +#[cfg_attr(not(target_os = "windows"), path = "dummy.rs")] +mod internal; +pub use internal::*; diff --git a/apps/desktop/desktop_native/napi/src/autotype_internal/windows.rs b/apps/desktop/desktop_native/napi/src/autotype_internal/windows.rs new file mode 100644 index 00000000000..a35b9f461ba --- /dev/null +++ b/apps/desktop/desktop_native/napi/src/autotype_internal/windows.rs @@ -0,0 +1,3 @@ +pub fn register_hotkey() -> std::result::Result { + autotype::register_hotkey() +} diff --git a/apps/desktop/desktop_native/napi/src/lib.rs b/apps/desktop/desktop_native/napi/src/lib.rs index 079872a3b03..393cdd89f1f 100644 --- a/apps/desktop/desktop_native/napi/src/lib.rs +++ b/apps/desktop/desktop_native/napi/src/lib.rs @@ -1,6 +1,7 @@ #[macro_use] extern crate napi_derive; +mod autotype_internal; mod passkey_authenticator_internal; mod registry; @@ -875,3 +876,13 @@ pub mod logging { fn flush(&self) {} } } + +#[napi] +pub mod autotype { + #[napi] + pub fn register_hotkey() -> napi::Result { + crate::autotype_internal::register_hotkey().map_err(|e| { + napi::Error::from_reason(e) + }) + } +} diff --git a/apps/desktop/src/entry.ts b/apps/desktop/src/entry.ts index 9f03a84e627..7f55df6f173 100644 --- a/apps/desktop/src/entry.ts +++ b/apps/desktop/src/entry.ts @@ -3,6 +3,8 @@ import * as path from "path"; import { app } from "electron"; +import { autotype } from "@bitwarden/desktop-napi" + if ( process.platform === "darwin" && process.argv.some((arg) => arg.indexOf("chrome-extension://") !== -1 || arg.indexOf("{") !== -1) @@ -40,6 +42,10 @@ if ( // eslint-disable-next-line const Main = require("./main").Main; + let r = autotype.registerHotkey(); + console.log("registerHotkey(): "); + console.log(r); + const main = new Main(); main.bootstrap(); } diff --git a/package-lock.json b/package-lock.json index 691705cc280..c0a126b3891 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1018,6 +1018,36 @@ "webpack": "^5.1.0" } }, + "node_modules/@angular-devkit/build-angular/node_modules/copy-webpack-plugin/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/copy-webpack-plugin/node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",