package hyprman import ( "bufio" "encoding/json" "fmt" "io" "log" "net" "os/exec" "strings" "time" ) type EwwWorkspace struct { Icon string `json:"icon"` Class string `json:"class"` Id int `json:"id"` } func (hm *Hyprman) pickIcon(class string) string { for k, v := range hm.Config.Classes { if strings.Contains(k, class) { return v } } return hm.Config.DefaultIcon } func (hm *Hyprman) generateEwwClasses() { monitors := getMonitors() clients := getClients() var ewwClasses [][]EwwWorkspace monitor := make([]EwwWorkspace, 9) for i := range 9 { monitor[i] = EwwWorkspace{ hm.Config.NoClientIcon, fmt.Sprintf("ws-button-%d", i+1), i + 1, } } for _, client := range clients { id := client.Workspace.Id - 1 currentIcon := monitor[id].Icon if currentIcon == hm.Config.NoClientIcon { monitor[id].Icon = hm.pickIcon(client.Class) } else { monitor[id].Icon = fmt.Sprintf("%s%s", currentIcon, hm.pickIcon(client.Class)) } } for _, id := range openWorkspaces(monitors) { // activeId := m.ActiveWorkspace.Id monitor[id-1].Class = fmt.Sprintf("%s %s", monitor[id-1].Class, "ws-button-open") } for i, m := range monitors { activeId := m.ActiveWorkspace.Id - 1 ewwClasses = append(ewwClasses, make([]EwwWorkspace, 9)) copy(ewwClasses[i], monitor) ewwClasses[i][activeId].Class = fmt.Sprintf("%s %s-%d", monitor[activeId].Class, "ws-button-active", activeId+1) } bytes, err := json.Marshal(ewwClasses) if err != nil { panic(err) } fmt.Println(string(bytes)) } func ewwBar1(cmd string) { time.Sleep(3 * time.Second) output, err := exec.Command("eww", cmd, "bar1").CombinedOutput() if err != nil { notify(fmt.Sprintf("failed to %s bar 1\n\n%s\n\n%v", cmd, output, err)) } } func (hm *Hyprman) handleHyprEvent(line string) { s := strings.Split(line, ">>") event, _ := s[0], s[1] if event == "monitoradded" { notify("Monitor added opening bar1") go ewwBar1("open") } hm.generateEwwClasses() } func (hm *Hyprman) LaunchEww() { for i := range getMonitors() { if err := exec.Command("eww", "open", fmt.Sprintf("bar%d", i)).Run(); err != nil { notify(fmt.Sprintf("Error lanching eww:\n%v", err)) } } } func (hm *Hyprman) Watch() { socketPath := hyprSocket2() conn, err := net.Dial("unix", socketPath) if err != nil { log.Fatalln("Error connecting to hyprland IPC:", err) } defer conn.Close() reader := bufio.NewReader(conn) hm.generateEwwClasses() for { line, err := reader.ReadString('\n') if err != nil { if err == io.EOF { // log.Printf("reached EOF for %s\n", socketPath) break } // log.Println("error reading line") continue } hm.handleHyprEvent(line) } }