Wired up a pty
This commit is contained in:
parent
39d2dc6efb
commit
f86d0e662b
@ -1,10 +1,31 @@
|
|||||||
import { Terminal } from "xterm";
|
import { Terminal } from "xterm";
|
||||||
|
|
||||||
const term = new Terminal();
|
const term = new Terminal({
|
||||||
|
fontFamily:
|
||||||
|
'"Fira Code", courier-new, courier, monospace, "Powerline Extra Symbols"',
|
||||||
|
});
|
||||||
|
|
||||||
|
let line = "";
|
||||||
|
|
||||||
|
term.onKey(({ key, domEvent }) => {
|
||||||
|
const printable = !(domEvent.altKey || domEvent.ctrlKey || domEvent.metaKey);
|
||||||
|
if (domEvent.key === "Enter") {
|
||||||
|
//@ts-ignore
|
||||||
|
window.__WRITE_PTY(line);
|
||||||
|
term.writeln("");
|
||||||
|
line = "";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (printable) {
|
||||||
|
term.write(key);
|
||||||
|
line += key;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
term.open(document.getElementById("terminal")!);
|
term.open(document.getElementById("terminal")!);
|
||||||
|
|
||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
window.__WRITE_TERMINAL = (data: string) => {
|
window.__WRITE_TERMINAL = (data: { result: string }) => {
|
||||||
term.write(data);
|
term.write(data.result);
|
||||||
};
|
};
|
||||||
|
2
go.mod
2
go.mod
@ -3,3 +3,5 @@ module git.cesium.pw/niku/ratatouille
|
|||||||
go 1.19
|
go 1.19
|
||||||
|
|
||||||
require github.com/webview/webview v0.0.0-20230210061304-7b40e46d97e9
|
require github.com/webview/webview v0.0.0-20230210061304-7b40e46d97e9
|
||||||
|
|
||||||
|
require github.com/creack/pty v1.1.18 // indirect
|
||||||
|
2
go.sum
2
go.sum
@ -1,2 +1,4 @@
|
|||||||
|
github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
|
||||||
|
github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
|
||||||
github.com/webview/webview v0.0.0-20230210061304-7b40e46d97e9 h1:SPyWnfToUom3xNh3dKGkq1ZV7pw+VSWDcfVrUM1nRWs=
|
github.com/webview/webview v0.0.0-20230210061304-7b40e46d97e9 h1:SPyWnfToUom3xNh3dKGkq1ZV7pw+VSWDcfVrUM1nRWs=
|
||||||
github.com/webview/webview v0.0.0-20230210061304-7b40e46d97e9/go.mod h1:rpXAuuHgyEJb6kXcXldlkOjU6y4x+YcASKKXJNUhh0Y=
|
github.com/webview/webview v0.0.0-20230210061304-7b40e46d97e9/go.mod h1:rpXAuuHgyEJb6kXcXldlkOjU6y4x+YcASKKXJNUhh0Y=
|
||||||
|
37
main.go
37
main.go
@ -1,25 +1,56 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"os/exec"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/creack/pty"
|
||||||
"github.com/webview/webview"
|
"github.com/webview/webview"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type PtyOutEvent struct {
|
||||||
|
Result string `json:"result"`
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
c := exec.Command("bash")
|
||||||
|
p, _ := pty.Start(c)
|
||||||
|
|
||||||
w := webview.New(true)
|
w := webview.New(true)
|
||||||
defer w.Destroy()
|
defer w.Destroy()
|
||||||
w.SetTitle("Basic Example")
|
|
||||||
|
w.SetTitle("Ratatouille")
|
||||||
w.SetSize(480, 320, webview.HintNone)
|
w.SetSize(480, 320, webview.HintNone)
|
||||||
|
|
||||||
b, _ := ioutil.ReadFile("frontend/dist/index.html")
|
b, _ := ioutil.ReadFile("frontend/dist/index.html")
|
||||||
w.SetHtml(string(b))
|
w.SetHtml(string(b))
|
||||||
|
|
||||||
|
w.Bind("__WRITE_PTY", func(command string) {
|
||||||
|
p.WriteString(command + "\n")
|
||||||
|
})
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
time.Sleep(2 * time.Second)
|
buf := make([]byte, 1024)
|
||||||
w.Eval(`window.__WRITE_TERMINAL('PONG!\r\n');`)
|
n, _ := p.Read(buf)
|
||||||
|
if n == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
result := string(buf)
|
||||||
|
event := PtyOutEvent{Result: result[:n]}
|
||||||
|
payload, err := json.Marshal(event)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Whoopsie", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
fn := fmt.Sprintf(`window.__WRITE_TERMINAL(%s);`, string(payload))
|
||||||
|
w.Eval(fn)
|
||||||
|
time.Sleep(200 * time.Millisecond)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user