Skip to content

Commit c471f7d

Browse files
committed
Fix terminal
1 parent 77a4923 commit c471f7d

1 file changed

Lines changed: 23 additions & 31 deletions

File tree

src-tauri/src/terminal.rs

Lines changed: 23 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::collections::HashMap;
22
use std::sync::Arc;
33

44
use tokio::{
5-
io::{AsyncReadExt, AsyncWriteExt},
5+
io::{split, AsyncReadExt, AsyncWriteExt, ReadHalf, WriteHalf},
66
sync::{Mutex, RwLock},
77
};
88

@@ -16,7 +16,7 @@ pub struct TermManager {
1616
}
1717

1818
pub struct TermInfo {
19-
pub pty: Arc<Mutex<Pty>>,
19+
pub writer: Arc<Mutex<WriteHalf<Pty>>>,
2020
pub child: Arc<Mutex<Option<Child>>>,
2121
}
2222

@@ -29,9 +29,9 @@ impl TermManager {
2929
}
3030

3131
impl TermInfo {
32-
pub fn new(pty: Pty, child: Child) -> Self {
32+
pub fn new(writer: WriteHalf<Pty>, child: Child) -> Self {
3333
TermInfo {
34-
pty: Arc::new(Mutex::new(pty)),
34+
writer: Arc::new(Mutex::new(writer)),
3535
child: Arc::new(Mutex::new(Some(child))),
3636
}
3737
}
@@ -48,32 +48,29 @@ pub async fn create_terminal(
4848
.spawn(pts)
4949
.map_err(|e| format!("Failed to spawn shell: {}", e))?;
5050

51-
let (term_id, pty_ref) = {
51+
let (reader, writer) = split(pty);
52+
53+
let (term_id, writer_ref) = {
5254
let mut terms = term_info.terminals.write().await;
5355
let term_id = format!("term-{}", terms.len() + 1);
54-
let info = TermInfo::new(pty, child);
55-
let pty_ref = info.pty.clone();
56+
let info = TermInfo::new(writer, child);
57+
let writer_ref = info.writer.clone();
5658
terms.insert(term_id.clone(), info);
57-
(term_id, pty_ref)
59+
(term_id, writer_ref)
5860
};
5961

6062
let window = window.clone();
6163
let term_id_clone = term_id.clone();
6264
tokio::spawn(async move {
65+
let mut reader: ReadHalf<Pty> = reader;
6366
let mut buffer = [0u8; 4096];
6467

6568
loop {
66-
let read_result = {
67-
let mut pty_guard = pty_ref.lock().await;
68-
pty_guard.read(&mut buffer).await
69-
};
70-
71-
match read_result {
72-
Ok(0) => break, // EOF
69+
match reader.read(&mut buffer).await {
70+
Ok(0) => break,
7371
Ok(n) => {
74-
let data = String::from_utf8_lossy(&buffer[..n]).into_owned();
75-
if !data.is_empty() {
76-
let _ = window.emit("terminal", (&term_id_clone, &data));
72+
if let Ok(data) = std::str::from_utf8(&buffer[..n]) {
73+
let _ = window.emit("terminal", (&term_id_clone, data));
7774
}
7875
}
7976
Err(_) => break,
@@ -90,22 +87,17 @@ pub async fn write_terminal(
9087
id: String,
9188
data: String,
9289
) -> Result<(), String> {
93-
println!("Writing to terminal {}: {}", id, data);
94-
95-
let pty_ref = {
90+
let writer = {
9691
let terms = term_info.terminals.read().await;
97-
match terms.get(&id) {
98-
Some(info) => info.pty.clone(),
99-
None => return Err("Terminal ID not found".to_string()),
100-
}
92+
terms
93+
.get(&id)
94+
.map(|info| info.writer.clone())
95+
.ok_or_else(|| "Terminal ID not found".to_string())?
10196
};
10297

103-
let mut pty_guard = pty_ref.lock().await;
104-
println!("PTY found, writing data");
105-
pty_guard
98+
let mut guard = writer.lock().await;
99+
guard
106100
.write_all(data.as_bytes())
107101
.await
108-
.map_err(|e| format!("Failed to write to terminal: {}", e))?;
109-
110-
Ok(())
102+
.map_err(|e| format!("Failed to write to terminal: {}", e))
111103
}

0 commit comments

Comments
 (0)