Skip to content

Commit 65bfb1b

Browse files
committed
feat: support copy clipboard
1 parent 32beabe commit 65bfb1b

File tree

3 files changed

+138
-45
lines changed

3 files changed

+138
-45
lines changed

Cargo.lock

Lines changed: 106 additions & 44 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ termcolor = "1.1.3"
1818
clap = { version = "4.0.22", features = ["derive", "cargo"] }
1919
once_cell = "1.16.0"
2020
arboard = "3.2.0"
21+
parking_lot = "0.12.1"

src/main.rs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ use arboard::{Clipboard, GetExtLinux};
55
use clap::Parser;
66
use db::Answer;
77
use explain::YdcvResp;
8+
use parking_lot::RwLock;
89

910
mod db;
1011
mod explain;
1112

1213
const REQUEST_BASE: &'static str = "http://fanyi.youdao.com/openapi.do?keyfrom=ydcv-rust&key=379421805&type=data&doctype=json&version=1.1&q=";
1314

15+
static CACHED_CONTENT: RwLock<(Option<String>, Option<String>)> = RwLock::new((None, None));
16+
1417
#[derive(Parser, Debug)]
1518
struct Args {
1619
word: Option<String>,
@@ -33,7 +36,34 @@ fn get_copied_text(clip: &mut Clipboard) -> Option<String> {
3336
}
3437

3538
fn get_clipboard_content(clip: &mut Clipboard) -> Option<String> {
36-
get_copied_text(clip).or_else(|| get_selected_text(clip))
39+
let copied_text = get_copied_text(clip);
40+
let selected_text = get_selected_text(clip);
41+
42+
let changed_copied_content = if let Some(copied_text) = copied_text {
43+
if CACHED_CONTENT.read().0.as_ref() != Some(&copied_text) {
44+
CACHED_CONTENT.write().0 = Some(copied_text.clone());
45+
46+
Some(copied_text)
47+
} else {
48+
None
49+
}
50+
} else {
51+
None
52+
};
53+
54+
let changed_selected_content = if let Some(selected_text) = selected_text {
55+
if CACHED_CONTENT.read().1.as_ref() != Some(&selected_text) {
56+
CACHED_CONTENT.write().1 = Some(selected_text.clone());
57+
58+
Some(selected_text)
59+
} else {
60+
None
61+
}
62+
} else {
63+
None
64+
};
65+
66+
changed_copied_content.or(changed_selected_content)
3767
}
3868

3969
fn main() -> Result<()> {

0 commit comments

Comments
 (0)