#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright (C) René 'Necoro' Neumann # # Some helper functions for managing workspaces in i3. # import sys from os.path import realpath, dirname, join cwd = realpath(dirname(__file__)) sys.path.insert(1, join(cwd, "libs")) import i3 import sh DEFAULT = "switch" def ws_dmenu(**kw): """Call `dmenu` with the names of the current workspaces. Arguments are directly passed to `dmenu`. Returns the stripped output of dmenu or `None`.""" ws = sorted(w["name"] for w in i3.get_workspaces()) try: return sh.dmenu("-b", _in = "\n".join(ws), **kw).strip() or None except sh.ErrorReturnCode: return None def new_ws(): """Create a new workspace by using the first free number > 0.""" nums = (w["num"] for w in i3.get_workspaces()) nums = filter(lambda n: n is not None and n >= 0, nums) for i,n in enumerate(sorted(nums)): if i != n: i3.workspace(str(i)) break else: i3.workspace(str(i+1)) def switch_ws(): """Use `dmenu` to switch to a workspace.""" sel = ws_dmenu(p="Switch to:") if sel is not None: i3.workspace(sel) def move_to_ws(): """Use `dmenu` to move the current container to a workspace.""" sel = ws_dmenu(p="Move to:") if sel is not None: i3.move("container to workspace", sel) if __name__ == "__main__": try: arg = sys.argv[1] except IndexError: arg = DEFAULT if arg == "switch": switch_ws() elif arg == "move": move_to_ws() elif arg == "new": new_ws() else: print("Unknown arg: %s" % arg) sys.exit(1)