dmenu window switcher for i3
I use i3 as my window manager so I more or less always know which workspace programs run in. Switching to a program is therefore as simple as going to a specific workspace. However, sometimes I end up with a lot of windows scattered in various workspaces and scratchpad and it would be nice to have a quick way to bring a particular program into focus.
To do that, I put together a small shell script that finds all windows and pipes them to dmenu for user selection and I have a keybinding to conveniently invoke the script. I believe this functionality is available in rofi but I was looking for something more minimal (and I prefer dmenu over rofi). This is the script in its entirety:
#!/bin/env bash
set -e
windows=$(i3-msg -t get_tree | jq '.. | objects |
select(.window_type == "normal") |
{name: (.window_properties.class + ": " + .name), id: .id}')
selected_window=$(echo "$windows" | jq -r '.name' | dmenu)
export selected_window
window_id=$(echo "$windows" | jq 'select(.name==env.selected_window) | .id') && i3-msg "[con_id=$window_id] focus"
The only dependency is jq
to parse the i3 window tree in JSON.