1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
#!/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
from functools import partial
DEFAULT = "switch"
switch = i3.workspace
move = partial(i3.move, "container to workspace")
def new_ws(cmd):
"""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:
cmd(str(i))
break
else:
cmd(str(i+1))
def to_ws(cmd, prompt):
"""Use `dmenu` to switch or move to a workspace."""
ws = sorted(w["name"] for w in i3.get_workspaces())
try:
sel = (sh.dmenu("-b", _in = "\n".join(ws), p=prompt).strip() or None)
except sh.ErrorReturnCode:
sel = None
if sel is not None:
cmd(sel)
def rename(keep = False):
cur_ws = i3.filter(i3.get_workspaces(), focused = True)[0]
input = partial(sh.i3_input, P = "Rename workspace: ")
if keep and cur_ws["num"]:
input(F = ('rename workspace to "%d: %%s"' % cur_ws["num"]))
else:
input(F = 'rename workspace to "%s"')
if __name__ == "__main__":
try:
arg = sys.argv[1]
except IndexError:
arg = DEFAULT
if arg == "switch":
to_ws(switch, "Switch to:")
elif arg == "move":
to_ws(move, "Move to:")
elif arg == "new":
new_ws(switch)
elif arg == "move_new":
new_ws(move)
elif arg == "rename":
rename(False)
elif arg == "rename_num":
rename(True)
else:
print("Unknown arg: %s" % arg)
sys.exit(1)
|