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

current_workspace() {
	wmctrl -d | awk '{print $1" "$2}' | grep "*" | awk '{print $1}'
}

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() {
	cat <<-_EOF
	A program to move all windows from workspace <1> to workspace <2> and
	vice versa.

	If the first workspace number is not specified, current workspace is assumed.
	Workspace numbering starts with 0.

	This is useful when you want to reorder workspaces but your DE doesn't have such
	feature.

	Usage:
		$(basename "$0") [<1>] <2>

	Dependencies:
		wmctrl
	_EOF
}

FROM=$1
TO=$2

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

if [ -z "$TO" ]; then
	if [ -z "$FROM" ]; then
		echo "$USAGE"
		exit 1
	fi
	TO="$FROM"
	FROM=$(current_workspace)
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