From 0bbdbc05914cd29c60c96471c06f154e86f6e934 Mon Sep 17 00:00:00 2001 From: jake Date: Mon, 16 Mar 2026 21:48:19 +0000 Subject: [PATCH] feat(kon): replace browser clipboard with arboard - New copy_to_clipboard Tauri command using arboard 3.6 - Replaced all 5 navigator.clipboard.writeText() calls across DictationPage, HistoryPage, FilesPage, and viewer with invoke() - Native clipboard access independent of WebView permissions Co-Authored-By: Claude Opus 4.6 (1M context) --- src-tauri/Cargo.toml | 1 + src-tauri/src/commands/clipboard.rs | 12 ++++++++++++ src-tauri/src/commands/mod.rs | 1 + src-tauri/src/lib.rs | 2 ++ src/lib/pages/DictationPage.svelte | 4 ++-- src/lib/pages/FilesPage.svelte | 2 +- src/lib/pages/HistoryPage.svelte | 2 +- src/routes/viewer/+page.svelte | 4 ++-- 8 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 src-tauri/src/commands/clipboard.rs diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index d77e655..0ecbfa3 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -33,3 +33,4 @@ serde_json = "1" # Async runtime (spawn_blocking for inference) tokio = { version = "1", features = ["rt", "sync"] } +arboard = "3.6.1" diff --git a/src-tauri/src/commands/clipboard.rs b/src-tauri/src/commands/clipboard.rs new file mode 100644 index 0000000..fe9e39d --- /dev/null +++ b/src-tauri/src/commands/clipboard.rs @@ -0,0 +1,12 @@ +use arboard::Clipboard; + +/// Copy text to the system clipboard via arboard. +#[tauri::command] +pub fn copy_to_clipboard(text: String) -> Result<(), String> { + let mut clipboard = + Clipboard::new().map_err(|e| format!("Clipboard init failed: {e}"))?; + clipboard + .set_text(&text) + .map_err(|e| format!("Clipboard write failed: {e}"))?; + Ok(()) +} diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs index 40acba1..84316e2 100644 --- a/src-tauri/src/commands/mod.rs +++ b/src-tauri/src/commands/mod.rs @@ -1,4 +1,5 @@ pub mod audio; +pub mod clipboard; pub mod llm; pub mod models; pub mod transcription; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 359bba6..28d6603 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -68,6 +68,8 @@ pub fn run() { // Windows commands::windows::open_task_window, commands::windows::open_viewer_window, + // Clipboard + commands::clipboard::copy_to_clipboard, // LLM stubs commands::llm::download_llm_model, commands::llm::check_llm_model, diff --git a/src/lib/pages/DictationPage.svelte b/src/lib/pages/DictationPage.svelte index 86c0ac5..5d46b34 100644 --- a/src/lib/pages/DictationPage.svelte +++ b/src/lib/pages/DictationPage.svelte @@ -332,7 +332,7 @@ async function finaliseTranscription() { if (transcript.trim()) { if (settings.autoCopy) { - navigator.clipboard.writeText(transcript).catch(() => {}); + invoke("copy_to_clipboard", { text: transcript }).catch(() => {}); } // Save audio if enabled — capture path for history replay @@ -395,7 +395,7 @@ } function copyAll() { - if (transcript) navigator.clipboard.writeText(transcript).catch(() => {}); + if (transcript) invoke("copy_to_clipboard", { text: transcript }).catch(() => {}); } function clearTranscript() { diff --git a/src/lib/pages/FilesPage.svelte b/src/lib/pages/FilesPage.svelte index 50abbd4..be5930f 100644 --- a/src/lib/pages/FilesPage.svelte +++ b/src/lib/pages/FilesPage.svelte @@ -117,7 +117,7 @@ } function copyAll() { - if (fileTranscript) navigator.clipboard.writeText(fileTranscript); + if (fileTranscript) invoke("copy_to_clipboard", { text: fileTranscript }).catch(() => {}); } function handleExport(format) { diff --git a/src/lib/pages/HistoryPage.svelte b/src/lib/pages/HistoryPage.svelte index 65d6f32..8618007 100644 --- a/src/lib/pages/HistoryPage.svelte +++ b/src/lib/pages/HistoryPage.svelte @@ -46,7 +46,7 @@ } function copyItem(item) { - navigator.clipboard.writeText(item.text).catch(() => {}); + invoke("copy_to_clipboard", { text: item.text }).catch(() => {}); } function removeItem(item) { diff --git a/src/routes/viewer/+page.svelte b/src/routes/viewer/+page.svelte index 46790e3..b3d59c3 100644 --- a/src/routes/viewer/+page.svelte +++ b/src/routes/viewer/+page.svelte @@ -1,7 +1,7 @@