Skip to content

Instantly share code, notes, and snippets.

@nathanielevan
Created March 24, 2021 08:04
Show Gist options
  • Save nathanielevan/48d4dd4c3a6b4e90544c98a376925045 to your computer and use it in GitHub Desktop.
Save nathanielevan/48d4dd4c3a6b4e90544c98a376925045 to your computer and use it in GitHub Desktop.
Shell script for switching monitors with dmenu and xrandr
#!/bin/sh
xrandroutput=$(xrandr -q)
monitors=$(echo "$xrandroutput" | grep "connected" | awk '{ print $1 }')
activemonitors=$(echo "$xrandroutput" | grep " connected " | awk '{ print $1 }')
numofactivemonitors=$(echo "$activemonitors" | wc -l)
options="single\nmanual" && [ "$numofactivemonitors" -gt 1 ] && options="single\nextend\nduplicate\nmanual"
monitorsingle() {
monitorto=$(echo "$activemonitors" | dmenu -r -p "select monitor:") &&
chooseres=$(echo "$xrandroutput" | awk -v monitor="$monitorto" '/connected/{p=0} p{print $1} $0 ~ monitor{p=1}' | dmenu -r -p "select resolution:") &&
xrandr --output "$monitorto" --primary --mode "$chooseres" $(echo "$monitors" | grep -v "$monitorto" | awk '{print "--output", $1, "--off"}' | paste -sd ' ' -) &&
feh --bg-fill --no-fehbg ~/.config/wallpapers/wallpaper.jpg
}
monitorduplicate() {
monitorone=$(echo "$activemonitors" | dmenu -r -p "select 1st monitor:") &&
monitortwo=$(echo "$activemonitors" | grep -v "$monitorone" | dmenu -r -p "select 2nd monitor:") &&
oneres=$(echo "$xrandroutput" | awk -v monitor="$monitorone" '/connected/{p=0} p{print $1} $0 ~ monitor{p=1}') &&
twores=$(echo "$xrandroutput" | awk -v monitor="$monitortwo" '/connected/{p=0} p{print $1} $0 ~ monitor{p=1}') &&
chooseres=$(echo "$twores" | grep -F -x "$oneres" | dmenu -r -p "select resolution:") &&
xrandr --output "$monitorone" --primary --mode "$chooseres" --output "$monitortwo" --mode "$chooseres" --same-as "$monitorone" $(echo "$monitors" | grep -v -e "$monitorone" -e "$monitortwo" | awk '{print "--output", $1, "--off"}' | paste -sd ' ' -) &&
feh --bg-fill --no-fehbg ~/.config/wallpapers/wallpaper.jpg
}
monitorextend() {
monitorone=$(echo "$activemonitors" | dmenu -r -p "select 1st monitor:") &&
oneres=$(echo "$xrandroutput" | awk -v monitor="$monitorone" '/connected/{p=0} p{print $1} $0 ~ monitor{p=1}' | dmenu -r -p "select 1st monitor resolution:") &&
monitortwo=$(echo "$activemonitors" | grep -v "$monitorone" | dmenu -r -p "select 2nd monitor:") &&
twores=$(echo "$xrandroutput" | awk -v monitor="$monitortwo" '/connected/{p=0} p{print $1} $0 ~ monitor{p=1}' | dmenu -r -p "select 2nd monitor resolution:") &&
dir=$(echo -e "left\nright\nabove\nbelow" | dmenu -r -p "position to 1st monitor:") &&
xrandr --output "$monitorone" --primary --mode "$oneres" --output "$monitortwo" --mode "$twores" --"$dir"$([ "$dir" = "left" ] || [ "$dir" = "right" ] && echo "-of") "$monitorone" $(echo "$monitors" | grep -v -e "$monitorone" -e "$monitortwo" | awk '{print "--output", $1, "--off"}' | paste -sd ' ' -) &&
feh --bg-fill --no-fehbg ~/.config/wallpapers/wallpaper.jpg
}
option=$(echo -e "$options" | dmenu -r -p "display mode:")
case "$option" in
single)
monitorsingle ;;
extend)
monitorextend ;;
duplicate)
monitorduplicate ;;
manual)
arandr ; exit ;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment