opti
This commit is contained in:
@ -1,10 +1,9 @@
|
||||
use crate::database::Database;
|
||||
use crate::models::{ClipboardData, ClipboardEntry, Image};
|
||||
use arboard::Clipboard;
|
||||
use std::collections::hash_map::DefaultHasher;
|
||||
use std::error::Error;
|
||||
use std::hash::{Hash, Hasher};
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::sync::mpsc;
|
||||
use std::thread;
|
||||
use std::time::{Duration, SystemTime};
|
||||
use uuid::Uuid;
|
||||
@ -22,7 +21,10 @@ fn hash_bytes(data: &[u8]) -> u64 {
|
||||
hasher.finish()
|
||||
}
|
||||
|
||||
pub fn start(db: Arc<Mutex<Database>>, mut clipboard: Clipboard) -> Result<(), Box<dyn Error>> {
|
||||
pub fn start(
|
||||
tx: mpsc::Sender<ClipboardEntry>,
|
||||
mut clipboard: Clipboard,
|
||||
) -> Result<(), Box<dyn Error>> {
|
||||
let (conn, screen_num) =
|
||||
RustConnection::connect(None).map_err(|e| format!("Connexion X11 impossible : {e}"))?;
|
||||
|
||||
@ -49,15 +51,14 @@ pub fn start(db: Arc<Mutex<Database>>, mut clipboard: Clipboard) -> Result<(), B
|
||||
.reply()?;
|
||||
|
||||
let clipboard_atom = conn.intern_atom(false, b"CLIPBOARD")?.reply()?.atom;
|
||||
|
||||
conn.xfixes_select_selection_input(
|
||||
win,
|
||||
clipboard_atom,
|
||||
SelectionEventMask::SET_SELECTION_OWNER,
|
||||
)?
|
||||
.check()?;
|
||||
|
||||
conn.flush()?;
|
||||
|
||||
println!("Clipboard monitor démarré (X11 XFIXES — zéro polling)");
|
||||
|
||||
let mut last_text: Option<String> = None;
|
||||
@ -68,14 +69,14 @@ pub fn start(db: Arc<Mutex<Database>>, mut clipboard: Clipboard) -> Result<(), B
|
||||
|
||||
if let Event::XfixesSelectionNotify(_) = event {
|
||||
thread::sleep(Duration::from_millis(50));
|
||||
handle_clipboard_event(&mut clipboard, &db, &mut last_text, &mut last_image_hash);
|
||||
handle_clipboard_event(&mut clipboard, &tx, &mut last_text, &mut last_image_hash);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_clipboard_event(
|
||||
clipboard: &mut Clipboard,
|
||||
db: &Arc<Mutex<Database>>,
|
||||
tx: &mpsc::Sender<ClipboardEntry>,
|
||||
last_text: &mut Option<String>,
|
||||
last_image_hash: &mut Option<u64>,
|
||||
) {
|
||||
@ -89,13 +90,15 @@ fn handle_clipboard_event(
|
||||
*last_image_hash = None;
|
||||
println!("Clipboard update (texte)");
|
||||
|
||||
spawn_db_write(
|
||||
Arc::clone(db),
|
||||
ClipboardEntry {
|
||||
if tx
|
||||
.send(ClipboardEntry {
|
||||
content: ClipboardData::Text(text),
|
||||
timestamp: SystemTime::now(),
|
||||
},
|
||||
);
|
||||
})
|
||||
.is_err()
|
||||
{
|
||||
eprintln!("X11 : writer thread disparu");
|
||||
}
|
||||
}
|
||||
|
||||
Err(_) => {
|
||||
@ -124,29 +127,20 @@ fn handle_clipboard_event(
|
||||
*last_text = None;
|
||||
println!("Clipboard update (image)");
|
||||
|
||||
spawn_db_write(
|
||||
Arc::clone(db),
|
||||
ClipboardEntry {
|
||||
content: ClipboardData::Image(crate::models::Image {
|
||||
if tx
|
||||
.send(ClipboardEntry {
|
||||
content: ClipboardData::Image(Image {
|
||||
raw_pixels: Some(img_data.bytes.into_owned()),
|
||||
width: img_data.width as u32,
|
||||
height: img_data.height as u32,
|
||||
id: Uuid::new_v4(),
|
||||
}),
|
||||
timestamp: SystemTime::now(),
|
||||
},
|
||||
);
|
||||
})
|
||||
.is_err()
|
||||
{
|
||||
eprintln!("X11 : writer thread disparu");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn spawn_db_write(db: Arc<Mutex<Database>>, entry: ClipboardEntry) {
|
||||
thread::spawn(move || {
|
||||
let lock = db.lock().unwrap();
|
||||
if let Err(e) = lock.append(entry) {
|
||||
eprintln!("SQLite write error: {e}");
|
||||
} else {
|
||||
println!("SQLite updated!");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user