add first implementation of circle keyboard and better switching of keyboards

This commit is contained in:
lukasadrion
2025-12-04 18:54:10 +01:00
parent 15cdc77eea
commit ef740ca9dd
6 changed files with 393 additions and 90 deletions

View File

@@ -1,4 +1,4 @@
use enigo::{Direction::Click, Enigo, Key, Keyboard, Settings};
use enigo::{Direction, Enigo, Key, Keyboard, Settings};
#[cfg(target_os = "linux")]
use std::ptr;
use tauri::Manager;
@@ -6,8 +6,8 @@ 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);
// let mut enigo = Enigo::new(&Settings::default()).unwrap();
// enigo.key(Key::Unicode('a'), Click);
format!("Hello, {}! You've been greeted from Rust!", name)
}
@@ -16,17 +16,30 @@ fn send_key(key: String) -> Result<(), String> {
let mut enigo = Enigo::new(&Settings::default()).map_err(|e| format!("Enigo error: {}", e))?;
if key.len() == 1 {
// Single letter (a-z, A-Z)
enigo.key(Key::Unicode(key.chars().next().unwrap()), Click)
.map_err(|e| format!("Key error: {}", e))?;
let ch = key.chars().next().unwrap();
// Check if uppercase letter
if ch.is_uppercase() && ch.is_alphabetic() {
// Send Shift + lowercase letter
enigo.key(Key::Shift, Direction::Press)
.map_err(|e| format!("Shift press error: {}", e))?;
enigo.key(Key::Unicode(ch.to_lowercase().next().unwrap()), Direction::Click)
.map_err(|e| format!("Key error: {}", e))?;
enigo.key(Key::Shift, Direction::Release)
.map_err(|e| format!("Shift release error: {}", e))?;
} else {
// Send character as-is (lowercase or non-letter)
enigo.key(Key::Unicode(ch), Direction::Click)
.map_err(|e| format!("Key error: {}", e))?;
}
} else {
// Special keys
match key.as_str() {
"Enter" => enigo.key(Key::Return, Click)
"Enter" => enigo.key(Key::Return, Direction::Click)
.map_err(|e| format!("Key error: {}", e))?,
"Space" => enigo.key(Key::Space, Click)
"Space" => enigo.key(Key::Space, Direction::Click)
.map_err(|e| format!("Key error: {}", e))?,
"Backspace" => enigo.key(Key::Backspace, Click)
"Backspace" => enigo.key(Key::Backspace, Direction::Click)
.map_err(|e| format!("Key error: {}", e))?,
_ => return Err("Unknown key".to_string()),
}