diff --git a/sway/config.d/keybinds.config b/sway/config.d/keybinds.config index 2816dc8..9ea957f 100644 --- a/sway/config.d/keybinds.config +++ b/sway/config.d/keybinds.config @@ -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 diff --git a/sway/scripts/sws.sh b/sway/scripts/sws.sh new file mode 100755 index 0000000..d2d8955 --- /dev/null +++ b/sway/scripts/sws.sh @@ -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 ] [-d | --dmenu-cmd ] + [-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 +