81 lines
2.1 KiB
Python
Executable File
81 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() |