Compare commits
No commits in common. "main" and "v0.0.6" have entirely different histories.
16
client.go
16
client.go
@ -11,17 +11,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Client is a single connection to a sway socket.
|
|
||||||
// All requests are synchronized in order to be thread-safe.
|
|
||||||
// That means they are processed in incoming order.
|
|
||||||
// If you want to be truly concurrent, use multiple clients
|
|
||||||
// connected to the same sway socket path.
|
|
||||||
// Subscriptions are the exception: They use their own socket connection
|
|
||||||
// so other requests are still possible.
|
|
||||||
// Subscription connections get closed as soon as the provided context is done.
|
|
||||||
// Use Client.Close after all requests are processed
|
|
||||||
// to close the connection to the socket.
|
|
||||||
// Client.Close does not handle subscriptions.
|
|
||||||
type Client struct {
|
type Client struct {
|
||||||
sync.Mutex
|
sync.Mutex
|
||||||
|
|
||||||
@ -29,8 +18,6 @@ type Client struct {
|
|||||||
conn net.Conn
|
conn net.Conn
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDefaultClient returns a sway client for the current seat.
|
|
||||||
// It determines the current seat by the SWAYSOCK environment variable
|
|
||||||
func GetDefaultClient() (*Client, error) {
|
func GetDefaultClient() (*Client, error) {
|
||||||
socket, ok := os.LookupEnv("SWAYSOCK")
|
socket, ok := os.LookupEnv("SWAYSOCK")
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -40,7 +27,6 @@ func GetDefaultClient() (*Client, error) {
|
|||||||
return GetClientBySocket(socket)
|
return GetClientBySocket(socket)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetClientBySocket returns a sway client for the provided socket.
|
|
||||||
func GetClientBySocket(socket string) (*Client, error) {
|
func GetClientBySocket(socket string) (*Client, error) {
|
||||||
conn, err := net.Dial("unix", socket)
|
conn, err := net.Dial("unix", socket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -53,8 +39,6 @@ func GetClientBySocket(socket string) (*Client, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close closes the socket connection.
|
|
||||||
// All requests will return errors after calling Close
|
|
||||||
func (c *Client) Close() error {
|
func (c *Client) Close() error {
|
||||||
c.Lock()
|
c.Lock()
|
||||||
defer c.Unlock()
|
defer c.Unlock()
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
package sway
|
package sway
|
||||||
|
|
||||||
// GetBarIDs returns a string array containing the IDs of all sway bars
|
|
||||||
func (c *Client) GetBarIDs() ([]string, error) {
|
func (c *Client) GetBarIDs() ([]string, error) {
|
||||||
return sendMessage[[]string](c, 6, "")
|
return sendMessage[[]string](c, 6, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetBarConfig returns the configuration for the given bar id
|
|
||||||
func (c *Client) GetBarConfig(barID string) (*BarConfig, error) {
|
func (c *Client) GetBarConfig(barID string) (*BarConfig, error) {
|
||||||
return sendMessage[*BarConfig](c, 6, barID)
|
return sendMessage[*BarConfig](c, 6, barID)
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package sway
|
package sway
|
||||||
|
|
||||||
// GetBindingModes returns all binding modes configured in the config file
|
|
||||||
func (c *Client) GetBindingModes() ([]string, error) {
|
func (c *Client) GetBindingModes() ([]string, error) {
|
||||||
return sendMessage[[]string](c, 8, "")
|
return sendMessage[[]string](c, 8, "")
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
package sway
|
package sway
|
||||||
|
|
||||||
// GetConfig returns the content of the content file.
|
|
||||||
// Includes are not handled
|
|
||||||
func (c *Client) GetConfig() (string, error) {
|
func (c *Client) GetConfig() (string, error) {
|
||||||
cfg, err := sendMessage[config](c, 9, "")
|
cfg, err := sendMessage[config](c, 9, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package sway
|
package sway
|
||||||
|
|
||||||
// GetCurrentBindingMode returns the currently active binding mode
|
|
||||||
func (c *Client) GetCurrentBindingMode() (string, error) {
|
func (c *Client) GetCurrentBindingMode() (string, error) {
|
||||||
mode, err := sendMessage[name](c, 12, "")
|
mode, err := sendMessage[name](c, 12, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package sway
|
package sway
|
||||||
|
|
||||||
// GetInputs returns all input devices and their properties
|
|
||||||
func (c *Client) GetInputs() ([]InputDevice, error) {
|
func (c *Client) GetInputs() ([]InputDevice, error) {
|
||||||
return sendMessage[[]InputDevice](c, 100, "")
|
return sendMessage[[]InputDevice](c, 100, "")
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package sway
|
package sway
|
||||||
|
|
||||||
// GetMarks returns a string array containing all current marks
|
|
||||||
func (c *Client) GetMarks() ([]string, error) {
|
func (c *Client) GetMarks() ([]string, error) {
|
||||||
return sendMessage[[]string](c, 5, "")
|
return sendMessage[[]string](c, 5, "")
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package sway
|
package sway
|
||||||
|
|
||||||
// GetOutputs returns all outputs and their properties
|
|
||||||
func (c *Client) GetOutputs() ([]Output, error) {
|
func (c *Client) GetOutputs() ([]Output, error) {
|
||||||
return sendMessage[[]Output](c, 3, "")
|
return sendMessage[[]Output](c, 3, "")
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package sway
|
package sway
|
||||||
|
|
||||||
// GetSeats returns all sway seats
|
|
||||||
func (c *Client) GetSeats() ([]Seat, error) {
|
func (c *Client) GetSeats() ([]Seat, error) {
|
||||||
return sendMessage[[]Seat](c, 101, "")
|
return sendMessage[[]Seat](c, 101, "")
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
package sway
|
package sway
|
||||||
|
|
||||||
// GetTree returns a Node object containing all
|
|
||||||
// outputs, workspaces, containers and windows in a recursive tree.
|
|
||||||
// Use Node.Find and Node.FindAll to search the tree recursively
|
|
||||||
func (c *Client) GetTree() (*Node, error) {
|
func (c *Client) GetTree() (*Node, error) {
|
||||||
return sendMessage[*Node](c, 4, "")
|
return sendMessage[*Node](c, 4, "")
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package sway
|
package sway
|
||||||
|
|
||||||
// GetVersion returns information about the sway version
|
|
||||||
func (c *Client) GetVersion() (*Version, error) {
|
func (c *Client) GetVersion() (*Version, error) {
|
||||||
return sendMessage[*Version](c, 7, "")
|
return sendMessage[*Version](c, 7, "")
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package sway
|
package sway
|
||||||
|
|
||||||
// GetWorkspaces returns all currently opened workspaces
|
|
||||||
func (c *Client) GetWorkspaces() ([]Workspace, error) {
|
func (c *Client) GetWorkspaces() ([]Workspace, error) {
|
||||||
return sendMessage[[]Workspace](c, 1, "")
|
return sendMessage[[]Workspace](c, 1, "")
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,6 @@ import (
|
|||||||
"git.milar.in/milarin/slices"
|
"git.milar.in/milarin/slices"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RunCommand runs all provided commands.
|
|
||||||
// It will return an array of errors
|
|
||||||
// which represent the result of each command.
|
|
||||||
// The last error is for communication problems only.
|
|
||||||
func (c *Client) RunCommand(cmd string) ([]error, error) {
|
func (c *Client) RunCommand(cmd string) ([]error, error) {
|
||||||
results, err := sendMessage[[]commandResult](c, 0, cmd)
|
results, err := sendMessage[[]commandResult](c, 0, cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package sway
|
package sway
|
||||||
|
|
||||||
// SendTick sends a tick with the given payload
|
|
||||||
func (c *Client) SendTick(payload string) error {
|
func (c *Client) SendTick(payload string) error {
|
||||||
result, err := sendMessage[commandResult](c, 10, payload)
|
result, err := sendMessage[commandResult](c, 10, payload)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -11,11 +11,6 @@ import (
|
|||||||
"git.milar.in/milarin/slices"
|
"git.milar.in/milarin/slices"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Subscribe subscribes to the given event types
|
|
||||||
// and returns a channel in which all events get written into.
|
|
||||||
// A new socket connection will be established
|
|
||||||
// so other requests can still be used during a subscription.
|
|
||||||
// The subscription connection will be closed as soon as ctx is closed.
|
|
||||||
func (c *Client) Subscribe(ctx context.Context, events ...EventType) (<-chan Event, error) {
|
func (c *Client) Subscribe(ctx context.Context, events ...EventType) (<-chan Event, error) {
|
||||||
conn, err := net.Dial("unix", c.socket)
|
conn, err := net.Dial("unix", c.socket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
47
types.go
47
types.go
@ -131,53 +131,6 @@ func (n Node) String() string {
|
|||||||
return string(data)
|
return string(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find recursively searches n and returns the node
|
|
||||||
// for which condition returned true.
|
|
||||||
// condition is called in depth-first order:
|
|
||||||
// 1. for n
|
|
||||||
// 2. for n.Nodes (in order)
|
|
||||||
// 3. for n.FloatingNodes (in order)
|
|
||||||
//
|
|
||||||
// If no matching node is found, Find returns nil
|
|
||||||
func (n *Node) Find(condition func(n *Node) bool) *Node {
|
|
||||||
if condition(n) {
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, child := range n.Nodes {
|
|
||||||
if node := child.Find(condition); node != nil {
|
|
||||||
return node
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, child := range n.FloatingNodes {
|
|
||||||
if node := child.Find(condition); node != nil {
|
|
||||||
return node
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindAll behaves like Find but returns all matching nodes
|
|
||||||
func (n *Node) FindAll(condition func(n *Node) bool) []*Node {
|
|
||||||
nodes := []*Node{}
|
|
||||||
|
|
||||||
if condition(n) {
|
|
||||||
nodes = append(nodes, n)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, child := range n.Nodes {
|
|
||||||
nodes = append(nodes, child.FindAll(condition)...)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, child := range n.FloatingNodes {
|
|
||||||
nodes = append(nodes, child.FindAll(condition)...)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nodes
|
|
||||||
}
|
|
||||||
|
|
||||||
type NodeType = string
|
type NodeType = string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
Loading…
x
Reference in New Issue
Block a user