#!/bin/bash
#set -x
#SET DISPLAYCARD to force a cardtype
#SET DISPLAYRES to force Xres, ENV takes precendent over cmdline
#displayres=cmdline
#NVPKGS="ati-dri xf86-video-ati xf86-video-radeonhd intel-dri xf86-video-intel unichrome-dri xf86-video-unichrome xf86-video-mga xf86-video-savage xf86-video-trident"
NVPKGS="ati-dri xf86-video-ati xf86-video-radeonhd intel-dri xf86-video-intel xf86-video-mga xf86-video-savage xf86-video-trident unichrome-dri xf86-video-openchrome"
BASE=""
. /etc/profile
NVIDIA_96XX="$TEMPLATES/xorg/96xx_supported.txt"
NVIDIA_173="$TEMPLATES/xorg/173_supported.txt"
NVIDIA_SUPPORTED="$TEMPLATES/xorg/nvidia_supported.txt"
#TEMPLATES="/usr/share/templates"
MYTHHOME=$BASE/home/mythtv

function Xvalues {
    CMDLINE=$(cat /proc/cmdline)
    echo "$CMDLINE" | grep -q forceXvesa
    if [ $? = 0  ]
    then
        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
    #force VGACARDTYPE
    if [ ! x$DISPLAYCARD = x ]
    then
        VGACARDTYPE=$DISPLAYCARD
        Xcardtype=$VGACARDTYPE
    fi
    echo "Will use $VGACARDTYPE"
    #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" > /tmp/options
    Xcategory=`echo "$Xresadvanced" | cut -d_ -f1`
    Xres=`echo "$Xresadvanced" | cut -d_ -f2`
    echo "$Xcategory"
    if [ "$Xcategory" = "nVidia Modeline" ]
    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
#    echo $ML
    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"
            ;;

        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"
            ;;

        via|VIA|Via|S3)
            # Need to add appropriate Modules, Device and DRI sections
            # See the http://www.mythtv.org/wiki/XvMC wiki page
            echo "no via here"
            ;;

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

function nvidia_driver_install {


        cp "$TEMPLATES/xorg/xorg.conf.nvidia"  $BASE/etc/X11/xorg.conf.d/20-automv.conf
        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}
        fi

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


            grep -qi "$CARDID" "$NVIDIA_SUPPORTED"
            if [ $? = 0 ]
            then
                #install latest drivers
                echo "installing current nvidia drivers"
                pacman --noconfirm  -Rd libgl > /dev/null 2>&1
                pacman --noconfirm  -R $NVPKGS > /dev/null 2>&1
                pacman --noconfirm  -S nvidia nvidia-utils > /dev/null 2>&1
            fi


            #nvidia check right here
            grep -qi "$CARDID" "$NVIDIA_96XX"
            if [ $? = 0 ]
            then
                #install 96xx drivers
                echo "installing nvidia 96xx drivers"
                pacman --noconfirm  -Rd libgl > /dev/null 2>&1
                pacman --noconfirm  -R $NVPKGS > /dev/null 2>&1
                pacman --noconfirm  -S nvidia-96xx nvidia-96xx-utils  > /dev/null 2>&1
            fi

            grep -qi "$CARDID" "$NVIDIA_173"
            if [ $? = 0 ]
            then
                #install latest drivers
                echo "installing 173 nvidia drivers"
                pacman --noconfirm  -Rd libgl > /dev/null 2>&1
                pacman --noconfirm  -R $NVPKGS > /dev/null 2>&1
                pacman --noconfirm  -S nvidia-173xx nvidia-173xx-utils > /dev/null 2>&1
            fi
        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 > /dev/null 2>&1
                        pacman --noconfirm  -S libgl unichrome-dri xf86-video-openchrome > /dev/null 2>&1
                    else
                        pacman --noconfirm  -R nvidia nvidia-utils > /dev/null 2>&1
                        pacman --noconfirm  -S libgl unichrome-dri xf86-video-unichrome > /dev/null 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 > /dev/null 2>&1
                    pacman --noconfirm -S libgl > /dev/null 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" 2>&1 > /dev/null
                ;;
        esac
    fi

}

#MAIN
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