#!/bin/bash

# if xorg hasn't been configured yet, use simple driver detection
driver=vesa
for device in /sys/bus/pci/devices/*
do
	if [ "$(cat $device/class)" = "0x030000" ]
	then
		case "$(cat $device/vendor)" in
		0x1002)
			driver=ati
			;;
		0x1013)
			driver=cirrus
			;;
		0x102b)
			driver=mga
			;;
		0x1039)
			driver=sis
			;;
		0x10de)
			driver=nvidia
			;;
		0x1106)
			driver=via
			;;
		0x12d2)
			driver=nv
			;;
		0x15ad)
			driver=vmware
			;;
		0x8086)
			case "$(cat $device/device)" in
			0x7800)
				driver=i740
				;;
			*)
				driver=intel
				;;
			esac
			;;
		esac
		break
	fi
done

if cmp -s /etc/X11/xorg.conf /usr/share/doc/xorg-server/xorg.conf-paldo
then
	sed -i -e "s/vesa/$driver/" /etc/X11/xorg.conf
	if [ "$driver" = "vmware" ]
	then
		sed -i -e 's/"mouse"/"vmmouse"/' /etc/X11/xorg.conf
	fi
	
	if grep -qi synaptics /proc/bus/input/devices
	then
		# add touchpad configuration
		cat >> /etc/X11/xorg.conf << EOF

Section "InputDevice"
	Driver "synaptics"
	Identifier "Touchpad0"
	Option "Device" "/dev/psaux"
	Option "Protocol" "auto-dev"
EndSection

EOF

		# enable touchpad
		sed -i -e 's/InputDevice "Mouse0".*$/&\n\tInputDevice "Touchpad0" "SendCoreEvents"/' /etc/X11/xorg.conf
	fi
fi	

# now switch to desired gl implementation

function clean_config ()
{
	rm -f /usr/lib/lib{GL,GLcore}.so*
	rm -f /usr/lib/xorg/modules/extensions/lib{glx,GLcore}.so*
}

function mesa_config ()
{
	ln -sf libGL.so.1 /usr/lib/libGL.so
	ln -sf mesa/libGL.so.1 /usr/lib/libGL.so.1
}

function mesa_glx_config ()
{
	ln -sf mesa/libglx.so /usr/lib/xorg/modules/extensions/libglx.so
	ln -sf mesa/libGLcore.so /usr/lib/xorg/modules/extensions/libGLcore.so
}

function nvidia_config ()
{
	ln -sf libGL.so.1 /usr/lib/libGL.so
	ln -sf nvidia-glx/libGL.so.1 /usr/lib/libGL.so.1
}

function nvidia_glx_config ()
{
	ln -sf libGLcore.so.1 /usr/lib/libGLcore.so
	ln -sf nvidia-glx/libGLcore.so.1 /usr/lib/libGLcore.so.1
	ln -sf nvidia-glx/libglx.so /usr/lib/xorg/modules/extensions/libglx.so
}

function fglrx_config ()
{
	ln -sf libGL.so.1 /usr/lib/libGL.so
	ln -sf fglrx/libGL.so.1 /usr/lib/libGL.so.1
}

[ ! -e /etc/default/x-window-system ] || . /etc/default/x-window-system

[ -e /usr/bin/Xgl ] || USE_XGL=FALSE

XGL_OPTS=

for config in "$XORGCONFIG" "/etc/X11/$XORGCONFIG" /etc/X11/xorg.conf
do
	if [ -f "$config" ]
	then
		clean_config
	
		if [ -e /usr/lib/nvidia-glx/libGL.so.1 ] && grep -qi '[[:space:]]*Driver[[:space:]]\+"nvidia"' $config
		then
			# reenable previously disabled RenderAccel as
			# current driver is compatible with Xorg 7.1
			sed -i -e '/RenderAccel/d' $config
		
			[ "$USE_XGL" != "AUTO" ] || USE_XGL=TRUE
			if [ "$USE_XGL" = "TRUE" ]
			then
				# Xgl clients need Mesa
				mesa_config
				# Xgl server needs NVIDIA
				export LD_LIBRARY_PATH=/usr/lib/nvidia-glx
				XGL_OPTS="-lines -accel glx:pbuffer -accel xv:fbo"
			else
				nvidia_config
			fi
			nvidia_glx_config
		elif [ -e /usr/lib/fglrx/libGL.so.1 ] && grep -qi '[[:space:]]*Driver[[:space:]]\+"fglrx"' $config
		then
			if [ "$USE_XGL" = "TRUE" ]
			then
				# Xgl clients need Mesa
				mesa_config
				# Xgl server needs fglrx
				export LD_LIBRARY_PATH=/usr/lib/fglrx
				XGL_OPTS="-accel glx:pbuffer -accel xv:pbuffer"
			else
				fglrx_config
			fi
			mesa_glx_config
		else
			mesa_config
			mesa_glx_config
		fi
	
		break
	fi
done

if [ "$USE_XGL" = "TRUE" ]
then
	exec /usr/bin/Xgl $XGL_OPTS "$@"
else
	exec /usr/bin/Xorg "$@"
fi
