From 472162d135478666913a888a68867e635e50d14a Mon Sep 17 00:00:00 2001 From: asepharyana Date: Wed, 15 Jul 2026 06:12:53 +0700 Subject: [PATCH] feat(ipc): dukung Ctrl+Y clipboard copy di mode daemon/attach Tambah DaemonFrame::ClipboardCopy(String) supaya daemon bisa mengirim teks pending_clipboard_copy ke attach client, yang kemudian menulis sekuens OSC52 ke stdout-nya sendiri (bukan stdout daemon yang tidak dimiliki terminal user). --- src/ipc/protocol.rs | 1 + src/main.rs | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/ipc/protocol.rs b/src/ipc/protocol.rs index 242ab93..60044b9 100644 --- a/src/ipc/protocol.rs +++ b/src/ipc/protocol.rs @@ -91,5 +91,6 @@ pub enum DaemonFrame { StateUpdate(Box), StreamToken(String), SystemNote { kind: String, message: String }, + ClipboardCopy(String), Closed, } diff --git a/src/main.rs b/src/main.rs index be77b8b..f643a53 100644 --- a/src/main.rs +++ b/src/main.rs @@ -396,6 +396,9 @@ fn handle_daemon_client( running = false; } } + if let Some(text) = state.misc.pending_clipboard_copy.take() { + conn.send(&ipc::protocol::DaemonFrame::ClipboardCopy(text))?; + } send_daemon_update(&mut conn, state)?; } None => { @@ -583,6 +586,15 @@ fn run_attach(session_id: &str) -> Result<()> { ), ); } + Some(ipc::protocol::DaemonFrame::ClipboardCopy(text)) => { + let _ = write_osc52(&mut io::stdout(), &text); + client_state.push_toast( + app::state::types::Toast::new( + app::state::types::ToastKind::Success, + "Copied to clipboard".to_string(), + ), + ); + } Some(ipc::protocol::DaemonFrame::Closed) | None => { client_state.quit = true; }