wmctrl - automation
Isolated Commands
| Description | Usage | Verification |
| Gets current workspace | current_workspace=$(wmctrl -d | awk '$2 ~/\*/' | awk '{print $1}') | echo $current_workspace |
| Gets windows on curr workspace | windows_on_current_workspace=$(wmctrl -l | awk -v curr="$current_workspace" '$2 == curr { print $0 }') | echo $windows_on_current_workspace |
| ^ + window geometry | windows_on_current_workspace_with_geometry=$(wmctrl -l -G | awk -v curr="$current_workspace" '$2 == curr { print $0 }') | echo $windows_on_current_workspace_with_geometry |
| Get window ID based on window title | window_title_regex="Firefox" window_id=$(wmctrl -l | awk -v curr="$current_workspace" '$2 == curr {print $0}' | awk -v regex=$window_title_regex '$0 ~ regex' | awk '{print $1}') | echo $window_id |
| Removes max properties from $window_id | wmctrl -i -r $window_id -b remove,maximized_vert,maximized_horz | |
| Move window to coordinates (gravity, x, y, width, height) | wmctrl -i -r $window_id -e 1,0,0,400,400 | |
| Maximize window | wmctrl -i -r $window_id -b add,maximized_vert,maximized_horz | |
| Select window by ID | wmctrl -i -a $window_id | |
| Move to workspace "2" (0 indexed) | wmctrl -s 2 | |
| Switch to workspace above current workspace | wmctrl -s $((current_workspace-1)) |
Window ID Acquisition
# Note that the latter commands rely on the former
current_workspace=$(wmctrl -d | awk '$2 ~/\*/' | awk '{print $1}')
echo $current_workspace
windows_on_current_workspace=$(wmctrl -l | awk -v curr="$current_workspace" '$2 == curr { print $0 }')
echo $windows_on_current_workspace
# Note that some x,y coordinates will be completely inaccurate
windows_on_current_workspace_with_geometry=$(wmctrl -l -G | awk -v curr="$current_workspace" '$2 == curr { print $0 }')
echo $windows_on_current_workspace_with_geometry
# get window id on specific workspace by matching against the windows title
# note that this will not stop after one match, it will grab all that match
window_title_regex="Firefox"
window_id=$(wmctrl -l | awk -v curr="$current_workspace" '$2 == curr {print $0}' | awk -v regex=$window_title_regex '$0 ~ regex' | awk '{print $1}')
Move window by ID
# first acquire an id using methods in 'Window ID acquisition'
# before we can move the window we need to remove maximized properties
wmctrl -i -r $window_id -b remove,maximized_vert,maximized_horz
# coords are gravity, x, y, width, height
wmctrl -i -r $window_id -e 1,0,0,400,400
# If you want to maximize the window
# First move window to desired screen
wmctrl -i -r $window_id -b remove,maximized_vert,maximized_horz
wmctrl -i -r $window_id -e 0,0,0,500,500
# Then maximize window on screen
wmctrl -i -r $window_id -b add,maximized_vert,maximized_horz
Select Window By ID
wmctrl -i -a $window_id
# -i ; Interpret window arguments (<WIN>) as a numeric value rather
than a string name for the window.
# -a ; Select window and give it focus
Switch Workspaces
# Switch to specific workspace (3rd workspace)
wmctrl -s 2
# Get the current workspace
current_workspace=$(wmctrl -d | awk '$2 ~/\*/' | awk '{print $1}')
echo $current_workspace
# Switch to workspace above your current workspace
wmctrl -s $((current_workspace-1))
# Switch to workspace below your current workspace
wmctrl -s $((current_workspace+1))