├── uiohook-sys ├── .gitignore ├── src │ ├── linux.rs │ ├── windows.rs │ └── lib.rs ├── Cargo.toml ├── build.rs └── Cargo.lock ├── .vscode ├── settings.json └── launch.json ├── .gitmodules ├── .envrc ├── .gitignore ├── devenv.yaml ├── package.json ├── .npmignore ├── lib └── venbind.d.ts ├── src ├── errors.rs ├── lib.rs ├── js.rs ├── structs.rs ├── windows.rs └── linux.rs ├── README.md ├── Cargo.toml ├── LICENSE ├── devenv.nix ├── .github └── workflows │ └── publish.yml ├── devenv.lock └── Cargo.lock /uiohook-sys/.gitignore: -------------------------------------------------------------------------------- 1 | /target -------------------------------------------------------------------------------- /uiohook-sys/src/linux.rs: -------------------------------------------------------------------------------- 1 | include!(concat!(env!("OUT_DIR"), "/linux_helper_bindings.rs")); -------------------------------------------------------------------------------- /uiohook-sys/src/windows.rs: -------------------------------------------------------------------------------- 1 | include!(concat!(env!("OUT_DIR"), "/windows_helper_bindings.rs")); 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "rust-analyzer.procMacro.ignored": { "napi-derive": ["napi"] } 3 | } -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "uiohook-sys/vendor"] 2 | path = uiohook-sys/vendor 3 | url = https://github.com/kwhat/libuiohook.git 4 | -------------------------------------------------------------------------------- /.envrc: -------------------------------------------------------------------------------- 1 | source_url "https://raw.githubusercontent.com/cachix/devenv/95f329d49a8a5289d31e0982652f7058a189bfca/direnvrc" "sha256-d+8cBpDfDBj41inrADaJt+bDWhOktwslgoP5YiGJ1v0=" 2 | 3 | use devenv -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /dist 3 | # Devenv 4 | .devenv* 5 | devenv.local.nix 6 | 7 | # direnv 8 | .direnv 9 | 10 | # pre-commit 11 | .pre-commit-config.yaml 12 | 13 | index.d.ts 14 | index.node -------------------------------------------------------------------------------- /devenv.yaml: -------------------------------------------------------------------------------- 1 | inputs: 2 | fenix: 3 | url: github:nix-community/fenix 4 | inputs: 5 | nixpkgs: 6 | follows: nixpkgs 7 | nixpkgs: 8 | url: github:cachix/devenv-nixpkgs/rolling 9 | -------------------------------------------------------------------------------- /uiohook-sys/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "uiohook-sys" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | [dependencies] 7 | 8 | [build-dependencies] 9 | bindgen = "0.69.4" 10 | cmake = "0.1.50" 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "venbind", 3 | "version": "0.1.7", 4 | "description": "", 5 | "types": "./lib/venbind.d.ts", 6 | "scripts": {}, 7 | "cpu": ["x64", "arm64"], 8 | "os": ["linux", "win32"], 9 | "keywords": [], 10 | "author": "Tuxinal" 11 | } 12 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /target 2 | /dist 3 | # Devenv 4 | .devenv* 5 | devenv* 6 | devenv.local.nix 7 | 8 | # direnv 9 | .direnv 10 | .envrc 11 | 12 | # pre-commit 13 | .pre-commit-config.yaml 14 | 15 | .gitignore 16 | .github 17 | 18 | src 19 | Cargo.* 20 | build.rs 21 | uiohook-sys -------------------------------------------------------------------------------- /uiohook-sys/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![allow(non_upper_case_globals)] 2 | #![allow(non_camel_case_types)] 3 | #![allow(non_snake_case)] 4 | 5 | #[cfg_attr(target_os = "linux", path = "linux.rs")] 6 | #[cfg_attr(target_os = "windows", path = "windows.rs")] 7 | pub mod platform; 8 | 9 | include!(concat!(env!("OUT_DIR"), "/bindings.rs")); 10 | -------------------------------------------------------------------------------- /lib/venbind.d.ts: -------------------------------------------------------------------------------- 1 | export class Venbind { 2 | startKeybinds(callback: (id: string, keyup: boolean) => void, app_id: string | null): void; 3 | setKeybinds(keybinds: KeybindInfo[]): void; 4 | defineErrorHandle(callback: (error: string) => void): void; 5 | getCurrentShortcut(): string; 6 | } 7 | export interface KeybindInfo { 8 | id: string 9 | name?: string 10 | shortcut?: string 11 | } 12 | -------------------------------------------------------------------------------- /src/errors.rs: -------------------------------------------------------------------------------- 1 | use thiserror::Error; 2 | 3 | use crate::structs::KeybindTrigger; 4 | 5 | pub type Result = std::result::Result; 6 | 7 | #[derive(Debug, Error)] 8 | pub enum VenbindError { 9 | #[error("Something went wrong with libuiohook")] // TODO: better log 10 | LibUIOHookError, 11 | #[error("No communication with main thread.")] 12 | MpscSendError(#[from] std::sync::mpsc::SendError), 13 | 14 | #[cfg(target_os = "linux")] 15 | #[error("Can't use on XDG!")] 16 | UnsupportedOnXdg, 17 | #[cfg(target_os = "linux")] 18 | #[error("ashpd error: {0}")] 19 | AshPdError(#[from] ashpd::Error), 20 | } 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Venbind 2 | 3 | An all-in-one library made to handle shortcuts globally across multiple operating systems and desktops. Originally made for usage in [Vesktop](https://github.com/Vencord/Vesktop). 4 | 5 | ## Compiling 6 | 7 | This project uses bindgen, which requires [libclang/LLVM](https://rust-lang.github.io/rust-bindgen/requirements.html). [Node](https://nodejs.org) is also required to build the project using napi-rs. 8 | 9 | ```sh 10 | git clone --recurse-submodules https://github.com/tuxinal/venbind.git 11 | cd venbind 12 | 13 | # if you cloned without submodules 14 | git submodule update --init --recursive 15 | 16 | # build 17 | cargo build 18 | ``` 19 | 20 | ## list of features / TODO 21 | 22 | - [x] support linux x11 23 | - [x] support being called through Node API 24 | - [x] support linux wayland 25 | - [x] support windows 26 | - [ ] support macos 27 | - [ ] better error handling 28 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "lldb", 9 | "request": "launch", 10 | "name": "Debug unit tests in library", 11 | "cargo": { 12 | "args": [ 13 | "test", 14 | "--no-run", 15 | "--lib" 16 | ] 17 | }, 18 | "args": [], 19 | "cwd": "${workspaceFolder}" 20 | }, 21 | { 22 | "type": "lldb", 23 | "request": "attach", 24 | "pid": "${command:pickProcess}", 25 | "name": "Debug Electron process", 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "venbind" 3 | version = "0.1.7" 4 | edition = "2021" 5 | 6 | [lib] 7 | crate-type = ["cdylib"] 8 | 9 | [profile.release] 10 | lto = true 11 | 12 | [dependencies] 13 | uiohook-sys = { path = "./uiohook-sys" } 14 | thiserror = "1.0" 15 | futures = "0.3" 16 | napi = { version = "2", features = ["napi4"], optional = true } 17 | napi-derive = { version = "2", optional = true } 18 | 19 | [target.'cfg(target_os = "linux")'.dependencies] 20 | xcb = { version = "1", features = ["x11", "xkb", "as-raw-xcb-connection"] } 21 | xkbcommon = { version = "0.8", features = ["x11"] } 22 | ashpd = { version = "0.11", features = ["wayland", "async-std"], default-features = false } 23 | 24 | [target.'cfg(target_os = "windows")'.dependencies.windows] 25 | version = "0.61.1" 26 | features = ["Win32_UI_Input_KeyboardAndMouse"] 27 | 28 | [features] 29 | default = ["node"] 30 | node = ["dep:napi", "dep:napi-build", "dep:napi-derive"] 31 | 32 | [workspace] 33 | members = ["./uiohook-sys"] 34 | 35 | [build-dependencies] 36 | napi-build = { version = "2", optional = true } 37 | cmake = "0.1" 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Tuxinal 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /devenv.nix: -------------------------------------------------------------------------------- 1 | { pkgs, lib, config, inputs, ... }: 2 | 3 | { 4 | packages = with pkgs; [ 5 | cmake 6 | libclang 7 | pkg-config 8 | 9 | xorg.libX11 10 | xorg.libXi 11 | xorg.libXtst 12 | xorg.libxcb 13 | libxkbcommon 14 | xorg.libxkbfile 15 | 16 | wayland 17 | 18 | ninja 19 | llvmPackages_latest.llvm 20 | cargo-xwin 21 | cargo-zigbuild 22 | ]; 23 | env.LIBCLANG_PATH="${pkgs.libclang.lib}/lib"; 24 | env.CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS= 25 | "-Clink-arg=-L${pkgs.pkgsCross.aarch64-multiplatform.libxkbcommon}/lib " + 26 | "-Clink-arg=-L${pkgs.pkgsCross.aarch64-multiplatform.xorg.libxcb}/lib " + 27 | "-Clink-arg=-L${pkgs.pkgsCross.aarch64-multiplatform.xorg.libXtst}/lib " + 28 | "-Clink-arg=-L${pkgs.pkgsCross.aarch64-multiplatform.xorg.libX11}/lib " + 29 | "-Clink-arg=-L${pkgs.pkgsCross.aarch64-multiplatform.wayland}/lib"; 30 | env.PKG_CONFIG_PATH_aarch64_unknown_linux_gnu= 31 | "${pkgs.pkgsCross.aarch64-multiplatform.xorg.libX11.dev.outPath}/lib/pkgconfig:" + 32 | "${pkgs.xorg.xorgproto}/share/pkgconfig:" + 33 | "${pkgs.pkgsCross.aarch64-multiplatform.wayland.dev.outPath}/lib/pkgconfig"; 34 | enterShell = '' 35 | export BINDGEN_EXTRA_CLANG_ARGS="$NIX_CFLAGS_COMPILE \ 36 | $(< ${pkgs.clang}/nix-support/libc-cflags) \ 37 | $(< ${pkgs.clang}/nix-support/cc-cflags)" 38 | ''; 39 | languages = { 40 | rust = { 41 | enable = true; 42 | channel = "stable"; 43 | mold.enable = false; 44 | targets = [ 45 | "aarch64-unknown-linux-gnu" 46 | "x86_64-unknown-linux-gnu" 47 | "aarch64-pc-windows-msvc" 48 | "x86_64-pc-windows-msvc" 49 | # "aarch64-apple-darwin" 50 | # "x86_64-apple-darwin" 51 | ]; 52 | }; 53 | javascript = { 54 | enable = true; 55 | pnpm.enable = true; 56 | }; 57 | }; 58 | } 59 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | tags: 4 | - "*" 5 | 6 | name: build and publish to npm 7 | 8 | jobs: 9 | build: 10 | name: Build - ${{ matrix.platform.os }} ${{ matrix.arch }} 11 | strategy: 12 | matrix: 13 | platform: 14 | - os: linux 15 | target_suffix: -unknown-linux-gnu 16 | - os: windows 17 | target_suffix: -pc-windows-msvc 18 | arch: [x86_64, aarch64] 19 | runs-on: ubuntu-latest 20 | steps: 21 | - uses: actions/checkout@v4 22 | with: 23 | submodules: true 24 | - uses: cachix/install-nix-action@v26 25 | - uses: cachix/cachix-action@v14 26 | with: 27 | name: devenv 28 | - name: Install devenv.sh 29 | run: nix profile install nixpkgs#devenv 30 | - name: Build 31 | shell: devenv shell bash -- -e {0} 32 | run: | 33 | npx --yes --package=@napi-rs/cli@canary -- napi build --release --cross-compile --target ${{ matrix.arch }}${{ matrix.platform.target_suffix }} 34 | mkdir dist 35 | cp index.node ./dist/venbind-${{ matrix.platform.os }}-${{ matrix.arch }}.node 36 | - name: Upload 37 | uses: actions/upload-artifact@v4 38 | with: 39 | name: ${{ matrix.platform.os }}-${{ matrix.arch }} 40 | path: ./dist/venbind-${{ matrix.platform.os }}-${{ matrix.arch }}.node 41 | publish: 42 | name: Publish 43 | needs: build 44 | runs-on: ubuntu-latest 45 | steps: 46 | - uses: actions/checkout@v4 47 | # TODO: check tag and make sure it matches across tag, package.json, and Cargo.toml 48 | - name: Install Node 49 | uses: actions/setup-node@v4 50 | with: 51 | node-version: 20 52 | registry-url: "https://registry.npmjs.org" 53 | - name: Download artifacts 54 | uses: actions/download-artifact@v4 55 | with: 56 | path: prebuilds 57 | - name: Publish to npm 58 | run: npm publish 59 | env: 60 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 61 | -------------------------------------------------------------------------------- /uiohook-sys/build.rs: -------------------------------------------------------------------------------- 1 | use std::{env, path::PathBuf}; 2 | 3 | fn main() { 4 | println!("cargo:rerun-if-changed=build.rs"); 5 | let dst = cmake::Config::new("vendor") 6 | .define("USE_XINERAMA", "OFF") 7 | .define("USE_XTEST", "OFF") 8 | .define("USE_XT", "OFF") 9 | .define("CMAKE_INSTALL_LIBDIR", "lib") 10 | .build(); 11 | println!("cargo:rustc-link-search=native={}/lib", dst.display()); 12 | println!("cargo:rustc-link-lib=static=uiohook"); 13 | if env::var_os("CARGO_CFG_WINDOWS").is_some() { 14 | println!("cargo:rustc-link-lib=user32"); 15 | } 16 | if env::var_os("CARGO_CFG_UNIX").is_some() { 17 | println!("cargo:rustc-link-lib=X11"); 18 | println!("cargo:rustc-link-lib=xcb"); 19 | println!("cargo:rustc-link-lib=X11-xcb"); 20 | println!("cargo:rustc-link-lib=xkbcommon-x11"); 21 | println!("cargo:rustc-link-lib=xkbcommon"); 22 | println!("cargo:rustc-link-lib=Xtst"); 23 | } 24 | 25 | let bindings = bindgen::Builder::default() 26 | .header("vendor/include/uiohook.h") 27 | .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) 28 | .generate() 29 | .expect("Unable to generate bindings"); 30 | let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); 31 | bindings 32 | .write_to_file(out_path.join("bindings.rs")) 33 | .expect("Couldn't write bindings!"); 34 | 35 | if std::env::var_os("CARGO_CFG_UNIX").is_some() { 36 | let bindings_linux = bindgen::Builder::default() 37 | .header("vendor/src/x11/input_helper.h") 38 | .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) 39 | .generate() 40 | .expect("Unable to generate bindings"); 41 | bindings_linux 42 | .write_to_file(out_path.join("linux_helper_bindings.rs")) 43 | .expect("Couldn't write bindings!"); 44 | } 45 | if std::env::var_os("CARGO_CFG_WINDOWS").is_some() { 46 | let bindings_windows = bindgen::Builder::default() 47 | .header("stdint.h") 48 | .header("vendor/src/windows/input_helper.h") 49 | .allowlist_file("vendor/src/windows/input_helper.h") 50 | .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) 51 | .generate() 52 | .expect("Unable to generate bindings"); 53 | bindings_windows 54 | .write_to_file(out_path.join("windows_helper_bindings.rs")) 55 | .expect("Couldn't write bindings!"); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | mod errors; 2 | #[cfg(feature = "node")] 3 | pub mod js; 4 | mod structs; 5 | 6 | #[cfg_attr(target_os = "linux", path = "linux.rs")] 7 | #[cfg_attr(target_os = "windows", path = "windows.rs")] 8 | mod platform; 9 | 10 | use std::sync::mpsc::Sender; 11 | 12 | use errors::Result; 13 | use platform::*; 14 | use structs::{KeybindInfo, KeybindTrigger}; 15 | 16 | pub fn start_keybinds(tx: Sender, app_id: Option) -> Result<()> { 17 | start_keybinds_internal(tx, app_id) 18 | } 19 | 20 | pub fn set_keybinds(keybinds: Vec) -> Result<()> { 21 | set_keybinds_internal(keybinds) 22 | } 23 | 24 | pub fn get_current_shortcut() -> Result { 25 | get_current_shortcut_internal() 26 | } 27 | 28 | #[cfg(test)] 29 | mod tests { 30 | use std::{sync::mpsc::channel, thread}; 31 | 32 | use crate::{ 33 | get_current_shortcut, set_keybinds, start_keybinds, structs::{KeybindInfo, KeybindTrigger} 34 | }; 35 | #[test] 36 | fn demo() { 37 | let (tx, rx) = channel::(); 38 | thread::spawn(|| { 39 | start_keybinds(tx, None).unwrap(); 40 | }); 41 | thread::sleep(std::time::Duration::from_secs(2)); 42 | set_keybinds(vec![ 43 | KeybindInfo { 44 | id: "1".to_owned(), 45 | name: Some("Does a thing!".to_owned()), 46 | shortcut: Some("shift+alt+m".to_owned()), 47 | }, 48 | KeybindInfo { 49 | id: "2".to_owned(), 50 | name: Some("Does another thing!".to_owned()), 51 | shortcut: Some("shift+CTRL+a".to_owned()), 52 | }, 53 | ]) 54 | .unwrap(); 55 | 56 | loop { 57 | match rx.recv() { 58 | Err(err) => { 59 | panic!("{err}"); 60 | } 61 | Ok(KeybindTrigger::Pressed(x)) => { 62 | println!("pressed {}", x); 63 | } 64 | Ok(KeybindTrigger::Released(x)) => { 65 | println!("released {}", x); 66 | } 67 | } 68 | } 69 | } 70 | #[test] 71 | fn current_shortcut() { 72 | #[cfg(target_os = "linux")] 73 | assert!(!crate::using_xdg(), "can't get current shortcut on wayland"); 74 | 75 | let (tx, _) = channel(); 76 | thread::spawn(|| { 77 | start_keybinds(tx, None).unwrap(); 78 | }); 79 | let mut current_shortcut = String::new(); 80 | loop { 81 | let curr = get_current_shortcut().unwrap(); 82 | if curr == current_shortcut || curr == "" { 83 | continue; 84 | } 85 | let _ = std::mem::replace(&mut current_shortcut, curr); 86 | println!("{}", current_shortcut); 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/js.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | sync::{mpsc::channel, LazyLock, Mutex}, 3 | thread, 4 | }; 5 | 6 | use napi::{ 7 | bindgen_prelude::*, 8 | threadsafe_function::{ 9 | ErrorStrategy, ThreadSafeCallContext, ThreadsafeFunction, ThreadsafeFunctionCallMode, 10 | }, 11 | }; 12 | use napi_derive::napi; 13 | 14 | use crate::structs::{KeybindInfo, KeybindTrigger}; 15 | 16 | static JS_ERROR_HANDLE: LazyLock>>> = 17 | LazyLock::new(|| Mutex::new(None)); 18 | 19 | macro_rules! pass_to_js_error_handle { 20 | ($func:expr) => { 21 | $func.inspect_err(|e| { 22 | if let Some(err_func) = &*JS_ERROR_HANDLE.lock().unwrap() { 23 | err_func.call(format!("{e}"), ThreadsafeFunctionCallMode::Blocking); 24 | } 25 | }) 26 | }; 27 | } 28 | 29 | #[napi(ts_args_type = "callback: (id: string, keyup: boolean) => void, app_id: string | null")] 30 | pub fn start_keybinds(callback: JsFunction, app_id: Option) -> Result<()> { 31 | let (tx, rx) = channel::(); 32 | thread::spawn(|| { 33 | let _ = pass_to_js_error_handle!(crate::start_keybinds(tx, app_id)); 34 | }); 35 | let thread_function: ThreadsafeFunction<(String, bool), ErrorStrategy::Fatal> = callback 36 | .create_threadsafe_function(0, |ctx: ThreadSafeCallContext<(String, bool)>| { 37 | ctx.env.create_string_from_std(ctx.value.0).and_then(|y| { 38 | ctx.env 39 | .get_boolean(ctx.value.1) 40 | .and_then(|x| (y, x).into_vec(ctx.env.raw())) 41 | }) 42 | })?; 43 | thread::spawn(move || loop { 44 | match rx.recv() { 45 | Err(err) => { 46 | panic!("{err}"); 47 | } 48 | Ok(KeybindTrigger::Pressed(x)) => { 49 | thread_function.call((x, false), ThreadsafeFunctionCallMode::Blocking); 50 | } 51 | Ok(KeybindTrigger::Released(x)) => { 52 | thread_function.call((x, true), ThreadsafeFunctionCallMode::Blocking); 53 | } 54 | } 55 | }); 56 | 57 | Ok(()) 58 | } 59 | 60 | #[napi] 61 | pub fn set_keybinds(#[napi(ts_arg_type = "KeybindInfo[]")] keybinds: Vec) { 62 | let _ = pass_to_js_error_handle!(crate::set_keybinds(keybinds)); 63 | } 64 | 65 | #[napi(ts_args_type = "callback: (error: string) => void")] 66 | pub fn define_error_handle(callback: JsFunction) -> Result<()> { 67 | let error_function: ThreadsafeFunction = callback 68 | .create_threadsafe_function(0, |ctx: ThreadSafeCallContext| { 69 | ctx.env.create_string_from_std(ctx.value).map(|v| vec![v]) 70 | })?; 71 | JS_ERROR_HANDLE.lock().unwrap().replace(error_function); 72 | Ok(()) 73 | } 74 | 75 | #[napi] 76 | pub fn get_current_shortcut() -> String { 77 | (pass_to_js_error_handle!(crate::get_current_shortcut())).unwrap_or(String::from("")) 78 | } 79 | -------------------------------------------------------------------------------- /src/structs.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashSet; 2 | 3 | pub type KeybindId = String; 4 | 5 | #[cfg(feature = "node")] 6 | use napi_derive::napi; 7 | 8 | #[derive(Default)] 9 | pub struct Keybinds { 10 | keybinds: Vec<(Shortcut, KeybindId)>, 11 | } 12 | 13 | #[cfg_attr(feature = "node", napi(object))] 14 | pub struct KeybindInfo { 15 | pub id: KeybindId, 16 | pub name: Option, 17 | pub shortcut: Option, 18 | } 19 | 20 | pub enum KeybindTrigger { 21 | Pressed(KeybindId), 22 | Released(KeybindId), 23 | } 24 | 25 | #[derive(PartialEq, Eq, Debug, Clone)] 26 | pub(crate) struct Shortcut { 27 | pub shift: bool, 28 | pub alt: bool, 29 | pub ctrl: bool, 30 | pub meta: bool, 31 | pub keys: HashSet, 32 | } 33 | 34 | impl Shortcut { 35 | pub fn from_string(keybind: String) -> Self { 36 | let lowercase_keybind = keybind.to_lowercase(); 37 | let keys = lowercase_keybind.split("+"); 38 | let mut shift = false; 39 | let mut alt = false; 40 | let mut ctrl = false; 41 | let mut meta = false; 42 | let mut chars = HashSet::new(); 43 | keys.for_each(|x| match x { 44 | "shift" => shift = true, 45 | "alt" => alt = true, 46 | "ctrl" => ctrl = true, 47 | "meta" => meta = true, 48 | _ => { 49 | chars.insert(x.to_owned()); 50 | } 51 | }); 52 | Self { 53 | shift, 54 | alt, 55 | ctrl, 56 | meta, 57 | keys: chars, 58 | } 59 | } 60 | } 61 | 62 | impl ToString for Shortcut { 63 | fn to_string(&self) -> String { 64 | let mut res = String::new(); 65 | // formatted for https://specifications.freedesktop.org/shortcuts-spec/latest/#specification 66 | if self.shift { 67 | res.push_str("+SHIFT"); 68 | } 69 | if self.alt { 70 | res.push_str("+ALT"); 71 | } 72 | if self.ctrl { 73 | res.push_str("+CTRL"); 74 | } 75 | if self.meta { 76 | res.push_str("+META"); 77 | } 78 | if !self.keys.is_empty() { 79 | res.push_str( 80 | &self 81 | .keys 82 | .iter() 83 | .map(|x| format!("+{}", x)) 84 | .collect::(), 85 | ); 86 | } 87 | res.trim_start_matches("+").to_owned() 88 | } 89 | } 90 | 91 | impl Keybinds { 92 | pub fn register_keybind(&mut self, keybind: Shortcut, id: KeybindId) { 93 | self.keybinds.push((keybind, id)); 94 | } 95 | pub fn clear(&mut self) { 96 | self.keybinds.clear(); 97 | } 98 | pub fn get_active_keybinds(&self, keys: &Shortcut) -> Vec { 99 | self.keybinds 100 | .iter() 101 | .filter(|x| { 102 | x.0.keys.is_subset(&keys.keys) 103 | && (!x.0.alt || (x.0.alt == keys.alt)) 104 | && (!x.0.ctrl || (x.0.ctrl == keys.ctrl)) 105 | && (!x.0.shift || (x.0.shift == keys.shift)) 106 | && (!x.0.meta || (x.0.meta == keys.meta)) 107 | }) 108 | .map(|x| x.1.clone()) 109 | .collect() 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /devenv.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "devenv": { 4 | "locked": { 5 | "dir": "src/modules", 6 | "lastModified": 1746002629, 7 | "owner": "cachix", 8 | "repo": "devenv", 9 | "rev": "596c451323c09ac73ffec4748b84bbefd10c1a8f", 10 | "type": "github" 11 | }, 12 | "original": { 13 | "dir": "src/modules", 14 | "owner": "cachix", 15 | "repo": "devenv", 16 | "type": "github" 17 | } 18 | }, 19 | "fenix": { 20 | "inputs": { 21 | "nixpkgs": [ 22 | "nixpkgs" 23 | ], 24 | "rust-analyzer-src": "rust-analyzer-src" 25 | }, 26 | "locked": { 27 | "lastModified": 1745995211, 28 | "owner": "nix-community", 29 | "repo": "fenix", 30 | "rev": "0db04339c4e4c0fd42dbbaebe3590a67cbd12aa3", 31 | "type": "github" 32 | }, 33 | "original": { 34 | "owner": "nix-community", 35 | "repo": "fenix", 36 | "type": "github" 37 | } 38 | }, 39 | "flake-compat": { 40 | "flake": false, 41 | "locked": { 42 | "lastModified": 1733328505, 43 | "owner": "edolstra", 44 | "repo": "flake-compat", 45 | "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", 46 | "type": "github" 47 | }, 48 | "original": { 49 | "owner": "edolstra", 50 | "repo": "flake-compat", 51 | "type": "github" 52 | } 53 | }, 54 | "gitignore": { 55 | "inputs": { 56 | "nixpkgs": [ 57 | "pre-commit-hooks", 58 | "nixpkgs" 59 | ] 60 | }, 61 | "locked": { 62 | "lastModified": 1709087332, 63 | "owner": "hercules-ci", 64 | "repo": "gitignore.nix", 65 | "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", 66 | "type": "github" 67 | }, 68 | "original": { 69 | "owner": "hercules-ci", 70 | "repo": "gitignore.nix", 71 | "type": "github" 72 | } 73 | }, 74 | "nixpkgs": { 75 | "locked": { 76 | "lastModified": 1746807397, 77 | "owner": "cachix", 78 | "repo": "devenv-nixpkgs", 79 | "rev": "c5208b594838ea8e6cca5997fbf784b7cca1ca90", 80 | "type": "github" 81 | }, 82 | "original": { 83 | "owner": "cachix", 84 | "ref": "rolling", 85 | "repo": "devenv-nixpkgs", 86 | "type": "github" 87 | } 88 | }, 89 | "pre-commit-hooks": { 90 | "inputs": { 91 | "flake-compat": "flake-compat", 92 | "gitignore": "gitignore", 93 | "nixpkgs": [ 94 | "nixpkgs" 95 | ] 96 | }, 97 | "locked": { 98 | "lastModified": 1742649964, 99 | "owner": "cachix", 100 | "repo": "pre-commit-hooks.nix", 101 | "rev": "dcf5072734cb576d2b0c59b2ac44f5050b5eac82", 102 | "type": "github" 103 | }, 104 | "original": { 105 | "owner": "cachix", 106 | "repo": "pre-commit-hooks.nix", 107 | "type": "github" 108 | } 109 | }, 110 | "root": { 111 | "inputs": { 112 | "devenv": "devenv", 113 | "fenix": "fenix", 114 | "nixpkgs": "nixpkgs", 115 | "pre-commit-hooks": "pre-commit-hooks" 116 | } 117 | }, 118 | "rust-analyzer-src": { 119 | "flake": false, 120 | "locked": { 121 | "lastModified": 1745949276, 122 | "owner": "rust-lang", 123 | "repo": "rust-analyzer", 124 | "rev": "78a488dd5e7e4f17162001519665795e6e68b6f8", 125 | "type": "github" 126 | }, 127 | "original": { 128 | "owner": "rust-lang", 129 | "ref": "nightly", 130 | "repo": "rust-analyzer", 131 | "type": "github" 132 | } 133 | } 134 | }, 135 | "root": "root", 136 | "version": 7 137 | } 138 | -------------------------------------------------------------------------------- /src/windows.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashSet; 2 | use std::ffi::OsString; 3 | use std::os::windows::ffi::OsStringExt; 4 | use std::sync::{mpsc::Sender, Mutex}; 5 | use std::sync::{LazyLock, OnceLock}; 6 | 7 | use uiohook_sys::{ 8 | _event_type_EVENT_KEY_PRESSED, _event_type_EVENT_KEY_RELEASED, _uiohook_event, hook_run, 9 | hook_set_dispatch_proc, UIOHOOK_SUCCESS, 10 | }; 11 | 12 | use windows::Win32::UI::Input::KeyboardAndMouse::{ 13 | GetKeyNameTextW, VIRTUAL_KEY, VK_BACK, VK_CONTROL, VK_DELETE, VK_ESCAPE, VK_LCONTROL, VK_LMENU, 14 | VK_LSHIFT, VK_LWIN, VK_MENU, VK_RCONTROL, VK_RETURN, VK_RMENU, VK_RSHIFT, VK_RWIN, VK_SHIFT, 15 | VK_SPACE, VK_TAB, 16 | }; 17 | 18 | use crate::errors::{Result, VenbindError}; 19 | use crate::structs::{KeybindId, KeybindInfo, KeybindTrigger, Keybinds, Shortcut}; 20 | 21 | static KEYBINDS: LazyLock> = LazyLock::new(|| Mutex::new(Keybinds::default())); 22 | static CURR_DOWN: LazyLock> = LazyLock::new(|| { 23 | Mutex::new(Shortcut { 24 | shift: false, 25 | alt: false, 26 | ctrl: false, 27 | meta: false, 28 | keys: HashSet::new(), 29 | }) 30 | }); 31 | static CURR_ACTIVE_KEYBINDS: LazyLock>> = 32 | LazyLock::new(|| Mutex::new(HashSet::new())); 33 | static TX: OnceLock> = OnceLock::new(); 34 | 35 | pub(crate) fn start_keybinds_internal(tx: Sender, _: Option) -> Result<()> { 36 | TX.set(tx).unwrap(); 37 | 38 | unsafe { 39 | hook_set_dispatch_proc(Some(dispatch_proc)); 40 | if hook_run() != UIOHOOK_SUCCESS as i32 { 41 | return Err(VenbindError::LibUIOHookError); 42 | } 43 | }; 44 | Ok(()) 45 | } 46 | 47 | #[no_mangle] 48 | pub extern "C" fn dispatch_proc(event_ref: *mut _uiohook_event) { 49 | let event = unsafe { *event_ref }; 50 | if event.type_ == _event_type_EVENT_KEY_PRESSED || event.type_ == _event_type_EVENT_KEY_RELEASED 51 | { 52 | let keycode = unsafe { event.data.keyboard.rawcode }; 53 | let scancode = unsafe { event.data.keyboard.keycode }; 54 | let key: Option = match VIRTUAL_KEY(keycode) { 55 | VK_SHIFT | VK_MENU | VK_CONTROL | VK_LWIN | VK_RWIN | VK_LSHIFT | VK_RSHIFT 56 | | VK_RCONTROL | VK_LCONTROL | VK_LMENU | VK_RMENU => None, 57 | VK_ESCAPE | VK_BACK | VK_TAB | VK_DELETE | VK_RETURN | VK_SPACE => { 58 | Some(get_key_name(scancode)) 59 | } 60 | _ => { 61 | const BUF_SIZE: usize = 8; 62 | let mut key_buffer: Vec = vec![0; BUF_SIZE]; 63 | let str_count = unsafe { 64 | uiohook_sys::platform::keycode_to_unicode( 65 | keycode as u32, 66 | key_buffer.as_mut_ptr(), 67 | BUF_SIZE.try_into().unwrap(), 68 | ) 69 | }; 70 | key_buffer.truncate(str_count.try_into().unwrap()); 71 | let key = OsString::from_wide(&key_buffer); 72 | if !key.is_empty() { 73 | Some(key.to_string_lossy().to_lowercase()) 74 | } else { 75 | Some(get_key_name(scancode)) 76 | } 77 | } 78 | }; 79 | 80 | let shift = event.mask & uiohook_sys::MASK_SHIFT as u16 != 0; 81 | let alt = event.mask & uiohook_sys::MASK_ALT as u16 != 0; 82 | let ctrl = event.mask & uiohook_sys::MASK_CTRL as u16 != 0; 83 | let meta = event.mask & uiohook_sys::MASK_META as u16 != 0; 84 | 85 | let mut curr_down = CURR_DOWN.lock().unwrap(); 86 | curr_down.alt = alt; 87 | curr_down.shift = shift; 88 | curr_down.ctrl = ctrl; 89 | curr_down.meta = meta; 90 | if let Some(key) = key { 91 | if event.type_ == _event_type_EVENT_KEY_PRESSED { 92 | curr_down.keys.insert(key); 93 | } else { 94 | curr_down.keys.remove(&key); 95 | } 96 | } 97 | let keybinds = KEYBINDS.lock().unwrap(); 98 | let active: HashSet = keybinds 99 | .get_active_keybinds(&curr_down) 100 | .into_iter() 101 | .collect(); 102 | let mut curr_active_keybinds = CURR_ACTIVE_KEYBINDS.lock().unwrap(); 103 | let pressed_keybinds = active.difference(&curr_active_keybinds); 104 | let released_keybinds = curr_active_keybinds.difference(&active); 105 | for pressed in pressed_keybinds { 106 | TX.get() 107 | .unwrap() 108 | .send(KeybindTrigger::Pressed(pressed.clone())) 109 | .unwrap(); 110 | } 111 | for released in released_keybinds { 112 | TX.get() 113 | .unwrap() 114 | .send(KeybindTrigger::Released(released.clone())) 115 | .unwrap(); 116 | } 117 | curr_active_keybinds.clear(); 118 | curr_active_keybinds.extend(active); 119 | } 120 | } 121 | 122 | pub(crate) fn set_keybinds_internal(keybinds: Vec) -> Result<()> { 123 | let mut keybinds_mutex = KEYBINDS.lock().unwrap(); 124 | keybinds_mutex.clear(); 125 | keybinds.iter().for_each(|x| { 126 | if x.shortcut.is_some() { 127 | keybinds_mutex.register_keybind( 128 | Shortcut::from_string(x.shortcut.clone().unwrap()), 129 | x.id.clone(), 130 | ) 131 | } 132 | }); 133 | Ok(()) 134 | } 135 | 136 | pub(crate) fn get_current_shortcut_internal() -> Result { 137 | let down = CURR_DOWN.lock().unwrap(); 138 | Ok(down.to_string()) 139 | } 140 | 141 | fn get_key_name(scancode: u16) -> String { 142 | let mut buf: Vec = vec![0; 16]; 143 | let str_count = unsafe { GetKeyNameTextW((scancode as i32) << 16, &mut buf) }; 144 | buf.truncate(str_count.try_into().unwrap()); 145 | let key = OsString::from_wide(&buf); 146 | key.to_string_lossy().to_string() 147 | } 148 | -------------------------------------------------------------------------------- /src/linux.rs: -------------------------------------------------------------------------------- 1 | use ashpd::{ 2 | desktop::{global_shortcuts::*, *}, 3 | register_host_app, 4 | zbus::export::futures_util::StreamExt, 5 | AppID, 6 | }; 7 | use futures::{executor::block_on, future::Either}; 8 | use std::{ 9 | cell::RefCell, 10 | collections::HashSet, 11 | env, 12 | str::FromStr, 13 | sync::{mpsc::Sender, LazyLock, Mutex, OnceLock}, 14 | }; 15 | use uiohook_sys::{ 16 | _event_type_EVENT_KEY_PRESSED, _event_type_EVENT_KEY_RELEASED, _uiohook_event, hook_run, 17 | hook_set_dispatch_proc, UIOHOOK_SUCCESS, 18 | }; 19 | use xcb::Extension; 20 | use xkbcommon::xkb::{self, Keysym, State}; 21 | 22 | use crate::structs::{KeybindInfo, KeybindTrigger, Keybinds, Shortcut}; 23 | use crate::{ 24 | errors::{Result, VenbindError}, 25 | structs::KeybindId, 26 | }; 27 | 28 | static KEYBINDS: LazyLock> = LazyLock::new(|| Mutex::new(Keybinds::default())); 29 | static CURR_DOWN: LazyLock> = LazyLock::new(|| { 30 | Mutex::new(Shortcut { 31 | shift: false, 32 | alt: false, 33 | ctrl: false, 34 | meta: false, 35 | keys: HashSet::new(), 36 | }) 37 | }); 38 | static CURR_ACTIVE_KEYBINDS: LazyLock>> = 39 | LazyLock::new(|| Mutex::new(HashSet::new())); 40 | static TX: OnceLock> = OnceLock::new(); 41 | 42 | static XDG_STATE: LazyLock>> = LazyLock::new(|| Mutex::new(None)); 43 | 44 | thread_local! { 45 | static XKBCOMMON_STATE: RefCell> = RefCell::new(None); 46 | } 47 | 48 | struct XDGState<'a> { 49 | portal: global_shortcuts::GlobalShortcuts<'a>, 50 | session: Session<'a, ashpd::desktop::global_shortcuts::GlobalShortcuts<'a>>, 51 | } 52 | 53 | pub(crate) fn start_keybinds_internal( 54 | tx: Sender, 55 | app_id: Option, 56 | ) -> Result<()> { 57 | TX.set(tx).unwrap(); 58 | if using_xdg() { 59 | block_on(xdg_start_keybinds(app_id)) 60 | } else { 61 | uiohook_start_keybinds() 62 | } 63 | } 64 | 65 | pub(crate) fn set_keybinds_internal(keybinds: Vec) -> Result<()> { 66 | if using_xdg() { 67 | xdg_set_keybinds(keybinds) 68 | } else { 69 | uiohook_set_keybinds(keybinds) 70 | } 71 | } 72 | 73 | async fn xdg_start_keybinds(app_id: Option) -> Result<()> { 74 | if let Some(app_id) = app_id { 75 | if let Err(err) = register_host_app(AppID::from_str(&app_id)?).await { 76 | eprintln!("Couldn't use registry (chances are your version of xdg-desktop-portal is old): {err}") 77 | } 78 | } 79 | let mut state = XDG_STATE.lock().unwrap(); 80 | let portal = GlobalShortcuts::new().await?; 81 | let session = portal.create_session().await?; 82 | 83 | state.replace(XDGState { portal, session }); 84 | drop(state); 85 | 86 | xdg_input_thread().await?; 87 | 88 | Ok(()) 89 | } 90 | 91 | async fn xdg_input_thread() -> Result<()> { 92 | let (mut activated, mut deactivted) = { 93 | let state = XDG_STATE.lock().unwrap(); 94 | if let Some(state) = state.as_ref() { 95 | let activated = state.portal.receive_activated().await?; 96 | let deactivated = state.portal.receive_deactivated().await?; 97 | (activated, deactivated) 98 | } else { 99 | panic!("This Thread should not be active no XDG state"); 100 | } 101 | }; 102 | loop { 103 | match futures::future::select(activated.next(), deactivted.next()).await { 104 | Either::Left((Some(activated), _)) => TX 105 | .get() 106 | .unwrap() 107 | .send(KeybindTrigger::Pressed(activated.shortcut_id().to_owned()))?, 108 | Either::Right((Some(deactivated), _)) => TX.get().unwrap().send( 109 | KeybindTrigger::Released(deactivated.shortcut_id().to_owned()), 110 | )?, 111 | _ => { 112 | eprintln!("Unexpected output from GlobalShortcuts!"); 113 | } 114 | } 115 | } 116 | } 117 | 118 | fn xdg_set_keybinds(keybinds: Vec) -> Result<()> { 119 | if !using_xdg() { 120 | return Err(VenbindError::UnsupportedOnXdg); 121 | } 122 | let shortcuts: Vec = keybinds 123 | .iter() 124 | .map(|x| NewShortcut::new(&x.id, x.name.clone().unwrap_or(x.id.clone()))) 125 | .collect(); 126 | let lock = XDG_STATE.lock().unwrap(); 127 | if let Some(state) = lock.as_ref() { 128 | let listshortcuts = block_on(state.portal.list_shortcuts(&state.session))?.response()?; 129 | let curr_shortcuts = listshortcuts.shortcuts(); 130 | 131 | if !keybinds 132 | .iter() 133 | .all(|x| curr_shortcuts.iter().any(|y| y.id() == x.id)) 134 | { 135 | block_on( 136 | state 137 | .portal 138 | .bind_shortcuts(&state.session, &shortcuts, None), 139 | )?; 140 | } 141 | } else { 142 | eprintln!("No GlobalShortcuts state was found! skipping preregistery."); 143 | } 144 | Ok(()) 145 | } 146 | 147 | #[no_mangle] 148 | pub extern "C" fn uiohook_dispatch_proc(event_ref: *mut _uiohook_event) { 149 | let event = &unsafe { *event_ref }; 150 | if event.type_ == _event_type_EVENT_KEY_PRESSED || event.type_ == _event_type_EVENT_KEY_RELEASED 151 | { 152 | XKBCOMMON_STATE.with(|state| { 153 | let state_borrow = state.borrow(); 154 | let state = state_borrow.as_ref().unwrap(); 155 | let shift = event.mask & uiohook_sys::MASK_SHIFT as u16 != 0; 156 | let alt = event.mask & uiohook_sys::MASK_ALT as u16 != 0; 157 | let ctrl = event.mask & uiohook_sys::MASK_CTRL as u16 != 0; 158 | let meta = event.mask & uiohook_sys::MASK_META as u16 != 0; 159 | let keycode = 160 | unsafe { uiohook_sys::platform::scancode_to_keycode(event.data.keyboard.keycode) }; 161 | // get the keysym from the keycode to always use a static keyboard layout 162 | let keysym = state.key_get_one_sym(keycode.into()); 163 | let key = match keysym { 164 | // Keys that do have an ascii representation but the keysym name is more fitting 165 | Keysym::Escape 166 | | Keysym::BackSpace 167 | | Keysym::Return 168 | | Keysym::Tab 169 | | Keysym::Delete 170 | | Keysym::space => { 171 | Some(format!("{:?}", keysym).trim_start_matches("XK_").to_owned()) 172 | } 173 | // Keys that are already considered in the event.mask 174 | Keysym::Shift_L 175 | | Keysym::Shift_R 176 | | Keysym::Control_L 177 | | Keysym::Control_R 178 | | Keysym::Alt_L 179 | | Keysym::Alt_R 180 | | Keysym::Super_L 181 | | Keysym::Super_R => None, 182 | // Everything else 183 | _ => { 184 | let key = state.key_get_utf8(keycode.into()); 185 | if key.is_empty() { 186 | Some(format!("{:?}", keysym).trim_start_matches("XK_").to_owned()) 187 | } else { 188 | Some(key) 189 | } 190 | } 191 | }; 192 | let mut curr_down = CURR_DOWN.lock().unwrap(); 193 | curr_down.alt = alt; 194 | curr_down.shift = shift; 195 | curr_down.ctrl = ctrl; 196 | curr_down.meta = meta; 197 | if let Some(key) = key { 198 | if event.type_ == _event_type_EVENT_KEY_PRESSED { 199 | curr_down.keys.insert(key); 200 | } else { 201 | curr_down.keys.remove(&key); 202 | } 203 | } 204 | let keybinds = KEYBINDS.lock().unwrap(); 205 | let active: HashSet = keybinds 206 | .get_active_keybinds(&curr_down) 207 | .into_iter() 208 | .collect(); 209 | let mut curr_active_keybinds = CURR_ACTIVE_KEYBINDS.lock().unwrap(); 210 | let pressed_keybinds = active.difference(&curr_active_keybinds); 211 | let released_keybinds = curr_active_keybinds.difference(&active); 212 | for pressed in pressed_keybinds { 213 | TX.get() 214 | .unwrap() 215 | .send(KeybindTrigger::Pressed(pressed.clone())) 216 | .unwrap(); 217 | } 218 | for released in released_keybinds { 219 | TX.get() 220 | .unwrap() 221 | .send(KeybindTrigger::Released(released.clone())) 222 | .unwrap(); 223 | } 224 | curr_active_keybinds.clear(); 225 | curr_active_keybinds.extend(active); 226 | }); 227 | } 228 | } 229 | 230 | fn uiohook_start_keybinds() -> Result<()> { 231 | let (connection, _screen) = 232 | xcb::Connection::connect_with_extensions(None, &[Extension::Xkb], &[]).unwrap(); 233 | let context = xkb::Context::new(xkb::CONTEXT_NO_FLAGS); 234 | xkb::x11::setup_xkb_extension( 235 | &connection, 236 | xkb::x11::MIN_MAJOR_XKB_VERSION, 237 | xkb::x11::MIN_MINOR_XKB_VERSION, 238 | xkb::x11::SetupXkbExtensionFlags::NoFlags, 239 | &mut 0, 240 | &mut 0, 241 | &mut 0, 242 | &mut 0, 243 | ); 244 | let device_id = xkb::x11::get_core_keyboard_device_id(&connection); 245 | let keymap = xkb::x11::keymap_new_from_device( 246 | &context, 247 | &connection, 248 | device_id, 249 | xkb::KEYMAP_COMPILE_NO_FLAGS, 250 | ); 251 | drop(connection); 252 | // don't make a state with an xcb connection (state_new_from_device) so it only chooses the first layout 253 | // TODO: if someone's first selected layout is not a latin based layout horrible things happen 254 | let state = xkb::State::new(&keymap); 255 | XKBCOMMON_STATE.replace(Some(state)); 256 | unsafe { 257 | hook_set_dispatch_proc(Some(uiohook_dispatch_proc)); 258 | if hook_run() != UIOHOOK_SUCCESS as i32 { 259 | return Err(VenbindError::LibUIOHookError); 260 | } 261 | }; 262 | Ok(()) 263 | } 264 | 265 | fn uiohook_set_keybinds(keybinds: Vec) -> Result<()> { 266 | let mut keybinds_mutex = KEYBINDS.lock().unwrap(); 267 | keybinds_mutex.clear(); 268 | keybinds.iter().for_each(|x| { 269 | if x.shortcut.is_some() { 270 | keybinds_mutex.register_keybind( 271 | Shortcut::from_string(x.shortcut.clone().unwrap()), 272 | x.id.clone(), 273 | ) 274 | } 275 | }); 276 | Ok(()) 277 | } 278 | 279 | pub(crate) fn get_current_shortcut_internal() -> Result { 280 | let down = CURR_DOWN.lock().unwrap(); 281 | Ok(down.to_string()) 282 | } 283 | 284 | #[inline] 285 | pub(crate) fn using_xdg() -> bool { 286 | env::var("XDG_SESSION_TYPE").is_ok_and(|x| x == "wayland".to_owned()) 287 | || env::var("WAYLAND_DISPLAY").is_ok() 288 | || env::var("VENBIND_USE_XDG_PORTAL").is_ok() 289 | } 290 | -------------------------------------------------------------------------------- /uiohook-sys/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "aho-corasick" 7 | version = "1.1.3" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "bindgen" 16 | version = "0.69.4" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" 19 | dependencies = [ 20 | "bitflags", 21 | "cexpr", 22 | "clang-sys", 23 | "itertools", 24 | "lazy_static", 25 | "lazycell", 26 | "log", 27 | "prettyplease", 28 | "proc-macro2", 29 | "quote", 30 | "regex", 31 | "rustc-hash", 32 | "shlex", 33 | "syn", 34 | "which", 35 | ] 36 | 37 | [[package]] 38 | name = "bitflags" 39 | version = "2.6.0" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 42 | 43 | [[package]] 44 | name = "cexpr" 45 | version = "0.6.0" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 48 | dependencies = [ 49 | "nom", 50 | ] 51 | 52 | [[package]] 53 | name = "cfg-if" 54 | version = "1.0.0" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 57 | 58 | [[package]] 59 | name = "clang-sys" 60 | version = "1.8.1" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 63 | dependencies = [ 64 | "glob", 65 | "libc", 66 | "libloading", 67 | ] 68 | 69 | [[package]] 70 | name = "either" 71 | version = "1.13.0" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 74 | 75 | [[package]] 76 | name = "errno" 77 | version = "0.3.9" 78 | source = "registry+https://github.com/rust-lang/crates.io-index" 79 | checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" 80 | dependencies = [ 81 | "libc", 82 | "windows-sys", 83 | ] 84 | 85 | [[package]] 86 | name = "glob" 87 | version = "0.3.1" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" 90 | 91 | [[package]] 92 | name = "home" 93 | version = "0.5.9" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" 96 | dependencies = [ 97 | "windows-sys", 98 | ] 99 | 100 | [[package]] 101 | name = "itertools" 102 | version = "0.12.1" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 105 | dependencies = [ 106 | "either", 107 | ] 108 | 109 | [[package]] 110 | name = "lazy_static" 111 | version = "1.5.0" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 114 | 115 | [[package]] 116 | name = "lazycell" 117 | version = "1.3.0" 118 | source = "registry+https://github.com/rust-lang/crates.io-index" 119 | checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" 120 | 121 | [[package]] 122 | name = "libc" 123 | version = "0.2.155" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" 126 | 127 | [[package]] 128 | name = "libloading" 129 | version = "0.8.4" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" 132 | dependencies = [ 133 | "cfg-if", 134 | "windows-targets", 135 | ] 136 | 137 | [[package]] 138 | name = "libuiohook-sys" 139 | version = "0.1.0" 140 | dependencies = [ 141 | "bindgen", 142 | ] 143 | 144 | [[package]] 145 | name = "linux-raw-sys" 146 | version = "0.4.14" 147 | source = "registry+https://github.com/rust-lang/crates.io-index" 148 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" 149 | 150 | [[package]] 151 | name = "log" 152 | version = "0.4.22" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 155 | 156 | [[package]] 157 | name = "memchr" 158 | version = "2.7.4" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 161 | 162 | [[package]] 163 | name = "minimal-lexical" 164 | version = "0.2.1" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 167 | 168 | [[package]] 169 | name = "nom" 170 | version = "7.1.3" 171 | source = "registry+https://github.com/rust-lang/crates.io-index" 172 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 173 | dependencies = [ 174 | "memchr", 175 | "minimal-lexical", 176 | ] 177 | 178 | [[package]] 179 | name = "once_cell" 180 | version = "1.19.0" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 183 | 184 | [[package]] 185 | name = "prettyplease" 186 | version = "0.2.20" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" 189 | dependencies = [ 190 | "proc-macro2", 191 | "syn", 192 | ] 193 | 194 | [[package]] 195 | name = "proc-macro2" 196 | version = "1.0.86" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" 199 | dependencies = [ 200 | "unicode-ident", 201 | ] 202 | 203 | [[package]] 204 | name = "quote" 205 | version = "1.0.36" 206 | source = "registry+https://github.com/rust-lang/crates.io-index" 207 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 208 | dependencies = [ 209 | "proc-macro2", 210 | ] 211 | 212 | [[package]] 213 | name = "regex" 214 | version = "1.10.5" 215 | source = "registry+https://github.com/rust-lang/crates.io-index" 216 | checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" 217 | dependencies = [ 218 | "aho-corasick", 219 | "memchr", 220 | "regex-automata", 221 | "regex-syntax", 222 | ] 223 | 224 | [[package]] 225 | name = "regex-automata" 226 | version = "0.4.7" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" 229 | dependencies = [ 230 | "aho-corasick", 231 | "memchr", 232 | "regex-syntax", 233 | ] 234 | 235 | [[package]] 236 | name = "regex-syntax" 237 | version = "0.8.4" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" 240 | 241 | [[package]] 242 | name = "rustc-hash" 243 | version = "1.1.0" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 246 | 247 | [[package]] 248 | name = "rustix" 249 | version = "0.38.34" 250 | source = "registry+https://github.com/rust-lang/crates.io-index" 251 | checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" 252 | dependencies = [ 253 | "bitflags", 254 | "errno", 255 | "libc", 256 | "linux-raw-sys", 257 | "windows-sys", 258 | ] 259 | 260 | [[package]] 261 | name = "shlex" 262 | version = "1.3.0" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 265 | 266 | [[package]] 267 | name = "syn" 268 | version = "2.0.71" 269 | source = "registry+https://github.com/rust-lang/crates.io-index" 270 | checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" 271 | dependencies = [ 272 | "proc-macro2", 273 | "quote", 274 | "unicode-ident", 275 | ] 276 | 277 | [[package]] 278 | name = "unicode-ident" 279 | version = "1.0.12" 280 | source = "registry+https://github.com/rust-lang/crates.io-index" 281 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 282 | 283 | [[package]] 284 | name = "which" 285 | version = "4.4.2" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" 288 | dependencies = [ 289 | "either", 290 | "home", 291 | "once_cell", 292 | "rustix", 293 | ] 294 | 295 | [[package]] 296 | name = "windows-sys" 297 | version = "0.52.0" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 300 | dependencies = [ 301 | "windows-targets", 302 | ] 303 | 304 | [[package]] 305 | name = "windows-targets" 306 | version = "0.52.6" 307 | source = "registry+https://github.com/rust-lang/crates.io-index" 308 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 309 | dependencies = [ 310 | "windows_aarch64_gnullvm", 311 | "windows_aarch64_msvc", 312 | "windows_i686_gnu", 313 | "windows_i686_gnullvm", 314 | "windows_i686_msvc", 315 | "windows_x86_64_gnu", 316 | "windows_x86_64_gnullvm", 317 | "windows_x86_64_msvc", 318 | ] 319 | 320 | [[package]] 321 | name = "windows_aarch64_gnullvm" 322 | version = "0.52.6" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 325 | 326 | [[package]] 327 | name = "windows_aarch64_msvc" 328 | version = "0.52.6" 329 | source = "registry+https://github.com/rust-lang/crates.io-index" 330 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 331 | 332 | [[package]] 333 | name = "windows_i686_gnu" 334 | version = "0.52.6" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 337 | 338 | [[package]] 339 | name = "windows_i686_gnullvm" 340 | version = "0.52.6" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 343 | 344 | [[package]] 345 | name = "windows_i686_msvc" 346 | version = "0.52.6" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 349 | 350 | [[package]] 351 | name = "windows_x86_64_gnu" 352 | version = "0.52.6" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 355 | 356 | [[package]] 357 | name = "windows_x86_64_gnullvm" 358 | version = "0.52.6" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 361 | 362 | [[package]] 363 | name = "windows_x86_64_msvc" 364 | version = "0.52.6" 365 | source = "registry+https://github.com/rust-lang/crates.io-index" 366 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 367 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "aho-corasick" 7 | version = "1.1.3" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "as-raw-xcb-connection" 16 | version = "1.0.1" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" 19 | 20 | [[package]] 21 | name = "ashpd" 22 | version = "0.11.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" 25 | dependencies = [ 26 | "async-fs", 27 | "async-net", 28 | "enumflags2", 29 | "futures-channel", 30 | "futures-util", 31 | "rand", 32 | "serde", 33 | "serde_repr", 34 | "url", 35 | "wayland-backend", 36 | "wayland-client", 37 | "wayland-protocols", 38 | "zbus", 39 | ] 40 | 41 | [[package]] 42 | name = "async-broadcast" 43 | version = "0.7.2" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" 46 | dependencies = [ 47 | "event-listener", 48 | "event-listener-strategy", 49 | "futures-core", 50 | "pin-project-lite", 51 | ] 52 | 53 | [[package]] 54 | name = "async-channel" 55 | version = "2.3.1" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" 58 | dependencies = [ 59 | "concurrent-queue", 60 | "event-listener-strategy", 61 | "futures-core", 62 | "pin-project-lite", 63 | ] 64 | 65 | [[package]] 66 | name = "async-executor" 67 | version = "1.13.1" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" 70 | dependencies = [ 71 | "async-task", 72 | "concurrent-queue", 73 | "fastrand", 74 | "futures-lite", 75 | "slab", 76 | ] 77 | 78 | [[package]] 79 | name = "async-fs" 80 | version = "2.1.2" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" 83 | dependencies = [ 84 | "async-lock", 85 | "blocking", 86 | "futures-lite", 87 | ] 88 | 89 | [[package]] 90 | name = "async-io" 91 | version = "2.4.0" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" 94 | dependencies = [ 95 | "async-lock", 96 | "cfg-if", 97 | "concurrent-queue", 98 | "futures-io", 99 | "futures-lite", 100 | "parking", 101 | "polling", 102 | "rustix", 103 | "slab", 104 | "tracing", 105 | "windows-sys", 106 | ] 107 | 108 | [[package]] 109 | name = "async-lock" 110 | version = "3.4.0" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 113 | dependencies = [ 114 | "event-listener", 115 | "event-listener-strategy", 116 | "pin-project-lite", 117 | ] 118 | 119 | [[package]] 120 | name = "async-net" 121 | version = "2.0.0" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" 124 | dependencies = [ 125 | "async-io", 126 | "blocking", 127 | "futures-lite", 128 | ] 129 | 130 | [[package]] 131 | name = "async-process" 132 | version = "2.3.0" 133 | source = "registry+https://github.com/rust-lang/crates.io-index" 134 | checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" 135 | dependencies = [ 136 | "async-channel", 137 | "async-io", 138 | "async-lock", 139 | "async-signal", 140 | "async-task", 141 | "blocking", 142 | "cfg-if", 143 | "event-listener", 144 | "futures-lite", 145 | "rustix", 146 | "tracing", 147 | ] 148 | 149 | [[package]] 150 | name = "async-recursion" 151 | version = "1.1.1" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" 154 | dependencies = [ 155 | "proc-macro2", 156 | "quote", 157 | "syn", 158 | ] 159 | 160 | [[package]] 161 | name = "async-signal" 162 | version = "0.2.10" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" 165 | dependencies = [ 166 | "async-io", 167 | "async-lock", 168 | "atomic-waker", 169 | "cfg-if", 170 | "futures-core", 171 | "futures-io", 172 | "rustix", 173 | "signal-hook-registry", 174 | "slab", 175 | "windows-sys", 176 | ] 177 | 178 | [[package]] 179 | name = "async-task" 180 | version = "4.7.1" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" 183 | 184 | [[package]] 185 | name = "async-trait" 186 | version = "0.1.85" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" 189 | dependencies = [ 190 | "proc-macro2", 191 | "quote", 192 | "syn", 193 | ] 194 | 195 | [[package]] 196 | name = "atomic-waker" 197 | version = "1.1.2" 198 | source = "registry+https://github.com/rust-lang/crates.io-index" 199 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 200 | 201 | [[package]] 202 | name = "autocfg" 203 | version = "1.4.0" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 206 | 207 | [[package]] 208 | name = "bindgen" 209 | version = "0.69.5" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" 212 | dependencies = [ 213 | "bitflags 2.7.0", 214 | "cexpr", 215 | "clang-sys", 216 | "itertools", 217 | "lazy_static", 218 | "lazycell", 219 | "log", 220 | "prettyplease", 221 | "proc-macro2", 222 | "quote", 223 | "regex", 224 | "rustc-hash", 225 | "shlex", 226 | "syn", 227 | "which", 228 | ] 229 | 230 | [[package]] 231 | name = "bitflags" 232 | version = "1.3.2" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 235 | 236 | [[package]] 237 | name = "bitflags" 238 | version = "2.7.0" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be" 241 | 242 | [[package]] 243 | name = "blocking" 244 | version = "1.6.1" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" 247 | dependencies = [ 248 | "async-channel", 249 | "async-task", 250 | "futures-io", 251 | "futures-lite", 252 | "piper", 253 | ] 254 | 255 | [[package]] 256 | name = "byteorder" 257 | version = "1.5.0" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 260 | 261 | [[package]] 262 | name = "cc" 263 | version = "1.2.9" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | checksum = "c8293772165d9345bdaaa39b45b2109591e63fe5e6fbc23c6ff930a048aa310b" 266 | dependencies = [ 267 | "shlex", 268 | ] 269 | 270 | [[package]] 271 | name = "cexpr" 272 | version = "0.6.0" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 275 | dependencies = [ 276 | "nom", 277 | ] 278 | 279 | [[package]] 280 | name = "cfg-if" 281 | version = "1.0.0" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 284 | 285 | [[package]] 286 | name = "cfg_aliases" 287 | version = "0.2.1" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 290 | 291 | [[package]] 292 | name = "clang-sys" 293 | version = "1.8.1" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 296 | dependencies = [ 297 | "glob", 298 | "libc", 299 | "libloading", 300 | ] 301 | 302 | [[package]] 303 | name = "cmake" 304 | version = "0.1.52" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | checksum = "c682c223677e0e5b6b7f63a64b9351844c3f1b1678a68b7ee617e30fb082620e" 307 | dependencies = [ 308 | "cc", 309 | ] 310 | 311 | [[package]] 312 | name = "concurrent-queue" 313 | version = "2.5.0" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 316 | dependencies = [ 317 | "crossbeam-utils", 318 | ] 319 | 320 | [[package]] 321 | name = "convert_case" 322 | version = "0.6.0" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" 325 | dependencies = [ 326 | "unicode-segmentation", 327 | ] 328 | 329 | [[package]] 330 | name = "crossbeam-utils" 331 | version = "0.8.21" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 334 | 335 | [[package]] 336 | name = "ctor" 337 | version = "0.2.9" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" 340 | dependencies = [ 341 | "quote", 342 | "syn", 343 | ] 344 | 345 | [[package]] 346 | name = "displaydoc" 347 | version = "0.2.5" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 350 | dependencies = [ 351 | "proc-macro2", 352 | "quote", 353 | "syn", 354 | ] 355 | 356 | [[package]] 357 | name = "dlib" 358 | version = "0.5.2" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 361 | dependencies = [ 362 | "libloading", 363 | ] 364 | 365 | [[package]] 366 | name = "downcast-rs" 367 | version = "1.2.1" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" 370 | 371 | [[package]] 372 | name = "either" 373 | version = "1.13.0" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 376 | 377 | [[package]] 378 | name = "endi" 379 | version = "1.1.0" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 382 | 383 | [[package]] 384 | name = "enumflags2" 385 | version = "0.7.10" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" 388 | dependencies = [ 389 | "enumflags2_derive", 390 | "serde", 391 | ] 392 | 393 | [[package]] 394 | name = "enumflags2_derive" 395 | version = "0.7.10" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" 398 | dependencies = [ 399 | "proc-macro2", 400 | "quote", 401 | "syn", 402 | ] 403 | 404 | [[package]] 405 | name = "equivalent" 406 | version = "1.0.1" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 409 | 410 | [[package]] 411 | name = "errno" 412 | version = "0.3.10" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 415 | dependencies = [ 416 | "libc", 417 | "windows-sys", 418 | ] 419 | 420 | [[package]] 421 | name = "event-listener" 422 | version = "5.4.0" 423 | source = "registry+https://github.com/rust-lang/crates.io-index" 424 | checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 425 | dependencies = [ 426 | "concurrent-queue", 427 | "parking", 428 | "pin-project-lite", 429 | ] 430 | 431 | [[package]] 432 | name = "event-listener-strategy" 433 | version = "0.5.3" 434 | source = "registry+https://github.com/rust-lang/crates.io-index" 435 | checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" 436 | dependencies = [ 437 | "event-listener", 438 | "pin-project-lite", 439 | ] 440 | 441 | [[package]] 442 | name = "fastrand" 443 | version = "2.3.0" 444 | source = "registry+https://github.com/rust-lang/crates.io-index" 445 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 446 | 447 | [[package]] 448 | name = "form_urlencoded" 449 | version = "1.2.1" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 452 | dependencies = [ 453 | "percent-encoding", 454 | ] 455 | 456 | [[package]] 457 | name = "futures" 458 | version = "0.3.31" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 461 | dependencies = [ 462 | "futures-channel", 463 | "futures-core", 464 | "futures-executor", 465 | "futures-io", 466 | "futures-sink", 467 | "futures-task", 468 | "futures-util", 469 | ] 470 | 471 | [[package]] 472 | name = "futures-channel" 473 | version = "0.3.31" 474 | source = "registry+https://github.com/rust-lang/crates.io-index" 475 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 476 | dependencies = [ 477 | "futures-core", 478 | "futures-sink", 479 | ] 480 | 481 | [[package]] 482 | name = "futures-core" 483 | version = "0.3.31" 484 | source = "registry+https://github.com/rust-lang/crates.io-index" 485 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 486 | 487 | [[package]] 488 | name = "futures-executor" 489 | version = "0.3.31" 490 | source = "registry+https://github.com/rust-lang/crates.io-index" 491 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 492 | dependencies = [ 493 | "futures-core", 494 | "futures-task", 495 | "futures-util", 496 | ] 497 | 498 | [[package]] 499 | name = "futures-io" 500 | version = "0.3.31" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 503 | 504 | [[package]] 505 | name = "futures-lite" 506 | version = "2.6.0" 507 | source = "registry+https://github.com/rust-lang/crates.io-index" 508 | checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 509 | dependencies = [ 510 | "fastrand", 511 | "futures-core", 512 | "futures-io", 513 | "parking", 514 | "pin-project-lite", 515 | ] 516 | 517 | [[package]] 518 | name = "futures-macro" 519 | version = "0.3.31" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 522 | dependencies = [ 523 | "proc-macro2", 524 | "quote", 525 | "syn", 526 | ] 527 | 528 | [[package]] 529 | name = "futures-sink" 530 | version = "0.3.31" 531 | source = "registry+https://github.com/rust-lang/crates.io-index" 532 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 533 | 534 | [[package]] 535 | name = "futures-task" 536 | version = "0.3.31" 537 | source = "registry+https://github.com/rust-lang/crates.io-index" 538 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 539 | 540 | [[package]] 541 | name = "futures-util" 542 | version = "0.3.31" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 545 | dependencies = [ 546 | "futures-channel", 547 | "futures-core", 548 | "futures-io", 549 | "futures-macro", 550 | "futures-sink", 551 | "futures-task", 552 | "memchr", 553 | "pin-project-lite", 554 | "pin-utils", 555 | "slab", 556 | ] 557 | 558 | [[package]] 559 | name = "getrandom" 560 | version = "0.2.15" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 563 | dependencies = [ 564 | "cfg-if", 565 | "libc", 566 | "wasi 0.11.0+wasi-snapshot-preview1", 567 | ] 568 | 569 | [[package]] 570 | name = "getrandom" 571 | version = "0.3.2" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" 574 | dependencies = [ 575 | "cfg-if", 576 | "libc", 577 | "r-efi", 578 | "wasi 0.14.2+wasi-0.2.4", 579 | ] 580 | 581 | [[package]] 582 | name = "glob" 583 | version = "0.3.2" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 586 | 587 | [[package]] 588 | name = "hashbrown" 589 | version = "0.15.2" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 592 | 593 | [[package]] 594 | name = "hermit-abi" 595 | version = "0.4.0" 596 | source = "registry+https://github.com/rust-lang/crates.io-index" 597 | checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" 598 | 599 | [[package]] 600 | name = "hex" 601 | version = "0.4.3" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 604 | 605 | [[package]] 606 | name = "home" 607 | version = "0.5.11" 608 | source = "registry+https://github.com/rust-lang/crates.io-index" 609 | checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 610 | dependencies = [ 611 | "windows-sys", 612 | ] 613 | 614 | [[package]] 615 | name = "icu_collections" 616 | version = "1.5.0" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 619 | dependencies = [ 620 | "displaydoc", 621 | "yoke", 622 | "zerofrom", 623 | "zerovec", 624 | ] 625 | 626 | [[package]] 627 | name = "icu_locid" 628 | version = "1.5.0" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 631 | dependencies = [ 632 | "displaydoc", 633 | "litemap", 634 | "tinystr", 635 | "writeable", 636 | "zerovec", 637 | ] 638 | 639 | [[package]] 640 | name = "icu_locid_transform" 641 | version = "1.5.0" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 644 | dependencies = [ 645 | "displaydoc", 646 | "icu_locid", 647 | "icu_locid_transform_data", 648 | "icu_provider", 649 | "tinystr", 650 | "zerovec", 651 | ] 652 | 653 | [[package]] 654 | name = "icu_locid_transform_data" 655 | version = "1.5.0" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 658 | 659 | [[package]] 660 | name = "icu_normalizer" 661 | version = "1.5.0" 662 | source = "registry+https://github.com/rust-lang/crates.io-index" 663 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 664 | dependencies = [ 665 | "displaydoc", 666 | "icu_collections", 667 | "icu_normalizer_data", 668 | "icu_properties", 669 | "icu_provider", 670 | "smallvec", 671 | "utf16_iter", 672 | "utf8_iter", 673 | "write16", 674 | "zerovec", 675 | ] 676 | 677 | [[package]] 678 | name = "icu_normalizer_data" 679 | version = "1.5.0" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 682 | 683 | [[package]] 684 | name = "icu_properties" 685 | version = "1.5.1" 686 | source = "registry+https://github.com/rust-lang/crates.io-index" 687 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 688 | dependencies = [ 689 | "displaydoc", 690 | "icu_collections", 691 | "icu_locid_transform", 692 | "icu_properties_data", 693 | "icu_provider", 694 | "tinystr", 695 | "zerovec", 696 | ] 697 | 698 | [[package]] 699 | name = "icu_properties_data" 700 | version = "1.5.0" 701 | source = "registry+https://github.com/rust-lang/crates.io-index" 702 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 703 | 704 | [[package]] 705 | name = "icu_provider" 706 | version = "1.5.0" 707 | source = "registry+https://github.com/rust-lang/crates.io-index" 708 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 709 | dependencies = [ 710 | "displaydoc", 711 | "icu_locid", 712 | "icu_provider_macros", 713 | "stable_deref_trait", 714 | "tinystr", 715 | "writeable", 716 | "yoke", 717 | "zerofrom", 718 | "zerovec", 719 | ] 720 | 721 | [[package]] 722 | name = "icu_provider_macros" 723 | version = "1.5.0" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 726 | dependencies = [ 727 | "proc-macro2", 728 | "quote", 729 | "syn", 730 | ] 731 | 732 | [[package]] 733 | name = "idna" 734 | version = "1.0.3" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 737 | dependencies = [ 738 | "idna_adapter", 739 | "smallvec", 740 | "utf8_iter", 741 | ] 742 | 743 | [[package]] 744 | name = "idna_adapter" 745 | version = "1.2.0" 746 | source = "registry+https://github.com/rust-lang/crates.io-index" 747 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 748 | dependencies = [ 749 | "icu_normalizer", 750 | "icu_properties", 751 | ] 752 | 753 | [[package]] 754 | name = "indexmap" 755 | version = "2.7.0" 756 | source = "registry+https://github.com/rust-lang/crates.io-index" 757 | checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" 758 | dependencies = [ 759 | "equivalent", 760 | "hashbrown", 761 | ] 762 | 763 | [[package]] 764 | name = "itertools" 765 | version = "0.12.1" 766 | source = "registry+https://github.com/rust-lang/crates.io-index" 767 | checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 768 | dependencies = [ 769 | "either", 770 | ] 771 | 772 | [[package]] 773 | name = "lazy_static" 774 | version = "1.5.0" 775 | source = "registry+https://github.com/rust-lang/crates.io-index" 776 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 777 | 778 | [[package]] 779 | name = "lazycell" 780 | version = "1.3.0" 781 | source = "registry+https://github.com/rust-lang/crates.io-index" 782 | checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" 783 | 784 | [[package]] 785 | name = "libc" 786 | version = "0.2.169" 787 | source = "registry+https://github.com/rust-lang/crates.io-index" 788 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 789 | 790 | [[package]] 791 | name = "libloading" 792 | version = "0.8.6" 793 | source = "registry+https://github.com/rust-lang/crates.io-index" 794 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 795 | dependencies = [ 796 | "cfg-if", 797 | "windows-targets", 798 | ] 799 | 800 | [[package]] 801 | name = "linux-raw-sys" 802 | version = "0.4.15" 803 | source = "registry+https://github.com/rust-lang/crates.io-index" 804 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 805 | 806 | [[package]] 807 | name = "litemap" 808 | version = "0.7.4" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" 811 | 812 | [[package]] 813 | name = "log" 814 | version = "0.4.25" 815 | source = "registry+https://github.com/rust-lang/crates.io-index" 816 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 817 | 818 | [[package]] 819 | name = "memchr" 820 | version = "2.7.4" 821 | source = "registry+https://github.com/rust-lang/crates.io-index" 822 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 823 | 824 | [[package]] 825 | name = "memmap2" 826 | version = "0.9.5" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" 829 | dependencies = [ 830 | "libc", 831 | ] 832 | 833 | [[package]] 834 | name = "memoffset" 835 | version = "0.9.1" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" 838 | dependencies = [ 839 | "autocfg", 840 | ] 841 | 842 | [[package]] 843 | name = "minimal-lexical" 844 | version = "0.2.1" 845 | source = "registry+https://github.com/rust-lang/crates.io-index" 846 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 847 | 848 | [[package]] 849 | name = "napi" 850 | version = "2.16.13" 851 | source = "registry+https://github.com/rust-lang/crates.io-index" 852 | checksum = "214f07a80874bb96a8433b3cdfc84980d56c7b02e1a0d7ba4ba0db5cef785e2b" 853 | dependencies = [ 854 | "bitflags 2.7.0", 855 | "ctor", 856 | "napi-derive", 857 | "napi-sys", 858 | "once_cell", 859 | ] 860 | 861 | [[package]] 862 | name = "napi-build" 863 | version = "2.1.4" 864 | source = "registry+https://github.com/rust-lang/crates.io-index" 865 | checksum = "db836caddef23662b94e16bf1f26c40eceb09d6aee5d5b06a7ac199320b69b19" 866 | 867 | [[package]] 868 | name = "napi-derive" 869 | version = "2.16.13" 870 | source = "registry+https://github.com/rust-lang/crates.io-index" 871 | checksum = "7cbe2585d8ac223f7d34f13701434b9d5f4eb9c332cccce8dee57ea18ab8ab0c" 872 | dependencies = [ 873 | "cfg-if", 874 | "convert_case", 875 | "napi-derive-backend", 876 | "proc-macro2", 877 | "quote", 878 | "syn", 879 | ] 880 | 881 | [[package]] 882 | name = "napi-derive-backend" 883 | version = "1.0.75" 884 | source = "registry+https://github.com/rust-lang/crates.io-index" 885 | checksum = "1639aaa9eeb76e91c6ae66da8ce3e89e921cd3885e99ec85f4abacae72fc91bf" 886 | dependencies = [ 887 | "convert_case", 888 | "once_cell", 889 | "proc-macro2", 890 | "quote", 891 | "regex", 892 | "semver", 893 | "syn", 894 | ] 895 | 896 | [[package]] 897 | name = "napi-sys" 898 | version = "2.4.0" 899 | source = "registry+https://github.com/rust-lang/crates.io-index" 900 | checksum = "427802e8ec3a734331fec1035594a210ce1ff4dc5bc1950530920ab717964ea3" 901 | dependencies = [ 902 | "libloading", 903 | ] 904 | 905 | [[package]] 906 | name = "nix" 907 | version = "0.29.0" 908 | source = "registry+https://github.com/rust-lang/crates.io-index" 909 | checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" 910 | dependencies = [ 911 | "bitflags 2.7.0", 912 | "cfg-if", 913 | "cfg_aliases", 914 | "libc", 915 | "memoffset", 916 | ] 917 | 918 | [[package]] 919 | name = "nom" 920 | version = "7.1.3" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 923 | dependencies = [ 924 | "memchr", 925 | "minimal-lexical", 926 | ] 927 | 928 | [[package]] 929 | name = "once_cell" 930 | version = "1.20.2" 931 | source = "registry+https://github.com/rust-lang/crates.io-index" 932 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 933 | 934 | [[package]] 935 | name = "ordered-stream" 936 | version = "0.2.0" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" 939 | dependencies = [ 940 | "futures-core", 941 | "pin-project-lite", 942 | ] 943 | 944 | [[package]] 945 | name = "parking" 946 | version = "2.2.1" 947 | source = "registry+https://github.com/rust-lang/crates.io-index" 948 | checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 949 | 950 | [[package]] 951 | name = "percent-encoding" 952 | version = "2.3.1" 953 | source = "registry+https://github.com/rust-lang/crates.io-index" 954 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 955 | 956 | [[package]] 957 | name = "pin-project-lite" 958 | version = "0.2.16" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 961 | 962 | [[package]] 963 | name = "pin-utils" 964 | version = "0.1.0" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 967 | 968 | [[package]] 969 | name = "piper" 970 | version = "0.2.4" 971 | source = "registry+https://github.com/rust-lang/crates.io-index" 972 | checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" 973 | dependencies = [ 974 | "atomic-waker", 975 | "fastrand", 976 | "futures-io", 977 | ] 978 | 979 | [[package]] 980 | name = "pkg-config" 981 | version = "0.3.31" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 984 | 985 | [[package]] 986 | name = "polling" 987 | version = "3.7.4" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" 990 | dependencies = [ 991 | "cfg-if", 992 | "concurrent-queue", 993 | "hermit-abi", 994 | "pin-project-lite", 995 | "rustix", 996 | "tracing", 997 | "windows-sys", 998 | ] 999 | 1000 | [[package]] 1001 | name = "ppv-lite86" 1002 | version = "0.2.20" 1003 | source = "registry+https://github.com/rust-lang/crates.io-index" 1004 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1005 | dependencies = [ 1006 | "zerocopy 0.7.35", 1007 | ] 1008 | 1009 | [[package]] 1010 | name = "prettyplease" 1011 | version = "0.2.29" 1012 | source = "registry+https://github.com/rust-lang/crates.io-index" 1013 | checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" 1014 | dependencies = [ 1015 | "proc-macro2", 1016 | "syn", 1017 | ] 1018 | 1019 | [[package]] 1020 | name = "proc-macro-crate" 1021 | version = "3.2.0" 1022 | source = "registry+https://github.com/rust-lang/crates.io-index" 1023 | checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" 1024 | dependencies = [ 1025 | "toml_edit", 1026 | ] 1027 | 1028 | [[package]] 1029 | name = "proc-macro2" 1030 | version = "1.0.93" 1031 | source = "registry+https://github.com/rust-lang/crates.io-index" 1032 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 1033 | dependencies = [ 1034 | "unicode-ident", 1035 | ] 1036 | 1037 | [[package]] 1038 | name = "quick-xml" 1039 | version = "0.30.0" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" 1042 | dependencies = [ 1043 | "memchr", 1044 | ] 1045 | 1046 | [[package]] 1047 | name = "quick-xml" 1048 | version = "0.36.2" 1049 | source = "registry+https://github.com/rust-lang/crates.io-index" 1050 | checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" 1051 | dependencies = [ 1052 | "memchr", 1053 | ] 1054 | 1055 | [[package]] 1056 | name = "quote" 1057 | version = "1.0.38" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 1060 | dependencies = [ 1061 | "proc-macro2", 1062 | ] 1063 | 1064 | [[package]] 1065 | name = "r-efi" 1066 | version = "5.2.0" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 1069 | 1070 | [[package]] 1071 | name = "rand" 1072 | version = "0.9.0" 1073 | source = "registry+https://github.com/rust-lang/crates.io-index" 1074 | checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" 1075 | dependencies = [ 1076 | "rand_chacha", 1077 | "rand_core", 1078 | "zerocopy 0.8.24", 1079 | ] 1080 | 1081 | [[package]] 1082 | name = "rand_chacha" 1083 | version = "0.9.0" 1084 | source = "registry+https://github.com/rust-lang/crates.io-index" 1085 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 1086 | dependencies = [ 1087 | "ppv-lite86", 1088 | "rand_core", 1089 | ] 1090 | 1091 | [[package]] 1092 | name = "rand_core" 1093 | version = "0.9.3" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 1096 | dependencies = [ 1097 | "getrandom 0.3.2", 1098 | ] 1099 | 1100 | [[package]] 1101 | name = "regex" 1102 | version = "1.11.1" 1103 | source = "registry+https://github.com/rust-lang/crates.io-index" 1104 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1105 | dependencies = [ 1106 | "aho-corasick", 1107 | "memchr", 1108 | "regex-automata", 1109 | "regex-syntax", 1110 | ] 1111 | 1112 | [[package]] 1113 | name = "regex-automata" 1114 | version = "0.4.9" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1117 | dependencies = [ 1118 | "aho-corasick", 1119 | "memchr", 1120 | "regex-syntax", 1121 | ] 1122 | 1123 | [[package]] 1124 | name = "regex-syntax" 1125 | version = "0.8.5" 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" 1127 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1128 | 1129 | [[package]] 1130 | name = "rustc-hash" 1131 | version = "1.1.0" 1132 | source = "registry+https://github.com/rust-lang/crates.io-index" 1133 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1134 | 1135 | [[package]] 1136 | name = "rustix" 1137 | version = "0.38.43" 1138 | source = "registry+https://github.com/rust-lang/crates.io-index" 1139 | checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" 1140 | dependencies = [ 1141 | "bitflags 2.7.0", 1142 | "errno", 1143 | "libc", 1144 | "linux-raw-sys", 1145 | "windows-sys", 1146 | ] 1147 | 1148 | [[package]] 1149 | name = "scoped-tls" 1150 | version = "1.0.1" 1151 | source = "registry+https://github.com/rust-lang/crates.io-index" 1152 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 1153 | 1154 | [[package]] 1155 | name = "semver" 1156 | version = "1.0.24" 1157 | source = "registry+https://github.com/rust-lang/crates.io-index" 1158 | checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" 1159 | 1160 | [[package]] 1161 | name = "serde" 1162 | version = "1.0.217" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 1165 | dependencies = [ 1166 | "serde_derive", 1167 | ] 1168 | 1169 | [[package]] 1170 | name = "serde_derive" 1171 | version = "1.0.217" 1172 | source = "registry+https://github.com/rust-lang/crates.io-index" 1173 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 1174 | dependencies = [ 1175 | "proc-macro2", 1176 | "quote", 1177 | "syn", 1178 | ] 1179 | 1180 | [[package]] 1181 | name = "serde_repr" 1182 | version = "0.1.19" 1183 | source = "registry+https://github.com/rust-lang/crates.io-index" 1184 | checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" 1185 | dependencies = [ 1186 | "proc-macro2", 1187 | "quote", 1188 | "syn", 1189 | ] 1190 | 1191 | [[package]] 1192 | name = "shlex" 1193 | version = "1.3.0" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1196 | 1197 | [[package]] 1198 | name = "signal-hook-registry" 1199 | version = "1.4.2" 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" 1201 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 1202 | dependencies = [ 1203 | "libc", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "slab" 1208 | version = "0.4.9" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1211 | dependencies = [ 1212 | "autocfg", 1213 | ] 1214 | 1215 | [[package]] 1216 | name = "smallvec" 1217 | version = "1.13.2" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1220 | 1221 | [[package]] 1222 | name = "stable_deref_trait" 1223 | version = "1.2.0" 1224 | source = "registry+https://github.com/rust-lang/crates.io-index" 1225 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1226 | 1227 | [[package]] 1228 | name = "static_assertions" 1229 | version = "1.1.0" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1232 | 1233 | [[package]] 1234 | name = "syn" 1235 | version = "2.0.96" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" 1238 | dependencies = [ 1239 | "proc-macro2", 1240 | "quote", 1241 | "unicode-ident", 1242 | ] 1243 | 1244 | [[package]] 1245 | name = "synstructure" 1246 | version = "0.13.1" 1247 | source = "registry+https://github.com/rust-lang/crates.io-index" 1248 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1249 | dependencies = [ 1250 | "proc-macro2", 1251 | "quote", 1252 | "syn", 1253 | ] 1254 | 1255 | [[package]] 1256 | name = "tempfile" 1257 | version = "3.15.0" 1258 | source = "registry+https://github.com/rust-lang/crates.io-index" 1259 | checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" 1260 | dependencies = [ 1261 | "cfg-if", 1262 | "fastrand", 1263 | "getrandom 0.2.15", 1264 | "once_cell", 1265 | "rustix", 1266 | "windows-sys", 1267 | ] 1268 | 1269 | [[package]] 1270 | name = "thiserror" 1271 | version = "1.0.69" 1272 | source = "registry+https://github.com/rust-lang/crates.io-index" 1273 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1274 | dependencies = [ 1275 | "thiserror-impl", 1276 | ] 1277 | 1278 | [[package]] 1279 | name = "thiserror-impl" 1280 | version = "1.0.69" 1281 | source = "registry+https://github.com/rust-lang/crates.io-index" 1282 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1283 | dependencies = [ 1284 | "proc-macro2", 1285 | "quote", 1286 | "syn", 1287 | ] 1288 | 1289 | [[package]] 1290 | name = "tinystr" 1291 | version = "0.7.6" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 1294 | dependencies = [ 1295 | "displaydoc", 1296 | "zerovec", 1297 | ] 1298 | 1299 | [[package]] 1300 | name = "toml_datetime" 1301 | version = "0.6.8" 1302 | source = "registry+https://github.com/rust-lang/crates.io-index" 1303 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 1304 | 1305 | [[package]] 1306 | name = "toml_edit" 1307 | version = "0.22.22" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" 1310 | dependencies = [ 1311 | "indexmap", 1312 | "toml_datetime", 1313 | "winnow", 1314 | ] 1315 | 1316 | [[package]] 1317 | name = "tracing" 1318 | version = "0.1.41" 1319 | source = "registry+https://github.com/rust-lang/crates.io-index" 1320 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1321 | dependencies = [ 1322 | "pin-project-lite", 1323 | "tracing-attributes", 1324 | "tracing-core", 1325 | ] 1326 | 1327 | [[package]] 1328 | name = "tracing-attributes" 1329 | version = "0.1.28" 1330 | source = "registry+https://github.com/rust-lang/crates.io-index" 1331 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 1332 | dependencies = [ 1333 | "proc-macro2", 1334 | "quote", 1335 | "syn", 1336 | ] 1337 | 1338 | [[package]] 1339 | name = "tracing-core" 1340 | version = "0.1.33" 1341 | source = "registry+https://github.com/rust-lang/crates.io-index" 1342 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 1343 | dependencies = [ 1344 | "once_cell", 1345 | ] 1346 | 1347 | [[package]] 1348 | name = "uds_windows" 1349 | version = "1.1.0" 1350 | source = "registry+https://github.com/rust-lang/crates.io-index" 1351 | checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" 1352 | dependencies = [ 1353 | "memoffset", 1354 | "tempfile", 1355 | "winapi", 1356 | ] 1357 | 1358 | [[package]] 1359 | name = "uiohook-sys" 1360 | version = "0.1.0" 1361 | dependencies = [ 1362 | "bindgen", 1363 | "cmake", 1364 | ] 1365 | 1366 | [[package]] 1367 | name = "unicode-ident" 1368 | version = "1.0.14" 1369 | source = "registry+https://github.com/rust-lang/crates.io-index" 1370 | checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" 1371 | 1372 | [[package]] 1373 | name = "unicode-segmentation" 1374 | version = "1.12.0" 1375 | source = "registry+https://github.com/rust-lang/crates.io-index" 1376 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 1377 | 1378 | [[package]] 1379 | name = "url" 1380 | version = "2.5.4" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 1383 | dependencies = [ 1384 | "form_urlencoded", 1385 | "idna", 1386 | "percent-encoding", 1387 | "serde", 1388 | ] 1389 | 1390 | [[package]] 1391 | name = "utf16_iter" 1392 | version = "1.0.5" 1393 | source = "registry+https://github.com/rust-lang/crates.io-index" 1394 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 1395 | 1396 | [[package]] 1397 | name = "utf8_iter" 1398 | version = "1.0.4" 1399 | source = "registry+https://github.com/rust-lang/crates.io-index" 1400 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1401 | 1402 | [[package]] 1403 | name = "venbind" 1404 | version = "0.1.7" 1405 | dependencies = [ 1406 | "ashpd", 1407 | "cmake", 1408 | "futures", 1409 | "napi", 1410 | "napi-build", 1411 | "napi-derive", 1412 | "thiserror", 1413 | "uiohook-sys", 1414 | "windows", 1415 | "xcb", 1416 | "xkbcommon", 1417 | ] 1418 | 1419 | [[package]] 1420 | name = "wasi" 1421 | version = "0.11.0+wasi-snapshot-preview1" 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" 1423 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1424 | 1425 | [[package]] 1426 | name = "wasi" 1427 | version = "0.14.2+wasi-0.2.4" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 1430 | dependencies = [ 1431 | "wit-bindgen-rt", 1432 | ] 1433 | 1434 | [[package]] 1435 | name = "wayland-backend" 1436 | version = "0.3.7" 1437 | source = "registry+https://github.com/rust-lang/crates.io-index" 1438 | checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" 1439 | dependencies = [ 1440 | "cc", 1441 | "downcast-rs", 1442 | "rustix", 1443 | "scoped-tls", 1444 | "smallvec", 1445 | "wayland-sys", 1446 | ] 1447 | 1448 | [[package]] 1449 | name = "wayland-client" 1450 | version = "0.31.7" 1451 | source = "registry+https://github.com/rust-lang/crates.io-index" 1452 | checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" 1453 | dependencies = [ 1454 | "bitflags 2.7.0", 1455 | "rustix", 1456 | "wayland-backend", 1457 | "wayland-scanner", 1458 | ] 1459 | 1460 | [[package]] 1461 | name = "wayland-protocols" 1462 | version = "0.32.5" 1463 | source = "registry+https://github.com/rust-lang/crates.io-index" 1464 | checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" 1465 | dependencies = [ 1466 | "bitflags 2.7.0", 1467 | "wayland-backend", 1468 | "wayland-client", 1469 | "wayland-scanner", 1470 | ] 1471 | 1472 | [[package]] 1473 | name = "wayland-scanner" 1474 | version = "0.31.5" 1475 | source = "registry+https://github.com/rust-lang/crates.io-index" 1476 | checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" 1477 | dependencies = [ 1478 | "proc-macro2", 1479 | "quick-xml 0.36.2", 1480 | "quote", 1481 | ] 1482 | 1483 | [[package]] 1484 | name = "wayland-sys" 1485 | version = "0.31.5" 1486 | source = "registry+https://github.com/rust-lang/crates.io-index" 1487 | checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" 1488 | dependencies = [ 1489 | "dlib", 1490 | "log", 1491 | "pkg-config", 1492 | ] 1493 | 1494 | [[package]] 1495 | name = "which" 1496 | version = "4.4.2" 1497 | source = "registry+https://github.com/rust-lang/crates.io-index" 1498 | checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" 1499 | dependencies = [ 1500 | "either", 1501 | "home", 1502 | "once_cell", 1503 | "rustix", 1504 | ] 1505 | 1506 | [[package]] 1507 | name = "winapi" 1508 | version = "0.3.9" 1509 | source = "registry+https://github.com/rust-lang/crates.io-index" 1510 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1511 | dependencies = [ 1512 | "winapi-i686-pc-windows-gnu", 1513 | "winapi-x86_64-pc-windows-gnu", 1514 | ] 1515 | 1516 | [[package]] 1517 | name = "winapi-i686-pc-windows-gnu" 1518 | version = "0.4.0" 1519 | source = "registry+https://github.com/rust-lang/crates.io-index" 1520 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1521 | 1522 | [[package]] 1523 | name = "winapi-x86_64-pc-windows-gnu" 1524 | version = "0.4.0" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1527 | 1528 | [[package]] 1529 | name = "windows" 1530 | version = "0.61.1" 1531 | source = "registry+https://github.com/rust-lang/crates.io-index" 1532 | checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" 1533 | dependencies = [ 1534 | "windows-collections", 1535 | "windows-core", 1536 | "windows-future", 1537 | "windows-link", 1538 | "windows-numerics", 1539 | ] 1540 | 1541 | [[package]] 1542 | name = "windows-collections" 1543 | version = "0.2.0" 1544 | source = "registry+https://github.com/rust-lang/crates.io-index" 1545 | checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 1546 | dependencies = [ 1547 | "windows-core", 1548 | ] 1549 | 1550 | [[package]] 1551 | name = "windows-core" 1552 | version = "0.61.2" 1553 | source = "registry+https://github.com/rust-lang/crates.io-index" 1554 | checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" 1555 | dependencies = [ 1556 | "windows-implement", 1557 | "windows-interface", 1558 | "windows-link", 1559 | "windows-result", 1560 | "windows-strings", 1561 | ] 1562 | 1563 | [[package]] 1564 | name = "windows-future" 1565 | version = "0.2.1" 1566 | source = "registry+https://github.com/rust-lang/crates.io-index" 1567 | checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 1568 | dependencies = [ 1569 | "windows-core", 1570 | "windows-link", 1571 | "windows-threading", 1572 | ] 1573 | 1574 | [[package]] 1575 | name = "windows-implement" 1576 | version = "0.60.0" 1577 | source = "registry+https://github.com/rust-lang/crates.io-index" 1578 | checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 1579 | dependencies = [ 1580 | "proc-macro2", 1581 | "quote", 1582 | "syn", 1583 | ] 1584 | 1585 | [[package]] 1586 | name = "windows-interface" 1587 | version = "0.59.1" 1588 | source = "registry+https://github.com/rust-lang/crates.io-index" 1589 | checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 1590 | dependencies = [ 1591 | "proc-macro2", 1592 | "quote", 1593 | "syn", 1594 | ] 1595 | 1596 | [[package]] 1597 | name = "windows-link" 1598 | version = "0.1.1" 1599 | source = "registry+https://github.com/rust-lang/crates.io-index" 1600 | checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" 1601 | 1602 | [[package]] 1603 | name = "windows-numerics" 1604 | version = "0.2.0" 1605 | source = "registry+https://github.com/rust-lang/crates.io-index" 1606 | checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 1607 | dependencies = [ 1608 | "windows-core", 1609 | "windows-link", 1610 | ] 1611 | 1612 | [[package]] 1613 | name = "windows-result" 1614 | version = "0.3.4" 1615 | source = "registry+https://github.com/rust-lang/crates.io-index" 1616 | checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 1617 | dependencies = [ 1618 | "windows-link", 1619 | ] 1620 | 1621 | [[package]] 1622 | name = "windows-strings" 1623 | version = "0.4.2" 1624 | source = "registry+https://github.com/rust-lang/crates.io-index" 1625 | checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 1626 | dependencies = [ 1627 | "windows-link", 1628 | ] 1629 | 1630 | [[package]] 1631 | name = "windows-sys" 1632 | version = "0.59.0" 1633 | source = "registry+https://github.com/rust-lang/crates.io-index" 1634 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1635 | dependencies = [ 1636 | "windows-targets", 1637 | ] 1638 | 1639 | [[package]] 1640 | name = "windows-targets" 1641 | version = "0.52.6" 1642 | source = "registry+https://github.com/rust-lang/crates.io-index" 1643 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1644 | dependencies = [ 1645 | "windows_aarch64_gnullvm", 1646 | "windows_aarch64_msvc", 1647 | "windows_i686_gnu", 1648 | "windows_i686_gnullvm", 1649 | "windows_i686_msvc", 1650 | "windows_x86_64_gnu", 1651 | "windows_x86_64_gnullvm", 1652 | "windows_x86_64_msvc", 1653 | ] 1654 | 1655 | [[package]] 1656 | name = "windows-threading" 1657 | version = "0.1.0" 1658 | source = "registry+https://github.com/rust-lang/crates.io-index" 1659 | checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 1660 | dependencies = [ 1661 | "windows-link", 1662 | ] 1663 | 1664 | [[package]] 1665 | name = "windows_aarch64_gnullvm" 1666 | version = "0.52.6" 1667 | source = "registry+https://github.com/rust-lang/crates.io-index" 1668 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1669 | 1670 | [[package]] 1671 | name = "windows_aarch64_msvc" 1672 | version = "0.52.6" 1673 | source = "registry+https://github.com/rust-lang/crates.io-index" 1674 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1675 | 1676 | [[package]] 1677 | name = "windows_i686_gnu" 1678 | version = "0.52.6" 1679 | source = "registry+https://github.com/rust-lang/crates.io-index" 1680 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1681 | 1682 | [[package]] 1683 | name = "windows_i686_gnullvm" 1684 | version = "0.52.6" 1685 | source = "registry+https://github.com/rust-lang/crates.io-index" 1686 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1687 | 1688 | [[package]] 1689 | name = "windows_i686_msvc" 1690 | version = "0.52.6" 1691 | source = "registry+https://github.com/rust-lang/crates.io-index" 1692 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1693 | 1694 | [[package]] 1695 | name = "windows_x86_64_gnu" 1696 | version = "0.52.6" 1697 | source = "registry+https://github.com/rust-lang/crates.io-index" 1698 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1699 | 1700 | [[package]] 1701 | name = "windows_x86_64_gnullvm" 1702 | version = "0.52.6" 1703 | source = "registry+https://github.com/rust-lang/crates.io-index" 1704 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1705 | 1706 | [[package]] 1707 | name = "windows_x86_64_msvc" 1708 | version = "0.52.6" 1709 | source = "registry+https://github.com/rust-lang/crates.io-index" 1710 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1711 | 1712 | [[package]] 1713 | name = "winnow" 1714 | version = "0.6.24" 1715 | source = "registry+https://github.com/rust-lang/crates.io-index" 1716 | checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" 1717 | dependencies = [ 1718 | "memchr", 1719 | ] 1720 | 1721 | [[package]] 1722 | name = "wit-bindgen-rt" 1723 | version = "0.39.0" 1724 | source = "registry+https://github.com/rust-lang/crates.io-index" 1725 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 1726 | dependencies = [ 1727 | "bitflags 2.7.0", 1728 | ] 1729 | 1730 | [[package]] 1731 | name = "write16" 1732 | version = "1.0.0" 1733 | source = "registry+https://github.com/rust-lang/crates.io-index" 1734 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 1735 | 1736 | [[package]] 1737 | name = "writeable" 1738 | version = "0.5.5" 1739 | source = "registry+https://github.com/rust-lang/crates.io-index" 1740 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 1741 | 1742 | [[package]] 1743 | name = "x11" 1744 | version = "2.21.0" 1745 | source = "registry+https://github.com/rust-lang/crates.io-index" 1746 | checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" 1747 | dependencies = [ 1748 | "libc", 1749 | "pkg-config", 1750 | ] 1751 | 1752 | [[package]] 1753 | name = "xcb" 1754 | version = "1.5.0" 1755 | source = "registry+https://github.com/rust-lang/crates.io-index" 1756 | checksum = "f1e2f212bb1a92cd8caac8051b829a6582ede155ccb60b5d5908b81b100952be" 1757 | dependencies = [ 1758 | "as-raw-xcb-connection", 1759 | "bitflags 1.3.2", 1760 | "libc", 1761 | "quick-xml 0.30.0", 1762 | "x11", 1763 | ] 1764 | 1765 | [[package]] 1766 | name = "xdg-home" 1767 | version = "1.3.0" 1768 | source = "registry+https://github.com/rust-lang/crates.io-index" 1769 | checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" 1770 | dependencies = [ 1771 | "libc", 1772 | "windows-sys", 1773 | ] 1774 | 1775 | [[package]] 1776 | name = "xkbcommon" 1777 | version = "0.8.0" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | checksum = "8d66ca9352cbd4eecbbc40871d8a11b4ac8107cfc528a6e14d7c19c69d0e1ac9" 1780 | dependencies = [ 1781 | "as-raw-xcb-connection", 1782 | "libc", 1783 | "memmap2", 1784 | "xkeysym", 1785 | ] 1786 | 1787 | [[package]] 1788 | name = "xkeysym" 1789 | version = "0.2.1" 1790 | source = "registry+https://github.com/rust-lang/crates.io-index" 1791 | checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" 1792 | 1793 | [[package]] 1794 | name = "yoke" 1795 | version = "0.7.5" 1796 | source = "registry+https://github.com/rust-lang/crates.io-index" 1797 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 1798 | dependencies = [ 1799 | "serde", 1800 | "stable_deref_trait", 1801 | "yoke-derive", 1802 | "zerofrom", 1803 | ] 1804 | 1805 | [[package]] 1806 | name = "yoke-derive" 1807 | version = "0.7.5" 1808 | source = "registry+https://github.com/rust-lang/crates.io-index" 1809 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 1810 | dependencies = [ 1811 | "proc-macro2", 1812 | "quote", 1813 | "syn", 1814 | "synstructure", 1815 | ] 1816 | 1817 | [[package]] 1818 | name = "zbus" 1819 | version = "5.3.0" 1820 | source = "registry+https://github.com/rust-lang/crates.io-index" 1821 | checksum = "192a0d989036cd60a1e91a54c9851fb9ad5bd96125d41803eed79d2e2ef74bd7" 1822 | dependencies = [ 1823 | "async-broadcast", 1824 | "async-executor", 1825 | "async-fs", 1826 | "async-io", 1827 | "async-lock", 1828 | "async-process", 1829 | "async-recursion", 1830 | "async-task", 1831 | "async-trait", 1832 | "blocking", 1833 | "enumflags2", 1834 | "event-listener", 1835 | "futures-core", 1836 | "futures-util", 1837 | "hex", 1838 | "nix", 1839 | "ordered-stream", 1840 | "serde", 1841 | "serde_repr", 1842 | "static_assertions", 1843 | "tracing", 1844 | "uds_windows", 1845 | "windows-sys", 1846 | "winnow", 1847 | "xdg-home", 1848 | "zbus_macros", 1849 | "zbus_names", 1850 | "zvariant", 1851 | ] 1852 | 1853 | [[package]] 1854 | name = "zbus_macros" 1855 | version = "5.3.0" 1856 | source = "registry+https://github.com/rust-lang/crates.io-index" 1857 | checksum = "3685b5c81fce630efc3e143a4ded235b107f1b1cdf186c3f115529e5e5ae4265" 1858 | dependencies = [ 1859 | "proc-macro-crate", 1860 | "proc-macro2", 1861 | "quote", 1862 | "syn", 1863 | "zbus_names", 1864 | "zvariant", 1865 | "zvariant_utils", 1866 | ] 1867 | 1868 | [[package]] 1869 | name = "zbus_names" 1870 | version = "4.1.1" 1871 | source = "registry+https://github.com/rust-lang/crates.io-index" 1872 | checksum = "519629a3f80976d89c575895b05677cbc45eaf9f70d62a364d819ba646409cc8" 1873 | dependencies = [ 1874 | "serde", 1875 | "static_assertions", 1876 | "winnow", 1877 | "zvariant", 1878 | ] 1879 | 1880 | [[package]] 1881 | name = "zerocopy" 1882 | version = "0.7.35" 1883 | source = "registry+https://github.com/rust-lang/crates.io-index" 1884 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 1885 | dependencies = [ 1886 | "byteorder", 1887 | "zerocopy-derive 0.7.35", 1888 | ] 1889 | 1890 | [[package]] 1891 | name = "zerocopy" 1892 | version = "0.8.24" 1893 | source = "registry+https://github.com/rust-lang/crates.io-index" 1894 | checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" 1895 | dependencies = [ 1896 | "zerocopy-derive 0.8.24", 1897 | ] 1898 | 1899 | [[package]] 1900 | name = "zerocopy-derive" 1901 | version = "0.7.35" 1902 | source = "registry+https://github.com/rust-lang/crates.io-index" 1903 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 1904 | dependencies = [ 1905 | "proc-macro2", 1906 | "quote", 1907 | "syn", 1908 | ] 1909 | 1910 | [[package]] 1911 | name = "zerocopy-derive" 1912 | version = "0.8.24" 1913 | source = "registry+https://github.com/rust-lang/crates.io-index" 1914 | checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" 1915 | dependencies = [ 1916 | "proc-macro2", 1917 | "quote", 1918 | "syn", 1919 | ] 1920 | 1921 | [[package]] 1922 | name = "zerofrom" 1923 | version = "0.1.5" 1924 | source = "registry+https://github.com/rust-lang/crates.io-index" 1925 | checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" 1926 | dependencies = [ 1927 | "zerofrom-derive", 1928 | ] 1929 | 1930 | [[package]] 1931 | name = "zerofrom-derive" 1932 | version = "0.1.5" 1933 | source = "registry+https://github.com/rust-lang/crates.io-index" 1934 | checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" 1935 | dependencies = [ 1936 | "proc-macro2", 1937 | "quote", 1938 | "syn", 1939 | "synstructure", 1940 | ] 1941 | 1942 | [[package]] 1943 | name = "zerovec" 1944 | version = "0.10.4" 1945 | source = "registry+https://github.com/rust-lang/crates.io-index" 1946 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 1947 | dependencies = [ 1948 | "yoke", 1949 | "zerofrom", 1950 | "zerovec-derive", 1951 | ] 1952 | 1953 | [[package]] 1954 | name = "zerovec-derive" 1955 | version = "0.10.3" 1956 | source = "registry+https://github.com/rust-lang/crates.io-index" 1957 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 1958 | dependencies = [ 1959 | "proc-macro2", 1960 | "quote", 1961 | "syn", 1962 | ] 1963 | 1964 | [[package]] 1965 | name = "zvariant" 1966 | version = "5.2.0" 1967 | source = "registry+https://github.com/rust-lang/crates.io-index" 1968 | checksum = "55e6b9b5f1361de2d5e7d9fd1ee5f6f7fcb6060618a1f82f3472f58f2b8d4be9" 1969 | dependencies = [ 1970 | "endi", 1971 | "enumflags2", 1972 | "serde", 1973 | "static_assertions", 1974 | "url", 1975 | "winnow", 1976 | "zvariant_derive", 1977 | "zvariant_utils", 1978 | ] 1979 | 1980 | [[package]] 1981 | name = "zvariant_derive" 1982 | version = "5.2.0" 1983 | source = "registry+https://github.com/rust-lang/crates.io-index" 1984 | checksum = "573a8dd76961957108b10f7a45bac6ab1ea3e9b7fe01aff88325dc57bb8f5c8b" 1985 | dependencies = [ 1986 | "proc-macro-crate", 1987 | "proc-macro2", 1988 | "quote", 1989 | "syn", 1990 | "zvariant_utils", 1991 | ] 1992 | 1993 | [[package]] 1994 | name = "zvariant_utils" 1995 | version = "3.1.0" 1996 | source = "registry+https://github.com/rust-lang/crates.io-index" 1997 | checksum = "ddd46446ea2a1f353bfda53e35f17633afa79f4fe290a611c94645c69fe96a50" 1998 | dependencies = [ 1999 | "proc-macro2", 2000 | "quote", 2001 | "serde", 2002 | "static_assertions", 2003 | "syn", 2004 | "winnow", 2005 | ] 2006 | --------------------------------------------------------------------------------