@@ -9,14 +9,15 @@ use std::time::Duration;
99
1010use anyhow:: bail;
1111use assert_matches:: assert_matches;
12+ use compact_str:: CompactString ;
1213use crossterm:: event:: { MouseButton , MouseEventKind } ;
1314use portable_pty:: MasterPty ;
1415use portable_pty:: { native_pty_system, ChildKiller , CommandBuilder , PtySize } ;
1516use serde:: { Deserialize , Serialize } ;
1617use tokio:: sync:: mpsc:: UnboundedSender ;
1718use tokio:: task:: spawn_blocking;
1819use tui:: layout:: Rect ;
19- use vt100:: MouseProtocolMode ;
20+ use vt100:: { MouseProtocolMode , TermReplySender } ;
2021
2122use crate :: config:: ProcConfig ;
2223use crate :: encode_term:: { encode_key, encode_mouse_event, KeyCodeEncodeModes } ;
@@ -48,7 +49,7 @@ impl Debug for Inst {
4849 }
4950}
5051
51- pub type VtWrap = Arc < RwLock < vt100:: Parser > > ;
52+ pub type VtWrap = Arc < RwLock < vt100:: Parser < ReplySender > > > ;
5253
5354impl Inst {
5455 fn spawn (
@@ -58,7 +59,15 @@ impl Inst {
5859 size : & Size ,
5960 scrollback_len : usize ,
6061 ) -> anyhow:: Result < Self > {
61- let vt = vt100:: Parser :: new ( size. height , size. width , scrollback_len) ;
62+ let vt = vt100:: Parser :: new (
63+ size. height ,
64+ size. width ,
65+ scrollback_len,
66+ ReplySender {
67+ proc_id : id,
68+ sender : tx. clone ( ) ,
69+ } ,
70+ ) ;
6271 let vt = Arc :: new ( RwLock :: new ( vt) ) ;
6372
6473 let pty_system = native_pty_system ( ) ;
@@ -309,7 +318,7 @@ impl Proc {
309318
310319 pub fn lock_vt (
311320 & self ,
312- ) -> Option < std:: sync:: RwLockReadGuard < ' _ , vt100:: Parser > > {
321+ ) -> Option < std:: sync:: RwLockReadGuard < ' _ , vt100:: Parser < ReplySender > > > {
313322 match & self . inst {
314323 ProcState :: None => None ,
315324 ProcState :: Some ( inst) => inst. vt . read ( ) . ok ( ) ,
@@ -319,7 +328,7 @@ impl Proc {
319328
320329 pub fn lock_vt_mut (
321330 & mut self ,
322- ) -> Option < std:: sync:: RwLockWriteGuard < ' _ , vt100:: Parser > > {
331+ ) -> Option < std:: sync:: RwLockWriteGuard < ' _ , vt100:: Parser < ReplySender > > > {
323332 match & self . inst {
324333 ProcState :: None => None ,
325334 ProcState :: Some ( inst) => inst. vt . write ( ) . ok ( ) ,
@@ -430,12 +439,12 @@ impl Proc {
430439 }
431440 }
432441
433- fn scroll_vt_up ( vt : & mut vt100:: Parser , n : usize ) {
442+ fn scroll_vt_up ( vt : & mut vt100:: Parser < ReplySender > , n : usize ) {
434443 let pos = usize:: saturating_add ( vt. screen ( ) . scrollback ( ) , n) ;
435444 vt. set_scrollback ( pos) ;
436445 }
437446
438- fn scroll_screen_up ( screen : & mut vt100:: Screen , n : usize ) {
447+ fn scroll_screen_up ( screen : & mut vt100:: Screen < ReplySender > , n : usize ) {
439448 let pos = usize:: saturating_add ( screen. scrollback ( ) , n) ;
440449 screen. set_scrollback ( pos) ;
441450 }
@@ -453,12 +462,12 @@ impl Proc {
453462 }
454463 }
455464
456- fn scroll_vt_down ( vt : & mut vt100:: Parser , n : usize ) {
465+ fn scroll_vt_down ( vt : & mut vt100:: Parser < ReplySender > , n : usize ) {
457466 let pos = usize:: saturating_sub ( vt. screen ( ) . scrollback ( ) , n) ;
458467 vt. set_scrollback ( pos) ;
459468 }
460469
461- fn scroll_screen_down ( screen : & mut vt100:: Screen , n : usize ) {
470+ fn scroll_screen_down ( screen : & mut vt100:: Screen < ReplySender > , n : usize ) {
462471 let pos = usize:: saturating_sub ( screen. scrollback ( ) , n) ;
463472 screen. set_scrollback ( pos) ;
464473 }
@@ -602,6 +611,13 @@ impl Proc {
602611
603612 ProcCmd :: SendKey ( key) => self . send_key ( & key) ,
604613 ProcCmd :: SendMouse ( event) => self . handle_mouse ( event) ,
614+ ProcCmd :: SendRaw ( s) => match & mut self . inst {
615+ ProcState :: None => ( ) ,
616+ ProcState :: Some ( inst) => {
617+ let _ = inst. master . write_all ( s. as_bytes ( ) ) ;
618+ }
619+ ProcState :: Error ( _) => ( ) ,
620+ } ,
605621
606622 ProcCmd :: ScrollUp => self . scroll_half_screen_up ( ) ,
607623 ProcCmd :: ScrollDown => self . scroll_half_screen_down ( ) ,
@@ -708,8 +724,8 @@ impl Size {
708724
709725pub enum CopyMode {
710726 None ( Option < Pos > ) ,
711- Start ( vt100:: Screen , Pos ) ,
712- Range ( vt100:: Screen , Pos , Pos ) ,
727+ Start ( vt100:: Screen < ReplySender > , Pos ) ,
728+ Range ( vt100:: Screen < ReplySender > , Pos , Pos ) ,
713729}
714730
715731impl Default for CopyMode {
@@ -762,3 +778,15 @@ impl Pos {
762778 }
763779 }
764780}
781+
782+ #[ derive( Clone ) ]
783+ pub struct ReplySender {
784+ proc_id : usize ,
785+ sender : UnboundedSender < ( usize , ProcEvent ) > ,
786+ }
787+
788+ impl TermReplySender for ReplySender {
789+ fn reply ( & self , s : CompactString ) {
790+ let _ = self . sender . send ( ( self . proc_id , ProcEvent :: TermReply ( s) ) ) ;
791+ }
792+ }
0 commit comments