From e4272f847815e1b6a44548e5e58d04b3b3b28ce1 Mon Sep 17 00:00:00 2001 From: milarin Date: Fri, 5 Jan 2024 19:16:58 +0100 Subject: [PATCH] GetEventChannel implemented --- get_events.go | 46 ++++++++++++++++++++++++++++++++++++ go.mod | 5 +++- go.sum | 2 ++ model_event.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 get_events.go create mode 100644 model_event.go 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 f8e9f42..bd2bbdf 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,9 @@ module git.milar.in/milarin/hypr go 1.21.6 -require git.milar.in/milarin/slices v0.0.8 +require ( + git.milar.in/milarin/channel v0.1.2 + git.milar.in/milarin/slices v0.0.8 +) require git.milar.in/milarin/gmath v0.0.3 // indirect diff --git a/go.sum b/go.sum index 3107e78..0f88dbc 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +git.milar.in/milarin/channel v0.1.2 h1:43nWriSppDxa2dO6Midhy2RymzMz2F/Mp1D6lgapQnQ= +git.milar.in/milarin/channel v0.1.2/go.mod h1:We83LTI8S7u7II3pD+A2ChCDWJfCkcBUCUqii9HjTtM= 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= 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" +)