From 86be8514f742b773db6e768163ade8854b6d15b86dff86b249c5523218e7c910 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Sun, 12 Oct 2025 11:38:47 +0300 Subject: [PATCH] Client TUIless mode --- cmd/client/gui.go | 2 + cmd/client/main.go | 110 ++++++++++++++++++++++++++------------------- 2 files changed, 65 insertions(+), 47 deletions(-) diff --git a/cmd/client/gui.go b/cmd/client/gui.go index e70216d..c8449da 100644 --- a/cmd/client/gui.go +++ b/cmd/client/gui.go @@ -16,6 +16,7 @@ package main import ( + "flag" "fmt" "log" "sort" @@ -25,6 +26,7 @@ import ( ) var ( + NoGUI = flag.Bool("tuiless", false, "no fancy TUI, only logs") GUI *gocui.Gui GUIReady bool GUIReadyC = make(chan struct{}) diff --git a/cmd/client/main.go b/cmd/client/main.go index 0844a65..396625f 100644 --- a/cmd/client/main.go +++ b/cmd/client/main.go @@ -25,6 +25,7 @@ import ( "fmt" "io" "log" + "log/slog" "net" "os" "os/exec" @@ -321,56 +322,65 @@ Magenta "S" means that peer is locally muted.`) seen := time.Now() LoggerReady := make(chan struct{}) - GUI, err = gocui.NewGui(gocui.OutputNormal) - if err != nil { - log.Fatal(err) - } - defer GUI.Close() - GUI.SelFgColor = gocui.ColorCyan - GUI.Highlight = true - GUI.SetManagerFunc(guiLayout) - if err = GUI.SetKeybinding("", gocui.KeyTab, gocui.ModNone, tabHandle); err != nil { - log.Fatal(err) - } - if err = GUI.SetKeybinding("", gocui.KeyF1, gocui.ModNone, - func(gui *gocui.Gui, v *gocui.View) error { - muteToggle() - return nil - }, - ); err != nil { - log.Fatal(err) - } - if err = GUI.SetKeybinding("", gocui.KeyF10, gocui.ModNone, - func(gui *gocui.Gui, v *gocui.View) error { - Finish <- struct{}{} - return gocui.ErrQuit - }, - ); err != nil { - log.Fatal(err) - } - - go func() { - <-GUIReadyC - v, errView := GUI.View("logs") - if errView != nil { - log.Fatal(errView) - } - log.SetOutput(v) + if *NoGUI { + close(GUIReadyC) + slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, nil))) log.Println("connected", "sid:", sidConnected, "addr:", conn.LocalAddr().String()) close(LoggerReady) - for { - time.Sleep(vors.ScreenRefresh) - GUI.Update(func(gui *gocui.Gui) error { + } else { + GUI, err = gocui.NewGui(gocui.OutputNormal) + if err != nil { + log.Fatal(err) + } + defer GUI.Close() + GUI.SelFgColor = gocui.ColorCyan + GUI.Highlight = true + GUI.SetManagerFunc(guiLayout) + if err = GUI.SetKeybinding("", gocui.KeyTab, gocui.ModNone, tabHandle); err != nil { + log.Fatal(err) + } + if err = GUI.SetKeybinding("", gocui.KeyF1, gocui.ModNone, + func(gui *gocui.Gui, v *gocui.View) error { + muteToggle() return nil - }) + }, + ); err != nil { + log.Fatal(err) } - }() + if err = GUI.SetKeybinding("", gocui.KeyF10, gocui.ModNone, + func(gui *gocui.Gui, v *gocui.View) error { + Finish <- struct{}{} + return gocui.ErrQuit + }, + ); err != nil { + log.Fatal(err) + } + go func() { + <-GUIReadyC + v, errView := GUI.View("logs") + if errView != nil { + log.Fatal(errView) + } + log.SetOutput(v) + log.Println("connected", "sid:", sidConnected, + "addr:", conn.LocalAddr().String()) + close(LoggerReady) + for { + time.Sleep(vors.ScreenRefresh) + GUI.Update(func(gui *gocui.Gui) error { + return nil + }) + } + }() + } go func() { <-Finish - go GUI.Close() - time.Sleep(100 * time.Millisecond) + if !*NoGUI { + go GUI.Close() + time.Sleep(100 * time.Millisecond) + } os.Exit(0) }() @@ -541,7 +551,9 @@ Magenta "S" means that peer is locally muted.`) close(playerTx) } }() - go statsDrawer(stream) + if !*NoGUI { + go statsDrawer(stream) + } StreamsM.Lock() Streams[sid] = stream StreamsM.Unlock() @@ -639,7 +651,9 @@ Magenta "S" means that peer is locally muted.`) } }() - go statsDrawer(&Stream{name: *Name, stats: OurStats}) + if !*NoGUI { + go statsDrawer(&Stream{name: *Name, stats: OurStats}) + } go func() { <-LoggerReady for now := range time.NewTicker(time.Second).C { @@ -718,8 +732,10 @@ Magenta "S" means that peer is locally muted.`) } }() - err = GUI.MainLoop() - if err != nil && err != gocui.ErrQuit { - log.Fatal(err) + if !*NoGUI { + err = GUI.MainLoop() + if err != nil && err != gocui.ErrQuit { + log.Fatal(err) + } } } -- 2.51.0