From 7a9ed4984dcd5cc745e005aef1ea07ba75665d2f Mon Sep 17 00:00:00 2001 From: frosty Date: Tue, 20 Aug 2024 22:33:37 +0000 Subject: [PATCH] allow setting the x root window name not perfect, still need to switch to byte arrays internally instead of strings --- go.mod | 2 ++ go.sum | 2 ++ main.go | 43 ++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 go.sum diff --git a/go.mod b/go.mod index ab70e9b..7f1a1ea 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module codeberg.org/frosty/modbot go 1.22.4 + +require github.com/jezek/xgb v1.1.1 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..bb22ecf --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4= +github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= diff --git a/main.go b/main.go index c1f3818..c2e9c60 100644 --- a/main.go +++ b/main.go @@ -18,6 +18,7 @@ package main import ( "bytes" + "flag" "fmt" "html/template" "log" @@ -26,6 +27,9 @@ import ( "sync" "syscall" "time" + + "github.com/jezek/xgb" + "github.com/jezek/xgb/xproto" ) var ( @@ -34,8 +38,16 @@ var ( mutex sync.Mutex lastOutput string + + // X connection data + x *xgb.Conn + root xproto.Window ) +type Flags struct { + SetXRootName bool +} + type Module struct { Func func() (interface{}, error) Interval time.Duration @@ -85,7 +97,28 @@ func (m *Module) Run() { mutex.Unlock() } +func parseFlags() Flags { + var flags Flags + flag.BoolVar(&flags.SetXRootName, "x", false, "set x root window name") + + flag.Parse() + + return flags +} + func main() { + flags := parseFlags() + + // Connect to X and get the root window if requested + if flags.SetXRootName { + var err error + x, err = xgb.NewConn() + if err != nil { + log.Fatalf("X connection failed: %s\n", err.Error()) + } + root = xproto.Setup(x).DefaultScreen(x).Root + } + sigChan := make(chan os.Signal, 1024) signalMap := make(map[os.Signal][]*Module) @@ -126,8 +159,16 @@ func main() { combinedOutput = prefix + combinedOutput + suffix mutex.Unlock() + // Output to either X root window name or stdout based on flags if combinedOutput != lastOutput { - fmt.Printf("%v\n", combinedOutput) + if flags.SetXRootName { + // Set the X root window name + outputBytes := []byte(combinedOutput) + xproto.ChangeProperty(x, xproto.PropModeReplace, root, xproto.AtomWmName, xproto.AtomString, 8, uint32(len(outputBytes)), outputBytes) + } else { + // Print to stdout + fmt.Printf("%v\n", combinedOutput) + } lastOutput = combinedOutput } }