1
0
mirror of https://github.com/joshuarubin/go-sway synced 2024-11-22 21:11:59 +01:00
go-sway/subscribe.go
aajonusonline b56ddd2124
add input subscribe event, update bar_status_event to bar_state_event (#2)
* add input subscribe event, update bar_status_event to bar_state_event

* Add missing documentation, update to recent IPC

* Added deprecated API back for backwards compatibility

Co-authored-by: wtl <wtl144000@gmail.com>
2021-09-23 08:20:55 -06:00

171 lines
4.8 KiB
Go

package sway
import (
"context"
)
// EventType is used to choose which events to Subscribe to
type EventType string
const (
// EventTypeWorkspace is sent whenever an event involving a workspace occurs
// such as initialization of a new workspace or a different workspace gains
// focus
EventTypeWorkspace EventType = "workspace"
// EventTypeMode is sent whenever the binding mode changes
EventTypeMode EventType = "mode"
// EventTypeWindow is sent whenever an event involving a view occurs such as
// being reparented, focused, or closed
EventTypeWindow EventType = "window"
// EventTypeBarConfigUpdate is sent whenever a bar config changes
EventTypeBarConfigUpdate EventType = "barconfig_update"
// EventTypeBinding is sent when a configured binding is executed
EventTypeBinding EventType = "binding"
// EventTypeShutdown is sent when the ipc shuts down because sway is exiting
EventTypeShutdown EventType = "shutdown"
// EventTypeTick is sent when an ipc client sends a SEND_TICK message
EventTypeTick EventType = "tick"
// EventTypeBarStateUpdate is sent when the visibility of a bar should change
// due to a modifier
EventTypeBarStateUpdate EventType = "bar_state_update"
// Deprecated: EventTypeBarStatusUpdate is deprecated
// you should use EventTypeBarStateUpdate instead
EventTypeBarStatusUpdate EventType = EventTypeBarStateUpdate
// EventTypeInput is sent when something related to input devices changes
EventTypeInput EventType = "input"
)
// An EventHandler is passed to Subscribe and its methods are called in response
// to sway events
type EventHandler interface {
Workspace(context.Context, WorkspaceEvent)
Mode(context.Context, ModeEvent)
Window(context.Context, WindowEvent)
BarConfigUpdate(context.Context, BarConfigUpdateEvent)
Binding(context.Context, BindingEvent)
Shutdown(context.Context, ShutdownEvent)
Tick(context.Context, TickEvent)
BarStateUpdate(context.Context, BarStateUpdateEvent)
BarStatusUpdate(context.Context, BarStatusUpdateEvent)
Input(context.Context, InputEvent)
}
// NoOpEventHandler is used to help provide empty methods that aren't intended
// to be handled by Subscribe
//
// type handler struct {
// sway.EventHandler
// }
//
// func (h handler) Window(ctx context.Context, e sway.WindowEvent) {
// ...
// }
//
// func main() {
// h := handler{
// EventHandler: sway.NoOpEventHandler(),
// }
//
// ctx := context.Background()
//
// sway.Subscribe(ctx, h, sway.EventTypeWindow)
// }
func NoOpEventHandler() EventHandler {
return noOpEventHandler{}
}
type noOpEventHandler struct{}
func (h noOpEventHandler) Workspace(context.Context, WorkspaceEvent) {}
func (h noOpEventHandler) Mode(context.Context, ModeEvent) {}
func (h noOpEventHandler) Window(context.Context, WindowEvent) {}
func (h noOpEventHandler) BarConfigUpdate(context.Context, BarConfigUpdateEvent) {}
func (h noOpEventHandler) Binding(context.Context, BindingEvent) {}
func (h noOpEventHandler) Shutdown(context.Context, ShutdownEvent) {}
func (h noOpEventHandler) Tick(context.Context, TickEvent) {}
func (h noOpEventHandler) BarStateUpdate(context.Context, BarStateUpdateEvent) {}
func (h noOpEventHandler) BarStatusUpdate(context.Context, BarStatusUpdateEvent) {}
func (h noOpEventHandler) Input(context.Context, InputEvent) {}
// Subscribe the IPC connection to the events listed in the payload
func Subscribe(ctx context.Context, handler EventHandler, events ...EventType) error {
n, err := New(ctx)
if err != nil {
return err
}
c := n.(*client)
if err = c.subscribe(ctx, events...); err != nil {
return err
}
for {
msg, err := c.recvMsg(ctx)
if err != nil {
return err
}
processEvent(ctx, handler, msg)
}
}
func processEvent(ctx context.Context, h EventHandler, msg *message) {
switch msg.Type {
case eventTypeWorkspace:
var e WorkspaceEvent
if err := msg.Decode(&e); err == nil {
h.Workspace(ctx, e)
}
case eventTypeMode:
var e ModeEvent
if err := msg.Decode(&e); err == nil {
h.Mode(ctx, e)
}
case eventTypeWindow:
var e WindowEvent
if err := msg.Decode(&e); err == nil {
h.Window(ctx, e)
}
case eventTypeBarConfigUpdate:
var e BarConfigUpdateEvent
if err := msg.Decode(&e); err == nil {
h.BarConfigUpdate(ctx, e)
}
case eventTypeBinding:
var e BindingEvent
if err := msg.Decode(&e); err == nil {
h.Binding(ctx, e)
}
case eventTypeShutdown:
var e ShutdownEvent
if err := msg.Decode(&e); err == nil {
h.Shutdown(ctx, e)
}
case eventTypeTick:
var e TickEvent
if err := msg.Decode(&e); err == nil {
h.Tick(ctx, e)
}
case eventTypeBarStateUpdate:
var e BarStateUpdateEvent
if err := msg.Decode(&e); err == nil {
h.BarStateUpdate(ctx, e)
}
case eventTypeInput:
var e InputEvent
if err := msg.Decode(&e); err == nil {
h.Input(ctx, e)
}
}
}