Rework initialisation flow
Signed-off-by: AKP <tom@tdpain.net>
This commit is contained in:
parent
44d8d31326
commit
39c4ec505e
2 changed files with 65 additions and 35 deletions
|
@ -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 {
|
||||
|
|
|
@ -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"`
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue