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
 | 
					# gopass prompt
 | 
				
			||||||
bindsym $mod+backslash exec $pass_menu
 | 
					bindsym $mod+backslash exec $pass_menu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bindsym $mod+semicolon exec $scripts/sws.sh --dmenu-cmd "rofi -dmenu"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# reload the configuration file
 | 
					# reload the configuration file
 | 
				
			||||||
bindsym $mod+Shift+c reload
 | 
					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