wmctrl - automation

Isolated Commands

DescriptionUsageVerification
Gets current workspacecurrent_workspace=$(wmctrl -d | awk '$2 ~/\*/' | awk '{print $1}')echo $current_workspace
Gets windows on curr workspacewindows_on_current_workspace=$(wmctrl -l | awk -v curr="$current_workspace" '$2 == curr { print $0 }')echo $windows_on_current_workspace
^ + window geometrywindows_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 titlewindow_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_idwmctrl -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 windowwmctrl -i -r $window_id -b add,maximized_vert,maximized_horz
Select window by IDwmctrl -i -a $window_id
Move to workspace "2" (0 indexed)wmctrl -s 2
Switch to workspace above current workspacewmctrl -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))