2023-11-27 18:03:12 +00:00
|
|
|
#!/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)"
|
2023-11-27 19:30:09 +00:00
|
|
|
if [ $(echo "$NAME" | grep "^$1") ]; then
|
2023-11-27 18:03:12 +00:00
|
|
|
echo "$i"
|
2023-11-27 19:30:09 +00:00
|
|
|
return 0
|
2023-11-27 18:03:12 +00:00
|
|
|
elif [ "$NAME" == "null" ]; then
|
2023-11-27 19:30:09 +00:00
|
|
|
return 1
|
2023-11-27 18:03:12 +00:00
|
|
|
fi
|
|
|
|
((i=i+1))
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2023-11-27 19:30:09 +00:00
|
|
|
die() {
|
2023-11-29 00:27:28 +00:00
|
|
|
notify-send -u critical -t 3000 "Sway" "$1"
|
2023-11-27 19:30:09 +00:00
|
|
|
kill $PID
|
|
|
|
}
|
|
|
|
|
2023-11-29 00:27:28 +00:00
|
|
|
PRIMARY=$(get_id "eDP-1" || die "Failed to get primary display")
|
|
|
|
EXTERNAL=$(get_id "DP" || get_id "HDMI" || die "Failed to get external display")
|
2023-11-27 18:03:12 +00:00
|
|
|
|
2023-11-29 00:27:28 +00:00
|
|
|
PRIMARY_SCALE=$2
|
2023-11-27 18:03:12 +00:00
|
|
|
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
|