#!/bin/zsh
# Filename:      grml-x
# Purpose:       wrapper for startx on grml [providing new xconfiguration tool]
# Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
# Bug-Reports:   see http://grml.org/bugs/
# License:       This file is licensed under the GPL v2.
# Latest change: Sam Aug 05 08:38:49 CEST 2006 [mika]
################################################################################

# some zsh-stuff {{{
  if [[ $DEBUG -gt 0 ]]; then
      setopt xtrace
  fi
  autoload colors ; colors
  [ -r /etc/grml_colors ] && . /etc/grml_colors
  [ -r /etc/grml/sh-lib ] && . /etc/grml/sh-lib
  if [ -r /etc/sysconfig/keyboard ] ; then
    source /etc/sysconfig/keyboard
  else
    XKEYBOARD='us'
  fi
# }}}

# warn if running as user root {{{
  if [[ $UID == 0 ]] ; then
     print "$bg[black]$fg[red]${bold_color}Warning: Please do not run grml-x as user root.${reset_color}"
     print "$bg[black]$fg[red]${bold_color}Running grml-x as user root is *not* supported!${reset_color}"
     print "$bg[black]$fg[red]${bold_color}Switch to user grml or run su - grml -c 'grml-x ...' instead.${reset_color}"
     # exit -1
  fi
  fstabuser=$(grep ':x:1000:' /etc/passwd)
  export fstabuser=${fstabuser%%[:]*}
# }}}

