feat(gui): allow interacting with the embedded terminal (#2312)

This commit is contained in:
Ellie Huxtable 2024-07-25 16:54:27 +01:00 committed by GitHub
parent 74d084305c
commit 5ba185e7d8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -2,6 +2,8 @@ import { useState, useEffect, useRef } from "react";
import { listen } from "@tauri-apps/api/event";
import "@xterm/xterm/css/xterm.css";
import { useStore } from "@/state/store";
import { invoke } from "@tauri-apps/api/core";
import { IDisposable } from "@xterm/xterm";
const usePersistentTerminal = (pty: string) => {
const newPtyTerm = useStore((store) => store.newPtyTerm);
@ -30,6 +32,7 @@ const TerminalComponent = ({ pty }: any) => {
const { terminalData, isReady } = usePersistentTerminal(pty);
const [isAttached, setIsAttached] = useState(false);
const cleanupListenerRef = useRef<(() => void) | null>(null);
const keyDispose = useRef<IDisposable | null>(null);
useEffect(() => {
// no pty? no terminal
@ -60,6 +63,12 @@ const TerminalComponent = ({ pty }: any) => {
setIsAttached(true);
window.addEventListener("resize", windowResize);
const disposeOnKey = terminalData.terminal.onKey(async (event) => {
await invoke("pty_write", { pid: pty, data: event.key });
});
keyDispose.current = disposeOnKey;
}
listen(`pty-${pty}`, (event: any) => {
@ -88,6 +97,8 @@ const TerminalComponent = ({ pty }: any) => {
cleanupListenerRef.current();
}
if (keyDispose.current) keyDispose.current.dispose();
window.removeEventListener("resize", windowResize);
};
}, [terminalData, isReady]);