aboutsummaryrefslogtreecommitdiff
path: root/dotfiles/scripts/cycle-workspace-multiscreen.py
blob: 5e3d32a7cc8386165e34a5a21a77a5439960fe9b (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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/usr/bin/env python

# cycle-workspace-multiscreen
#   Moves the currently active workspace to the left/right/top/bottom active
#   display.
#   Depends on i3-py (`pip install i3-py`)
#   Because workspace name are fixed to a display, just rename workspace can
#   change workspace to another display.
#   So for the moment this script is tested and work if workspaces are fixed
#   to a display.

import i3
import sys

# figure out what is on, and what is currently on your screen.
workspace_origin = list(filter(lambda s: s['focused'], i3.get_workspaces()))[0]
outputs = list(filter(lambda s: s['active'], i3.get_outputs()))
output_origin = ""

for output in outputs:
    if output['current_workspace'] == workspace_origin['name']:
        output_origin = output

output_destination = workspace_origin

if sys.argv[1] == "right":
    output_origin_x = output_origin['rect']['x']
    output_origin_width = output_origin['rect']['width']
    next_workspace_start = output_origin_x + output_origin_width
    for output in outputs:
        if next_workspace_start == output['rect']['x']:
            output_destination = output

if sys.argv[1] == "left":
    output_origin_x = output_origin['rect']['x']
    output_origin_width = output_origin['rect']['width']
    next_workspace_start = output_origin_x - output_origin_width
    for output in outputs:
        next_workspace_start = output_origin_x - output['rect']['width']
        if next_workspace_start == output['rect']['x']:
            output_destination = output

if sys.argv[1] == "bottom":
    output_origin_y = output_origin['rect']['y']
    output_origin_height = output_origin['rect']['height']
    next_workspace_start = output_origin_y + output_origin_height
    output_origin_x = output_origin['rect']['x']
    for output in outputs:
        output_end = output['rect']['x'] + output['rect']['width']
        # FIXME: screen must have the same start x position and screen with not
        # the same resolution can by buggy
        if (next_workspace_start == output['rect']['y'] and
                output['rect']['x'] <= output_origin_x <= output_end):
            output_destination = output


if sys.argv[1] == "top":
    output_origin_y = output_origin['rect']['y']
    output_origin_height = output_origin['rect']['height']
    next_workspace_start = output_origin_y - output_origin_height
    output_origin_x = output_origin['rect']['x']
    for output in outputs:
        next_workspace_start = output_origin_y - output['rect']['height']
        output_end = output['rect']['x'] + output['rect']['width']
        # FIXME: screen must have the same start x position and screen with not
        # the same resolution can by buggy
        if (next_workspace_start == output['rect']['y'] and
                output['rect']['x'] <= output_origin_x <= output_end):
            output_destination = output


if (output_destination != workspace_origin):
    wrksp_orig = workspace_origin['name']
    wkrsp_dest = output_destination['current_workspace']
    # Move origin workspace to the correct screen
    i3.command('move', 'workspace to output '+output_destination['name'])
    # Rename origin workspace to temporary workspace of the screen destination
    cmd = f"workspace {wrksp_orig} to a_fucking_workspace"
    i3.command('rename', cmd)
    # Change focus to the workspace destination
    i3.workspace(output_destination['current_workspace'])
    # Move destination workspace to the correct screen
    i3.command('move', 'workspace to output '+workspace_origin['output'])
    # Rename workspace destination to the origin workspace
    cmd = f"workspace {wkrsp_dest} to {wrksp_orig}"
    i3.command('rename', cmd)
    # Rename temporary workspace to workspace destination
    cmd = f"workspace a_fucking_workspace to {wkrsp_dest}"
    i3.command('rename', cmd)
    # Change focus the workspace destination
    i3.workspace(output_destination['current_workspace'])