#!/bin/bash
#set -x
#SET DISPLAYRES to force Xres, ENV takes precendent over cmdline


LOGFILE=/tmp/xconfig.log
for i in ati intel mga savage sis unichrome
do
    templist=`echo $i-dri xf86-video-$i`
    NVPKGS=`echo $NVPKGS  $templist`
done

BASE=""
MYTH_RUN_STATUS="1"
. /etc/profile

NVIDIA_304xx="$TEMPLATES/xorg/304xx_supported.txt"
NVIDIA_340xx="$TEMPLATES/xorg/340xx_supported.txt"
NVIDIA_SUPPORTED="$TEMPLATES/xorg/nvidia_supported.txt"

. /usr/MythVantage/bin/install_functions.sh
home_check

function Xvalues {
    #echo $VGACARDTYPE
    VGAFORCED=0
    if [ "x$VGACARDTYPE" = "x" ]
    then
	CMDLINE=$(cat /proc/cmdline)
        echo "$CMDLINE" | grep -q forceXvesa
        if [ $? = 0  ]
        then
            echo "Forcing driver to vesa"
            VGACARDTYPE=vesa
            Xcardtype=$VGACARDTYPE
        else
            VGACARDTYPE=`lspci | grep -i vga | grep -vi non-vga| sort -r | head -n 1 | cut -d: -f3 | cut -d" " -f2`
            VGAPCIID=`lspci | grep -i vga |grep -vi non-vga| sort -r | head -n 1 | cut -d" " -f1`
            CARDID=`lspci -n | grep "$VGAPCIID" | grep 10de | cut -d" " -f3 | cut -d: -f2`
            VENDORID=`lspci -n | grep "$VGAPCIID" | grep 10de | cut -d" " -f3 | cut -d: -f1`
            echo "Detected $VGACARDTYPE as the video card type"
        fi
    else
        echo "Video card type forced to $VGACARDTYPE"
        VGAFORCED=1
        CARDID="NOT_DETECTED"
    fi
    VGACARDTYPE=${VGACARDTYPE,,} #make lowercase
}

function presetupX {
    if  [ "$XIgnoreConfig" = 1 ]
    then
        echo "Using User Supplied X"
        if [ -f "$MYTHHOME/templates/xorg.user" ]
        then
            cp -f "$MYTHHOME/templates/xorg.user" "$XORG_CONF"
        else
            echo "Didn't find the file"
            echo "Copy your config file to $MYTHHOME/templates/xorg.user" > "$XORG_CONF"
        fi
    else
        setupX
    fi
}

function nvidia_prepare {
    for i in mesa-libgl nvidia nvidia-utils nvidia-libgl opencl-nvidia nvidia-304xx nvidia-304xx-utils nvidia-304xx-libgl opencl-nvidia-304xx nvidia-340xx nvidia-340xx-utils nvidia-340xx-libgl opencl-nvidia-340xx
    do
        pacman --noconfirm -Rdd $i >> $LOGFILE 2>&1
    done

    for i in `echo ${NVPKGS}`
    do
        pacman --noconfirm -Rc $i >> $LOGFILE 2>&1
    done
}

function pkg_check () {
    echo "  Checking for $1 in cache or online"
    pacman --noconfirm -Sw $1 >> $LOGFILE 2>&1
    rc=$?
    if [ $rc != 0 ]
    then
        echo "  Couldn't find $1 for install, aborting"
        echo "  Couldn't find $1 for install, aborting" >> $LOGFILE 2>&1
        exit 1
    fi
}

