Created
March 24, 2021 08:04
-
-
Save nathanielevan/48d4dd4c3a6b4e90544c98a376925045 to your computer and use it in GitHub Desktop.
Shell script for switching monitors with dmenu and xrandr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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