-
-
Save lbonn/89d064cde963cfbacabd77e0d3801398 to your computer and use it in GitHub Desktop.
@deafmute1
I like your additions. Is nice (though I modified it separately since I use awesome-font icons for the window switcher.
Is there a way to also make this display the icons of the actual application windows involved in rofi? I like this approach better than swayr for its simplicity, just trying to make it look prettier in rofu now... =]
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/&/&/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
... 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
Sometimes app_ids are not enough in my experience, and sometimes app_ids don't translate to icons.
I updated @bellecp's script to accommodate this:
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
| (
if .window_properties.class == "Spotify" then "spotify-client"
elif .window_properties.class == "LM Studio" then "lm-studio"
else .app_id // .window_properties.class // .name
end ) as $icon_name
| "[\($ws.name)] \($asterisk) <span weight=\"bold\">\(.app_id // .window_properties.class)</span> - \(.name) <!-- \(.id) -->\u0000icon\u001f\($icon_name)"
' |
sed 's/&/&/g' |
rofi -dmenu -show-icons -markup-rows -p "window")
if [ ! -z "$row" ]; then
winid=$(echo "$row" | sed 's/.*<!-- \([0-9]*\) -->.*/\1/')
swaymsg "[con_id=$winid] focus"
fi
There probably is a better way at detecting icons (rofi -show window) does a somewhat better job. I guess you might be able to map the app names to icons thorugh their .desktop files.
Great work, everyone! I've tested the solutions above. Since I use fuzzel, I came up with this approach to address the issue with icons and XWayland apps that don't have an app_id.
# Parse the Sway tree to generate a formatted list of windows for fuzzel.
selected_window=$( swaymsg -t get_tree | jq -r '
..
# Get workspaces and customize workspace names
| objects | select(.type == "workspace") as $workspace
| ( if $workspace.name == "__i3_scratch"
then "-" else $workspace.name end
) as $ws_name
| ..
# Get opened apps and set "focused" decoration
| objects | select(has("app_id"))
| (if .focused == true then "🟢" else "" end) as $selected
# Exclude apps from list
| select(.app_id == null or (.app_id | test("pavucontrol") | not))
# Manually set icons to fix cases where they are not displayed
| ( "vivaldi-pjibgclleladliembfgfagdaldikeohf-Default" ) as $spotify
| ( if .name != null and (.name | test("Spotify")) then $spotify
elif .app_id == "Firefox" then "firefox"
else .app_id // .window_properties.class // .name end
) as $icon
# Fix for displaying app_id when it is null
| ( if .app_id == null and (.name | test("Spotify")) then "Spotify"
else .name end
) as $app_id
# Set dmenu item format (keep the icon separated from the rest)
# Output ex: 📂 (101) [1] 🟢File Explorer
| "(\(.id)) [\($ws_name)] \($selected)\($app_id)" +
"\u0000icon\u001f\($icon)"' \
| fuzzel -d -w 50
)
# Focus the selected window.
if [ "$selected_window" != "" ]; then
window_id=$(echo "$selected_window" | sed 's/.*(\([[:digit:]]*\)).*/\1/')
swaymsg [con_id="$window_id"] focus
fi
I've also tried to improve the readability by adding comments to make the code easier to understand. Additionally, I published this version in my repository (sway-util-scripts/window_switcher.sh), referencing this gist and some other links I found online.
Cheers from Brazil!🇧🇷
Hi, I made a few changes to show the currently focused window with an asterick as well as the workspace of each window, If anyone stumbles across this and is interested.
This makes it a bit more similar to this script: https://github.com/wilecoyote2015/Swytch, but I much prefer your script to that one.