GetEventChannel implemented

This commit is contained in:
milarin 2024-01-05 19:16:58 +01:00
parent 726c07b87a
commit 704f069cb6
7 changed files with 123 additions and 0 deletions

46
get_events.go Normal file
View File

@ -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
}

7
go.mod
View File

@ -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

6
go.sum Normal file
View File

@ -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=

64
model_event.go Normal file
View File

@ -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"
)