#!/usr/bin/env bash PID=$$ get_mode() { swaymsg -t get_outputs -r | jq ".[$1].modes[0]" } get_name() { swaymsg -t get_outputs -r | jq -r ".[$1].name" } get_width() { get_mode "$1" | jq ".width" } get_height() { get_mode "$1" | jq ".width" } get_refresh() { get_mode "$1" | jq ".refresh" | rev | cut -c 4- | rev } get_placement() { # $1 - monitor placement # $2 - monitor index compared # $3 - monitor compared scale WIDTH="$(jq -n "$(get_width $2)/$3" | awk -F. '{print $1}')" case $1 in "NONE") echo "0 0" ;; "RIGHT") echo "$WIDTH 0" ;; *) echo "0 0" ;; esac } update() { # $1 - monitor index # $2 - monitor scale # $3 - monitor placement # $4 - monitor index compared # $5 - monitor compared scale swaymsg output "$(get_name $1)" "enable" swaymsg output "$(get_name $1)" resolution "$(get_width $1)x$(get_height $1)@$(get_refresh $1)hz" scale $2 position "$(get_placement $3 $4 $5)" } off() { swaymsg output "$(get_name $1)" "disable" } get_id() { i=0 while true; do NAME="$(get_name $i)" if [ $(echo "$NAME" | grep "^$1") ]; then echo "$i" return 0 elif [ "$NAME" == "null" ]; then return 1 fi ((i=i+1)) done } die() { notify-send -u critical -t 3000 "Sway" "$1" kill $PID } PRIMARY=$(get_id "eDP-1" || die "Failed to get primary display") EXTERNAL=$(get_id "DP" || get_id "HDMI" || die "Failed to get external display") PRIMARY_SCALE=$2 EXTERNAL_SCALE=1 set_monitors() { update $EXTERNAL $EXTERNAL_SCALE $1 $PRIMARY $PRIMARY_SCALE update $PRIMARY $PRIMARY_SCALE $2 $EXTERNAL $EXTERNAL_SCALE } set_left() { set_monitors "NONE" "RIGHT" } set_right() { set_monitors "RIGHT" "NONE" } set_primary_only() { set_monitors "NONE" "NONE" off $EXTERNAL } set_external_only() { set_monitors "NONE" "NONE" off $PRIMARY } case $1 in "LEFT") set_left notify-send -t 3000 "Sway" "External display set to left aligned" ;; "RIGHT") set_right notify-send -t 3000 "Sway" "External display set to right aligned" ;; "PRIMARY_ONLY") set_primary_only notify-send -t 3000 "Sway" "Set to primary display only" ;; "EXTERNAL_ONLY") set_external_only notify-send -t 3000 "Sway" "Set to external display only" ;; esac