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) <noreply@anthropic.com>
This commit is contained in:
@@ -33,3 +33,4 @@ serde_json = "1"
|
||||
|
||||
# Async runtime (spawn_blocking for inference)
|
||||
tokio = { version = "1", features = ["rt", "sync"] }
|
||||
arboard = "3.6.1"
|
||||
|
||||
12
src-tauri/src/commands/clipboard.rs
Normal file
12
src-tauri/src/commands/clipboard.rs
Normal file
@@ -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(())
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
pub mod audio;
|
||||
pub mod clipboard;
|
||||
pub mod llm;
|
||||
pub mod models;
|
||||
pub mod transcription;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
}
|
||||
|
||||
function copyAll() {
|
||||
if (fileTranscript) navigator.clipboard.writeText(fileTranscript);
|
||||
if (fileTranscript) invoke("copy_to_clipboard", { text: fileTranscript }).catch(() => {});
|
||||
}
|
||||
|
||||
function handleExport(format) {
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
}
|
||||
|
||||
function copyItem(item) {
|
||||
navigator.clipboard.writeText(item.text).catch(() => {});
|
||||
invoke("copy_to_clipboard", { text: item.text }).catch(() => {});
|
||||
}
|
||||
|
||||
function removeItem(item) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<script>
|
||||
import { onMount, onDestroy } from "svelte";
|
||||
import { getCurrentWindow } from "@tauri-apps/api/window";
|
||||
import { convertFileSrc } from "@tauri-apps/api/core";
|
||||
import { convertFileSrc, invoke } from "@tauri-apps/api/core";
|
||||
import { formatTime, formatDuration } from "$lib/utils/time.js";
|
||||
import { PLAYBACK_SPEEDS } from "$lib/utils/constants.js";
|
||||
|
||||
@@ -193,7 +193,7 @@
|
||||
|
||||
function copySegment(idx) {
|
||||
if (item?.segments?.[idx]) {
|
||||
navigator.clipboard.writeText(item.segments[idx].text.trim()).catch(() => {});
|
||||
invoke("copy_to_clipboard", { text: item.segments[idx].text.trim() }).catch(() => {});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user