diff --git a/dwmgobar/Makefile b/dwmgobar/Makefile new file mode 100644 index 0000000..41e9084 --- /dev/null +++ b/dwmgobar/Makefile @@ -0,0 +1,18 @@ +EXEC=dwmgobar + +SRC=dwmgobar.go + +PREFIX = /usr/local +MANPREFIX = $(PREFIX)/share/man +MANPAGE = dwmgobar.1 + +$(EXEC): + go build -o $(EXEC) $(SRC) + +clean: + rm $(EXEC) + +install: $(EXEC) + cp $(EXEC) $(PREFIX)/bin/$(EXEC) + chmod 755 $(PREFIX)/bin/$(EXEC) + cp $(MANPAGE) $(MANPREFIX)/$(MANPAGE) diff --git a/dwmgobar/dwmgobar b/dwmgobar/dwmgobar new file mode 100755 index 0000000..6d6506e Binary files /dev/null and b/dwmgobar/dwmgobar differ diff --git a/dwmgobar/dwmgobar.1 b/dwmgobar/dwmgobar.1 new file mode 100644 index 0000000..bd72d85 --- /dev/null +++ b/dwmgobar/dwmgobar.1 @@ -0,0 +1,16 @@ +.Dd 2019-08-19 +.Dt dwmgobar 1 +.Os sde +.Sh NAME +.Nm dwmgobar +.Nd dwm status bar written in go +.Sh SYNOPSIS +.Pp +add those lines to your .xinitrc +.Pp + dwmgobar& +.Pp + exec dwm-gaps +.El +.Sh SEE ALSO +.Xr dwm 1 diff --git a/dwmgobar/dwmgobar.go b/dwmgobar/dwmgobar.go new file mode 100644 index 0000000..1c1ecc3 --- /dev/null +++ b/dwmgobar/dwmgobar.go @@ -0,0 +1,422 @@ +package main + +import ( + "bytes" + "bufio" + "fmt" + "time" + "os/exec" + "io/ioutil" + "strconv" + "strings" +) + +const cpu_temp1_path string = "/sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input" +//const cpu_temp2_path string = "/sys/devices/platform/coretemp.0/hwmon/hwmon1/temp3_input" + +const mu_play string = "" +const mu_pause string = "" +const cmusWidth uint8 = 24 +const aVolMed int = 35 +const aVolMax int = 75 + +const audioMut string = "" +const audioMin string = "" +const audioMed string = "" +const audioMax string = "" + +const termo100 string = "" +const termo075 string = "" +const termo050 string = "" +const termo025 string = "" +const termo000 string = "" + +const temp_crit int = 60 +const temp_high int = 50 +const temp_norm int = 40 +const temp_cool int = 30 + +const bat100 string = "" +const bat075 string = "" +const bat050 string = "" +const bat025 string = "" +const bat000 string = "" + +const usblogo string = "" + +const task_done string = "" +const task_todo string = "" + +const time_track string = "" +const time_loose string = "" +//const time_wip string = "" + +var cmusQ []byte +var amixQ []byte +var cmusLine []byte +var alsaLine []byte +var cpu_temp1 []byte +var cpu_temp1i int +var cpu_fmt string +var err error +var cmd *exec.Cmd +var sec uint8 = 0 +var t bytes.Buffer +var batlevel bytes.Buffer +var cput bytes.Buffer +var cpuse bytes.Buffer +var status bytes.Buffer +var cmustat bytes.Buffer +var cmusAT bytes.Buffer +var alstat bytes.Buffer +var usbstat bytes.Buffer +var ttcheck bytes.Buffer +var item bytes.Buffer + +var amixQf [][]byte +var alsabVol []byte +var alsaVol int + +var no_time_track []byte = []byte("There is no active time tracking.") +var overdue []byte +var usb []byte +var timew []byte +var timewtrack []byte + +var cpupercent []byte +var cpufloat float64 + +var batcmd []byte +var batint int + +type cmusInfo struct { + artist []byte + title []byte + full bytes.Buffer + size uint8 + a uint8 + b uint8 +} + +var nowPlaying cmusInfo + +func check(e error) { + if e != nil { + fmt.Println(e) + } +} + +func xsetroot(name string) { + cmd = exec.Command("xsetroot","-name", name) + err = cmd.Run() + check(err) +} + +func statusMkr(buff bytes.Buffer, items...bytes.Buffer) bytes.Buffer{ + buff.Reset() + for _, item = range (items){ + buff.WriteString(" ") + buff.WriteString(item.String()) + } + return buff +} + +func getTime(t bytes.Buffer) bytes.Buffer { + // to format the time string, you can use thoses codes: + // 15 : hour + // 03 : hour in am/pm format + // (you can add pm or PM at the end) + // 04 : minutes + // 05 : seconds + // 01 : month number + // 02 : day number + // 06 : two last digit of year number + // 2006 : full year number + t.Reset() + t.WriteString(time.Now().Format("Mon 02/01/06 15:04:05")) + return t +} + +func getCpuTemp(cput bytes.Buffer) bytes.Buffer { + cpu_temp1, err = ioutil.ReadFile(cpu_temp1_path) + check(err) + cpu_temp1i, err = strconv.Atoi(strings.Replace(string(cpu_temp1), "\n","",-1)) + cpu_temp1i = cpu_temp1i / 1000 + check(err) + cput.Reset() + switch { + case cpu_temp1i > temp_crit: + cput.WriteString(termo100) + case cpu_temp1i > temp_high: + cput.WriteString(termo075) + case cpu_temp1i > temp_norm: + cput.WriteString(termo050) + case cpu_temp1i > temp_cool: + cput.WriteString(termo025) + case cpu_temp1i <= temp_cool: + cput.WriteString(termo000) + + } + return cput +} + +func bContain(b []byte, s string) bool { + return bytes.Contains(b,[]byte(s)) +} + +func bDel(b []byte, o string) []byte { + return bytes.Replace(b, []byte(o), []byte(""), 1) +} + + +func defil(cmusAT bytes.Buffer) bytes.Buffer { + cmusAT.Reset() + nowPlaying.full.Reset() + nowPlaying.full.Write(nowPlaying.artist) + nowPlaying.full.WriteString(" - ") + nowPlaying.full.Write(nowPlaying.title) + nowPlaying.size = uint8(len(nowPlaying.full.String())) + if nowPlaying.size > cmusWidth { + nowPlaying.full.WriteString(" - ") + nowPlaying.size = uint8(len(nowPlaying.full.String())) + nowPlaying.a = sec % nowPlaying.size + nowPlaying.b = (sec + cmusWidth) % nowPlaying.size + if nowPlaying.b > nowPlaying.a { + cmusAT.Write(nowPlaying.full.Bytes()[nowPlaying.a:nowPlaying.b]) + } else { + cmusAT.Write(nowPlaying.full.Bytes()[nowPlaying.a:nowPlaying.size]) + cmusAT.Write(nowPlaying.full.Bytes()[0:nowPlaying.b]) + } + return cmusAT + } else { + cmusAT.Write(nowPlaying.full.Bytes()) + return cmusAT + } +} + +func cmusParse(cmusQ []byte, cmustat, cmusAT bytes.Buffer) (bytes.Buffer, bytes.Buffer){ + cmusReader := bytes.NewReader(cmusQ) + cmusScanner := bufio.NewScanner(cmusReader) + cmusScanner.Split(bufio.ScanLines) + for cmusScanner.Scan() { + cmusLine = cmusScanner.Bytes() + switch { + case bContain(cmusLine,"status"): + switch { + case bContain(cmusLine,"playing"): + cmustat.WriteString(mu_play) + case bContain(cmusLine,"paused"): + cmustat.WriteString(mu_pause) + } + case bContain(cmusLine,"tag artist "): + nowPlaying.artist = bDel(cmusLine,"tag artist ") + case bContain(cmusLine,"tag title "): + nowPlaying.title = bDel(cmusLine,"tag title ") + } + } + cmusAT = defil(cmusAT) + cmustat.WriteString(" ") + cmustat.Write(cmusAT.Bytes()) + return cmustat, cmusAT +} + +func getCmus(cmustat, cmusAT bytes.Buffer) (bytes.Buffer, bytes.Buffer) { + cmusQ, err = exec.Command("cmus-remote","-Q").Output() + if err != nil { + cmustat.Reset() + return cmustat, cmusAT + } + cmustat.Reset() + cmustat, cmusAT = cmusParse(cmusQ, cmustat, cmusAT) + return cmustat, cmusAT +} + +func getUSB(usbstat bytes.Buffer) (bytes.Buffer) { + usb, _ = exec.Command("getsdbz").Output() + usbstat.Reset() + if len(usb) != 0 { + usbstat.WriteString(usblogo) + return usbstat + } else { + return usbstat + } +} + +func alsaParse(amixQ []byte, alstat bytes.Buffer) bytes.Buffer { + alsaReader := bytes.NewReader(amixQ) + alsaScanner := bufio.NewScanner(alsaReader) + alsaScanner.Split(bufio.ScanLines) + for alsaScanner.Scan() { + alsaLine = alsaScanner.Bytes() + if bContain(alsaLine,"Mono: Playback"){ + if bContain(alsaLine,"[off]") { + alstat.WriteString(audioMut) + } else { + amixQf = bytes.Split(alsaLine,[]byte(" ")) + alsabVol = bDel(amixQf[5],"[") + alsabVol = bDel(alsabVol,"%]") + alsaVol, _ = strconv.Atoi(string(alsabVol)) + switch { + case alsaVol < aVolMed: + alstat.WriteString(audioMin) + case alsaVol >= aVolMed && alsaVol < aVolMax: + alstat.WriteString(audioMed) + case alsaVol >= aVolMax: + alstat.WriteString(audioMax) + } + } + } + } + return alstat +} + +func getAlsa(alstat bytes.Buffer) bytes.Buffer { + amixQ, _ = exec.Command("amixer","get","Master","volume").Output() + alstat.Reset() + alstat = alsaParse(amixQ, alstat) + return alstat +} + +func getCpuUse(cpuse bytes.Buffer) bytes.Buffer { + cpuse.Reset() + cpupercent, _ = exec.Command("cpu_percent").Output() + cpufloat, _ = strconv.ParseFloat(strings.Replace(string(cpupercent),"\n","",1), 32) + switch { + case cpufloat >= 75: + cpuse.WriteByte(8) + cpuse.WriteString("") + cpuse.WriteByte(1) + case cpufloat < 75: + cpuse.WriteString("") + } + return cpuse +} + +func getBattery(batlevel bytes.Buffer) bytes.Buffer { + batlevel.Reset() + batcmd, _ = exec.Command("battery_level").Output() + batint, _ = strconv.Atoi(strings.Replace(string(batcmd),"\n","",1)) + switch { + case batint >= 85: + batlevel.WriteString(bat100) + case batint >= 68: + batlevel.WriteString(bat075) + case batint >= 45: + batlevel.WriteString(bat050) + case batint >= 20: + batlevel.WriteString(bat025) + } + return batlevel +} + +func getTtcheck(ttcheck bytes.Buffer) bytes.Buffer { + ttcheck.Reset() + timew, _ = exec.Command("timew").Output() + if bytes.Contains(timew, no_time_track){ + ttcheck.WriteByte(7) + ttcheck.WriteString(time_loose) + ttcheck.WriteByte(1) + } else { + ttcheck.WriteString(time_track) + timewtrack, _ = exec.Command("timetrackwhat").Output() + ttcheck.WriteString(" ") + ttcheck.Write(timewtrack) + } + + ttcheck.WriteString(" ") + + overdue, _ = exec.Command("task","overdue").Output() + if len(overdue) == 0 { + ttcheck.WriteString(task_done) + } else { + ttcheck.WriteByte(7) + ttcheck.WriteString(task_todo) + ttcheck.WriteByte(1) + } + return ttcheck +} + +func checkCmus(){ + + go func(){ + for ;; { + cmustat, cmusAT = getCmus(cmustat, cmusAT) + time.Sleep(time.Second) + sec ++ + } + }() + +} + +func checkUSB(){ + go func () { + for ;; { + usbstat = getUSB(usbstat) + time.Sleep(1* time.Second) + } + }() +} + +func checkTTM(){ + go func () { + for ;; { + ttcheck = getTtcheck(ttcheck) + time.Sleep(10 * time.Second) + } + }() +} + +func main() { + /* + for ;; { + if (sec % 3) == 0 { + cput = getCpuTemp(cput) + cpuse = getCpuUse(cpuse) + batlevel = getBattery(batlevel) + } + if (sec % 10) == 0 { + ttcheck = getTtcheck(ttcheck) + } + alstat = getAlsa(alstat) + }*/ + + checkCmus() + + go func () { + for ;; { + cput = getCpuTemp(cput) + time.Sleep(2 * time.Second) + } + }() + + go func () { + for ;; { + cpuse = getCpuUse(cpuse) + time.Sleep(2 * time.Second) + } + }() + + go func () { + for ;; { + batlevel = getBattery(batlevel) + time.Sleep(2 * time.Second) + } + }() + + go func () { + for ;; { + alstat = getAlsa(alstat) + time.Sleep(2 * time.Second) + } + }() + + for ;; { + t = getTime(t) + //status = statusMkr(status, cmustat, t) + status = statusMkr(status, cmustat, usbstat, alstat, t, cput, cpuse, batlevel) + xsetroot(status.String()) + time.Sleep(time.Second) + } + +} +