Added Window Switching tool for sway
This commit is contained in:
parent
94252d74b9
commit
fd66191bdf
|
@ -9,6 +9,8 @@ bindsym $mod+space exec $menu
|
|||
# gopass prompt
|
||||
bindsym $mod+backslash exec $pass_menu
|
||||
|
||||
bindsym $mod+semicolon exec $scripts/sws.sh --dmenu-cmd "rofi -dmenu"
|
||||
|
||||
# reload the configuration file
|
||||
bindsym $mod+Shift+c reload
|
||||
|
||||
|
|
133
sway/scripts/sws.sh
Executable file
133
sway/scripts/sws.sh
Executable file
|
@ -0,0 +1,133 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Author: Adrien Le Guillou
|
||||
# License: MIT
|
||||
set -e # error if a command as non 0 exit
|
||||
set -u # error if undefined variable
|
||||
|
||||
# Default parameters
|
||||
FORMAT="W:%W | %A - %T"
|
||||
DMENU="dmenu"
|
||||
|
||||
# Doc
|
||||
NAME="$(basename "$0")"
|
||||
VERSION="0.2"
|
||||
DESCRIPTION="Window switcher for Sway using dmenu"
|
||||
HELP="
|
||||
$NAME. $VERSION - $DESCRIPTION
|
||||
|
||||
Usage:
|
||||
$NAME [-f | --format <format>] [-d | --dmenu-cmd <command>]
|
||||
[-h | --help] [-v | --version]
|
||||
|
||||
Options:
|
||||
-d CMD, --dmenu-cmd CMD\t\t[default: \"dmenu\"]
|
||||
set the \`dmenu\` command to use (ex \"rofi -dmenu\")
|
||||
|
||||
-f FORMAT, --format FORMAT\t\t[default: \"$FORMAT\"]
|
||||
set the format for the window picker
|
||||
%O: Output (Display)
|
||||
%W: Workspace
|
||||
%A: Application
|
||||
%T: Window Title
|
||||
(window_id) is appended at the end to identify the window
|
||||
|
||||
-v, --version
|
||||
print version info and exit
|
||||
|
||||
-h, --help
|
||||
display this help and exit
|
||||
|
||||
Examples:
|
||||
# Default options work well if you have dmenu installed
|
||||
sws.sh
|
||||
|
||||
# Use a different dmenu provider
|
||||
sws.sh --dmenu-cmd \"wofi -d\"
|
||||
|
||||
# Add outputs name to the selector
|
||||
sws --format \"[%O] W:%W | %A - %T\"
|
||||
"
|
||||
|
||||
# Options parsing
|
||||
INVALID_ARGS=0
|
||||
OPTS=$(getopt -n $NAME -o f:d:hv \
|
||||
--long format:,dmenu-cmd:,help,version -- "$@") || INVALID_ARGS=1
|
||||
|
||||
# Exit with error and print $HELP if an invalid argument is passed
|
||||
# the previous command is allowed to fail for this purpose
|
||||
if [ "$INVALID_ARGS" -ne "0" ]
|
||||
then
|
||||
echo "$HELP"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Required for getopt parsing
|
||||
eval set -- "$OPTS"
|
||||
unset OPTS
|
||||
|
||||
while :
|
||||
do
|
||||
case "$1" in
|
||||
-f | --format)
|
||||
FORMAT=$2
|
||||
shift 2
|
||||
;;
|
||||
-d | --dmenu-cmd)
|
||||
DMENU=$2
|
||||
shift 2
|
||||
;;
|
||||
-h | --help)
|
||||
echo "$HELP"
|
||||
exit
|
||||
;;
|
||||
-v | --version)
|
||||
echo "Version $VERSION"
|
||||
exit
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
*)
|
||||
echo "$HELP"
|
||||
exit 1
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# FORMAT as a `jq` concatenation string
|
||||
FORMAT="$FORMAT (%I)"
|
||||
FORMAT=$(echo "$FORMAT" | \
|
||||
sed 's/%O/" + .output + "/
|
||||
s/%W/" + .workspace + "/
|
||||
s/%A/" + .app_id + "/
|
||||
s/%T/" + .name + "/
|
||||
s/%I/" + .id + "/
|
||||
s/"/\"/
|
||||
s/\(.*\)/\"\1\"/')
|
||||
|
||||
# Get the container ID from the node tree
|
||||
CON_ID=$(swaymsg -t get_tree | \
|
||||
jq -r ".nodes[]
|
||||
| {output: .name, content: .nodes[]}
|
||||
| {output: .output, workspace: .content.name,
|
||||
apps: .content
|
||||
| ..
|
||||
| {id: .id?|tostring, name: .name?, app_id: .app_id?, shell: .shell?}
|
||||
| select(.app_id != null or .shell != null)}
|
||||
| {output: .output, workspace: .workspace,
|
||||
id: .apps.id, app_id: .apps.app_id, name: .apps.name }
|
||||
| $FORMAT
|
||||
| tostring" | \
|
||||
$DMENU -i -p "Window Switcher")
|
||||
|
||||
# Requires the actual `id` to be at the end and between paretheses
|
||||
CON_ID=${CON_ID##*(}
|
||||
CON_ID=${CON_ID%)}
|
||||
|
||||
echo 2
|
||||
# Focus on the chosen window
|
||||
swaymsg [con_id=$CON_ID] focus
|
||||
|
Loading…
Reference in New Issue
Block a user