#!/bin/sh

if [ ! $DISPLAY = "" ]; then
DCMD="Xdialog --wrap" 
CMD="rxvt -e "
else
DCMD="dialog"
CMD=""
fi


TMPFILE="/tmp/mkxf86config-$$"
MONITORTMP="$TMPFILE-monitor"

rm -f "$TMPFILE" "$MONITORTMP"

# Read in what vlsetup has found for X
# [ -f /etc/sysconfig/vector ] && . /etc/sysconfig/vector

#if [ "$XMODULE" = "nv" ] && [ -e /lib/modules/`uname -r`/kernel/drivers/video/NVdriver ]; then
#XMODULE="nvidia"
#fi

#if [ "$XMODULE" = "nv" ] && [ -e /lib/modules/`uname -r`/kernel/drivers/video/nvidia ]; then
#XMODULE="nvidia"
#fi

#if [ "$XMODULE" = "nv" ]; then
#installpkg /tmp/nvidia/NVIDIA_GLX-1.0-3123-i586-1.tgz 1>/dev/null 2>/dev/null
#kern=`uname -r`
#if echo $kern | grep -F ide ; then
#installpkg /tmp/nvidia/NVIDIA_kernel-1.0-3123-pentide-1-i586-1.tgz 1>/dev/null 2>/dev/null
#else
#installpkg /tmp/nvidia/NVIDIA_kernel-1.0-3123-pentscsi-1-i586-1.tgz 1>/dev/null 2>/dev/null
#fi
#XMODULE="nvidia"
#rm -rf /tmp/nvidia
#ldconfig 1>/dev/null 2>/dev/null
#depmod -a 1>/dev/null 2>/dev/null
#fi
#Lets test keyboard for non-us users
kmapset
. /etc/sysconfig/vector

# Wheel
$DCMD --title "Wheel Mouse Setup" --yesno "Does your mouse have a scroll wheel?" 0 0
case $? in
0)
WHEEL='s|"PS/2"|"IMPS/2"\
Option          "ZAxisMapping"          "4 5"|g;'
;;
1)
WHEEL=""
;;
255)
WHEEL=""
;;
esac

# Create mouse link and insert a mouse default type into XF86Config
# if not already done by hwsetup
[ -e /dev/mouse ] || ln -sf /dev/ttyS0 /dev/mouse
# PROTO="${XMOUSETYPE:-Auto}"
PROTO="${XMOUSETYPE0:-Microsoft}"
NOEMU=""
[ "${XEMU3}" = "no" ] && NOEMU='s|^.*Emulate3|# No 2 -> 3 Button emulation|g'
#DEADKEYS=""
#[ "$XKEYBOARD" = "de" ] || DEADKEYS='s|^.*nodeadkeys.*$||g;'
if [ -n "XMODULE" ]; then
# Check for Framebuffer X-Modules and initialize framebuffer module
case "$XMODULE" in
pvr2fb) modprobe "$XMODULE" >/dev/null 2>&1 ; XMODULE="fbdev"; ;;
esac
fi

# Try to get Monitor data via kudzu ddcxinfo


MONITOROK=""
MODEL="$(ddcprobe 2>/dev/null | awk 'BEGIN{m="Generic";i="Monitor"}/^Manufacturer:/{m=$2};/^ID:/{i=$2};END{print m " "i}')"
HREFRESH="$(ddcxinfo -hsync 2>/dev/null)"
VREFRESH="$(ddcxinfo -vsync 2>/dev/null)"
#MODELINES="$(ddcxinfo -modelines 2>/dev/null)"
#DEFAULTMODES='"1024x768" "800x600" "640x480"'
#MODES="Modes $DEFAULTMODES"
MINHREFRESH=""
MAXHREFRESH=""
MINVREFRESH=""
MAXVREFRESH=""

