#!/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