#!/bin/bash
#set -x
#SET DISPLAYRES to force Xres, ENV takes precendent over cmdline
#SET VGACARDTYPE to force card type:
    #VGACARDTYPE="ati" xconfig.sh
    #VGACARDTYPE="intel" xconfig.sh
    #VGACARDTYPE="nvidia" xconfig.sh
    #VGACARDTYPE="nvidia-390xx" xconfig.sh
    #VGACARDTYPE="nvidia-340xx" xconfig.sh
    #VGACARDTYPE="nvidia-304xx" xconfig.sh
    #VGACARDTYPE="vesa" xconfig.sh
    #VGACARDTYPE="VMware" xconfig.sh

LOGFILE=/tmp/xconfig.log
echo -e "\n\n--------------------------------------------------------------------------------" >> $LOGFILE 2>&1
echo -e `date`"\n" >> $LOGFILE 2>&1

#libxnvctrl is needed as a dep of mythtv so must be installed for every driver
ATI_PKGS="xf86-video-ati libva-mesa-driver libva-utils libglvnd libxnvctrl"
INTEL_PKGS="xf86-video-intel libva-intel-driver libva-utils libglvnd libxnvctrl"
NVIDIA_PKGS="nvidia nvidia-utils opencl-nvidia nvidia-settings libglvnd libxnvctrl"
NVIDIA_390xx_PKGS="nvidia-390xx nvidia-390xx-utils opencl-nvidia-390xx nvidia-390xx-settings libglvnd libxnvctrl-390xx"
NVIDIA_340xx_PKGS="nvidia-340xx nvidia-340xx-utils opencl-nvidia-340xx nvidia-340xx-settings libglvnd libxnvctrl-340xx"
NVIDIA_304xx_PKGS="nvidia-304xx nvidia-304xx-utils opencl-nvidia-304xx libglvnd libxnvctrl-340xx"
NVIDIA_ALL_PKGS=`echo $NVIDIA_PKGS $NVIDIA_390xx_PKGS $NVIDIA_340xx_PKGS $NVIDIA_304xx_PKGS|xargs -n1|sort -u`
VESA_PKGS="xf86-video-vesa libglvnd libxnvctrl"
VMWARE_PKGS="xf86-input-vmmouse xf86-video-vmware xf86-video-vesa libglvnd libxnvctrl"

for i in ati intel mga savage sis unichrome vmware
do
    templist=`echo $i-dri xf86-video-$i`
    OTHER_PKGS=`echo $OTHER_PKGS $templist`
done

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

NVIDIA_304xx_SUPPORTED="$TEMPLATES/xorg/304xx_supported.txt"
NVIDIA_340xx_SUPPORTED="$TEMPLATES/xorg/340xx_supported.txt"
NVIDIA_390xx_SUPPORTED="$TEMPLATES/xorg/390xx_supported.txt"
NVIDIA_SUPPORTED="$TEMPLATES/xorg/nvidia_supported.txt"
NVIDIA_DISABLE_MSI="$TEMPLATES/xorg/nvidia_disable_msi.txt"
NVIDIA_MSI_MODPROBE="$BASE/etc/modprobe.d/nvidia_msi.conf"

. /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 from kernel cmdline" | tee -a $LOGFILE
            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" | tee -a $LOGFILE
        fi
    else
        echo "Video card type forced to $VGACARDTYPE" | tee -a $LOGFILE
        VGAFORCED=1
        CARDID="NOT_DETECTED"
    fi
    VGACARDTYPE=${VGACARDTYPE,,} #make lowercase
}

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

