diff --git a/.gitignore b/.gitignore index d109d43..2a6a091 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ /bspwm /bspc +/tspwm +/tspc + *.log *.sock diff --git a/Makefile b/Makefile index 06a84a7..c7e361d 100644 --- a/Makefile +++ b/Makefile @@ -20,10 +20,10 @@ all: bspwm bspc VPATH=src bspwm: cmd/bspwm src/**/* - go build -o bspwm ./cmd/bspwm + go build -o tspwm ./cmd/bspwm bspc: cmd/bspc src/**/* - go build -o bspc ./cmd/bspc + go build -o tspc ./cmd/bspc xephyr: Xephyr :11 -br -ac -noreset -screen ${WINDOWSIZE} diff --git a/cmd/bspwm/main.go b/cmd/bspwm/main.go index 4068ef5..499c648 100644 --- a/cmd/bspwm/main.go +++ b/cmd/bspwm/main.go @@ -71,9 +71,9 @@ func _main() (code int, err error) { XWM: xwm, } // install the handlers - handler.AddDomain[domains.Todo](h, "node") + handler.AddDomain[domains.Node](h, "node") handler.AddDomain[domains.Todo](h, "desktop") - handler.AddDomain[domains.Todo](h, "monitor") + handler.AddDomain[domains.Monitor](h, "monitor") handler.AddDomain[domains.Wm](h, "wm") handler.AddDomain[domains.Todo](h, "rule") handler.AddDomain[domains.Config](h, "config") diff --git a/src/handler/domains/common.go b/src/handler/domains/common.go index e84cccf..44ba118 100644 --- a/src/handler/domains/common.go +++ b/src/handler/domains/common.go @@ -2,6 +2,7 @@ package domains import ( "fmt" + "strings" "tuxpa.in/t/wm/src/bsp" "tuxpa.in/t/wm/src/copies" @@ -11,6 +12,28 @@ import ( type inject struct { xwm } + +type monitor_sel struct { + monitorsel string +} + +func (n *monitor_sel) tryMonitorSel(msg *sock.Msg) (bool, error) { + // first split the str by . + if !msg.HasNext() { + return false, nil + } + str := msg.Peek() + splt := strings.Split(str, ".") + switch splt[0] { + case "any", "first_ancestor", + "last", "newest", "older", "newer", + "focused", "pointed", "biggest", "smallest": + n.monitorsel = str + return true, nil + } + return false, nil +} + type desktop_sel struct { desktopsel string } @@ -51,10 +74,6 @@ type cmd struct { Command string } -func (c *cmd) SetCommand(x string) { - c.Command = x -} - func (n *cmd) readCommand(msg *sock.Msg, c string) (bool, error) { if n.Command == "" { n.Command = c @@ -63,6 +82,33 @@ func (n *cmd) readCommand(msg *sock.Msg, c string) (bool, error) { return false, fmt.Errorf("multiple commands given") } +type commandParser struct { + routes map[string]string +} + +func newCommandParser() *commandParser { + return &commandParser{ + routes: map[string]string{}, + } +} + +func (c *commandParser) addDef(name string, aliases ...string) *commandParser { + c.routes["--"+strings.TrimSpace(name)] = name + for _, a := range aliases { + c.routes[strings.TrimSpace(a)] = name + } + return c +} + +func (c *commandParser) parse(n *cmd, msg *sock.Msg) (bool, error) { + arg := msg.Next() + cmd, ok := c.routes[arg] + if !ok { + return false, fmt.Errorf(`unknown option: '%s'`, arg) + } + return n.readCommand(msg, cmd) +} + type xwm struct { XWM *bsp.XWM } diff --git a/src/handler/domains/monitor.go b/src/handler/domains/monitor.go new file mode 100644 index 0000000..2588e9d --- /dev/null +++ b/src/handler/domains/monitor.go @@ -0,0 +1,72 @@ +package domains + +import ( + "fmt" + + "tuxpa.in/t/wm/src/copies" + "tuxpa.in/t/wm/src/sock" +) + +type Monitor struct { + UseNames bool + + inject + + cmd + + monitor_sel +} + +func (n *Monitor) Run(msg *sock.Msg) ([]byte, error) { + if !msg.HasNext() { + return nil, &copies.ErrMissingArguments{} + } + for { + ok, err := n.parse(msg) + if err != nil { + return nil, err + } + if !ok { + break + } + } + switch n.Command { + default: + return nil, &copies.ErrTODO{ + Kind: "command", + Name: n.Command, + } + } +} + +func (n *Monitor) parse(msg *sock.Msg) (bool, error) { + if !msg.HasNext() { + return false, &copies.ErrMissingArguments{} + } + ok, err := n.tryMonitorSel(msg) + if err != nil { + return false, err + } + if ok { + msg.Next() + } + arg := msg.Next() + switch arg { + case "--add-desktops", "-a": + return n.readCommand(msg, "add-desktops") + case "--focus", "-f": + return n.readCommand(msg, "focus") + case "--rectangle", "-g": + return n.readCommand(msg, "rectangle") + case "--remove", "-r": + return n.readCommand(msg, "remove") + case "--reorder-desktops", "-o": + return n.readCommand(msg, "reorder-desktops") + case "--reset-desktops", "-d": + return n.readCommand(msg, "reset-desktops") + case "--swap", "-s": + return n.readCommand(msg, "swap") + default: + return false, fmt.Errorf(`unknown option: '%s'`, arg) + } +} diff --git a/src/handler/domains/node.go b/src/handler/domains/node.go index f584559..c926c33 100644 --- a/src/handler/domains/node.go +++ b/src/handler/domains/node.go @@ -29,7 +29,13 @@ func (n *Node) Run(msg *sock.Msg) ([]byte, error) { } } - return nil, nil + switch n.Command { + default: + return nil, &copies.ErrTODO{ + Kind: "command", + Name: n.Command, + } + } } func (n *Node) parse(msg *sock.Msg) (bool, error) { diff --git a/src/handler/domains/query.go b/src/handler/domains/query.go index 10e9679..649262c 100644 --- a/src/handler/domains/query.go +++ b/src/handler/domains/query.go @@ -60,22 +60,22 @@ func (n *Query) desktops(msg *sock.Msg) ([]byte, error) { return o.Bytes(), nil } +var queryParser = newCommandParser(). + addDef("desktop", "-d", "--desktops") + func (n *Query) parse(msg *sock.Msg) (bool, error) { if !msg.HasNext() { return false, &copies.ErrMissingArguments{} } arg := msg.Next() switch arg { - case "--desktop", "-d": - case "--desktops", "-D": + case "--desktop", "-d", "--desktops", "-D": return n.readCommand(msg, "desktops") - case "--monitor", "-m": - case "--monitors", "-M": + case "--monitor", "-m", "--monitors", "-M": return n.readCommand(msg, "monitors") case "--names": n.UseNames = true - case "--node", "-n": - case "--nodes", "-N": + case "--node", "-n", "--nodes", "-N": return n.readCommand(msg, "nodes") case "--tree", "-T": return n.readCommand(msg, "tree") diff --git a/src/handler/domains/wm.go b/src/handler/domains/wm.go index 7919411..ec95ec7 100644 --- a/src/handler/domains/wm.go +++ b/src/handler/domains/wm.go @@ -29,7 +29,14 @@ func (n *Wm) Run(msg *sock.Msg) ([]byte, error) { } } - return nil, nil + switch n.Command { + default: + return nil, &copies.ErrTODO{ + Kind: "command", + Name: n.Command, + } + } + } func (n *Wm) parse(msg *sock.Msg) (bool, error) { @@ -38,21 +45,23 @@ func (n *Wm) parse(msg *sock.Msg) (bool, error) { } arg := msg.Next() switch arg { - case "--desktop", "-d": - case "--desktops", "-D": - return n.readCommand(msg, "desktops") - case "--monitor", "-m": - case "--monitors", "-M": - return n.readCommand(msg, "monitors") - case "--names": - n.UseNames = true - case "--node", "-n": - case "--nodes", "-N": - return n.readCommand(msg, "nodes") - case "--tree", "-T": - return n.readCommand(msg, "tree") + case "--add-monitor", "-a": + return n.readCommand(msg, "add-monitor") + case "--adopt-orphans", "-o": + return n.readCommand(msg, "adopt-orphans") + case "--dump-state", "-d": + return n.readCommand(msg, "dump-state") + case "--get-status", "-g": + return n.readCommand(msg, "get-status") + case "--load-state", "-l": + return n.readCommand(msg, "load-state") + case "--record-history", "-h": + return n.readCommand(msg, "record-history") + case "--reorder-monitors", "-O": + return n.readCommand(msg, "reorder-monitors") + case "--restart", "-r": + return n.readCommand(msg, "restart") default: return false, fmt.Errorf(`unknown option: '%s'`, arg) } - return msg.HasNext(), nil }