initial commit
This commit is contained in:
commit
8b50666489
10
go.mod
Normal file
10
go.mod
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
module git.milar.in/milarin/hypr-fixspecialworkspaces
|
||||||
|
|
||||||
|
go 1.22.1
|
||||||
|
|
||||||
|
require (
|
||||||
|
git.milar.in/hyprland-tools/hypr v0.1.7
|
||||||
|
git.milar.in/milarin/slices v0.0.8
|
||||||
|
)
|
||||||
|
|
||||||
|
require git.milar.in/milarin/gmath v0.0.3 // indirect
|
6
go.sum
Normal file
6
go.sum
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
git.milar.in/hyprland-tools/hypr v0.1.7 h1:x5t09YBHDkuSxxuvl3/aCiS8Yj+4ob23NT9NdHOu6sE=
|
||||||
|
git.milar.in/hyprland-tools/hypr v0.1.7/go.mod h1:suJt+N7Nb8T7kaOUsRbFDPV4E/EddVTqpAbpjaJ1xN4=
|
||||||
|
git.milar.in/milarin/gmath v0.0.3 h1:ii6rKNItS55O/wtIFhD1cTN2BMwDZjTBmiOocKURvxM=
|
||||||
|
git.milar.in/milarin/gmath v0.0.3/go.mod h1:HDLftG5RLpiNGKiIWh+O2G1PYkNzyLDADO8Cd/1abiE=
|
||||||
|
git.milar.in/milarin/slices v0.0.8 h1:qN9TE3tkArdTixMKSnwvNPcApwAjxpLVwA5a9k1rm2s=
|
||||||
|
git.milar.in/milarin/slices v0.0.8/go.mod h1:qMhdtMnfWswc1rHpwgNw33lB84aNEkdBn5BDiYA+G3k=
|
89
main.go
Normal file
89
main.go
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.milar.in/hyprland-tools/hypr"
|
||||||
|
"git.milar.in/milarin/slices"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
client, err := hypr.GetDefaultClient()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
events, err := client.Subscribe(context.Background(), hypr.EventTypeMonitorAdded)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for event := range events {
|
||||||
|
monitorName := event.Data[0]
|
||||||
|
log.Printf("monitor %s added", monitorName)
|
||||||
|
|
||||||
|
activeWorkspace, err := client.GetActiveWorkspace()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(fmt.Errorf("active workspace: %w", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := client.DispatchExpectOK(fmt.Sprintf("focusmonitor %s", monitorName)); err != nil {
|
||||||
|
log.Println(fmt.Errorf("focus monitor '%s': %w", monitorName, err))
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := FixAllSpecialWorkspacesOnMonitor(client, monitorName); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := client.DispatchExpectOK(fmt.Sprintf("focusmonitor %s", activeWorkspace.Monitor)); err != nil {
|
||||||
|
log.Println(fmt.Errorf("focus monitor '%s': %w", monitorName, err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func FixAllSpecialWorkspacesOnMonitor(client *hypr.Client, monitorName string) error {
|
||||||
|
workspaces, err := client.GetWorkspaces()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("retrieve workspaces from Hyprland: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
workspacesOnMonitor := slices.Filter(workspaces, WorkspaceIsOnMonitor(monitorName))
|
||||||
|
specialWorkspacesOnMonitor := slices.Filter(workspacesOnMonitor, WorkspaceIsSpecial)
|
||||||
|
|
||||||
|
for _, workspace := range specialWorkspacesOnMonitor {
|
||||||
|
if err := ToggleSpecialWorkspace(client, workspace.Name); err != nil {
|
||||||
|
return fmt.Errorf("toggle special workspace '%s': %w", workspace.Name, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := ToggleSpecialWorkspace(client, workspace.Name); err != nil {
|
||||||
|
return fmt.Errorf("toggle special workspace '%s': %w", workspace.Name, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("special workspace '%s' fixed", workspace.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func WorkspaceIsSpecial(w *hypr.Workspace) bool {
|
||||||
|
return w.ID < 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func WorkspaceIsOnMonitor(monitorName string) func(w *hypr.Workspace) bool {
|
||||||
|
return func(w *hypr.Workspace) bool {
|
||||||
|
return w.Monitor == monitorName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ToggleSpecialWorkspace(client *hypr.Client, workspaceName string) error {
|
||||||
|
if workspaceName == "special" {
|
||||||
|
return client.DispatchExpectOK("togglespecialworkspace")
|
||||||
|
}
|
||||||
|
|
||||||
|
specialWorkspaceName := strings.TrimPrefix(workspaceName, "special:")
|
||||||
|
return client.DispatchExpectOK(fmt.Sprintf("togglespecialworkspace %s", specialWorkspaceName))
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user