function nvidia_prepare {
    [[ -f "$NVIDIA_MSI_MODPROBE" ]] && rm -f "$NVIDIA_MSI_MODPROBE"
    echo "Remove all nvidia pkgs" >> $LOGFILE 2>&1
    for i in ${NVIDIA_ALL_PKGS}
    do
        pacman --noconfirm -Rdd $i >> $LOGFILE 2>&1
    done

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

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

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

    INSTALLED=0

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

    if [ $INSTALLED -eq 0 ]
    then
        CARDNAME=`grep -i "$CARDID" "$NVIDIA_390xx_SUPPORTED"`
        if [[ $? = 0 || $VGAFORCED -eq 1 && $VGACARDTYPE == "nvidia-390xx" ]]
        then
            echo "$CARDNAME" | tee -a $LOGFILE
            for i in ${NVIDIA_390xx_PKGS}
            do
                pkg_check $i
            done
            echo "Installing nvidia-390xx driver" | tee -a $LOGFILE
            nvidia_prepare
            pacman --noconfirm -S ${NVIDIA_390xx_PKGS} >> $LOGFILE 2>&1
            if [[ $? != 0 ]]
            then
                echo "ERROR: Unable to install nvidia-390xx driver" | tee -a $LOGFILE
            else
                echo "  Successfully Installed" | tee -a $LOGFILE
                INSTALLED=1
            fi
        fi
    fi

    if [ $INSTALLED -eq 0 ]
    then
        CARDNAME=`grep -i "$CARDID" "$NVIDIA_340xx_SUPPORTED"`
        if [[ $? = 0 || $VGAFORCED -eq 1 && $VGACARDTYPE == "nvidia-340xx" ]]
        then
            echo "$CARDNAME" | tee -a $LOGFILE
            for i in ${NVIDIA_340xx_PKGS}
            do
                pkg_check $i
            done
            echo "Installing nvidia-340xx driver" | tee -a $LOGFILE
            nvidia_prepare
            pacman --noconfirm -S ${NVIDIA_340xx_PKGS} >> $LOGFILE 2>&1
            if [[ $? != 0 ]]
            then
                echo "ERROR: Unable to install nvidia-340xx driver" | tee -a $LOGFILE
            else
                echo "  Successfully Installed" | tee -a $LOGFILE
                INSTALLED=1
            fi
        fi
    fi

    if [ $INSTALLED -eq 0 ]
    then
        CARDNAME=`grep -i "$CARDID" "$NVIDIA_304xx_SUPPORTED"`
        if [[ $? = 0 || $VGAFORCED -eq 1 && $VGACARDTYPE == "nvidia-304xx" ]]
        then
            echo "$CARDNAME" | tee -a $LOGFILE
            for i in ${NVIDIA_304xx_PKGS}
            do
                pkg_check $i
            done
            echo "Installing nvidia-304xx driver" | tee -a $LOGFILE
            nvidia_prepare
            pacman --noconfirm -S ${NVIDIA_304xx_PKGS} >> $LOGFILE 2>&1
            if [[ $? != 0 ]]
            then
                echo "ERROR: Unable to install nvidia-304xx driver" | tee -a $LOGFILE
            else
                echo "  Successfully Installed" | tee -a $LOGFILE
                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. Installing current nvidia driver" | tee -a $LOGFILE
        for i in ${NVIDIA_PKGS}
        do
            pkg_check $i
        done
        echo "Installing current nvidia driver" | tee -a $LOGFILE
        nvidia_prepare
        pacman --noconfirm -S ${NVIDIA_PKGS} >> $LOGFILE 2>&1
        if [[ $? != 0 ]]
        then
            echo "ERROR: Unable to install current nvidia driver" | tee -a $LOGFILE
        else
            echo "  Successfully Installed" | tee -a $LOGFILE
            INSTALLED=1
        fi
    fi

    if [ $INSTALLED -eq 1 ]
    then
        grep -qi "$CARDID" "$NVIDIA_DISABLE_MSI"
        if [[ $? = 0 ]]
        then
            echo "Disabling MSI interrupts" | tee -a $LOGFILE
            echo "options nvidia NVreg_EnableMSI=0" > "$NVIDIA_MSI_MODPROBE"
        fi
    fi
}

function vmware_driver_install {
    for i in ${VMWARE_PKGS}
    do
        pkg_check $i
    done
    echo "Installing VMware driver" | tee -a $LOGFILE
    #this is used to remove nvidia
    nvidia_prepare
    pacman --noconfirm -S ${VMWARE_PKGS} >> $LOGFILE 2>&1
    if [[ $? != 0 ]]
    then
        echo "ERROR: Unable to install VMware driver" | tee -a $LOGFILE
    else
        echo "  Successfully Installed" | tee -a $LOGFILE
    fi
}

