Files
dots/config/sway/main/swayworkspace.py
T
2026-06-08 13:21:47 -05:00

82 lines
2.1 KiB
Python
Executable File

# implementation of swaysome in python
import sys
from dataclasses import dataclass
from swayipc import Swayipc, Output, Workspace
import pathlib
class SwaySome(Swayipc):
def __init__(self):
super().__init__()
def _cmd(self, cmd_str):
self.cmd(cmd_str)
def ordered_outputs(self):
outs = self.outputs()
outs.sort(key=lambda o: o.name)
return outs
def current_workspace(self):
outs = self.outputs()
wss = self.workspaces()
focused_output = next((o.name for o in outs if o.focused), None)
if not focused_output:
raise RuntimeError("No focused output")
for ws in wss:
if ws.visible and ws.output == focused_output:
return ws.num
raise RuntimeError("No active workspace found")
def group_base(self):
return (self.current_workspace() // 10) * 10
def resolve(self, n: int):
return self.group_base() + n
def focus(self, n: int):
self._cmd(f"workspace number {self.resolve(n)}")
def move(self, n: int):
self._cmd(f"move container to workspace number {self.resolve(n)}")
def focus_abs(self, n: int):
self._cmd(f"workspace number {n}")
def move_abs(self, n: int):
self._cmd(f"move container to workspace number {n}")
def init(self, n: int):
outputs = self.ordered_outputs()
current = next((o.name for o in outputs if o.focused), None)
for i, out in enumerate(outputs):
target = ((i + 1) * 10) + n
self._cmd(f"focus output {out.name}")
self._cmd(f"workspace number {target}")
if current:
self._cmd(f"focus output {current}")
def main():
cmd = sys.argv[1]
n = int(sys.argv[2])
sway = SwaySome()
if cmd == "focus":
sway.focus(n)
elif cmd == "move":
sway.move(n)
elif cmd == "focus-abs":
sway.focus_abs(n)
elif cmd == "move-abs":
sway.move_abs(n)
else:
print(f"Unknown command: {cmd}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()