From 6ae34369b4ec2a174cba89e3b85b6b48a776d9a7 Mon Sep 17 00:00:00 2001 From: eneller Date: Sat, 8 Nov 2025 18:09:56 +0100 Subject: [PATCH] begin minimal keyboard simulation --- src-tauri/Cargo.lock | 2 ++ src-tauri/Cargo.toml | 2 ++ src-tauri/src/lib.rs | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 4b3add5..07adc85 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1838,11 +1838,13 @@ name = "keeb" version = "0.1.0" dependencies = [ "enigo", + "raw-window-handle", "serde", "serde_json", "tauri", "tauri-build", "tauri-plugin-opener", + "x11", ] [[package]] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index d635022..38b7ec8 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -23,6 +23,8 @@ tauri-plugin-opener = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" enigo = "0.6.1" +x11 = { version = "2.21.0", features = ["xlib"] } +raw-window-handle = "0.6.2" [profile.dev] incremental = true # Compile your binary in smaller steps. diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 4a277ef..0f04b33 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,12 +1,44 @@ +use enigo::{Direction::Click, Enigo, Key, Keyboard, Settings}; +use raw_window_handle::{HasRawWindowHandle, RawWindowHandle, WindowHandle}; +use std::ptr; +use tauri::Manager; + // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ #[tauri::command] fn greet(name: &str) -> String { + let mut enigo = Enigo::new(&Settings::default()).unwrap(); + enigo.key(Key::Unicode('a'), Click); format!("Hello, {}! You've been greeted from Rust!", name) } #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { tauri::Builder::default() + .setup(|app| { + let window = app.get_webview_window("main").unwrap(); + #[cfg(target_os = "linux")] + { + use x11::xlib; + // raw X11 pointers here + unsafe { + let handle = window.raw_window_handle(); + if let Ok(RawWindowHandle::Xlib(h)) = handle { + let display = xlib::XOpenDisplay(ptr::null()); + if !display.is_null() { + let hints = xlib::XAllocWMHints(); + if !hints.is_null() { + (*hints).flags = xlib::InputHint; + (*hints).input = 0; // Set input hint to False + xlib::XSetWMHints(display, h.window, hints); + xlib::XFree(hints as *mut _); + } + xlib::XCloseDisplay(display); + } + } + } + } + Ok(()) + }) .plugin(tauri_plugin_opener::init()) .invoke_handler(tauri::generate_handler![greet]) .run(tauri::generate_context!())