#!/bin/sh
#
# X configuration script based on ltsp4 startx screen session.

. /usr/share/lessdisks/ltsp_functions 

# TODO take commandline arguments for various settings.

vidlist=${vidlist:-"/usr/share/lessdisks/ltsp_vidlist"}
alt_vidlist=${alt_vidlist:-"/usr/share/discover/pci.lst"}
probe_order=${probe_order:-"ltsp discover"}

X_LINK=${X_LINK:-"$rw/etc/X"}

DEFAULT_SERVER=${SERVER:-"xapp"}
XDM_SERVER=${XDM_SERVER:-${DEFAULT_SERVER}}
XFCFG=${xf86config:-"/var/state/lessdisks/etc/XF86Config"}

if [ $# -lt 1 ]; then
    XF_ARGS=""
else
    XF_ARGS=$*
fi

get_ltsp_xserver(){
  # full id of the pci card
  pci_id=$1
  # manufactuer id number
  man_id=$(echo $pci_id | sed s/....$//g)
  # model id number
  card_id=$(echo $pci_id | sed s/^....//g)
  xdriver=$(egrep "^$man_id:$card_id" $vidlist | awk '{print $2}')
  echo $xdriver
}

get_discover_xserver(){
  # use discover-data
  pci_id=$(echo $1 | tr A-Z a-z)
  xdriver=$(egrep $pci_id $alt_vidlist | awk '/video/{print $3}' | sed s/Server://g | sed s/XFree86\(//g | tr ")" " ")
  echo $xdriver
}

get_xserver(){
  # TODO put probe_order somewhere else...
  for p in $probe_order; do
    case $p in
      ltsp) xdriver=$(get_ltsp_xserver $1) ;;
      discover) xdriver=$(get_discover_xserver $1) ;;
    esac
    if [ -n "$xdriver" ]; then
      break
    fi
  done
  echo $xdriver
}

check_cards(){
# TODO make use of this function
number_xservers=$(echo $xservers | wc -w)

if [ "$number_xservers" = "0" ]; then
  echo "ERROR: couldn't find any video cards"
  exit 1
elif [ "$number_xservers" -gt "1" ]; then
  # TODO real handling for multiple video cards...
  echo "WARNING: $number_xservers servers found, this script is prone to fail..."
fi
}

make_x_link(){
  if [ -z "$1" ]; then
    return 1
  fi
  if [ -x "$1" ] && [ ! -d "$1" ]; then
    X_BINARY_PATH="$1"
  elif [ -x "/usr/bin/X11/$1" ] && [ ! -d "/usr/bin/X11/$1" ]; then
    X_BINARY_PATH=/usr/bin/X11/$1
  elif [ -d /usr/bin/X11/ ]; then
    X_BINARY_PATH=/usr/bin/X11/$1
    echo "NOTE: setting X server to $X_BINARY_PATH, but"
    echo "  the appropriate X server is not installed."
    echo "  you will need an X server installed..."
    sleep 5
  fi
  if [ -L "$2" ] || [ -e "$2" ]; then
    mv -vf $2 $2.old
  fi
  ln -s $X_BINARY_PATH $2
}

################################################################################
#
# Setup the XF86Config file
#

XSERVER=${XSERVER:-"auto"}

if [ "${XSERVER}" = "auto" ]; then
    XSERVER=""
    echo "Scanning for video card"
    pci_ids=$(cut -f 2 /proc/bus/pci/devices)
    for x in $test_pci_ids $pci_ids ; do
        XSERVER=$(get_xserver $x)
        # TODO handle multple video cards
        if [ -n "$XSERVER" ]; then
          echo "found X server: $XSERVER"
          break
        fi
    done
    if [ -z "${XSERVER}" ]; then
        XSERVER=${DEFAULT_XSERVER:-"vesa"}
        echo
        echo "  WARNING: Auto probe of the video card failed"
        echo
        echo "assuming default of $XSERVER"
        sleep 5
    fi
fi

if [ "${XSERVER}" = "i810" ]; then
    if [ ! -f /tmp/i810_loaded ]; then
        modprobe agpgart
        touch /tmp/i810_loaded
    fi
fi

#
# Build the XF86Config file from entries in the lts.conf file
# If it starts with 'XF86_', then we use XFree86 3.3.6.  Otherwise,
# we use XFree86 4.x
#

if [ -e "${XFCFG}" ]; then
  cp -a ${XFCFG} ${XFCFG}.old
fi
case ${XSERVER} in
    XF86_*)  build_x3_cfg ${XSERVER} >${XFCFG}
             ;;
    *)       build_x4_cfg ${XSERVER} >${XFCFG}
             ;;
esac

################################################################################
#
# Figure out how to run the X server
#

if [ -e "$X_LINK" ]; then
  mv -f $X_LINK $X_LINK.old
fi
case ${XSERVER} in

    XF86_*|Xvnc)  XBINARY="${XSERVER}"
             XOPTS=""
             make_x_link $XSERVER $X_LINK
             ;;

    Xvesa)   XBINARY="Xvesa"
             make_x_link $XSERVER $X_LINK
             case "${X_MODE_0}" in
                 1280x1024)   XOPTS="-shadow -mode 0x011A"
                              ;;
                 1024x768)    XOPTS="-shadow -mode 0x0117"
                              ;;
                 800x600)     XOPTS="-shadow -mode 0x0114"
                              ;;
                 640x480)     XOPTS="-shadow -mode 0x0111"
                              ;;
                 *)           XOPTS="-shadow -mode 0x0117"
                              ;;
             esac
             ;;
             
    *)       XBINARY="XFree86"
             XOPTS=""
             make_x_link XFree86 $X_LINK
             ;;
esac
