initial commit
This commit is contained in:
commit
8345de3597
16
event.go
Normal file
16
event.go
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package sway
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
|
"git.milar.in/milarin/adverr"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Event struct {
|
||||||
|
Change string `json:"change"`
|
||||||
|
Container Node `json:"container"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e Event) String() string {
|
||||||
|
return string(adverr.Must(json.MarshalIndent(e, "", "\t")))
|
||||||
|
}
|
9
event_type.go
Normal file
9
event_type.go
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package sway
|
||||||
|
|
||||||
|
type EventType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
EventTypeWindow EventType = "window"
|
||||||
|
EventTypeWorkspace EventType = "workspace"
|
||||||
|
// TODO
|
||||||
|
)
|
23
get_tree.go
Normal file
23
get_tree.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package sway
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"os/exec"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetTree(ctx context.Context) (*Node, error) {
|
||||||
|
cmd := exec.CommandContext(ctx, "swaymsg", "-t", "get_tree")
|
||||||
|
|
||||||
|
data, err := cmd.Output()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var root Node
|
||||||
|
if err := json.Unmarshal(data, &root); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &root, nil
|
||||||
|
}
|
16
get_tree_test.go
Normal file
16
get_tree_test.go
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package sway
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestGetTree(t *testing.T) {
|
||||||
|
root, err := GetTree(context.Background())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(root.ID, root.Name)
|
||||||
|
}
|
5
go.mod
Normal file
5
go.mod
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
module git.milar.in/milarin/sway
|
||||||
|
|
||||||
|
go 1.21.1
|
||||||
|
|
||||||
|
require git.milar.in/milarin/adverr v1.1.1
|
2
go.sum
Normal file
2
go.sum
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
git.milar.in/milarin/adverr v1.1.1 h1:ENtBcqT7CncLsVfaLC3KzX8QSSGiSpsC7I7wDqladu8=
|
||||||
|
git.milar.in/milarin/adverr v1.1.1/go.mod h1:joU9sBb7ySyNv4SpTXB0Z4o1mjXsArBw4N27wjgzj9E=
|
150
node.go
Normal file
150
node.go
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
package sway
|
||||||
|
|
||||||
|
type Node struct {
|
||||||
|
ID NodeID `json:"id"`
|
||||||
|
Type NodeType `json:"type"`
|
||||||
|
Orientation Orientation `json:"orientation"`
|
||||||
|
Percentage float64 `json:"percent"`
|
||||||
|
Urgent bool `json:"urgent"`
|
||||||
|
Marks []string `json:"marks"`
|
||||||
|
Focused bool `json:"focused"`
|
||||||
|
Layout string `json:"layout"`
|
||||||
|
Border BorderStyle `json:"border"`
|
||||||
|
CurrentBorderWidth int `json:"current_border_width"`
|
||||||
|
Rect Rect `json:"rect"`
|
||||||
|
DecoRect Rect `json:"deco_rect"`
|
||||||
|
WindowRect Rect `json:"window_rect"`
|
||||||
|
Geometry Rect `json:"geometry"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
XorgWindowID *int64 `json:"window"`
|
||||||
|
Nodes []Node `json:"nodes"`
|
||||||
|
FloatingNodes []Node `json:"floating_nodes"`
|
||||||
|
Focus []NodeID `json:"focus"`
|
||||||
|
FullscreenMode FullscreenMode `json:"fullscreen_mode"`
|
||||||
|
Sticky bool `json:"sticky"`
|
||||||
|
PID int64 `json:"pid"`
|
||||||
|
AppID string `json:"app_id"`
|
||||||
|
Visible bool `json:"visible"`
|
||||||
|
MaxRenderTimeMilli int64 `json:"max_render_time"`
|
||||||
|
Shell string `json:"shell"`
|
||||||
|
InhibitIdle bool `json:"inhibit_idle"`
|
||||||
|
IdleInhibitors IdleInhibitors `json:"idle_inhibitors"`
|
||||||
|
|
||||||
|
// NodeTypeOutput only
|
||||||
|
Primary bool `json:"primary"`
|
||||||
|
Make string `json:"make"`
|
||||||
|
Model string `json:"model"`
|
||||||
|
Serial string `json:"serial"`
|
||||||
|
Modes []OutputMode `json:"modes"`
|
||||||
|
NonDesktop bool `json:"non_desktop"`
|
||||||
|
Active bool `json:"active"`
|
||||||
|
DPMS bool `json:"dpms"`
|
||||||
|
Power bool `json:"power"`
|
||||||
|
Scale float64 `json:"scale"`
|
||||||
|
ScaleFilter ScaleFilter `json:"scale_filter"`
|
||||||
|
Transform Transform `json:"transform"`
|
||||||
|
AdaptiveSync string `json:"adaptive_sync_status"`
|
||||||
|
LayerShellSurfaces []LayerShellSurface `json:"layer_shell_surfaces"`
|
||||||
|
CurrentWorkspace string `json:"current_workspace"`
|
||||||
|
CurrentMode OutputMode `json:"current_mode"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type NodeID int64
|
||||||
|
|
||||||
|
type NodeType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
NodeTypeRoot NodeType = "root"
|
||||||
|
NodeTypeOutput NodeType = "output"
|
||||||
|
NodeTypeCon NodeType = "con"
|
||||||
|
NodeTypeFloatingCon NodeType = "floating_con"
|
||||||
|
NodeTypeWorkspace NodeType = "workspace"
|
||||||
|
NodeTypeDockarea NodeType = "dockarea"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Rect struct {
|
||||||
|
Y int `json:"y"`
|
||||||
|
X int `json:"x"`
|
||||||
|
Width int `json:"width"`
|
||||||
|
Height int `json:"height"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type BorderStyle string
|
||||||
|
|
||||||
|
const (
|
||||||
|
BorderStyleNormal BorderStyle = "normal"
|
||||||
|
BorderStyleNo BorderStyle = "none"
|
||||||
|
BorderStylePixel BorderStyle = "pixel"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Layout string
|
||||||
|
|
||||||
|
const (
|
||||||
|
LayoutSplitH Layout = "splith"
|
||||||
|
LayoutSplitV Layout = "splitv"
|
||||||
|
LayoutStacked Layout = "stacked"
|
||||||
|
LayoutTabbed Layout = "tabbed"
|
||||||
|
LayoutDockarea Layout = "dockarea"
|
||||||
|
LayoutOutput Layout = "output"
|
||||||
|
)
|
||||||
|
|
||||||
|
type FullscreenMode int64
|
||||||
|
|
||||||
|
const (
|
||||||
|
FullscreenNone FullscreenMode = 0
|
||||||
|
FullscreenOutput FullscreenMode = 1
|
||||||
|
FullscreenGlobal FullscreenMode = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
type IdleInhibitors struct {
|
||||||
|
User string `json:"user"`
|
||||||
|
Application string `json:"application"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type OutputMode struct {
|
||||||
|
Width int `json:"width"`
|
||||||
|
Height int `json:"height"`
|
||||||
|
RefreshRate int `json:"refresh"`
|
||||||
|
AspectRatio string `json:"picture_aspect_ratio"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ScaleFilter string
|
||||||
|
|
||||||
|
const (
|
||||||
|
ScaleFilterNearest ScaleFilter = "nearest"
|
||||||
|
ScaleFilterLinear ScaleFilter = "linear"
|
||||||
|
ScaleFilterSmart ScaleFilter = "smart"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Transform string
|
||||||
|
|
||||||
|
const (
|
||||||
|
TransformNormal Transform = "normal"
|
||||||
|
Transform90 Transform = "90"
|
||||||
|
Transform180 Transform = "180"
|
||||||
|
Transform270 Transform = "270"
|
||||||
|
TransformFlipped Transform = "flipped"
|
||||||
|
TransformFlipped90 Transform = "flipped-90"
|
||||||
|
TransformFlipped180 Transform = "flipped-180"
|
||||||
|
TransformFlipped270 Transform = "flipped-270"
|
||||||
|
)
|
||||||
|
|
||||||
|
type LayerShellSurface struct {
|
||||||
|
Namespace string `json:"namespace"`
|
||||||
|
Layer string `json:"layer"`
|
||||||
|
Extent Rect `json:"extenct"`
|
||||||
|
Effects []Effect `json:"effects"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Effect string
|
||||||
|
|
||||||
|
const (
|
||||||
|
EffectBlur Effect = "blur"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Orientation string
|
||||||
|
|
||||||
|
const (
|
||||||
|
OrientationHorizontal Orientation = "horizontal"
|
||||||
|
OrientationVertical Orientation = "vertical"
|
||||||
|
)
|
38
subscribe.go
Normal file
38
subscribe.go
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package sway
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"os/exec"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Subscribe(ctx context.Context, events ...EventType) (<-chan Event, error) {
|
||||||
|
data, err := json.Marshal(events)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd := exec.CommandContext(ctx, "swaymsg", "-t", "subscribe", "-m", string(data))
|
||||||
|
|
||||||
|
stdout, err := cmd.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
out := make(chan Event, 10)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
defer cmd.Wait()
|
||||||
|
dec := json.NewDecoder(stdout)
|
||||||
|
var event Event
|
||||||
|
for err := dec.Decode(&event); err == nil; err = dec.Decode(&event) {
|
||||||
|
out <- event
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if err := cmd.Start(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return out, nil
|
||||||
|
}
|
18
subscribe_test.go
Normal file
18
subscribe_test.go
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package sway
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSubscribe(t *testing.T) {
|
||||||
|
events, err := Subscribe(context.Background(), EventTypeWindow, EventTypeWorkspace)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for event := range events {
|
||||||
|
fmt.Println(event)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user