commit a984dfeb2bd1319e07d3a1a967d9a0b20a55f0e5 from: Matthias Schmidt date: Mon Jul 01 11:57:51 2013 UTC initial commit of dtoggle.sh commit - /dev/null commit + a984dfeb2bd1319e07d3a1a967d9a0b20a55f0e5 blob - /dev/null blob + a3d817e3e890ecd1232f5f23dea1d73d1b50470a (mode 644) --- /dev/null +++ README.md @@ -0,0 +1 @@ +Quick-n-dirty hack to use xrandr to configure internal/external displays blob - /dev/null blob + c1bce00035d7a19140741a5574d8b1fa52c07453 (mode 755) --- /dev/null +++ dtoogle.sh @@ -0,0 +1,168 @@ +#!/bin/bash + +# Quick-n-dirty script to turn external/internal displays on/off with xrandr +# +# 2013 by Matthias Schmidt +# +# License GNU GPL + +# ----------------------------------------------------------------------- +# Add your own additional options for xrandr here +# ----------------------------------------------------------------------- +XRANDROPTS="--dryrun" +# ----------------------------------------------------------------------- + + +function choose_profile() +{ + local PROFILE=$1 + + case "$PROFILE" in + # Home profile: Internal on, external extended + home) + INTERN="LVDS1" + EXTERN[0]="HDMI1" + ;; + # Work profile: Internal off, both external displays on + work) + INTERN="LVDS1" + EXTERN[0]="HDMI3" + EXTERN[1]="HDMI2" + ;; + # Projector profile: Internal on, external VGA extended + vga) + INTERN="LVDS1" + EXTERN[0]="VGA1" + ;; + # ----------------------------------------------------------------------- + # Add your own profiles here. + # ----------------------------------------------------------------------- + # name) + # INTERN="LVDS1" + # EXTERN[0]="VGA1" + # ... + # ;; + # ----------------------------------------------------------------------- + *) + usage + echo "ERROR: Profile not found" + exit 1 + ;; + esac + + # Only enable the internal display + if [ $IFLAG -eq 1 ]; then + build_xrandr_string "--auto" "--off" + # Clone screen on all displays + elif [ $CFLAG -eq 1 ]; then + RES=`xrandr -q | egrep "^ *[0-9]*x[0-9]*" | awk {'print $1'} | sort -g -r | uniq -d | head -1` + build_xrandr_string "--mode $RES" "--same-as $INTERN" + # Turn internal display off + elif [ $EFLAG -eq 1 ]; then + build_xrandr_string "--off" "--auto" "--left-of" + # Internal on and extend screen on all displays by default + else + build_xrandr_string "--auto" "--auto" + fi +} + +function build_xrandr_string() +{ + local DOINTERN=$1 + local DOEXTERN=$2 + local POSITION=$3 + + CMD="xrandr --output $INTERN $DOINTERN " + + CMDEXT= + i=0 + for d in ${EXTERN[*]}; do + if [ $CFLAG -eq 1 ]; then + CMDEXT="${CMDEXT} --output ${DOEXTERN} --mode ${RES}" + elif [ ! -z $POSITION ]; then + # xrandr --output $INTERN --auto --output $EXTERN --auto --right-of $INTERN + if [ $i -eq 0 ]; then + CMDEXT="${CMDEXT} --output $d ${DOEXTERN} ${POSITION} $INTERN" + else + CMDEXT="${CMDEXT} --output $d ${DOEXTERN} ${POSITION} ${EXTERN[i-1]}" + fi + else + CMDEXT="${CMDEXT} --output $d ${DOEXTERN} ${POSITION}" + fi + i=$(($i + 1)) + done + + CMD="$CMD $CMDEXT" + echo $CMD +} + +function run_xrandr() +{ + exec "$CMD XRANDROPTS" +} + +function usage() +{ + echo "$0 [-ceim] [-p profile]" + echo + echo " -c Clone screen on all displays" + echo " -e Enable external display(s) and disable internal" + echo " -i Enable only the internal display" + echo " -m Show all available modes" + echo + echo " -p profile Enable the specified profile" + echo + echo "DEFAULT: Extend screen to all displays" + echo +} + +CMD= +PROFILE= +INTERN= +RES= +EXTERN[0]= +EXTERN[1]= +EXTERN[2]= +EXTERN[3]= + +# Clone screen on all displays +CFLAG=0 +# Enable only external displays +EFLAG=0 +# Enable only the internal display +IFLAG=0 + +while getopts "ciemp:" opt; do + case $opt in + c) + CFLAG=1 + ;; + i) + IFLAG=1 + ;; + e) + EFLAG=1 + ;; + m) + exec xrandr -q + ;; + p) + [ ! -z "$OPTARG" ] && PROFILE=$OPTARG + ;; + *) + usage + exit 1 + ;; + esac +done + +if [ $((CFLAG + $IFLAG + $EFLAG)) -gt 1 ]; then + usage + echo "Please specify either -c or -e or -i" + exit 1 +fi + +choose_profile $PROFILE +run_xrandr + +exit $? \ No newline at end of file