diff --git a/get_events.go b/get_events.go new file mode 100644 index 0000000..12df28a --- /dev/null +++ b/get_events.go @@ -0,0 +1,46 @@ +package hypr + +import ( + "bufio" + "context" + "net" + "os" + "strings" + + "git.milar.in/milarin/channel" + "git.milar.in/milarin/slices" +) + +func GetEventChannel(ctx context.Context, types ...EventType) (<-chan Event, error) { + conn, err := net.Dial("unix", os.ExpandEnv("/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock")) + if err != nil { + return nil, err + } + + out := make(chan Event, 10) + + go func() { + defer conn.Close() + <-ctx.Done() + }() + + go func() { + defer close(out) + defer conn.Close() + + sc := bufio.NewScanner(conn) + for sc.Scan() { + out <- parseEvent(sc.Text()) + } + }() + + if len(types) == 0 { + return out, nil + } + + typeMap := slices.ToStructMap(slices.Map(types, strings.ToLower)) + return channel.Filter(out, func(e Event) bool { + _, ok := typeMap[e.Type] + return ok + }), nil +} diff --git a/go.mod b/go.mod index 5900e77..594eb94 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,10 @@ module git.milar.in/milarin/hypr go 1.21.5 + +require ( + git.milar.in/milarin/channel v0.1.1 + git.milar.in/milarin/slices v0.0.8 +) + +require git.milar.in/milarin/gmath v0.0.5 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..10ed6d4 --- /dev/null +++ b/go.sum @@ -0,0 +1,6 @@ +git.milar.in/milarin/channel v0.1.1 h1:s8+BdiOMmuRUDmChQ2i4G5GWsDCK9tKNHt1knLJx9zM= +git.milar.in/milarin/channel v0.1.1/go.mod h1:We83LTI8S7u7II3pD+A2ChCDWJfCkcBUCUqii9HjTtM= +git.milar.in/milarin/gmath v0.0.5 h1:qQQMUTbxEk5LriMMSRbElExDSouSJKYBo6zRcOYKVIU= +git.milar.in/milarin/gmath v0.0.5/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= diff --git a/model_event.go b/model_event.go new file mode 100644 index 0000000..e68b79b --- /dev/null +++ b/model_event.go @@ -0,0 +1,64 @@ +package hypr + +import ( + "encoding/json" + "strings" +) + +type Event struct { + Type EventType `json:"type"` + Data []string `json:"data"` +} + +func parseEvent(str string) Event { + data := strings.Split(str, ">>") + return Event{ + Type: EventType(data[0]), + Data: strings.Split(data[1], ","), + } +} + +func (e Event) String() string { + data, _ := json.MarshalIndent(e, "", "\t") + return string(data) +} + +type EventType = string + +const ( + EventTypeTick EventType = "tick" + EventTypeActiveWindow EventType = "activeWindow" + EventTypeActiveWindowV2 EventType = "activeWindowV2" + EventTypeKeyboardFocus EventType = "keyboardFocus" + EventTypeMoveWorkspace EventType = "moveWorkspace" + EventTypeFocusedMon EventType = "focusedMon" + EventTypeMoveWindow EventType = "moveWindow" + EventTypeOpenLayer EventType = "openLayer" + EventTypeCloseLayer EventType = "closeLayer" + EventTypeOpenWindow EventType = "openWindow" + EventTypeCloseWindow EventType = "closeWindow" + EventTypeUrgent EventType = "urgent" + EventTypeMinimize EventType = "minimize" + EventTypeMonitorAdded EventType = "monitorAdded" + EventTypeMonitorRemoved EventType = "monitorRemoved" + EventTypeCreateWorkspace EventType = "createWorkspace" + EventTypeDestroyWorkspace EventType = "destroyWorkspace" + EventTypeFullscreen EventType = "fullscreen" + EventTypeChangeFloatingMode EventType = "changeFloatingMode" + EventTypeWorkspace EventType = "workspace" + EventTypeSubmap EventType = "submap" + EventTypeMouseMove EventType = "mouseMove" + EventTypeMouseButton EventType = "mouseButton" + EventTypeMouseAxis EventType = "mouseAxis" + EventTypeTouchDown EventType = "touchDown" + EventTypeTouchUp EventType = "touchUp" + EventTypeTouchMove EventType = "touchMove" + EventTypeActiveLayout EventType = "activeLayout" + EventTypePreRender EventType = "preRender" + EventTypeScreencast EventType = "screencast" + EventTypeRender EventType = "render" + EventTypeWindowtitle EventType = "windowtitle" + EventTypeConfigReloaded EventType = "configReloaded" + EventTypePreConfigReload EventType = "preConfigReload" + EventTypeKeyPress EventType = "keyPress" +) diff --git a/monitor.go b/model_monitor.go similarity index 100% rename from monitor.go rename to model_monitor.go diff --git a/window.go b/model_window.go similarity index 100% rename from window.go rename to model_window.go diff --git a/workspace.go b/model_workspace.go similarity index 100% rename from workspace.go rename to model_workspace.go