#!/bin/bash
# Copyright 2006 - SabayonLinux (Fabio Erculiani)
# Desktop Acceleration Helpers

echo "Working..."

# Constants
if [ -e "/usr/kde/3.4" ];then
    kdmdir="/usr/kde/3.4/share/config/kdm/"
elif [ -e "/usr/kde/3.5" ];then
    kdmdir="/usr/kde/3.5/share/config/kdm/"
fi
if [ -e "/sbin/lspci" ];then
    lspci="/sbin/lspci"
else
    lspci="/usr/sbin/lspci"
fi
beryl_tmpdir="/tmp/"
beryl_wrapper="beryl-wrapper.desktop"
beryl_manager="beryl-manager.desktop"
beryl_wrapper_desktop_file=$beryl_tmpdir$beryl_wrapper
beryl_manager_desktop_file=$beryl_tmpdir$beryl_manager
xorg_conf="/etc/X11/xorg.conf"
desktop_acceleration_helpers_config_file="/etc/desktop-acceleration-helpers.conf"

# Functions

write_acceleration_method() {
    sed -i 's/Acceleration=.*/Acceleration='$1'/' $desktop_acceleration_helpers_config_file
}

remove_beryl_wrapper_script() {
    sed -i '/.*beryl-wrapper.*$DESKTOP_SESSION/d' $kdmdir/Xsession
}

configure_kdm() {
    if [ "$1" == "xgl" ]; then
        xgl_nvidia=$($lspci | grep ' VGA ' | grep -i nvidia)
        xgl_ati=$($lspci | grep ' VGA ' | grep ATI)
        # Changing KDM configuration
	if [ -n "$xgl_nvidia" ]; then
	   sed -i 's/ServerCmd=.*/ServerCmd=\/usr\/bin\/Xgl -ac -accel glx:pbuffer -accel xv:fbo /' $kdmdir/kdmrc
        elif [ -n "$xgl_ati" ]; then
	   sed -i 's/ServerCmd=.*/ServerCmd=\/usr\/bin\/Xgl -ac -accel glx:pbuffer -accel xv:pbuffer /' $kdmdir/kdmrc
	else
	   sed -i 's/ServerCmd=.*/ServerCmd=\/usr\/bin\/Xgl -ac -accel glx:pbuffer -accel xv /' $kdmdir/kdmrc
	fi
    elif [ "$1" == "none" ]; then
        # Changing KDM configuration
        sed -i 's/ServerCmd=.*/ServerCmd=\/usr\/bin\/X/' $kdmdir/kdmrc
    elif [ "$1" == "aiglx" ]; then
        # Changing KDM configuration
        sed -i 's/ServerCmd=.*/ServerCmd=\/usr\/bin\/X/' $kdmdir/kdmrc
    elif [ "$1" == "nvidia" ]; then
        # Changing KDM configuration- is actually no different from none or aiglx, but adds consistency
        sed -i 's/ServerCmd=.*/ServerCmd=\/usr\/bin\/X/' $kdmdir/kdmrc
    fi
}

create_beryl_manager_desktop_file() {
    # it works with both KDE and GNOME
    echo "[Desktop Entry]" > $beryl_manager_desktop_file
    echo "Name=Beryl Manager" >> $beryl_manager_desktop_file
    echo "Encoding=UTF-8" >> $beryl_manager_desktop_file
    echo "MimeType=" >> $beryl_manager_desktop_file
    echo "Icon=agent" >> $beryl_manager_desktop_file
    echo "Version=1.0" >> $beryl_manager_desktop_file
    echo "Exec=beryl-manager" >> $beryl_manager_desktop_file
    echo "Path=" >> $beryl_manager_desktop_file
    echo "StartupNotify=false" >> $beryl_manager_desktop_file
    echo "Terminal=false" >> $beryl_manager_desktop_file
    echo "TerminalOptions=" >> $beryl_manager_desktop_file
    echo "Type=Application" >> $beryl_manager_desktop_file
    echo "X-DCOP-ServiceType=" >> $beryl_manager_desktop_file
    echo "X-KDE-SubstituteUID=false" >> $beryl_manager_desktop_file
    echo "X-KDE-Username=" >> $beryl_manager_desktop_file
    echo "X-GNOME-Autostart-enabled=true" >> $beryl_manager_desktop_file
}

