@@ -41,16 +41,30 @@ impl TermInfo {
4141pub async fn create_terminal (
4242 window : Window ,
4343 term_info : State < ' _ , TermManager > ,
44+ shell : Option < String > ,
4445) -> Result < String , String > {
4546 let ( pty, pts) = pty_process:: open ( ) . map_err ( |e| format ! ( "Failed to spawn terminal: {}" , e) ) ?;
46- let mut cmd = pty_process:: Command :: new ( "/bin/bash" ) ;
47+ let command = match shell {
48+ Some ( s) => s,
49+ None => {
50+ #[ cfg( target_os = "windows" ) ]
51+ {
52+ String :: from ( "pwsh.exe" )
53+ }
54+ #[ cfg( not( target_os = "windows" ) ) ]
55+ {
56+ std:: env:: var ( "SHELL" ) . unwrap_or_else ( |_| String :: from ( "sh" ) )
57+ }
58+ }
59+ } ;
60+ let cmd = pty_process:: Command :: new ( command) ;
4761 let child = cmd
4862 . spawn ( pts)
4963 . map_err ( |e| format ! ( "Failed to spawn shell: {}" , e) ) ?;
5064
5165 let ( reader, writer) = split ( pty) ;
5266
53- let ( term_id, writer_ref ) = {
67+ let ( term_id, _ ) = {
5468 let mut terms = term_info. terminals . write ( ) . await ;
5569 let term_id = format ! ( "term-{}" , terms. len( ) + 1 ) ;
5670 let info = TermInfo :: new ( writer, child) ;
@@ -101,3 +115,22 @@ pub async fn write_terminal(
101115 . await
102116 . map_err ( |e| format ! ( "Failed to write to terminal: {}" , e) )
103117}
118+
119+ #[ tauri:: command]
120+ pub async fn close_terminal ( term_info : State < ' _ , TermManager > , id : String ) -> Result < ( ) , String > {
121+ let child = {
122+ let terms = term_info. terminals . read ( ) . await ;
123+ terms
124+ . get ( & id)
125+ . map ( |info| info. child . clone ( ) )
126+ . ok_or_else ( || "Terminal ID not found" . to_string ( ) ) ?
127+ } ;
128+ let mut guard = child. lock ( ) . await ;
129+ if let Some ( mut child_proc) = guard. take ( ) {
130+ child_proc
131+ . kill ( )
132+ . await
133+ . map_err ( |e| format ! ( "Failed to kill terminal process: {}" , e) ) ?;
134+ }
135+ Ok ( ( ) )
136+ }
0 commit comments