diff --git a/package.json b/package.json index 057ed84..b9f4f2e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "tiletopia", "private": true, - "version": "0.2.2", + "version": "0.2.3", "type": "module", "scripts": { "dev": "vite", @@ -14,6 +14,7 @@ }, "dependencies": { "@tauri-apps/api": "^2.0.0", + "@tauri-apps/plugin-clipboard-manager": "^2.0.0", "@xterm/addon-fit": "^0.10.0", "@xterm/xterm": "^5.5.0", "react": "^18.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e490123..aab158b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@tauri-apps/api': specifier: ^2.0.0 version: 2.11.0 + '@tauri-apps/plugin-clipboard-manager': + specifier: ^2.0.0 + version: 2.3.2 '@xterm/addon-fit': specifier: ^0.10.0 version: 0.10.0(@xterm/xterm@5.5.0) @@ -505,6 +508,9 @@ packages: engines: {node: '>= 10'} hasBin: true + '@tauri-apps/plugin-clipboard-manager@2.3.2': + resolution: {integrity: sha512-CUlb5Hqi2oZbcZf4VUyUH53XWPPdtpw43EUpCza5HWZJwxEoDowFzNUDt1tRUXA8Uq+XPn17Ysfptip33sG4eQ==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -1172,6 +1178,10 @@ snapshots: '@tauri-apps/cli-win32-ia32-msvc': 2.11.2 '@tauri-apps/cli-win32-x64-msvc': 2.11.2 + '@tauri-apps/plugin-clipboard-manager@2.3.2': + dependencies: + '@tauri-apps/api': 2.11.0 + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.3 diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index da9374f..65febb2 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tiletopia" -version = "0.2.2" +version = "0.2.3" description = "Tiling multi-terminal manager for WSL" authors = ["megaproxy"] edition = "2021" diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 3547edf..8d355d9 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -6,6 +6,8 @@ "permissions": [ "core:default", "core:event:default", - "core:window:default" + "core:window:default", + "clipboard-manager:allow-read-text", + "clipboard-manager:allow-write-text" ] } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index ade2c64..06dea5f 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -15,6 +15,7 @@ pub fn run() { .try_init(); tauri::Builder::default() + .plugin(tauri_plugin_clipboard_manager::init()) .manage(PtyManager::new()) .invoke_handler(tauri::generate_handler![ commands::list_distros, diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 391c661..4678192 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "tiletopia", - "version": "0.2.2", + "version": "0.2.3", "identifier": "com.megaproxy.tiletopia", "build": { "beforeDevCommand": "pnpm dev", diff --git a/src/components/XtermPane.tsx b/src/components/XtermPane.tsx index 21615ee..022502b 100644 --- a/src/components/XtermPane.tsx +++ b/src/components/XtermPane.tsx @@ -2,6 +2,10 @@ import { useRef, useEffect } from "react"; import { Terminal } from "@xterm/xterm"; import { FitAddon } from "@xterm/addon-fit"; import type { UnlistenFn } from "@tauri-apps/api/event"; +import { + readText as clipboardReadText, + writeText as clipboardWriteText, +} from "@tauri-apps/plugin-clipboard-manager"; import { spawnPane, writeToPane, @@ -174,23 +178,25 @@ export default function XtermPane({ // Ctrl+V (which would otherwise inject ^V into the PTY). term.paste() // routes through onData → writeToPane, so broadcasting and bracketed // paste both keep working for free. + // + // Uses tauri-plugin-clipboard-manager instead of navigator.clipboard so + // WebView2 doesn't surface its native "Allow clipboard access?" prompt. term?.attachCustomKeyEventHandler((e) => { if (e.type !== "keydown") return true; if (!e.ctrlKey || !e.shiftKey || e.altKey) return true; if (e.code === "KeyC") { const sel = term?.getSelection(); if (sel) { - void navigator.clipboard - .writeText(sel) - .catch((err) => console.warn("clipboard write failed:", err)); + void clipboardWriteText(sel).catch((err) => + console.warn("clipboard write failed:", err), + ); } e.preventDefault(); return false; } if (e.code === "KeyV") { e.preventDefault(); - navigator.clipboard - .readText() + clipboardReadText() .then((text) => { if (text && term) term.paste(text); })