62 lines
1.0 KiB
Go
62 lines
1.0 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"time"
|
|
|
|
"github.com/creack/pty"
|
|
"github.com/webview/webview"
|
|
)
|
|
|
|
type PtyRespEvent struct {
|
|
Result string `json:"result"`
|
|
}
|
|
|
|
func main() {
|
|
c := exec.Command("bash")
|
|
p, _ := pty.Start(c)
|
|
|
|
w := webview.New(true)
|
|
defer w.Destroy()
|
|
|
|
w.SetTitle("Ratatouille")
|
|
w.SetSize(720, 432, webview.HintFixed)
|
|
|
|
b, _ := ioutil.ReadFile("frontend/dist/index.html")
|
|
w.SetHtml(string(b))
|
|
|
|
w.Bind("__WRITE_PTY", func(command string) {
|
|
p.WriteString(command + "\n")
|
|
})
|
|
|
|
go func() {
|
|
time.Sleep(500 * time.Millisecond)
|
|
for {
|
|
buf := make([]byte, 1024)
|
|
n, err := p.Read(buf)
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, err)
|
|
}
|
|
|
|
result := string(buf)
|
|
event := PtyRespEvent{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)
|
|
}
|
|
}()
|
|
|
|
w.Run()
|
|
}
|