#!/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=""
. /etc/profile
NVIDIA_96XX="$TEMPLATES/xorg/96xx_supported.txt"
NVIDIA_173="$TEMPLATES/xorg/173_supported.txt"
NVIDIA_SUPPORTED="$TEMPLATES/xorg/nvidia_supported.txt"

MYTHHOME=$BASE/home/mythtv

function Xvalues {
    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 | sort -r | head -n 1 | cut -d: -f3 | cut -d" " -f2`
        VGAPCIID=`lspci | grep -i 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`
    fi

    echo "Detected $VGACARDTYPE as the video card type"
    #currentmode=`cat "$BASE/etc/X11/xorg.conf" | grep Modes | awk -Fs '{ print $2 }'`
}

function presetupX {
    if [ -f /etc/sysconfig/IGNORE_X ]
    then
        echo "Will not run xconfig.sh due to presence of /etc/sysconfig/IGNORE_X"
        return 1
    else
        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
            #if [ "$XUseAdvanced" = 1 ]
            #then
            #    setupAdvancedX
            #else
                setupX
            #fi
        fi
    fi

}

function setupAdvancedX {

    echo "#Doing the advanced X setup" >> $LOGFILE
    #Xcategory=`echo "$Xresadvanced" | cut -d_ -f1`
    #Xres=`echo "$Xresadvanced" | cut -d_ -f2`

    Xcategory=`echo "$Xresadvanced" | cut -d_ -f1`
    Xres=${Xres}
    #echo "$Xcategory"
    #echo $Xres
    if [ "$Xcategory" = "Nvidia" ]
    then
        #Xres=""
        if [ "$XnVidia1080p" = "1" ]
        then
            Xres="${Xres} 1920x1080_60"
        fi
        if [ "$XnVidia1080i" = "1" ]
        then
            Xres="${Xres} 1920x1080_60i"
        fi
        if [ "$XnVidia720p" = "1" ]
        then
            Xres="${Xres} 1280x720_60"
        fi
        if [ "$XnVidia480p" = "1" ]
        then
            Xres="${Xres} 720x480_60"
        fi
        #ML="\t Modes ${Xres}"
#     else
#         ML="\t Modes \"${Xres}\""
    fi

    case $Xcardtype in
        NVIDIA|nVidia|nvidia)
            nvidia_driver_install
            case $Xconnection in
                DVI)    ConnectedMonitor=DFP ;;
                vga)    ConnectedMonitor=CRT;;
                Auto)   ConnectedMonitor=Auto;;
                TV)     ConnectedMonitor=TV
                        nvidia-xconfig -c /etc/X11/xorg.conf.d/20-automv.conf --tv-standard="$XTVstandard"
                        nvidia-xconfig -c /etc/X11/xorg.conf.d/20-automv.conf  --tv-out-format="$XTVconnection"
                    #    echo "Option \"TVStandard\" \"$XTVstandard\""  >>/tmp/options
                    #    echo "Option \"TVOutFormat\" \"$XTVconnection\"" >> /tmp/options
                    ;;
                *)      ConnectedMonitor=Auto;;
            esac
            if [ "$ConnectedMonitor" = Auto ]
            then
                echo "auto connection"
            else
                nvidia-xconfig -c /etc/X11/xorg.conf.d/20-automv.conf   --connected-monitor="$ConnectedMonitor"
                #echo "Option \"ConnectedMonitor\" \"$ConnectedMonitor\"" >> /tmp/options
                #echo "Option \"FlatPanelProperties\" \"Scaling = centered, Dithering = enabled\"" >> /tmp/options
                #echo "Option \"DigitalVibrance\" \"0\"" >> /tmp/options
            fi
#
#             if  [ "$XignoreEDID" = 1 ]
#             then
#                 EDIDvalue=true
#                 EDIDFREQ=false
#                 DS="    DisplaySize $XDisplaysize"
#                 HS="    HorizSync   $XHsync"
#                 VR="    VertRefresh $XVrefresh"
#             else
#                 EDIDvalue=false
#                 EDIDFREQ=true
#                 DS="# Display size edid used "
#                 HS="# Hsync edid used "
#                 VR="# Vertrefresh edid used "
#             fi
#             echo "Option  \"UseEdidFreqs\" \"$EDIDFREQ\"" >> /tmp/options
#             echo "Option  \"IgnoreEDID\" \"$EDIDvalue\"" >> /tmp/options
#
#
#             sed -e "s/^.*Modes.*$/${ML}/" \
#                 -e "/INSERT MODELINE/r  $TEMPLATES/xorg/modeline.$Xcategory" \
#                 -e "s/^.*DisplaySize.*$/ $DS/" \
#                 -e "s/^#.*HorizSync.*$/ $HS/g" \
#                 -e "s/^#.*VertRefresh.*$/ $VR/g" \
#                 -e "/INSERT HERE/r /tmp/options" "$TEMPLATES/xorg/xorg.conf.nvidia" > "$XORG_CONF"

            #nvidia-xconfig -c /etc/X11/xorg.conf.d/20-automv.conf --mode-list=\"${Xres}\"
            eval nvidia-xconfig -c /etc/X11/xorg.conf.d/20-automv.conf --mode-list=\"${Xres}\"
            ;;

        ati|ATI)
            case $Xconnection in
                DVI)    ConnectedMonitor="tmds1,nocrt1,notv";;
                VGA)    ConnectedMonitor="crt1,notmds1,notv" ;;
                TV)     ConnectedMonitor="tv,nocrt1,notmds1"
                        echo "Option \"TVStandard\" \"$XTVstandard\""  >>/tmp/options
                        echo "Option \"TVFormat\" \"$XTVconnection\"" >> /tmp/options
                    ;;
            esac
            if  [ "$XignoreEDID" = 1 ]
            then
                DS="    DisplaySize $XDisplaysize"
                HS="    HorizSync   $XHsync"
                VR="    VertRefresh $XVrefresh"
            else
                DS="# Display size edid used "
                HS="# Hsync edid used "
                VR="# Vertrefresh edid used "
            fi

            echo "Option \"ForceMonitors\" \"$ConnectedMonitor\"" >> /tmp/options

            sed -e "s/^.*Modes.*$/\t $ML/" \
                -e "/INSERT MODELINE/r  $TEMPLATES/xorg/modeline.$Xcategory" \
                -e "s/^.*DisplaySize.*$/ $DS/" \
                -e "s/^#.*HorizSync.*$/ $HS/g" \
                -e "s/^#.*VertRefresh.*$/ $VR/g" \
                -e "/INSERT HERE/r /tmp/options" "$TEMPLATES/xorg/xorg.conf.ati"  > "$XORG_CONF"
            ;;



        *)
            echo "unknown card type"
            ;;
    esac
}

function nvidia_prepare {
    for i in libgl nvidia nvidia-utils nvidia-173xx nvidia-173xx-utils nvidia-96xx nvidia-96xx-utils
    do
        pacman --noconfirm -Rdd $i >> $LOGFILE 2>&1
    done

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


}

function nvidia_driver_install {


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

        installed=0
        if [ "$TESTMODE" != "test" ]
        then


            grep -qi "$CARDID" "$NVIDIA_SUPPORTED"
            if [ $? = 0 ]
            then
                #install latest drivers
                echo "Installing current nvidia drivers"
                nvidia_prepare
                pacman --noconfirm  -S nvidia nvidia-utils >> $LOGFILE 2>&1
                installed=1
            fi

            if [ $installed = 0 ]
            then
                #nvidia check right here
                grep -qi "$CARDID" "$NVIDIA_96XX"
                if [ $? = 0 ]
                then
                    #install 96xx drivers
                    echo "Installing nvidia 96xx drivers"
                    nvidia_prepare
                    pacman --noconfirm  -S nvidia-96xx nvidia-96xx-utils  >> $LOGFILE 2>&1
                    installed=1
                fi
            fi

            if [ $installed = 0 ]
            then
                grep -qi "$CARDID" "$NVIDIA_173"
                if [ $? = 0 ]
                then
                    #install latest drivers
                    echo "Installing 173 nvidia drivers"
                    nvidia_prepare
                    pacman --noconfirm  -S nvidia-173xx nvidia-173xx-utils >> $LOGFILE 2>&1
                    installed=1
                fi
            fi

            if [ $installed = 0 ]
            then
                #this is a failsafe, can't find the right driver, then use the latest'
                #install latest drivers
                echo "Couldn't find the card in the supported list"
                echo "Installing current nvidia drivers"

                nvidia_prepare
                pacman --noconfirm  -S nvidia nvidia-utils >> $LOGFILE 2>&1
                installed=1
            fi


        fi


        if [ \"$Xres\" = "Auto" ]
        then
            nvidia-xconfig -c /etc/X11/xorg.conf.d/20-automv.conf --mode-list="nvidia-auto-select"
        else
            #nvidia-xconfig -c /etc/X11/xorg.conf.d/20-automv.conf --mode-list=$Xres
            eval nvidia-xconfig -c /etc/X11/xorg.conf.d/20-automv.conf --mode-list=\"${Xres}\"
        fi

        echo "/usr/lib/libXvMCNVIDIA_dynamic.so.1" > "$XVMC_CONFIG"
        #rm $BASE/etc/X11/xorg.conf.d/20-nvidia.conf
}


function setupX {
    Xvalues
    #echo "$currentmode  ____   ${Xres}"
    #if [ "${currentmode}" != \"${Xres}\" ]
    if [ x = x ]
    then
        case $VGACARDTYPE in
            nVidia)
                    nvidia_driver_install
                ;;

      #      VMware)
      #              sed -e "s/^.*Modes.*$/\t Modes \"${Xres}\"/" "$TEMPLATES/xorg/xorg.conf.vmware" > "$XORG_CONF"
      #              ;;

            VIA|S3)
                # There are actually multiple options here
                # xf86-video-openchrome
                # xf86-video-unichrome
                # There is also a seperate driver for the Unichrome Pro
                if [ ${Xres} = Auto ]
                then
                    sed -e "/^.*Modes.*$/d" "$TEMPLATES/xorg/xorg.conf.via" > "$XORG_CONF"
                else
                    sed -e "s/^.*Modes.*$/\t Modes \"${Xres}\"/" "$TEMPLATES/xorg/xorg.conf.via" > "$XORG_CONF"
                fi
                if [ "$TESTMODE" != "test" ]
                then
                    if [ "$OPENCHROME" = "1" ]
                    then
                        pacman --noconfirm  -R nvidia nvidia-utils >> $LOGFILE 2>&1
                        pacman --noconfirm  -S libgl unichrome-dri xf86-video-openchrome >> $LOGFILE 2>&1
                    else
                        pacman --noconfirm  -R nvidia nvidia-utils >> $LOGFILE 2>&1
                        pacman --noconfirm  -S libgl unichrome-dri xf86-video-unichrome >> $LOGFILE 2>&1
                    fi
                fi
                # I'm making educated guesses here...
                if lspci | grep "VGA" | grep -qi "Unichrome Pro"
                then
                    if [ -f "/usr/lib/libchromeXvMCPro.so.1" ]
                    then
	                echo "/usr/lib/libchromeXvMCPro.so.1" > "$XVMC_CONFIG"
                    else
	                echo "/usr/lib/libviaXvMCPro.so.1" > "$XVMC_CONFIG"
                    fi
                else
                    if [ -f "/usr/lib/libchromeXvMC.so.1" ]
                    then
	                echo "/usr/lib/libchromeXvMC.so.1" > "$XVMC_CONFIG"
                    else
                        echo "/usr/lib/libviaXvMC.so.1" > "$XVMC_CONFIG"
                    fi
                fi
                ;;

            Intel|intel)
               if [ ${Xres} = Auto ]
                then
                    sed -e "/^.*Modes.*$/d" "$TEMPLATES/xorg/xorg.conf.intel" > "$XORG_CONF"
                else
                    sed -e "s/^.*Modes.*$/\t Modes \"${Xres}\"/" "$TEMPLATES/xorg/xorg.conf.intel" > "$XORG_CONF"
                fi
                if [ "$TESTMODE" != "test" ]
                then
                    pacman --noconfirm -R nvidia-utils >> $LOGFILE 2>&1
                    pacman --noconfirm -S libgl >> $LOGFILE 2>&1
                fi
	        echo "/usr/lib/libIntelXvMC.so.1" > "$XVMC_CONFIG"
                ;;

            vesa|InnoTek)
                if [ ${Xres} = Auto ]
                then
                    sed -e "/^.*Modes.*$/d" "$TEMPLATES/xorg/xorg.conf.vesa" > "$XORG_CONF"
                else
                    sed -e "s/^.*Modes.*$/\t Modes \"${Xres}\"/" "$TEMPLATES/xorg/xorg.conf.vesa" > "$XORG_CONF"
                fi
                ;;

            *)
                XCONF=/root/xorg.conf.new
                XCONFB=/etc/X11/xorg.conf.install
                X -configure
                if [ -f "$XCONF" ]
                then
                    echo "Using $XCONF"
                    if [ ${Xres} = Auto ]
                    then
                        grep -v Modes "$XCONF" | sed -e 's/dev\/mouse/dev\/psaux/g'> "$XORG_CONF"
                    else
                        grep -v Modes "$XCONF" | sed -e "/Depth.*16/a Modes \"${Xres}\" " -e "/Depth.*24/a Modes \"${Xres}\""     -e 's/dev\/mouse/dev\/psaux/g'> "$XORG_CONF"
                    fi
                elif [ -f "$XCONFB" ]
                then
                    echo "Using $XCONFB"
                    if [ ${Xres} = Auto ]
                    then
                        sed -e "/^.*Modes.*$/d" "$XCONFB" > "$XORG_CONF"
                    else
                        sed -e "s/^.*Modes.*$/\t Modes \"${Xres}\"/" "$XCONFB" > "$XORG_CONF"
                    fi
                else
                    echo "Xorg configuration failed"
                fi
                rm -f "$XCONF"  >> $LOGFILE 2>&1
                ;;
        esac
    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 0
fi

TESTMODE="$1"
if [ "$TESTMODE" = "test" ]
then
    XORG_CONF="/tmp/xorg.conf.test"
    XVMC_CONFIG="/tmp/XvMCConfig.test"
    XUseAdvanced="1"
    XIgnoreConfig="${2}"
    Xcardtype="${3}"
    XIgnoreEDID="${4}"
    Xconnection="${5}"
    XHsync="${6}"
    XVrefresh="${7}"
    Xresadvanced="${8}"
    XTVstandard="${9}"
    XTVconnection="${10}"
    XDisplaysize="${11}"
else
    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"
fi
presetupX