Skip to content
This repository was archived by the owner on Sep 7, 2026. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 96 additions & 24 deletions src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ thiserror = "1.0"
font-kit = "0.14.2"
image = "0.25.4"

rdev = "0.5"

[target.'cfg(target_os = "macos")'.dependencies]
macos-accessibility-client = "0.0.1"
window-shadows = "0.2"
Expand Down
63 changes: 63 additions & 0 deletions src-tauri/src/clipboard.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,72 @@
use crate::window::text_translate;
use crate::window::slide_translate;
use std::sync::Mutex;
use tauri::{ClipboardManager, Manager};

pub struct ClipboardMonitorEnableWrapper(pub Mutex<String>);
pub struct SlideTranslateEnableWrapper(pub Mutex<String>);

use rdev::{listen, Event, EventType, Button};
use std::sync::Arc;

pub fn start_slide_translate(app_handle: tauri::AppHandle) {
let mouse_down_pos = Arc::new(Mutex::new(None::<(f64, f64)>));
let mouse_up_pos = Arc::new(Mutex::new(None::<(f64, f64)>));
let last_mouse_pos = Arc::new(Mutex::new((0.0, 0.0)));

std::thread::spawn({
let mouse_down_pos = mouse_down_pos.clone();
let mouse_up_pos = mouse_up_pos.clone();
let last_mouse_pos = last_mouse_pos.clone();

move || {
if let Err(error) = listen(move |event: Event| {
// Check if stroke translation is enabled
let state = app_handle.state::<SlideTranslateEnableWrapper>();
if let Ok(slide_enable) = state.0.lock() {
if slide_enable.contains("false") {
return;
}
}
match event.event_type {
EventType::MouseMove { x, y } => {
// Record the current coordinates of the mouse
let mut pos = last_mouse_pos.lock().unwrap();
*pos = (x, y);
}
EventType::ButtonPress(Button::Left) => {
let pos = last_mouse_pos.lock().unwrap();
*mouse_down_pos.lock().unwrap() = Some(*pos);
}
EventType::ButtonRelease(Button::Left) => {
let pos = last_mouse_pos.lock().unwrap();
*mouse_up_pos.lock().unwrap() = Some(*pos);

let down = mouse_down_pos.lock().unwrap();
let up = mouse_up_pos.lock().unwrap();

if let (Some((dx, dy)), Some((ux, uy))) = (*down, *up) {
if (dx - ux).abs() > 1.0 || (dy - uy).abs() > 1.0 {
std::thread::spawn(move || {
use selection::get_text;
// Get Selected Text
let selected = get_text();
if !selected.trim().is_empty() {
slide_translate(selected);
}
});
}
// else click no drag, ignore.
}
}
_ => {}
}
}) {
eprintln!("Error: {:?}", error);
}
}
});
}
pub fn start_clipboard_monitor(app_handle: tauri::AppHandle) {
tauri::async_runtime::spawn(async move {
let mut pre_text = "".to_string();
Expand Down
Loading