scan_and_remove_old_files() {
      for file in `find /home -maxdepth 4 -name $beryl_wrapper`
         do
            rm -rf $file
         done
      for file in `find /home -maxdepth 4 -name $beryl_manager`
         do
            rm -rf $file
         done
      for file in `find /home -maxdepth 2 -name .beryl*`
         do
            rm -rf $file
         done
}

add_beryl_manager_to_the_startup() {
    if [ -e "/usr/share/autostart" ]; then
        cp $beryl_manager_desktop_file /usr/share/autostart/ -p
        # link that to the GNOME startup dir
        if [ -e /usr/share/gnome/autostart ]; then
          ln -sf /usr/share/autostart/$beryl_manager /usr/share/gnome/autostart/
        fi
    fi
}

remove_beryl_manager_from_the_startup() {
    rm -f /usr/share/gnome/autostart/$beryl_manager
    rm -f /usr/share/autostart/$beryl_manager
}

enable_aiglx_in_xorg_conf() {
    # Enable AIGLX Stuff
    sed -i '/"AIGLX"/ s/#//' $xorg_conf
    opengl_nvidia=$(eselect opengl show | grep nvidia)
    if [ -n "$opengl_nvidia" ]; then
        sed -i '/"AddARGBGLXVisuals"/ s/#//' $xorg_conf
    fi
    sed -i '/"Composite"/ s/#//g' $xorg_conf
}

disable_aiglx_in_xorg_conf() {
    # Disable AIGLX Option
    sed -i '/"AIGLX"/ s/#//' $xorg_conf
    sed -i '/"AIGLX"/ s/Option/#Option/' $xorg_conf
    sed -i '/"AddARGBGLXVisuals"/ s/#//' $xorg_conf
    sed -i '/"AddARGBGLXVisuals"/ s/Option/#Option/' $xorg_conf
    sed -i '/"Composite"/ s/#//' $xorg_conf
    sed -i '/"Composite"/ s/Option/#Option/' $xorg_conf
}

enable_nvidia_in_xorg_conf() {
    # Enable nvidia stuff, no AIGLX option
    opengl_nvidia=$(eselect opengl show | grep nvidia)
    if [ -n "$opengl_nvidia" ]; then
        sed -i '/"AddARGBGLXVisuals"/ s/#//' $xorg_conf
    fi
    sed -i '/"Composite"/ s/#//g' $xorg_conf
}

disable_nvidia_in_xorg_conf() {
    # Disable nvidia
    sed -i '/"AddARGBGLXVisuals"/ s/#//' $xorg_conf
    sed -i '/"AddARGBGLXVisuals"/ s/Option/#Option/' $xorg_conf
    sed -i '/"Composite"/ s/#//' $xorg_conf
    sed -i '/"Composite"/ s/Option/#Option/' $xorg_conf
}

if [ -z "$1" ] && [ -z "$2" ] && [ "$1" == "--help" ] && [ "$1" != "aiglx" ] && [ "$1" != "xgl" ] && [ "$1" != "nvidia" ] && [ "$2" !="enable" ] && [ "$2" != "disable" ]; then
   echo
   echo "desktop-acceleration-setup - SabayonLinux - Copyright 2006"
   echo
   echo "This helper enable/disable AIGLX/XGL system wide."
   echo "   Usage:"
   echo "   # desktop-acceleration-setup aiglx/xgl/nvidia enable/disable"
   echo
   exit 0
fi

if [ "$UID" != "0" ]; then
   echo "Error: you need to run this application as root."
fi

