]> Sergey Matveev's repositories - vors.git/commitdiff
Client TUIless mode
authorSergey Matveev <stargrave@stargrave.org>
Sun, 12 Oct 2025 08:38:47 +0000 (11:38 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Wed, 12 Nov 2025 19:27:52 +0000 (22:27 +0300)
cmd/client/gui.go
cmd/client/main.go

index e70216db87095577becdb89071739050a1909c56f11e2f18230955461c2b3de1..c8449daffd5d8974750aac5cc9a137d2fbff0e5747518658bb93d78517146533 100644 (file)
@@ -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{})
index 0844a6503826e3afe3a7c0a09bf47267394a881ccfbd6e5f2ab1a73040fbeb63..396625fbd2872a2e7ac0d44b0511dab0e4489bae5861b5bdb17b11741389b9ef 100644 (file)
@@ -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)
+               }
        }
 }