function vesa_driver_install {
    for i in ${VESA_PKGS}
    do
        pkg_check $i
    done
    echo "Installing Vesa driver" | tee -a $LOGFILE
    #this is used to remove nvidia
    nvidia_prepare
    pacman --noconfirm -S ${VESA_PKGS} >> $LOGFILE 2>&1
    if [[ $? != 0 ]]
    then
        echo "ERROR: Unable to install vesa driver" | tee -a $LOGFILE
    else
        echo "  Successfully Installed" | tee -a $LOGFILE
    fi
}

function intel_driver_install {
    for i in ${INTEL_PKGS}
    do
        pkg_check $i
    done
    echo "Installing Intel driver" | tee -a $LOGFILE
    #this is used to remove nvidia
    nvidia_prepare
    pacman --noconfirm -S ${INTEL_PKGS} >> $LOGFILE 2>&1
    if [[ $? != 0 ]]
    then
        echo "ERROR: Unable to install Intel driver" | tee -a $LOGFILE
    else
        echo "  Successfully Installed" | tee -a $LOGFILE
    fi
}

function ati_driver_install {
    for i in ${ATI_PKGS}
    do
        pkg_check $i
    done
    echo "Installing ATI driver" | tee -a $LOGFILE
    #this is used to remove nvidia
    nvidia_prepare
    pacman --noconfirm -S ${ATI_PKGS} >> $LOGFILE 2>&1
    if [[ $? != 0 ]]
    then
        echo "ERROR: Unable to install ATI driver" | tee -a $LOGFILE
    else
        echo "  Successfully Installed" | tee -a $LOGFILE
    fi
}

function set_res {
    echo "Setting resolution to ${Xres}" | tee -a $LOGFILE
    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-390xx|nvidia-340xx|nvidia-304xx)
                    nvidia_driver_install
                    if [[ $Xres != "Auto" ]]
                    then
                        set_res
                    else
                        echo "Setting resolution to ${Xres}" | tee -a $LOGFILE
                        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
                        echo "Setting resolution to ${Xres}" | tee -a $LOGFILE
                        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
                        echo "Setting resolution to ${Xres}" | tee -a $LOGFILE
                        rm -f /etc/X11/xorg.conf.d/30-screen.conf
                    fi
                ;;

            ati)
                    ati_driver_install
                    #cp $TEMPLATES/xorg/xorg.ati  /etc/X11/xorg.conf.d/20-automv.conf
                    if [[ $Xres != "Auto" ]]
                    then
                        set_res
                    else
                        echo "Setting resolution to ${Xres}" | tee -a $LOGFILE
                        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." | tee -a $LOGFILE
                    fi
                    vesa_driver_install
                    cp $TEMPLATES/xorg/xorg.vesa  /etc/X11/xorg.conf.d/20-automv.conf
                    if [[ $Xres != "Auto" ]]
                    then
                        set_res
                    else
                        echo "Setting resolution to ${Xres}" | tee -a $LOGFILE
                        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" | tee -a $LOGFILE
            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." | tee -a $LOGFILE
        echo "  Waiting for pacman to quit..." | tee -a $LOGFILE
        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" | tee -a $LOGFILE
    exit 1
fi

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

if [ -f /etc/systemconfig ]
then
    . /etc/systemconfig
else
    echo "    systemconfig not found." | tee -a $LOGFILE
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
    echo "    Setting resolution to ${Xres} from kernel cmdline" | tee -a $LOGFILE
fi
if [ ! x$DISPLAYRES = x ]
then
    Xres=$DISPLAYRES
    echo "Resolution forced to ${Xres}" | tee -a $LOGFILE
fi
if [ x$Xres = x ]
then
    Xres="Auto"
    echo "Resolution not set. Setting to ${Xres}" | tee -a $LOGFILE
fi


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

pacman_wait
presetupX