# Create our config file if it does not exist
if [ ! -e "$desktop_acceleration_helpers_config_file" ]; then
    # Acceleration is disabled (AND MUST BE) by default
    echo "Acceleration=none" > $desktop_acceleration_helpers_config_file
fi

if [ "$1" == "xgl" ]; then

    if [ "$2" == "enable" ]; then
        echo -en "Enabling XGL system wide..."

	# Configure kdmrc
	configure_kdm xgl

	# remove any possible wrapper script in Xsession
	remove_beryl_wrapper_script
        # remove old stuff
        scan_and_remove_old_files

	# Beryl Manager startup file - create file $beryl_manager_desktop_file
	create_beryl_manager_desktop_file

	# Add Beryl to the startup
	add_beryl_manager_to_the_startup

	# remove junk
	rm -f $beryl_wrapper_desktop_file
	rm -f $beryl_manager_desktop_file

	# set XGL in the config file
	write_acceleration_method xgl

        echo -e "Done"
    else
        echo -en "Disabling XGL system wide (reverting to X.Org)..."

        # Changing KDM configuration
        configure_kdm none

	# remove any possible wrapper script in Xsession
	remove_beryl_wrapper_script
        # remove old stuff
        scan_and_remove_old_files

        # remove beryl-manager
        remove_beryl_manager_from_the_startup

	# set No Acceleration in the config file
	write_acceleration_method none

        echo -e "Done"
    fi

elif [ "$1" == "aiglx" ]; then

   if [ "$2" == "enable" ]; then
        echo "Enabling AIGLX system wide..."

        # Changing KDM configuration
        configure_kdm aiglx

	# remove any possible wrapper script in Xsession
	remove_beryl_wrapper_script
        # remove old stuff
        scan_and_remove_old_files

	# Enable AIGLX
	enable_aiglx_in_xorg_conf

	# Beryl Manager startup file - create file $beryl_manager_desktop_file
	create_beryl_manager_desktop_file

	# Add Beryl to the startup
	add_beryl_manager_to_the_startup

	# remove junk
	rm -f $beryl_wrapper_desktop_file
	rm -f $beryl_manager_desktop_file

	# set XGL in the config file
	write_acceleration_method aiglx

        echo -e "Done"
   else
        echo "Disabling AIGLX system wide..."

        # Changing KDM configuration
        configure_kdm none

	# remove any possible wrapper script in Xsession
	remove_beryl_wrapper_script
        # remove old stuff
        scan_and_remove_old_files

	# Disable AIGLX
	disable_aiglx_in_xorg_conf

        # remove beryl-manager
        remove_beryl_manager_from_the_startup

	# set No Acceleration in the config file
	write_acceleration_method none

        echo -e "Done"
   fi

elif [ "$1" == "nvidia" ]; then

   if [ "$2" == "enable" ]; then
        echo "Enabling NVidia system wide..."

        # Changing KDM configuration
        configure_kdm nvidia

	# remove any possible wrapper script in Xsession
	remove_beryl_wrapper_script
        # remove old stuff
        scan_and_remove_old_files

	# Enable NVidia
	enable_nvidia_in_xorg_conf

	# Beryl Manager startup file - create file $beryl_manager_desktop_file
	create_beryl_manager_desktop_file

	# Add Beryl to the startup
	add_beryl_manager_to_the_startup

	# remove junk
	rm -f $beryl_wrapper_desktop_file
	rm -f $beryl_manager_desktop_file

	# set NVidia in the config file
	write_acceleration_method nvidia

        echo -e "Done"
   else
        echo "Disabling NVidia system wide..."

        # Changing KDM configuration
        configure_kdm none

	# remove any possible wrapper script in Xsession
	remove_beryl_wrapper_script
        # remove old stuff
        scan_and_remove_old_files

	# Disable NVidia
	disable_nvidia_in_xorg_conf

        # remove beryl-manager
        remove_beryl_manager_from_the_startup

	# set No Acceleration in the config file
	write_acceleration_method none

        echo -e "Done"
   fi

fi                                  # now write the beryl-manager parser and configurator
