aboutsummaryrefslogtreecommitdiff
path: root/swap_workspaces
blob: f7c81856c97b598e874a6988b0302c52dcbebbaf (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
#!/bin/bash

workspace_exists() {
    wmctrl -d | awk '{print $1}' | grep -w -- "${1}"
}

workspace_windows() {
    wmctrl -l | {
        while IFS= read -r line; do
            local parts=($line)
            local id="${parts[@]:0:1}"
            local workspace=${parts[@]:1:1}
            if [[ "$workspace" != "$1" ]]; then
                continue
            fi
            echo "$id"
        done
    }
}

move_window() {
    wmctrl -i -r "$1" -t "$2"
}

USAGE="A program to move all windows from workspace <1> to workspace <2> and
vice versa.

This is useful when you want to reorder workspaces but your DE doesn't have such
feature (XFCE as an example).

Usage:
    $(basename "$0") <1> <2>
    
Dependencies:
    wmctrl"

FROM=$1
TO=$2

if [ ! -x "$(command -v wmctrl)" ]; then
    echo "Please make sure that wmctrl is installed."
    exit 1
fi

if [ -z "$FROM" ] || [ -z "$TO" ]; then 
    echo "$USAGE"
    exit 1
fi

if [ "$FROM" == "$TO" ]; then
    exit
fi

if [[ ! $(workspace_exists "$FROM") ]]; then
    echo "workspace $FROM not found"
    exit 1
elif [[ ! $(workspace_exists "$TO") ]]; then
    echo "workspace $TO not found"
    exit 1
fi

WINDOWS_FROM=($(workspace_windows "$FROM"))
WINDOWS_TO=($(workspace_windows "$TO"))

for id in "${WINDOWS_FROM[@]}"; do
    move_window "$id" "$TO"
done

for id in "${WINDOWS_TO[@]}"; do
    move_window "$id" "$FROM"
done