Skip to content

Instantly share code, notes, and snippets.

@nl0x
Created October 5, 2012 16:17
Show Gist options
  • Save nl0x/3840785 to your computer and use it in GitHub Desktop.
Save nl0x/3840785 to your computer and use it in GitHub Desktop.
Automatically select screen
#!/bin/bash
# Usage: scr [local|external|clone]
# (no option) → try external, else local
# local → local display
# external → external + local if closed, else external only
# clone → same content, local display scaled to fit external
export DISPLAY=`ck-list-sessions|grep 'x11-display = '|sed "s/.*\(:[0-9]\)'/\1/"`
LOCAL=LVDS1
WIDTH=
HEIGHT=
screensize () {
splitsize `xrandr -q --current|grep "^$1" -A1|tail -n1|sed "s/\([0-9]\+\)x\([0-9]\+\).*/\1x\2/"`
}
splitsize () {
WIDTH=`echo $1|cut -dx -f1`
HEIGHT=`echo $1|cut -dx -f2`
}
# figure out whether an external monitor is connected
EXTERNAL=`xrandr --current|grep ' connected'|cut -d' ' -f1|grep -v $LOCAL|head -n1`
SCALE='1x1'
if test -n "$EXTERNAL"; then
MODE=external
cat /proc/acpi/button/lid/LID/state | grep -q closed && MODE=external-only
screensize $LOCAL
w1=$WIDTH
h1=$HEIGHT
screensize $EXTERNAL
w2=$WIDTH
h2=$HEIGHT
SCALE=`echo "s1=$w2/$w1;s2=$h2/$h1;if(s1>s2) s1 else s2"|bc -l`
SCALEX=`echo "$w2/$w1"|bc -l`
SCALEY=`echo "$h2/$h1"|bc -l`
else
# no external output connected
MODE=local
fi
case $1 in
external)
if test -n "$EXTERNAL";then
MODE=external
else
echo "No external screen found."
exit 1
fi
;;
clone)
if test -n "$EXTERNAL";then
MODE=clone
else
echo "No external screen found."
exit 1
fi
;;
local)
MODE=local
esac
case $MODE in
external-only)
xrandr --output $LOCAL --off --output $EXTERNAL --auto --scale 1x1
;;
external)
xrandr --output $LOCAL --auto --scale 1x1 --output $EXTERNAL --auto --scale 1x1 --left-of $LOCAL
;;
clone)
xrandr --output $LOCAL --auto --scale ${SCALEX}x${SCALEY} --output $EXTERNAL --auto --same-as $LOCAL
;;
local)
xrandr --output $LOCAL --auto --scale 1x1 --output VGA1 --off --output HDMI1 --off --output DP1 --off --output DP2 --off --output DP3 --off
;;
esac
xrefresh
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment