Rework initialisation flow

Signed-off-by: AKP <tom@tdpain.net>
This commit is contained in:
akp 2022-05-27 11:36:08 +01:00
parent 44d8d31326
commit 39c4ec505e
No known key found for this signature in database
GPG key ID: AA5726202C8879B7
2 changed files with 65 additions and 35 deletions

View file

@ -2,7 +2,6 @@ package main
import (
"os"
"os/signal"
"path"
"runtime/debug"
"syscall"
@ -34,7 +33,7 @@ func main() {
}
func run() error {
b := i3bar.New(os.Stdout)
b := i3bar.New(os.Stdout, time.Second*5, syscall.SIGUSR1)
if err := b.Initialise(); err != nil {
return err
}
@ -44,13 +43,7 @@ func run() error {
commitHash = " " + commitHash
}
if err := b.Emit([]i3bar.BlockGenerator{
providers.NewPlainText("cdmbar" + commitHash),
}); err != nil {
return err
}
blocks := []i3bar.BlockGenerator{
b.RegisterBlockGenerator(
providers.NewAudioPlayer(32),
providers.NewIPAddress("wlp0s20f3"),
providers.NewWiFi("wlp0s20f3", 75),
@ -60,31 +53,17 @@ func run() error {
providers.NewMemory(7, 5),
providers.NewPulseaudioVolume(),
providers.NewDateTime(),
)
if err := b.Emit([]i3bar.BlockGenerator{
providers.NewPlainText("cdmbar" + commitHash),
}); err != nil {
return err
}
ticker := time.NewTicker(time.Second * 5)
sigUpdate := make(chan os.Signal, 1)
time.Sleep(time.Second) // show "cdmbar" for one second
signal.Notify(sigUpdate, syscall.SIGUSR1)
go func() {
// hacky thing to force an update in a second so we can clear the "cdmbar <VERSION>" readout
time.Sleep(time.Millisecond * 1000)
sigUpdate <- os.Signal(syscall.SIGUSR1)
}()
for {
select {
case <-sigUpdate:
if err := b.Emit(blocks); err != nil {
return err
}
case <-ticker.C:
if err := b.Emit(blocks); err != nil {
return err
}
}
}
return b.StartLoop()
}
func getCommitHash() string {

View file

@ -4,19 +4,29 @@ import (
"encoding/json"
"fmt"
"io"
"os"
"os/signal"
"syscall"
"time"
"github.com/rs/zerolog/log"
)
type I3bar struct {
writer io.Writer
writer io.Writer
updateInterval time.Duration
updateSignal syscall.Signal
registeredGenerators []BlockGenerator
hasInitialised bool
hasSentFirstLine bool
}
func New(writer io.Writer) *I3bar {
func New(writer io.Writer, updateInterval time.Duration, updateSignal syscall.Signal) *I3bar {
return &I3bar{
writer: writer,
writer: writer,
updateInterval: updateInterval,
updateSignal: updateSignal,
}
}
@ -26,7 +36,13 @@ func (b *I3bar) Initialise() error {
// 4.3 can still work with this bar. We do not use touch features, nor
//do we use any special stop/start handling. That's handled by the OS.
))
return err
if err != nil {
return err
}
b.hasInitialised = true
return nil
}
var defaultColorSet = &ColorSet{
@ -37,6 +53,12 @@ var defaultColorSet = &ColorSet{
}
func (b *I3bar) Emit(generators []BlockGenerator) error {
if !b.hasInitialised {
if err := b.Initialise(); err != nil {
return err
}
}
var blocks []*Block
for _, generator := range generators {
b, err := generator.Block(defaultColorSet)
@ -71,6 +93,35 @@ func (b *I3bar) Emit(generators []BlockGenerator) error {
return nil
}
func (b *I3bar) RegisterBlockGenerator(bg ...BlockGenerator) {
b.registeredGenerators = append(b.registeredGenerators, bg...)
}
func (b *I3bar) StartLoop() error {
// The ticker will start after the specified duration, not when we
// instantiate it. Circumventing that here by calling Emit now.
if err := b.Emit(b.registeredGenerators); err != nil {
return err
}
ticker := time.NewTicker(b.updateInterval)
sigUpdate := make(chan os.Signal, 1)
signal.Notify(sigUpdate, os.Signal(b.updateSignal))
for {
select {
case <-sigUpdate:
if err := b.Emit(b.registeredGenerators); err != nil {
return err
}
case <-ticker.C:
if err := b.Emit(b.registeredGenerators); err != nil {
return err
}
}
}
}
type Block struct {
FullText string `json:"full_text"`
ShortText string `json:"short_text,omitempty"`