function nvidia_driver_install {
    cp "$TEMPLATES/xorg/xorg.nvidia"  $BASE/etc/X11/xorg.conf.d/20-automv.conf

    INSTALLED=0

    grep -qi "$CARDID" "$NVIDIA_SUPPORTED"
    if [[ $? = 0 || $VGAFORCED -eq 1 && $VGACARDTYPE == "nvidia" ]]
    then
        LIST="nvidia nvidia-libgl nvidia-utils opencl-nvidia"
        for i in `echo ${LIST}`
        do
            pkg_check $i
        done
        echo "Installing current nvidia driver"
        echo "Installing current nvidia driver" >> $LOGFILE 2>&1
        nvidia_prepare
        pacman --noconfirm -S ${LIST} >> $LOGFILE 2>&1
        if [[ $? != 0 ]]
        then
            echo "ERROR: Unable to install current nvidia driver"
            echo "ERROR: Unable to install current nvidia driver" >> $LOGFILE 2>&1
        else
            INSTALLED=1
        fi
    fi

    if [ $INSTALLED -eq 0 ]
    then
        grep -qi "$CARDID" "$NVIDIA_340xx"
        if [[ $? = 0 || $VGAFORCED -eq 1 && $VGACARDTYPE == "nvidia-340xx" ]]
        then
            LIST="nvidia-340xx nvidia-340xx-libgl nvidia-340xx-utils opencl-nvidia-340xx"
            for i in `echo ${LIST}`
            do
                pkg_check $i
            done
            echo "Installing nvidia-340xx driver"
            echo "Installing nvidia-340xx driver" >> $LOGFILE 2>&1
            nvidia_prepare
            pacman --noconfirm -S ${LIST} >> $LOGFILE 2>&1
            if [[ $? != 0 ]]
            then
                echo "ERROR: Unable to install nvidia-340xx driver"
                echo "ERROR: Unable to install nvidia-340xx driver" >> $LOGFILE 2>&1
            else
                INSTALLED=1
            fi
        fi
    fi

    if [ $INSTALLED -eq 0 ]
    then
        grep -qi "$CARDID" "$NVIDIA_304xx"
        if [[ $? = 0 || $VGAFORCED -eq 1 && $VGACARDTYPE == "nvidia-304xx" ]]
        then
            LIST="nvidia-304xx nvidia-304xx-libgl nvidia-304xx-utils opencl-nvidia-304xx"
            for i in `echo ${LIST}`
            do
                pkg_check $i
            done
            echo "Installing nvidia-304xx driver"
            echo "Installing nvidia-304xx driver" >> $LOGFILE 2>&1
            nvidia_prepare
            pacman --noconfirm -S ${LIST} >> $LOGFILE 2>&1
            if [[ $? != 0 ]]
            then
                echo "ERROR: Unable to install nvidia-304xx driver"
                echo "ERROR: Unable to install nvidia-304xx driver" >> $LOGFILE 2>&1
            else
                INSTALLED=1
            fi
        fi
    fi

    if [ $INSTALLED -eq 0 ]
    then
        #this is a failsafe, can't find the right driver, then use the latest'
        echo "  Couldn't find the card id in any list"
        echo "  Couldn't find the card id in any list" >> $LOGFILE 2>&1
        LIST="nvidia nvidia-libgl nvidia-utils opencl-nvidia"
        for i in `echo ${LIST}`
        do
            pkg_check $i
        done
        echo "Installing current nvidia driver"
        echo "Installing current nvidia driver" >> $LOGFILE 2>&1
        nvidia_prepare
        pacman --noconfirm -S ${LIST} >> $LOGFILE 2>&1
        if [[ $? != 0 ]]
        then
            echo "ERROR: Unable to install current nvidia driver"
            echo "ERROR: Unable to install current nvidia driver" >> $LOGFILE 2>&1
        else
            INSTALLED=1
        fi
    fi

    echo "/usr/lib/libXvMCNVIDIA_dynamic.so.1" > "$XVMC_CONFIG"
}

function vmware_driver_install {
    LIST="xf86-input-vmmouse xf86-video-vmware xf86-video-vesa svga-dri mesa-libgl"
    for i in `echo ${LIST}`
    do
        pkg_check $i
    done
    echo "Installing VMware driver"
    echo "Installing VMware driver" >> $LOGFILE 2>&1
    #this is used to remove nvidia
    nvidia_prepare
    for i in `echo ${LIST}`
    do
        pacman -S --noconfirm $i >> $LOGFILE 2>&1
    done
}

function vesa_driver_install {
    pkg_check xf86-video-vesa
    pkg_check mesa-libgl
    echo "Installing Vesa driver"
    echo "Installing Vesa driver" >> $LOGFILE 2>&1
    #this is used to remove nvidia
    nvidia_prepare
    pacman -S --noconfirm xf86-video-vesa mesa-libgl  >> $LOGFILE 2>&1
}

function intel_driver_install {
    pkg_check xf86-video-intel
    pkg_check mesa-libgl
    echo "Installing Intel driver"
    echo "Installing Intel driver" >> $LOGFILE 2>&1
    #this is used to remove nvidia
    nvidia_prepare
    pacman -S --noconfirm xf86-video-intel mesa-libgl >> $LOGFILE 2>&1
    echo "/usr/lib/libIntelXvMC.so.1" > "$XVMC_CONFIG"
}

