#!/bin/bash # Input name from `swaymsg -t get_inputs` INPUTNAME="AT Translated Set 2 keyboard" ACTIVELAYOUT=$(swaymsg -t get_inputs | jq -r ".[] | select(.name==\"$INPUTNAME\") | .xkb_active_layout_name") mapfile -t AVAILABLELAYOUTS < <( swaymsg -t get_inputs | jq -r ".[] | select(.name==\"$INPUTNAME\") | .xkb_layout_names" | sed 's/[][,]//g' | sed 's/^ *//g' | grep -P '.') ACTIVEINDEX=0 for i in "${AVAILABLELAYOUTS[@]}"; do if [[ "$i" == '"'$ACTIVELAYOUT'"' ]]; then break else ((ACTIVEINDEX+=1)) fi done ACTION=bar if [ -n $1 ]; then ACTION=$1 fi if [[ $ACTION == 'osk' ]]; then FILE=/home/jpm/.local/state/onscreen-keyboard if [ -f $FILE ]; then rm $FILE busctl call --user sm.puri.OSK0 /sm/puri/OSK0 sm.puri.OSK0 SetVisible b false else touch $FILE busctl call --user sm.puri.OSK0 /sm/puri/OSK0 sm.puri.OSK0 SetVisible b true fi elif [[ $ACTION == 'layout' ]]; then # Simpler just to use 'next' to rotate input layouts #((ACTIVEINDEX+=1)) #if [[ $ACTIVEINDEX -eq ${#AVAILABLELAYOUTS[@]} ]]; then #ACTIVEINDEX=0 #fi #swaymsg input type:keyboard $ACTIVEINDEX swaymsg input type:keyboard xkb_switch_layout next $0 bar else SHORT=$(echo $ACTIVELAYOUT | sed -r 's/.*\(([[:alpha:]]*)\).*/\1/') if [[ $ACTIVEINDEX -ne 0 ]]; then echo '{"text": "⌨  '$SHORT'", "tooltip": "Rotate keyboard layout", "class": "alternate"}' else echo '{"text": "⌨  '$SHORT'", "tooltip": "Rotate keyboard layout", "class": "primary"}' fi fi