#!/bin/bash
#
# Script to switch displays, e.g. by pressing Fn-F7 on Thinkpad Laptops.
# Uses aticonfig from the ATI fglrx driver for dynamic switching, and
# xrandr for resolution changing. OSD done with xosd.sh, which uses
# osd_cat from Xosd.
#
# Author: Armin Hornung  --  www.arminhornung.de
# Date: 2008-05-01
#
# Partly based on a display switching script from SuSE 10.1
# 

# path to xosd.sh, change to "echo" if not installed
xosd="/usr/local/bin/xosd.sh"

# path to xrandr
xrandr="/usr/bin/xrandr"

INTERNAL="lvds" # internal LCD of Laptop
EXTERNAL="crt1" # external monitor, CRT or TFT


# Determine X user, script usually runs as root:

getXuser() {
        user=`finger| grep -m1 ":$displaynum " | awk '{print $1}'`

        if [ x"$user" = x"" ]; then
                user=`finger| grep -m1 ":$displaynum" | awk '{print $1}'`
        fi
        if [ x"$user" != x"" ]; then
                userhome=`getent passwd $user | cut -d: -f6`
                export XAUTHORITY=$userhome/.Xauthority
        else
                export XAUTHORITY=""
        fi
}

for x in /tmp/.X11-unix/*; do
    displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
    getXuser
    if [ x"$XAUTHORITY" != x"" ]; then
        # extract current state
	export DISPLAY=":$displaynum"
	_enabled_monitors=`su $user -c "aticonfig --query-monitor | grep Enabled"`
	_connected_monitors=`su $user -c "aticonfig --query-monitor | grep Connected"`
    fi
done


# determine if internal is active
echo "${_enabled_monitors}" | grep $INTERNAL > /dev/null 2>&1 
if [ $? -eq 0 ]; then
  _internal_enabled=yes
else
  _internal_enabled=no
fi

# determine if external is connected 
# (LVDS always assumed to be connected)
echo "${_connected_monitors}" | grep $EXTERNAL > /dev/null 2>&1 
if [ $? -eq 0 ]; then
  _external_connected=yes
else
  _external_connected=no
fi

# determine if external is active
_external_enabled=no
echo "${_enabled_monitors}" | grep $EXTERNAL > /dev/null 2>&1 
if [ $? -eq 0 ]; then
  _external_enabled=yes
fi


#### display switching part ####

if [ "${_internal_enabled}" = "yes" ]; then
  if [ "${_external_connected}" = "yes" ]; then
    if [ "${_external_enabled}" = "yes" ]; then
      # switch to external only, after both enabled:
      $xosd "Enabling $EXTERNAL" &
      su $user -c "aticonfig --enable-monitor $EXTERNAL"
      # adjust resolution back to standard:
      $xrandr -s 1280x1024 -r 60
    else
      # switch to both enabled, after external only
      $xosd "Enabling $INTERNAL & $EXTERNAL" &
      su $user -c "aticonfig --enable-monitor $INTERNAL,$EXTERNAL"
      # adjust resolution:
      $xrandr -s 1280x1024 -r 60
    fi
  else
    $xosd "No external display connected" &
    if [ "${_external_enabled}" = "yes" ]; then
      # switch back just if external display got disconnected
      su $user -c "aticonfig --enable-monitor $INTERNAL"
      $xrandr -s 1400x1050 -r 60
    fi
  fi
else
  # switch back to internal only, after external enabled:
  $xosd "Enabling $INTERNAL" &
  su $user -c "aticonfig --enable-monitor $INTERNAL"
  # adjust resolution back to standard:
  $xrandr -s 1400x1050 -r 60
fi

exit 0

