diff --git a/internal/eww.go b/internal/eww.go new file mode 100644 index 0000000..63115b1 --- /dev/null +++ b/internal/eww.go @@ -0,0 +1,145 @@ +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(200 * time.Second) + if err := exec.Command("eww", cmd, "bar1").Run(); err != nil { + log.Fatal(err) + } +} + +func (hm *Hyprman) handleHyprEvent(line string) { + s := strings.Split(line, ">>") + event, _ := s[0], s[1] + switch event { + case "monitorremoved": + notify("Monitor removed closing bar1") + go ewwBar1("close") + hm.generateEwwClasses() + case "monitoradded": + notify("Monitor added opening bar1") + go ewwBar1("open") + hm.generateEwwClasses() + case "workspace", + "focusedmon", + "activewindow", + "createworkspace", + "destroyworkspace", + "moveworkspace", + "renameworkspace", + "openwindow", + "closewindow", + "movewindow", + "movewindowv2", + "changefloatingmode", + "windowtitle", + "togglegroup", + "moveintogroup", + "moveoutofgroup", + "configreloaded": + 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) + } +} diff --git a/internal/hyprman.go b/internal/hyprman.go index db0534c..96e7fd9 100644 --- a/internal/hyprman.go +++ b/internal/hyprman.go @@ -1,17 +1,13 @@ package hyprman import ( - "bufio" "encoding/json" "fmt" - "io" "log" "net" "os" "os/exec" "path/filepath" - "strings" - "time" yaml "github.com/goccy/go-yaml" ) @@ -133,21 +129,6 @@ func getClients() []Client { return clients } -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 openWorkspaces(monitors []Monitor) []int { open := make([]int, len(monitors)) for i, m := range monitors { @@ -156,124 +137,7 @@ func openWorkspaces(monitors []Monitor) []int { return open } -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(200 * time.Second) - if err := exec.Command("eww", cmd, "bar1").Run(); err != nil { - log.Fatal(err) - } -} - func notify(message string) { cmd := exec.Command("notify-send", "hyprman", message) cmd.Run() } - -func (hm *Hyprman) handleHyprEvent(line string) { - s := strings.Split(line, ">>") - event, _ := s[0], s[1] - switch event { - case "monitorremoved": - notify("Monitor removed closing bar1") - go ewwBar1("close") - hm.generateEwwClasses() - case "monitoradded": - notify("Monitor added opening bar1") - go ewwBar1("open") - hm.generateEwwClasses() - case "workspace", - "focusedmon", - "activewindow", - "createworkspace", - "destroyworkspace", - "moveworkspace", - "renameworkspace", - "openwindow", - "closewindow", - "movewindow", - "movewindowv2", - "changefloatingmode", - "windowtitle", - "togglegroup", - "moveintogroup", - "moveoutofgroup", - "configreloaded": - 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) - } -}