summaryrefslogtreecommitdiff
path: root/.i3/scripts/workspaces.py
blob: 4c0ec87ae09282af06d33504fe9f0b8020d12ae9 (plain)
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
#!/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)