#!/bin/bash # Script found at http://www.thinkwiki.org/wiki/Sample_Fn-F7_script # # External output may be "VGA" or "VGA-0" or "DVI-0" EXTERNAL_OUTPUT="VGA" INTERNAL_OUTPUT="LVDS" EXTERNAL_LOCATION="right" # Figure out which user and X11 display to work on # TODO there has to be a better way to do this? X_USER=$(w -h -s | grep ":[0-9]\W" | head -1 | awk '{print $1}') export DISPLAY=$(w -h -s | grep ":[0-9]\W" | head -1 | awk '{print $3}') # Switch to X user if necessary if [ "$X_USER" != "$USER" ]; then SU="su $X_USER -c" else SU="" fi case "$EXTERNAL_LOCATION" in left|LEFT) EXTERNAL_LOCATION="--left-of $INTERNAL_OUTPUT" ;; right|RIGHT) EXTERNAL_LOCATION="--right-of $INTERNAL_OUTPUT" ;; top|TOP|above|ABOVE) EXTERNAL_LOCATION="--above $INTERNAL_OUTPUT" ;; bottom|BOTTOM|below|BELOW) EXTERNAL_LOCATION="--below $INTERNAL_OUTPUT" ;; *) EXTERNAL_LOCATION="--left-of $INTERNAL_OUTPUT" ;; esac # Figure out current state INTERNAL_STATE=$($SU xrandr | grep ^$INTERNAL_OUTPUT | grep con | sed "s/.*connected //" | sed "s/(.*//") EXTERNAL_STATE=$($SU xrandr | grep ^$EXTERNAL_OUTPUT | grep con | sed "s/.*connected //" | sed "s/(.*//") if [ -z "$INTERNAL_STATE" ]; then STATE="external" elif [ -z "$EXTERNAL_STATE" ]; then STATE="internal" else INTERNAL_STATE=$(echo $INTERNAL_STATE | sed "s/[0-9]*x[0-9]*//") EXTERNAL_STATE=$(echo $EXTERNAL_STATE | sed "s/[0-9]*x[0-9]*//") if [ "$INTERNAL_STATE" = "$EXTERNAL_STATE" ]; then STATE="mirror" else STATE="both" fi fi function screen_external(){ [ -n "$SU" ] && $SU "xrandr --output $INTERNAL_OUTPUT --off" || xrandr --output $INTERNAL_OUTPUT --off [ -n "$SU" ] && $SU "xrandr --output $EXTERNAL_OUTPUT --auto" || xrandr --output $EXTERNAL_OUTPUT --auto } function screen_internal(){ [ -n "$SU" ] && $SU "xrandr --output $EXTERNAL_OUTPUT --off" || xrandr --output $EXTERNAL_OUTPUT --off [ -n "$SU" ] && $SU "xrandr --output $INTERNAL_OUTPUT --auto" || xrandr --output $INTERNAL_OUTPUT --auto } function screen_mirror(){ [ -n "$SU" ] && $SU "xrandr --output $INTERNAL_OUTPUT --auto" || xrandr --output $INTERNAL_OUTPUT --auto [ -n "$SU" ] && $SU "xrandr --output $EXTERNAL_OUTPUT --auto --same-as $INTERNAL_OUTPUT" || xrandr --output $EXTERNAL_OUTPUT --auto --same-as $INTERNAL_OUTPUT } function screen_both(){ [ -n "$SU" ] && $SU "xrandr --output $INTERNAL_OUTPUT --auto" || xrandr --output $INTERNAL_OUTPUT --auto [ -n "$SU" ] && $SU "xrandr --output $EXTERNAL_OUTPUT --auto $EXTERNAL_LOCATION" || xrandr --output $EXTERNAL_OUTPUT --auto $EXTERNAL_LOCATION } function screen_toggle(){ case "$STATE" in internal) screen_mirror ;; mirror) screen_external ;; external) screen_both ;; both) screen_internal ;; *) screen_internal ;; esac } # What should we do? DO="$1" if [ -z "$DO" ]; then if [ $(basename $0) = "switch_video.sh" ]; then DO="toggle" fi fi case "$DO" in toggle) screen_toggle ;; internal) screen_internal ;; external) screen_external ;; mirror) screen_mirror ;; both) screen_both ;; status) echo "Current Fn-F7 state is: $STATE" echo echo "Attached monitors:" $SU xrandr | grep "\Wconnected" | sed "s/^/ /" ;; *) echo "usage: $0 " >&2 echo >&2 echo " commands:" >&2 echo " status" >&2 echo " internal" >&2 echo " external" >&2 echo " mirror" >&2 echo " both" >&2 echo " toggle" >&2 echo >&2 ;; esac