function set_res {
    echo "    Setting modeline to ${Xres}"
    echo "    Setting modeline to ${Xres}" >> $LOGFILE 2>&1
    cat > /etc/X11/xorg.conf.d/30-screen.conf <<EOF
    Section "Screen"
        Identifier             "Screen0"  #Collapse Monitor and Device section to Screen section
        Device                 "Device0"
        Monitor                "Monitor0"
        DefaultDepth            24 #Choose the depth (16||24)
        SubSection             "Display"
            Depth               24
            Modes              "${Xres}"  #Choose the resolution
        EndSubSection
    EndSection
EOF
}

function setupX {
    Xvalues
    if [ x = x ]
    then
        case $VGACARDTYPE in
            nvidia|nvidia-340xx|nvidia-304xx)
                    nvidia_driver_install
                    if [ \"$Xres\" = "Auto" ]
                    then
                        Xres="nvidia-auto-select"
                    fi

                    if [ ${Xres} != "Auto" ]
                    then
                        set_res
                    else
                        rm -f /etc/X11/xorg.conf.d/30-screen.conf
                    fi
                ;;

            vmware)
                    vmware_driver_install
                    cp $TEMPLATES/xorg/xorg.vmware  /etc/X11/xorg.conf.d/20-automv.conf
                    echo "copy in autostart functions" >> $LOGFILE 2>&1
                    mkdir -p /etc/X11/autostart  >> $LOGFILE 2>&1
                    echo "#!/bin/bash" > /etc/X11/autostart/vmware.sh
                    echo "/usr/bin/vmware-user-suid-wrapper" >> /etc/X11/autostart/vmware.sh
                    chmod 755 /etc/X11/autostart/vmware.sh
                    if [ ${Xres} != "Auto" ]
                    then
                        set_res
                    else
                        rm -f /etc/X11/xorg.conf.d/30-screen.conf
                    fi
                ;;

            intel)
                    intel_driver_install
                    cp $TEMPLATES/xorg/xorg.intel  /etc/X11/xorg.conf.d/20-automv.conf
                    if [ ${Xres} != "Auto" ]
                    then
                        set_res
                    else
                        rm -f /etc/X11/xorg.conf.d/30-screen.conf
                    fi
                ;;

            vesa|innotek|*) #leaving this as * and vesa for no real reason other then it's explicit to catch vesa
                  if [[ $VGACARDTYPE != "vesa" && $VGACARDTYPE != "innotek" ]]
                  then
                      echo "Unknown card type, using Vesa."
                  fi
                  vesa_driver_install
                  cp $TEMPLATES/xorg/xorg.vesa  /etc/X11/xorg.conf.d/20-automv.conf
                  if [ ${Xres} != "Auto" ]
                    then
                        set_res
                    else
                        rm -f /etc/X11/xorg.conf.d/30-screen.conf
                    fi

                ;;

        esac
        #configure the ramdisk for kms
        if [ x$RUNP != "x1" ]
        then
            echo "Running plymouth_config"
            plymouth_config.py >> $LOGFILE 2>&1
        fi
    fi

}

function pacman_wait {
    if [ -f /var/lib/pacman/db.lck ]
    then
        echo "Pacman is running and must quit before xconfig.sh can continue."
        echo "  Waiting for pacman to quit..."
        while [ -f /var/lib/pacman/db.lck ]
        do
	    sleep 5
        done
    fi
}
#---------------------------------------------------------------------------------
#MAIN


LINE=`grep -i xorg /etc/mythvantage.cfg|grep -q False`
rc=$?
if  [ $rc = 0 ]
then
    echo "**   xorg configuration disabled in /etc/mythvantage.cfg"
    exit 1
fi

if [ -f /etc/sysconfig/IGNORE_X ]
then
    echo "**   Will not run xconfig.sh due to presence of /etc/sysconfig/IGNORE_X"
    exit 1
fi


if [ -f /etc/systemconfig ]
then
    . /etc/systemconfig
else
    Xres="800x600"
fi
CMDLINE=$(cat /proc/cmdline)
echo $CMDLINE | grep -q displayres
if [ $? = 0 ]
then
    TEMPVAR=${CMDLINE#*displayres=}
    DSR=${TEMPVAR%% *}
fi
if [ ! x$DSR = x ]
then
    Xres=$DSR
fi
if [ ! x$DISPLAYRES = x ]
then
    Xres=$DISPLAYRES
fi


XORG_CONF="/etc/X11/xorg.conf"
XVMC_CONFIG="/etc/X11/XvMCConfig"


pacman_wait
presetupX