# Check values
#cat >"$MONITORTMP" <<EOF
#$MODELINES
#EOF
#while read a b c; do
# case "$a" in ModeLine)   NEWMODES="$NEWMODES $b"; ;; esac
#done < "$MONITORTMP"
rm -f "$MONITORTMP"
TFT=""
case "$MODEL" in *[Ll][Cc][Dd]*|*[Tt][Ff][Tt]*) TFT="true"; ;; esac
MINHREFRESH="${HREFRESH%%-*}"
MAXHREFRESH="${HREFRESH##*-}"
MINVREFRESH="${VREFRESH%%-*}"
MAXVREFRESH="${VREFRESH##*-}"
# Up to version 12-02-2002, settings like minhsync=maxhsync were allowed.
# This does not seem to work , the DDC probings are simply wrong.
# So, now -le has been changed to -lt
#if [ -n "$NEWMODES" -a -n "$MINHREFRESH" -a -n "$MAXHREFRESH" -a \
#     -n "$MINVREFRESH" -a -n "$MAXVREFRESH" -a \
#     "$MINHREFRESH" -ge 25 -a "$MAXHREFRESH" -le 220 -a \
#     "$MINHREFRESH" -lt "$MAXHREFRESH" -a \
#     "$MINVREFRESH" -ge 35 -a "$MAXVREFRESH" -le 200 -a \
#     "$MINVREFRESH" -lt "$MAXVREFRESH" ] 2>/dev/null ; then
#  ADDMODES=""
#  # These settigs are probably wrong.
#  [ "$MINHREFRESH" -eq "$MAXHREFRESH" ] 2>/dev/null && MINHREFRESH="$(($MINHREFRESH - 5))"
#  [ "$MINVREFRESH" -eq "$MAXVREFRESH" ] 2>/dev/null && MINVREFRESH="$(($MINVREFRESH - 5))"
##  for i in $NEWMODES; do
#   tmp="${i#*\"}"
#   hmode="${tmp%%x*}"
#   tmp="${tmp##*x}"
#   vmode="${tmp%%\"*}"
   # Filter invalid modes like "1x1"
#   [ -n "$hmode" -a -n "$vmode" -a "$hmode" -ge 320 -a "$vmode" -ge 200 ] 2>/dev/null || continue
   # For now, restrict "normal" monitors to a maximum of 1024x768
   # [ -z "$TFT" -a "$hmode" -gt 1024 ] 2>/dev/null && continue
#   ADDMODES="$ADDMODES $i"
#   [ "$hmode" -gt 1800 ] 2>/dev/null && ADDMODES="$ADDMODES "'"1800x1440"' # Add additional fallback mode
#   [ "$hmode" -gt 1600 ] 2>/dev/null && ADDMODES="$ADDMODES "'"1600x1200"' # Add additional fallback mode
#   [ "$hmode" -gt 1280 ] 2>/dev/null && ADDMODES="$ADDMODES "'"1280x1024"' # Add additional fallback mode
#   [ "$hmode" -gt 1152 ] 2>/dev/null && ADDMODES="$ADDMODES "'"1152x864"'  # Add additional fallback mode
   [ "$hmode" -gt 1024 ] 2>/dev/null && ADDMODES="$ADDMODES "'"1024x768"'  # Add additional fallback mode
#  done

#  if [ -n "$ADDMODES" ]; then
   # Sort modes
#   ADDMODES=$(for i in $ADDMODES; do echo "$i"; done | sort -n +0.1 -r | uniq)
#   MODES="Modes $(echo $ADDMODES)"
#  else
#   MODES="Modes $DEFAULTMODES"
#  fi

$DCMD --title "Screen Resolution Selection" \
--menu "Use the cursor or [+] [-] keys to navigate. \n\  Press [enter] to select the largest screen size you wish to use." 18 76 7 \
 "1800" "1800x1440" \
 "1600" "1600x1200" \
 "1280" "1280x1024" \
 "1152" "1152x864" \
 "1024" "1024x768" \
 "800"  "800x600" 2> /tmp/screen
if [ $? = 1 -o $? = 255 ]; then
  rm -f /tmp/screen
 clear
  exit 0
fi

SCREEN="`cat /tmp/screen`"
rm -f /tmp/screen

 if [ "$SCREEN" = "1800" ]; then
 MODES='Modes "1800x1440" "1600x1200" "1280x1024" "1152x864" "1024x768" "800x600" "640x480"'
 fi
 if [ "$SCREEN" = "1600" ]; then
 MODES='Modes "1600x1200" "1280x1024" "1152x864" "1024x768" "800x600" "640x480"'
 fi
 if [ "$SCREEN" = "1280" ]; then
 MODES='Modes "1280x1024" "1152x864" "1024x768" "800x600" "640x480"'
 fi
 if [ "$SCREEN" = "1152" ]; then
 MODES='Modes "1152x864" "1024x768" "800x600" "640x480"'
 fi
 if [ "$SCREEN" = "1024" ]; then
 MODES='Modes "1024x768" "800x600" "640x480"'
 fi
 if [ "$SCREEN" = "800" ]; then
 MODES='Modes "800x600" "640x480"'
 fi




  # Everything should be OK now.
  MONITOROK="yes"
# else
# HREFRESH=""
# VREFRESH=""
# fi

#if [ -n "$MONITOROK" ]; then
cat >"$MONITORTMP" <<EOF
Section "Monitor"
	Identifier   "Monitor0"
	ModelName    "$MODEL"
# These are the DDC-probed settings and modelines
	HorizSync    $HREFRESH
	VertRefresh  $VREFRESH
EndSection
EOF
#else



DEPTH=""
# We need to check this because serial mice have long timeouts
SERIALMOUSE="$(ls -l1 /dev/mouse* 2>/dev/null | awk '/ttyS/{print $NF ; exit 0}')"
if [ -n "$SERIALMOUSE" ]; then
SERIALMOUSE="s|/dev/ttyS0|$SERIALMOUSE|g;"
else
SERIALMOUSE='s|^.*InputDevice.*"Serial Mouse".*$|# Serial Mouse not detected|g;'
fi

# PS/2 bug: Some keyboards are incorrectly used as mice in XFree. :-(
PSMOUSE="$(ls -l1 /dev/mouse* 2>/dev/null | awk '/psaux/{print $NF ; exit 0}')"
if [ -n "$PSMOUSE" ]; then
PSMOUSE=""
else
PSMOUSE='s|^.*InputDevice.*"PS/2 Mouse".*$|# PS/2 Mouse not detected|g;'
fi

USBMOUSE="$(ls -l1 /dev/mouse* 2>/dev/null | awk '/input/{print $NF ; exit 0}')"
if [ -n "$USBMOUSE" ]; then
USBMOUSE=""
else
USBMOUSE='s|^.*InputDevice.*"USB Mouse".*$|# USB Mouse not detected|g;'
fi

if [ ! -f /etc/XF86Config-4 -a ! -f /etc/X11/XF86Config-4 ]; then 
rm -f /etc/XF86Config-4 /etc/X11/XF86Config-4 2>/dev/null
fi
# VMWare special handling
VMWARE=""
if [ "$XMODULE" = "vmware" ]; then
VMWARE='s|^.*BusID.*PCI.*$|BusID "PCI:0:15:0"|g;'
DEPTH='s|DefaultColorDepth |# DefaultColorDepth |g;'
fi

# These drivers need the sw_cursor option
SWCURSOR=""
case "$XMODULE" in ati|radeon|trident) SWCURSOR='s|^.*#Option.*"sw_cursor".*$|Option "sw_cursor"|g;';; esac

sed -e 's|@@PROTOCOL@@|'"$PROTO"'|g;'"$NOEMU" \
    -e '/@@MONITOR@@/r '"$MONITORTMP" \
    -e 's|@@MONITOR@@||g' \
    -e 's|Identifier  *"Monitor0"|Identifier   "Monitor0"\
Option "DPMS"|g' \
    -e 's|@@XMODULE@@|'"$XMODULE"'|g;'"$VMWARE""$SERIALMOUSE""$USBMOUSE""$PSMOUSE""$SWCURSOR""$WHEEL" \
    -e 's|@@MODES@@|'"$MODES"'|g;'"$DEPTH" \
    -e 's|"XkbLayout" *"[^"]*"|"XkbLayout" "'"$XKEYBOARD"'"|g;'"$DEADKEYS" \
    /etc/X11/XF86Config-4.in > /etc/X11/XF86Config-4

rm -f "$TMPFILE" "$MONITORTMP" 2>/dev/null

