#!/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>. If the first workspace 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 exit 1 } 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 usage 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