# set variables  {{{
  PROGRAMNAME=${0##*/}
  HWINFO='/usr/sbin/hwinfo'
  DATE=$(date)
  (( ${+XINITRC} )) || XINITRC="$HOME/.xinitrc"
# }}}

# usage information {{{
usage()
{
  if [[ $1 != '' ]] ; then echo 1>&2 "\n$1" ; fi
  print "$bg[black]$fg[red]$bold_color"
  print 1>&2 "
Usage: $PROGRAMNAME
       $PROGRAMNAME [-options] windowmanager

Examples:
  $PROGRAMNAME wmii
  $PROGRAMNAME pekwm
  $PROGRAMNAME fluxbox
  $PROGRAMNAME -force -nostart fluxbox
  $PROGRAMNAME -nosynaptics fluxbox
  $PROGRAMNAME -nosync fluxbox
  $PROGRAMNAME -noddc wmii
  $PROGRAMNAME -nousb fluxbox
  $PROGRAMNAME -module radeon -mode 1024x768 -vsync 60 wmi
  XINITRC=~/.xinitrc $PROGRAMNAME ion
  $PROGRAMNAME -display 8 wmii

More information on grml-x can be found in the manual page: man grml-x

Report bugs, send wishes and feedback to the grml team:
http://grml.org/bugs/ - contact (at) grml.org
"
#  $PROGRAMNAME wmi -- :8
  print "${reset_color}"
  exit 2
}
# }}}

# writehwinfo {{{
writehwinfo()
{
   HWINFO_TMP="/tmp/hwinfo.$$"
   if [[ $UID == 0 ]] ; then
     su - $fstabuser -c "$HWINFO > $HWINFO_TMP"
   else
     $HWINFO > $HWINFO_TMP
   fi
}
# }}}

# monitor {{{
monitor()
{
  MONITORINFO="/tmp/monitorinfo.$$"
  sudo $HWINFO --monitor > $MONITORINFO
}
# }}}

# mode {{{
mode()
{
   modes=$(perl -e 'while (<STDIN>) {if (/  Resolution:/) { s/.*\s+(\d+x\d+).*/$1/; print} }' < $MONITORINFO |
sort -nur | perl -ne 's/\s+/ /; s/(\d+x\d+)/"$1"/; print')
   if [[ -n $NODDC ]] ; then
     MODES='Modes "1024x768" "800x600" "640x480"  "1600x1200" "1280x1024" "1280x960"'
   elif [[ "$modes" == "\"1024x768\" " || -z $modes ]] ; then
     MODES='# Modes "1024x768" "800x600" "640x480"  "1600x1200" "1280x1024" "1280x960"'
   else
     MODES="# Modes $modes"
   fi
}
# }}}

# sync - get hsync/vsync settings {{{
sync()
{
   monitor # get monitor settings
   vsyncval=$(awk '/Vert. Sync Range:/{print $4}' $MONITORINFO | sed 's/-/.0 - / ; s/$/.0/' | head -1)
   hsyncval=$(awk '/Hor. Sync Range:/{print $4}'  $MONITORINFO | sed 's/-/.0 - / ; s/$/.0/' | head -1)
   if [ -z $vsyncval ] ; then
     vsyncval='50.0 - 60.0'
   fi
   if [ -z $hsyncval ] ; then
     hsyncval='28.0 - 96.0'
   fi
}
sync
# }}}

# mouse {{{
mouse()
{
   MOUSEINFO="/tmp/mouse.$$"
#   if [[ $UID == 0 ]] ; then
#     su - $fstabuser -c "$HWINFO --mouse > $MOUSEINFO"
#   else
     sudo $HWINFO --mouse > $MOUSEINFO
#   fi

   # SynPS/2 Synaptics TouchPad
   if grep -q 'Device:.*Synaptics' "$MOUSEINFO" ; then
    if [[ "$SYNAPTICS" == "yes" ]] ; then # check for '-nosynaptics'-option
     MOUSEDRIVER='synaptics'
     # SYNMOUSE='InputDevice    "Synaptics" "CorePointer"'
     SYNMOUSE='InputDevice    "Synaptics"  "AlwaysCore"'
     SYNMOUSEDETAIL="
Section \"InputDevice\"
  Driver        \"synaptics\"
  Identifier    \"Synaptics\"
  Option        \"Device\"        \"/dev/psaux\"
  Option        \"Protocol\"      \"auto-dev\"
  Option        \"LeftEdge\"      \"1700\"
  Option        \"RightEdge\"     \"5300\"
  Option        \"TopEdge\"       \"1700\"
  Option        \"BottomEdge\"    \"4200\"
  Option        \"FingerLow\"     \"25\"
  Option        \"FingerHigh\"    \"30\"
  Option        \"ZAxisMapping\"   \"4 5\"
  Option        \"MaxTapTime\"    \"180\"
  Option        \"MaxTapMove\"    \"220\"
  Option        \"VertScrollDelta\" \"100\"
  Option        \"MinSpeed\"      \"0.06\"
  Option        \"MaxSpeed\"      \"0.12\"
  Option        \"AccelFactor\" \"0.0010\"
#  Option       \"SHMConfig\"     \"on\"
#  Option       \"Repeater\"      \"/dev/ps2mouse\"
EndSection
"
    else
     MOUSEDRIVER='mouse'
     SYNMOUSEDETAIL=""
     SYNMOUSE='# No synaptics touchpad detected.'
    fi
   else

    # AlpsPS/2 ALPS TouchPad (with Synapticsdriver)
    if grep -q 'Device:.*ALPS' "$MOUSEINFO" ; then
     if [[ "$SYNAPTICS" == "yes" ]] ; then # check for '-nosynaptics'-option
      MOUSEDRIVER='synaptics'
      # SYNMOUSE='InputDevice    "Synaptics" "CorePointer"'
      SYNMOUSE='InputDevice    "Synaptics"  "AlwaysCore"'
      SYNMOUSEDETAIL="
Section \"InputDevice\"
  Driver        \"synaptics\"
  Identifier    \"Synaptics\"
  Option        \"Device\"        \"/dev/psaux\"
  Option        \"Protocol\"      \"auto-dev\"
  Option        \"LeftEdge\"      \"120\"
  Option        \"RightEdge\"     \"850\"
  Option        \"TopEdge\"       \"120\"
  Option        \"BottomEdge\"    \"650\"
  Option        \"FingerLow\"     \"14\"
  Option        \"FingerHigh\"    \"15\"
  Option        \"ZAxisMapping\"   \"4 5\"
  Option        \"MaxTapTime\"    \"180\"
  Option        \"MaxTapMove\"    \"50\"
  Option        \"MaxDoubleTapTime\"    \"100\"
  Option        \"VertScrollDelta\" \"20\"
  Option        \"HorizScrollDelta\" \"20\"
  Option        \"MinSpeed\"      \"0.3\"
  Option        \"MaxSpeed\"      \"2.00\"
  Option        \"AccelFactor\" \"0.030\"
  Option        \"UpDownScrolling\" \"1\"
  Option        \"EmulateMiddleButtonTime\" \"75\"
  Option        \"CircularScrolling\" \"1\"
  Option        \"CircScrollDelta\" \"0.1\"
  Option        \"CircScrollTrigger\" \"8\"
#  Option       \"SHMConfig\"     \"on\"
#  Option       \"Repeater\"      \"/dev/ps2mouse\"
EndSection
"
     else
      MOUSEDRIVER='mouse'
      SYNMOUSEDETAIL=""
      SYNMOUSE='# No alps touchpad detected.'
     fi
    else
      SYNMOUSE='# No alps touchpad present.'
    fi
   fi

   # USB-PS/2 Optical Mouse
#   if grep -q 'Device:.*USB' "$MOUSEINFO" ; then
   if ! [[ -n $NOUSB ]] ; then
     USB='yes'
     USBMOUSE='InputDevice    "USB Mouse"  "CorePointer"'
     USBMOUSEDETAIL="
Section \"InputDevice\"
        Identifier      \"USB Mouse\"
        Driver          \"mouse\"
        Option          \"Device\"                \"/dev/input/mice\"
        Option          \"Protocol\"              \"auto\"
        Option          \"ZAxisMapping\"          \"4 5\"
        Option          \"Buttons\"               \"5\"
        Option          \"SendCoreEvents\"        \"true\"
EndSection
"
   else
     USBMOUSE='# Deactivated USB Mouse as requested.'
   fi

   if grep -q 'Device:.*Serial' "$MOUSEINFO" ; then
     SERIAL='yes'
     SERMOUSE='InputDevice    "Serial Mouse" "CorePointer"'
     SERMOUSEDETAIL="
Section \"InputDevice\"
        Identifier  \"Serial Mouse\"
        Driver      \"mouse\"
        Option      \"Device\" \"/dev/ttyS0\"
        Option      \"Protocol\" \"Microsoft\"
        Option      \"Emulate3Buttons\" \"true\"
        Option      \"Emulate3Timeout\" \"70\"
        Option      \"SendCoreEvents\"  \"true\"
EndSection
"
   else
     SERMOUSE='# No serial mouse detected.'
   fi

   # ImExPS/2 Logitech Explorer Mouse
   # "PS2++ Logitech MX Mouse"
   if ! [[ -n $NOPS2 ]] ; then
     if grep -qE 'Device:.*PS.?2' "$MOUSEINFO" ; then
       PS2='yes'
       PS2MOUSE='InputDevice    "PS/2 Mouse" "CorePointer"'
       PS2MOUSEDETAIL="
Section \"InputDevice\"
        Identifier  \"PS/2 Mouse\"
        Driver      \"mouse\"
        Option      \"Device\" \"/dev/input/mice\"
        # Option      \"Device\" \"/dev/psaux\"
        Option      \"Protocol\" \"PS/2\"
        Option      \"Emulate3Buttons\" \"true\"
        Option      \"Emulate3Timeout\" \"70\"
        Option      \"SendCoreEvents\"  \"true\"
EndSection
"
     else
       PS2MOUSE='# No PS/2 mouse detected.'
       PS2MOUSEDETAIL=""
     fi
   else
     PS2MOUSE='# Deactivated PS/2 Mouse as requested.'
   fi

   if [[ -n $GENERICMOUSE ]] ; then
     GENERIC='yes'
     GENERICMOUSE='InputDevice    "Generic Mouse" "CorePointer"'
     GENERICMOUSEDETAIL="
Section \"InputDevice\"
        Identifier  \"Generic Mouse\"
        Driver      \"mouse\"
        Option      \"Device\" \"/dev/input/mice\"
        Option      \"Protocol\" \"auto\"
        Option      \"Buttons\" \"5\"
        Option      \"ZAxisMapping\" \"4 5\"
EndSection
"
   else
     GENERICMOUSE='# No generic mouse configured.'
   fi

   MOUSE="        $USBMOUSE
        $PS2MOUSE
        $SYNMOUSE
        $GENERICMOUSE
        $SERMOUSE"
}
# }}}

# commandline parsing {{{
parse_options()
{
   # default values
   #o_xserver=(-xserver XFree86)
   #o_hsync=(-hsync '28.0 - 96.0')
   #o_vsync=(-vsync '50.0 - 60.0')

   zparseopts -K -- xserver:=o_xserver module:=o_module help=o_help noddc=o_noddc nosync=o_nosync \
                    vsync:=o_vsync hsync:=o_hsync mode:=o_mode force=o_force display:=o_display   \
                    nostart=o_nostart nodpms=o_nodpms nosynaptics=o_nosynaptics nousb=o_nousb \
                    nops2=o_nops2 genmouse=o_genmouse novref=o_novref nohsync=o_nohsync

   if [[ $# == 0 || "$o_help" != "" || "$1" == '-h' || "$1" == '--help' ]]; then
      usage
   fi

   if [[ "$o_force" != "" ]]; then
      FORCE="yes"
   fi

   if [[ "$o_nodpms" != "" ]]; then
      DPMS='Option       "DPMS"      "false"'
   else
      DPMS='Option       "DPMS"      "true"'
   fi

   if [[ "$o_noddc" != "" ]]; then
      NODDC="yes"
   fi

   if [[ "$o_vsync" != "" ]]; then
      FORCE="yes"
   fi

   if [[ "$o_hsync" != "" ]]; then
      FORCE="yes"
   fi

   if [[ "$o_xserver" != "" ]]; then
      FORCE="yes"
   fi

   if [[ "$o_nousb" != "" ]]; then
      NOUSB='yes'
   fi

   if [[ "$o_nops2" != "" ]]; then
      NOPS2='yes'
   fi

   if [[ "$o_genmouse" != "" ]]; then
      GENERICMOUSE='yes'
   fi

   if [[ "$o_nosynaptics" != "" ]]; then
      SYNAPTICS='no'
   else
      SYNAPTICS='yes'
   fi

   if [[ "$o_nostart" != "" ]]; then
      NOSTART="yes"
   fi

   DISPLAY=$o_display[2]
   if [ -z $o_hsync ] ; then
     o_hsync=(-hsync "$hsyncval")
     HSYNC=$o_hsync[2]
     HORIZSYNC="        HorizSync    $HSYNC"
   else
     o_hsync=(-hsync "$o_hsync[2]")
     HSYNC=$o_hsync[2]
     HORIZSYNC="        HorizSync    $HSYNC"
   fi

   if [ -z $o_vsync ] ; then
     o_vsync=(-vsync "$vsyncval")
     VSYNC=$o_vsync[2]
     VERTISYNC="        VertRefresh  $VSYNC"
   else
     o_vsync=(-vsync "$o_vsync[2]")
     VSYNC=$o_vsync[2]
     VERTISYNC="        VertRefresh  $VSYNC"
   fi

   if [[ "$o_nosync" != "" ]]; then
      HORIZSYNC="#       HorizSync   28.0 - 96.0  # deactivated via -nosync option of grml-x"
      VERTISYNC="#       VertRefresh 50.0 - 60.0  # deactivated via -nosync option of grml-x"
   fi
   if [[ "$o_nohsync" != "" ]]; then
      HORIZSYNC="#       HorizSync   28.0 - 96.0  # deactivated via -nohsync option of grml-x"
   fi
   if [[ "$o_novref" != "" ]]; then
      VERTISYNC="#       VertRefresh 50.0 - 60.0  # deactivated via -novref option of grml-x"
   fi

   eval WINDOWMANAGER=\${$#}

   XSERVER=$o_xserver[2]
   if [[ -n $(X -version 2>&1| grep XFree86) || "$XSERVER" == XFree86 ]] ; then
      XSERVER="XFree86"
      XCONFIG='/etc/X11/XF86Config-4'
      KEYBOARD="Driver      \"keyboard\"
        Option      \"XkbRules\" \"xfree86\"
        Option      \"XkbModel\" \"pc105\"
        Option      \"XkbLayout\" \"${XKEYBOARD}\"
        #Option      \"XkbVariant\" \"nodeadkeys\""
   elif [[ -n $(X -version 2>&1 | grep -e 'X\.Org' -e 'Version 7\.') || "$XSERVER" == Xorg ]] ; then
      XSERVER="Xorg"
      XCONFIG='/etc/X11/xorg.conf'
      KEYBOARD="Driver      \"kbd\"
        #Option      \"XkbRules\"   \"xfree86\"
        Option      \"XkbRules\"   \"xorg\"
        Option      \"XkbModel\"   \"pc105\"
        Option      \"XkbLayout\"  \"${XKEYBOARD}\"
        #Option      \"XkbVariant\" \"nodeadkeys\""
   fi

   # check for font path
   if [ -d /usr/share/fonts/X11 ] ; then
      XFONTS="        FontPath     \"/usr/share/fonts/X11/misc\"
        FontPath     \"/usr/share/fonts/X11/cyrillic\"
        FontPath     \"/usr/share/fonts/X11/100dpi/:unscaled\"
        FontPath     \"/usr/share/fonts/X11/75dpi/:unscaled\"
        FontPath     \"/usr/share/fonts/X11/Type1\"
        FontPath     \"/usr/share/fonts/X11/100dpi\"
        FontPath     \"/usr/share/fonts/X11/75dpi\""
   fi
   if [ -d /usr/X11R6/lib/X11/fonts ] ; then
       XFONTS="$XFONTS
        FontPath     \"/usr/X11R6/lib/X11/fonts/misc:unscaled\"
        FontPath     \"/usr/X11R6/lib/X11/fonts/misc\"
        FontPath     \"/usr/X11R6/lib/X11/fonts/75dpi:unscaled\"
        FontPath     \"/usr/X11R6/lib/X11/fonts/75dpi\"
        FontPath     \"/usr/X11R6/lib/X11/fonts/100dpi:unscaled\"
        FontPath     \"/usr/X11R6/lib/X11/fonts/100dpi\""
   fi

   if [[ "$XKEYBOARD" == de ]] ; then
       KEYBOARD="$KEYBOARD
       Option      \"XkbVariant\" \"nodeadkeys\""
   fi

   print -n "$bold_color$fg[blue]Gathering hardware information: $fg[red]"

   writehwinfo
   MONITOR=$(awk '/monitor.1:/{print $3}' $HWINFO_TMP)
   if [[ $MONITOR != 'ddc' ]] ; then
     NODDC=yes
   fi
   MODULE=$o_module[2]
   if [ -z $MODULE ] ; then
     MODULE="$(getBootParam xmodule 2>/dev/null)"
     if [ -z "$MODULE" ] ; then
       MODULE=$(grep 'XFree86 v4 Server Module:' "${HWINFO_TMP}" | head -1 | awk '{print $5}')
       if [ -z  "$MODULE" ] ; then
         MODULE='vesa'
       fi
     fi
   else
     FORCE="yes"
   fi

   mouse    # get mouse settings
   VGA=$(lspci | grep VGA | sed 's/.*compatible controller: //' | head -1)

   MODE=$o_mode[2]
   if [ -z $MODE ] ; then
     mode # get available modes
   else
     MODES="Modes \"$MODE\""
     FORCE="yes"
   fi

   print "$fg[green]done$reset_color"


   print "$bg[black]$fg[white]$bold_color"
   print "$fg[green]Specified windowmanager is $fg[yellow]$WINDOWMANAGER"
   print "$fg[green]Video is $fg[yellow]$VGA$fg[green] using $bg[black]$fg[yellow]${XSERVER}$fg[cyan](${MODULE})$fg[green] Server"
   [[ -z $HSYNC ]] && [[ -z $VSYNC ]] && print "$fg[green]Monitor is $fg[yellow]$MONITOR"
   [[ -z $HSYNC ]] && [[ -n $VSYNC ]] && print "$fg[green]Monitor is $fg[yellow]$MONITOR$fg[green], VSYNC: $fg[yellow]$VSYNC"
   [[ -z $VSYNC ]] && [[ -n $HSYNC ]] && print "$fg[green]Monitor is $fg[yellow]$MONITOR$fg[green], HSYNC: $fg[yellow]$HSYNC"
   [[ -n $VSYNC ]] && [[ -n $HSYNC ]] && print "$fg[green]Monitor is $fg[yellow]$MONITOR$fg[green], HSYNC: $fg[yellow]$HSYNC $fg[green]VSYNC: $fg[yellow]$VSYNC"
   [[ -n $modes ]] && print "$fg[green]Using default X.org modes."
   [[ -z $modes ]] && print "$fg[green]Using Mode: $fg[yellow]$MODE"
#   [[ -n $MODE ]] && print "$fg[green]Using Mode: $fg[yellow]$MODE"
#   [[ -z $MODE ]] && print "$fg[green]Using default modes."
   print "${reset_color}"
#   if [[ $module[1] != ./. ]]; then module="$PWD/$module"; fi
}
parse_options $*
# }}}

# check for requirements {{{
requirements()
{
if ! [ -x $(which hwinfo) ] ; then
  print "$bg[black]$fg[red]${bold_color}Error: hwinfo not found in path.${reset_color}
Note:  run 'apt-get install hwinfo' on systems running debian.
Exiting.${reset_color}"
  exit -1
fi

if ! [[ -d /sys ]] ; then
  print "$bg[black]$fg[red]${bold_color}Error: mounted /sys required (for hwinfo).${reset_color}
You may want to add the following line to your /etc/fstab:

  sysfs /sys sysfs defaults 0 0

or just run 'mount /sys'. Exiting.${reset_color}"
  exit -1
fi
}
requirements
# }}}

# xconfig {{{
xconfig() {
cat << EOX
################################################################################
# Filename:      $XCONFIG
# Purpose:       config file for xserver - generated by grml-x
# Bug-Reports:   see http://grml.org/bugs/
# Latest change: ${DATE}
# See also:
#   /usr/share/doc/xserver-xorg/   and
#   http://wiki.x.org/wiki/Home    and
#   http://ftp.x.org/pub/X11R7.0/doc/html/index.html for information on Xorg
#   /usr/share/doc/xfree86-common/                   for information on XFree86
# Refer to the xorg.conf man page and to
# http://ftp.x.org/pub/X11R7.0/doc/html/xorg.conf.5.html
# for details about the format of this file.
# 
# If you would like this file to be automatically reconfigured by debian,
# run the following command:
#   sudo dpkg-reconfigure -phigh xserver-xorg
################################################################################

Section "ServerLayout"
        Identifier     "XServer Configured"
        Screen      0  "Screen0" 0 0
        InputDevice    "Keyboard0"  "CoreKeyboard"
$MOUSE
EndSection

Section "ServerFlags"
        Option "AllowMouseOpenFail"  "true"  # allows the server to start up even if the mouse does not work
        Option "DontVTSwitch"        "false" # allow switching between virtual terminal
        # Option "DontZap"             "true"  # disable <Crtl><Alt><BS> (server abort)
        # Option "DontZoom"            "true"  # disable <Crtl><Alt><KP_+>/<KP_-> (resolution switching)
EndSection

Section "Files"
#        RgbPath      "/usr/X11R6/lib/X11/rgb"
#        ModulePath   "/usr/X11R6/lib/modules"
# More information:  http://ftp.x.org/pub/X11R7.0/doc/html/fonts.html
$XFONTS
# check:
#       FontPath     "/usr/X11R6/lib/X11/fonts/Speedo"
#       FontPath     "/usr/X11R6/lib/X11/fonts/PEX"
#       FontPath     "/usr/X11R6/lib/X11/fonts/encodings"
#       FontPath     "/usr/X11R6/lib/X11/fonts/Type1
#       FontPath     "/usr/X11R6/lib/X11/fonts/util
# Additional fonts: Locale, Gimp, TTF...
#       FontPath     "/usr/X11R6/lib/X11/fonts/cyrillic"
#       FontPath     "/usr/X11R6/lib/X11/fonts/latin2/75dpi"
#       FontPath     "/usr/X11R6/lib/X11/fonts/latin2/100dpi"
# True type and type1 fonts are also handled via xftlib, see /etc/X11/XftConfig!
        FontPath     "/usr/X11R6/lib/X11/fonts/Type1"
        FontPath     "/usr/share/fonts/ttf/western"
        FontPath     "/usr/share/fonts/ttf/decoratives"
#        FontPath     "/usr/share/fonts/truetype"
#        FontPath     "/usr/share/fonts/truetype/openoffice"
        FontPath     "/usr/share/fonts/truetype/ttf-bitstream-vera"
#       FontPath     "/usr/share/fonts/truetype/latex-xft-fonts"
        FontPath     "/usr/share/fonts/latex-ttf-fonts"
        FontPath     "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
#       FontPath     "/usr/X11R6/lib/X11/fonts/defoma/TrueType"
#       FontPath     "/usr/X11R6/lib/X11/fonts/defoma/CID"
EndSection

# Modules - see /usr/X11R6/lib/modules/fonts and /usr/X11R6/lib/modules/extensions
Section "Module"
        Load  "dbe"       # double buffer extension
        Load  "dri"       # direct rendering
        Load  "glx"       # 3D layer
        Load  "type1"     # font module
        Load  "freetype"  # font rendering
        Load  "extmod"    # some commonly used server extensions (e.g. shape extension)
        Load  "record"    # recording extension
        # Load  "vbe"       # Vesa BIOS Extension
        # Load  "ddc"       # ddc probing of monitor
        # Load  "bitmap"    # bitmap fonts
        # Load  "GLcore"    # render OpenGL in software
        # Load  "i2c"       # I2C bus
        # Load  "int10"     # initialize graphics cards via int10 call to the BIOS
        # Load  "speedo"    # font module
        # Load  "v4l"       # Video for Linux
        # Load  "evdev"     # generic input handling driver on Linux
# Valid entries - see /usr/lib/xorg/modules/[extensions/]
# afb bitmap cfb cfb16 cfb24 cfb32 cw damage dbe ddc dri drm extmod fb
# fbdevhw freetype GLcore glx i2c int10 int10 layer mfb pcidata rac ramdac
# record scanpci shadow shadowfb type1 vbe vgahw xaa xf1bpp xf24_32bpp xf4bpp
# xf8_16bpp xf8_32bpp xtrap
EndSection

# If you'd like to switch the positions of your capslock and control keys, use:
# Option "XkbOptions" "ctrl:swapcaps"
# Or if you just want both to be control, use:
# Option "XkbOptions" "ctrl:nocaps"
# More information: http://ftp.x.org/pub/X11R7.0/doc/html/XKB-Config.html
Section "InputDevice"
        Identifier  "Keyboard0"
        Option      "CoreKeyboard"
        $KEYBOARD
EndSection

# More information: http://ftp.x.org/pub/X11R7.0/doc/html/mouse.html
$GENERICMOUSEDETAIL
$USBMOUSEDETAIL
$PS2MOUSEDETAIL
$SERMOUSEDETAIL
$SYNMOUSEDETAIL
Section "Monitor"
        Identifier   "Monitor0"
#       ModelName    "Old Monitor (no DDC)"
        $DPMS
#       HorizSync    28.0 - 78.0 # Warning: This may fry very old Monitors
#       HorizSync    28.0 - 96.0 # Warning: This may fry old Monitors
$HORIZSYNC
#       VertRefresh  50.0 - 76.0 # Very conservative. May flicker.
#       VertRefresh  50.0 - 60.0 # Extreme conservative. Will flicker. TFT default.
$VERTISYNC
# Need more information?
#  http://xtiming.sourceforge.net/cgi-bin/xtiming.pl
#  http://en.tldp.org/HOWTO/XFree86-Video-Timings-HOWTO/
EndSection

Section "Device"
        ### Available Driver options are:
        ## sw_cursor is needed for some ati and radeon cards
        # Option     "sw_cursor"
        # Option     "hw_cursor"
        # Option     "NoAccel"
        # Option     "ShowCache"
        # Option     "ShadowFB"
        # Option     "UseFBDev"
        # Option     "Rotate"
        ## xorg + nvidia:
        # Option "RenderAccel" "true"
        # Option "AllowGLXWithComposite" "true"
        Identifier  "Card0"
# The following line is auto-generated by grml-x
        Driver      "$MODULE"
        VendorName  "All"
        BoardName   "All"
        ## Workaround for drivers which send output to wrong device:
        # Option "MonitorLayout" "LVDS, AUTO"
        # Option "MonitorLayout" "LVDS, CRT"
        # Option "MonitorLayout" "NONE, STV"
        # Option "MonitorLayout" "LVDS"
        ## Specify BusID:
        # BusID       "PCI:1:0:0"
EndSection

Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        DefaultColorDepth 16
        SubSection "Display"
                Depth     1
                $MODES
        EndSubSection
        SubSection "Display"
                Depth     4
                $MODES
        EndSubSection
        SubSection "Display"
                Depth     8
                $MODES
        EndSubSection
        SubSection "Display"
                Depth     15
                $MODES
        EndSubSection
        SubSection "Display"
                Depth     16
                $MODES
        EndSubSection
        SubSection "Display"
                Depth     24
                $MODES
        EndSubSection
        SubSection "Display"
                Depth     32
                $MODES
        EndSubSection
EndSection

Section "DRI"
        Mode 0666
EndSection

#Section "Extensions"
#    Option "Composite" "Enable"
#EndSection

## END OF FILE #################################################################
EOX
}
# }}}

# writeit {{{
writeit() {
    XCONFTMP="/tmp/xconfig.$$"
    xconfig > $XCONFTMP
    [ -f $XCONFIG ] && sudo mv -f $XCONFIG $XCONFIG.old
    sudo mv $XCONFTMP $XCONFIG
    sudo chown root.root $XCONFIG
    sudo chmod 644 $XCONFIG
}
# }}}

# writeconfig {{{
function writeconfig
{
  if [[ ! -f $XCONFIG ]] ; then
    print -n "$bold_color$fg[blue]Creating $XCONFIG: $fg[red]"
    writeit && print "$fg[green]done$reset_color"
  else
    print "$bold_color$fg[blue]Notice: $XCONFIG exists already.
Use the force-option (-force) to force creation.
$fg[red]"
  fi
  if [[ -n "$FORCE" ]] ; then
    print "$bold_color$fg[blue]Force-switch or manual option(s) detected -"
    print -n "moving eventual existing $XCONFIG to ${XCONFIG}.old: $fg[red]"
    writeit && print "$fg[green]done$reset_color"
  fi
}
# }}}

# runit {{{
function runit
{
  writeconfig
  if [ -z $NOSTART ] ; then
    print "$reset_color"
    if [ -x /etc/init.d/xorg-common ] ; then
      sudo /etc/init.d/xorg-common start
    else
      if [ -x /etc/init.d/xfree86-common ] ; then
        sudo /etc/init.d/xfree86-common start
      fi
    fi
    print ""
    if [ -z $DISPLAY ] ; then
      print "$bold_color$fg[green]Now trying to run startx.$reset_color"
      startx ~/.xinitrc -- $XOPTS
    else
      print "$bold_color$fg[green]Now trying to run startx on display $DISPLAY.$reset_color"
      startx ~/.xinitrc -- :$DISPLAY $XOPTS
    fi
  else
    print "$bold_color$fg[blue]Not running startx as requested as option.$reset_color"
  fi
  return 1
}
# }}}

# failed {{{
function failed
{
  print "$fg[red]"
  if [ $UID != 0 ] ; then
    if [[ $(tty) == /dev/pts/* ]] ; then
      print "It seems you are running $PROGRAMNAME from inside GNU screen.
Notice that this might fail if running as user grml!
Please exit screen and try to run $PROGRAMNAME again."
    fi
  fi
  print "
Problems? Run the following commands for getting information on your hardware:
  hwinfo --gfxcard
  discover -v --data-path=xfree86/server/device/driver display
  xdebconfigurator -c -d -i -x
  get-edid | parse-edid

Do you want to go the debian way of life? Run:
  apt-get install x-window-system-core read-edid mdetect hwinfo xdebconfigurator
  dpkg-reconfigure x-window-system-core (or xserver-xfree86 or xserver-xorg depending on your system)

Problems with the module used for X? Try to load another one or
fall back to module vesa:
  $PROGRAMNAME -module radeon ...
  $PROGRAMNAME -module vesa  ...

Do you want to deactivate a present synaptics touchpad? Run:
  $PROGRAMNAME -nosynaptics ...

Your monitor is very old and/or does not support DDC-probing?
  $PROGRAMNAME -noddc ...

Do you want to create a x configuration file but do not start X?
  $PROGRAMNAME -nostart ...

Monitor frequency too high or too low? Just specify hsync/vsync manually:
  $PROGRAMNAME -hsync 30-65 ...
  $PROGRAMNAME -hsync 30-65 -vsync 50-60 ...

Want to adjust the resolution? Use the mode-switch:
  $PROGRAMNAME -mode 1024x768 ...
  $PROGRAMNAME -mode '1280x1024 1024x768' ...

To adjust resolution while running X execute:
  xrandr -s '1024x768'

More information on grml-x can be found in the manual page: man grml-x

Report bugs, send wishes and feedback to the grml team:
http://grml.org/bugs/ - contact (at) grml.org
"
print -n "$reset_color"
}
# }}}

# cleanup {{{
cleanup()
{
  rm -f $HWINFO_TMP
  rm -f $MONITORINFO
  rm -f $MOUSEINFO
  rm -f $XCONFTMP
}
cleanup
# }}}

# xinitrc {{{
  if [ -w $XINITRC ] ; then
    sed -i "s|^[^#]*exec.*|  exec $WINDOWMANAGER|g" $XINITRC
    runit || failed
  else
    echo -e "#!/bin/sh\n  exec $WINDOWMANAGER" >> $XINITRC
    runit || failed
  fi
# }}}

## END OF FILE #################################################################
# vim:foldmethod=marker
