Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Window switcher for sway ('rofi -show window' clone)
#!/usr/bin/env bash
set -euo pipefail
tree=$(swaymsg -t get_tree)
readarray -t win_ids <<< "$(jq -r '.. | objects | select(has("app_id")) | .id' <<< "$tree")"
readarray -t win_names <<< "$(jq -r '.. | objects | select(has("app_id")) | .name' <<< "$tree")"
readarray -t win_types <<< "$(jq -r '.. | objects | select(has("app_id")) | .app_id // .window_properties.class' <<< "$tree")"
switch () {
local k
read -r k
swaymsg "[con_id=${win_ids[$k]}] focus"
}
for k in $(seq 0 $((${#win_ids[@]} - 1))); do
echo -e "<span weight=\"bold\">${win_types[$k]}</span> - ${win_names[$k]}"
done | rofi -dmenu -markup-rows -i -p window -format i | switch
@bellecp
Copy link

bellecp commented May 27, 2022

Very nice. I made a few modifications in order to

  • show icons with rofi -show-icons
  • perform only one call to jq to remove latency.

The window id is encoded inside the strings passed to rofi hidden inside an html comment, for instace <!-- 264 -->, and retrieved later on using sed.

#!/usr/bin/env bash
# Based on https://gist.github.com/lbonn/89d064cde963cfbacabd77e0d3801398 
#
# In order to have meaningful window names for terminals, use

# inside .vimrc:
# set title

# inside .bashrc:
# export PROMPT_COMMAND='echo -en "\033]0; $("pwd")  \a"'

row=$(swaymsg -t get_tree | jq  -r '
    ..
    | objects
    | select(.type == "workspace") as $ws
    | ..
    | objects
    | select(has("app_id"))
    | (if .focused == true then "*" else " " end) as $asterisk
    | "[\($ws.name)] \($asterisk) <span weight=\"bold\">\(.app_id)</span>  - \(.name) <!-- \(.id) -->\u0000icon\u001f\(.app_id)"' \
| sed 's/&/&amp;/g' \
| rofi -dmenu -show-icons -markup-rows)

if [ ! -z "$row" ]
then
    winid=$(echo "$row" | sed 's/.*<!-- \([0-9]*\) -->.*/\1/')
    swaymsg "[con_id=$winid] focus"
fi

@anarcat
Copy link

anarcat commented Nov 24, 2022

... and i rewrote this so it works with fuzzel, which involved (unfortunately) removing the fancy pango markup, but it should work with anything that supports dmenu now (as long as it also supports rofi's icon system):

https://gitlab.com/anarcat/scripts/-/blob/main/sway-window-menu

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment