Fix virtualbox config, deactivate type1 and freetype module
[grml-x.git] / grml-x
1 #!/bin/zsh
2 # Filename:      grml-x
3 # Purpose:       wrapper for startx on grml [providing new xconfiguration tool]
4 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
5 # Bug-Reports:   see http://grml.org/bugs/
6 # License:       This file is licensed under the GPL v2.
7 ################################################################################
8
9 # debugging {{{
10 # usage: DEBUG=1 grml-x ..... 2>/tmp/grml-x-debug.log
11   if [[ $DEBUG -gt 0 ]]; then
12       setopt xtrace
13   fi
14 # }}}
15
16 # functions and color {{{
17   # use colors only if not booted with nocolor bootoption
18   if ! grep -q nocolor /proc/cmdline ; then
19      autoload colors ; colors
20      [ -r /etc/grml_colors ] && . /etc/grml_colors
21   fi
22
23   # some functions like getBootParam
24   if [ -r /etc/grml/script-functions -a -r /etc/grml/sh-lib ] ; then
25      source /etc/grml/script-functions
26      source /etc/grml/sh-lib
27   else
28     echo 'Error: sourcing function files failed. Exiting.'
29     exit 1
30   fi
31
32   check4root &>/dev/null && ROOT='1' || ROOT=''
33 # }}}
34
35 # set variables  {{{
36   PROGRAMNAME=${0##*/}
37   HWINFO='/usr/sbin/hwinfo'
38   DATE=$(date)
39   [ -n "$XINITRC" ] || XINITRC="$HOME/.xinitrc"
40
41   # temporary files
42   # notice: we need the unsafe option, otherwise users other than root
43   # can not write to HWINFO_TMP, but we don't want to run hwinfo as root
44   HWINFO_TMP="$(mktemp -u)" || exit 1
45   MONITORINFO="$(mktemp)"   || exit 1
46   MOUSEINFO="$(mktemp)"     || exit 1
47
48   if [ -z "$HWINFO_TMP" ] ; then
49      echo "Fatal: could not create temporary file. Exiting.">&2
50      bailout 1
51   fi
52
53   if [ -r /etc/sysconfig/keyboard ] ; then
54     source /etc/sysconfig/keyboard
55   else
56     XKEYBOARD='us'
57   fi
58
59   XSERVER="Xorg"
60   XCONFIG='/etc/X11/xorg.conf'
61   KEYBOARD="# Driver      \"kbd\"
62 #         Option      \"XkbRules\"   \"xfree86\"
63 #         Option      \"XkbRules\"   \"xorg\"
64 #         Option      \"XkbModel\"   \"pc105\"
65 #         Option      \"XkbLayout\"  \"${XKEYBOARD},us\"
66 #         Option      \"XkbVariant\" \"nodeadkeys\""
67
68   # check for font path
69   if [ -d /usr/share/fonts/X11 ] ; then
70      XFONTS="        FontPath     \"/usr/share/fonts/X11/misc\"
71         FontPath     \"/usr/share/fonts/X11/100dpi/:unscaled\"
72         FontPath     \"/usr/share/fonts/X11/75dpi/:unscaled\"
73         FontPath     \"/usr/share/fonts/X11/Type1\"
74         FontPath     \"/usr/share/fonts/X11/100dpi\"
75         FontPath     \"/usr/share/fonts/X11/75dpi\""
76   fi
77   # /usr/X11R6/lib/X11/fonts exists nearly everywhere, assume
78   # /usr/X11R6/lib/X11/fonts as valid font path only if fonts.dir
79   # exists for "misc"
80   if [ -r /usr/X11R6/lib/X11/fonts/misc/fonts.dir ] ; then
81       XFONTS="$XFONTS
82         FontPath     \"/usr/X11R6/lib/X11/fonts/Type1\"
83         FontPath     \"/usr/X11R6/lib/X11/fonts/misc:unscaled\"
84         FontPath     \"/usr/X11R6/lib/X11/fonts/misc\"
85         FontPath     \"/usr/X11R6/lib/X11/fonts/75dpi:unscaled\"
86         FontPath     \"/usr/X11R6/lib/X11/fonts/75dpi\"
87         FontPath     \"/usr/X11R6/lib/X11/fonts/100dpi:unscaled\"
88         FontPath     \"/usr/X11R6/lib/X11/fonts/100dpi\""
89   fi
90 # }}}
91
92 # make sure we don't leave any temp files {{{
93 bailout() {
94   rm -f "$HWINFO_TMP" "$MONITORINFO" "$MOUSEINFO"
95   [ -n "$1" ] && EXIT="$1" || EXIT="1"
96   print "$bg[black]$fg[red]${bold_color}Exiting...${reset_color}">&2
97   exit "$EXIT"
98 }
99
100 trap bailout 1 2 3 15
101 # }}}
102
103 # warn if running as user root {{{
104   if [ -n "$ROOT" ] ; then
105      if [ -r /etc/grml_cd ] ; then
106         print "$bg[black]$fg[red]${bold_color}Warning: Please do not run grml-x as user root.${reset_color}"
107         print "$bg[black]$fg[red]${bold_color}Running grml-x as user root is *not* supported!${reset_color}"
108         print "$bg[black]$fg[red]${bold_color}Switch to user grml or run su - grml -c 'grml-x ...' instead.${reset_color}"
109         print ''
110      else
111         print "$bg[black]$fg[red]${bold_color}Warning: Please do not run X.org as user root!${reset_color}"
112         print "$bg[black]$fg[red]${bold_color}As soon as you have a working $XCONFIG please use startx instead of grml-x.${reset_color}"
113         print ''
114      fi
115   fi
116   fstabuser=$(grep ':x:1000:' /etc/passwd)
117   fstabuser=${fstabuser%%[:]*}
118 # }}}
119
120 # usage information {{{
121 usage()
122 {
123   if [[ $1 != '' ]] ; then echo 1>&2 "\n$1" ; fi
124   print "$bg[black]$fg[red]$bold_color"
125   print 1>&2 "
126 Usage: $PROGRAMNAME
127        $PROGRAMNAME [-options] windowmanager
128
129 Usage examples:
130   $PROGRAMNAME fluxbox
131   $PROGRAMNAME fluxbox
132   $PROGRAMNAME -force -nostart fluxbox
133   $PROGRAMNAME -nosynaptics fluxbox
134   $PROGRAMNAME -nosync fluxbox
135   $PROGRAMNAME -noddc fluxbox
136   $PROGRAMNAME -xinerama -composite fluxbox
137   $PROGRAMNAME -module radeon -mode 1024x768 -vsync 60 fluxbox
138   XINITRC=~/.xinitrc $PROGRAMNAME fluxbox
139   $PROGRAMNAME -display 8 fluxbox
140
141 More information on grml-x can be found in the manual page: man grml-x
142
143 Report bugs, send wishes and feedback to the grml team:
144 http://grml.org/bugs/ - contact (at) grml.org
145 "
146   print "${reset_color}"
147   exit 2
148 }
149 # }}}
150
151 # writehwinfo {{{
152 writehwinfo()
153 {
154    if [ -n "$ROOT" ] ; then
155      su - $fstabuser -c "$HWINFO > $HWINFO_TMP"
156    else
157      $HWINFO > $HWINFO_TMP
158    fi
159 }
160 # }}}
161
162 # monitor {{{
163 monitor()
164 {
165   sudo $HWINFO --monitor > $MONITORINFO
166 }
167 # }}}
168
169 # mode {{{
170 mode()
171 {
172    [ -r "$MONITORINFO" ] || monitor # get monitor settings
173    modes=$(perl -e 'while (<STDIN>) {if (/  Resolution:/) { s/.*\s+(\d+x\d+).*/$1/; print} }' < $MONITORINFO |
174 sort -nur | perl -ne 's/\s+/ /; s/(\d+x\d+)/"$1"/; print')
175
176    if [ -n "$XINERAMA" ] ; then
177
178       print "$fg[green]
179
180 Option for $fg[yellow]Xinerama$fg[green] found, please use xrandr inside X.org for your further configuration!
181 Trying to identify monitors now..."
182
183       # make sure we have information from 2 monitors:
184       # - first one from 'hwinfo --monitor'      => $MONITORINFO
185       # - second one from 'hwinfo --framebuffer' => $FRAMEBUFFER
186       FRAMEBUFFER=$(hwinfo --framebuffer | grep 'Mode 0x.* bits' | head -1)
187       if [ -z "$FRAMEBUFFER" ] ; then
188          print "$fg[red]
189 Fatal: could not identify two monitors - no chance to
190        set up multihead using Xinerama - sorry. :-(
191
192 Please run grml-x without the -xinerama option to start
193 X anyway (dropping support for Xinerama of course) and
194 contact grml developers if you have any further useful
195 information.                  => http://grml.org/bugs/
196 "
197          bailout 10
198       fi
199
200       # check whether we can read the $MONITORINFO file
201       if ! [ -r "$MONITORINFO" ] ; then
202          print "$fg[red]
203 Fatal: could not identify monitor - no chance to
204        set up multihead using Xinerama - sorry. :-(
205 "
206          bailout 11
207       else
208          # Currently we only know that it works with current intel driver,
209          # so inform user about that:
210          if [[ "$MODULE" != "intel" ]] ; then
211             print "$fg[red]
212
213 Warning: using a non-intel driver - trying Xinerama setup anyway.
214 If it worked please contact grml developers providing information
215 about your setup so we can adjust grml-x according!
216
217       -> http://grml.org/contact/
218
219 Sleeping for 10 seconds now... Will continue then...
220 Just press Ctrl-C to cancel operation.
221 "
222             sleep 10
223          fi
224
225          # now calculate Virtual size for use with Xinerama
226          HORIZ_RES1="$(grep 'Max. Resolution:' $MONITORINFO | sed 's/    Max\. Resolution: \(.*\)x\(.*\)/\1/')"
227          VERIZ_RES1="$(grep 'Max. Resolution:' $MONITORINFO | sed 's/    Max\. Resolution: \(.*\)x\(.*\)/\2/')"
228          # it might happen that we don't have a Max Resolution in hwinfo output :-/
229          # fall back to a generic value then...
230          # TODO: check out how to get resolution of external monitor from console
231          if [ -z "$HORIZ_RES1" ] ; then
232             HORIZ_RES1="1024"
233             VERIZ_RES1="768"
234          fi
235
236          # get maximum of output
237          HORIZ_RES2="$(echo $FRAMEBUFFER | grep 'Mode 0x' | sed 's/  Mode 0x.*: \(.*\)x.*/\1/'| sort -u | head -1)"
238          VERIZ_RES2="$(echo $FRAMEBUFFER | grep 'Mode 0x' | sed 's/  Mode 0x.*x\(.*\) (.*/\1/' | sort -u | head -1)"
239
240          if [ -n "$HORIZ_RES1" -a -n "$VERIZ_RES1" -a -n "$HORIZ_RES2" -a -n "$VERIZ_RES2" ] ; then
241             if [ "$(echo $VERIZ_RES1" - "$VERIZ_RES2 | bc -l)" -eq 0 ] ; then
242             VERIZ_RESULT="$VERIZ_RES1"
243             elif [ "$VERIZ_RES1" -gt "$VERIZ_RES2" ] ; then
244                VERIZ_RESULT="$VERIZ_RES1"
245             else
246                VERIZ_RESULT="$VERIZ_RES2"
247             fi
248
249             HORIZ_RESULT=$(echo $HORIZ_RES1 + $HORIZ_RES2 | bc -l)
250
251             # important: keep newline for appropriate placing below $MODES!
252             if [ -n "$HORIZ_RESULT" ] ; then
253                VIRTUAL="
254                 Virtual $HORIZ_RESULT $VERIZ_RES1"
255             fi
256          fi
257        fi
258    fi
259
260    if [[ -n $NODDC ]] ; then
261      MODES="Modes \"1024x768\" \"800x600\" \"640x480\"  \"1600x1200\" \"1280x1024\" \"1280x960\"$VIRTUAL"
262    elif [[ "$modes" == "\"1024x768\" " || -z $modes ]] ; then
263      MODES="# Modes \"1024x768\" \"800x600\" \"640x480\"  \"1600x1200\" \"1280x1024\" \"1280x960\"$VIRTUAL"
264    else
265      MODES="# Modes $modes$VIRTUAL"
266    fi
267 }
268 # }}}
269
270 # sync - get hsync/vsync settings {{{
271 sync()
272 {
273    [ -r "$MONITORINFO" ] || monitor # get monitor settings
274    [ -r "$MONITORINFO" ] || bailout 1
275    vsyncval=$(awk '/Vert. Sync Range:/{print $4}' $MONITORINFO | sed 's/-/.0 - / ; s/$/.0/' | head -1)
276    hsyncval=$(awk '/Hor. Sync Range:/{print $4}'  $MONITORINFO | sed 's/-/.0 - / ; s/$/.0/' | head -1)
277    if [ -z $vsyncval ] ; then
278      vsyncval='50.0 - 60.0'
279    fi
280    if [ -z $hsyncval ] ; then
281      hsyncval='28.0 - 96.0'
282    fi
283 }
284 # }}}
285
286 # mouse {{{
287 mouse()
288 {
289    sudo $HWINFO --mouse > $MOUSEINFO
290
291    # SynPS/2 Synaptics TouchPad
292    if grep -q 'Device:.*Synaptics' "$MOUSEINFO" ; then
293     if [[ "$SYNAPTICS" == "yes" ]] ; then # check for '-nosynaptics'-option
294      MOUSEDRIVER='synaptics'
295      SYNMOUSE='InputDevice    "Synaptics" # "AlwaysCore"'
296      SYNMOUSEDETAIL="
297 Section \"InputDevice\"
298   Driver        \"synaptics\"
299   Identifier    \"Synaptics\"
300   Option        \"Device\"        \"/dev/psaux\"
301   Option        \"Protocol\"      \"auto-dev\"
302   Option        \"LeftEdge\"      \"1700\"
303   Option        \"RightEdge\"     \"5300\"
304   Option        \"TopEdge\"       \"1700\"
305   Option        \"BottomEdge\"    \"4200\"
306   Option        \"FingerLow\"     \"25\"
307   Option        \"FingerHigh\"    \"30\"
308   Option        \"ZAxisMapping\"   \"4 5\"
309   Option        \"MaxTapTime\"    \"180\"
310   Option        \"MaxTapMove\"    \"220\"
311   Option        \"VertScrollDelta\" \"100\"
312   Option        \"MinSpeed\"      \"0.06\"
313   Option        \"MaxSpeed\"      \"0.12\"
314   Option        \"AccelFactor\" \"0.0010\"
315 #  Option       \"SHMConfig\"     \"on\"
316 #  Option       \"Repeater\"      \"/dev/ps2mouse\"
317 EndSection
318 "
319     else
320      MOUSEDRIVER='mouse'
321      SYNMOUSEDETAIL=""
322      SYNMOUSE='# No synaptics touchpad detected.'
323     fi
324    else
325
326     # AlpsPS/2 ALPS TouchPad (with Synapticsdriver)
327     if grep -q 'Device:.*ALPS' "$MOUSEINFO" ; then
328      if [[ "$SYNAPTICS" == "yes" ]] ; then # check for '-nosynaptics'-option
329       MOUSEDRIVER='synaptics'
330       SYNMOUSE='InputDevice    "Synaptics" # "AlwaysCore"'
331       SYNMOUSEDETAIL="
332 Section \"InputDevice\"
333   Driver        \"synaptics\"
334   Identifier    \"Synaptics\"
335   Option        \"Device\"        \"/dev/psaux\"
336   Option        \"Protocol\"      \"auto-dev\"
337   Option        \"LeftEdge\"      \"120\"
338   Option        \"RightEdge\"     \"850\"
339   Option        \"TopEdge\"       \"120\"
340   Option        \"BottomEdge\"    \"650\"
341   Option        \"FingerLow\"     \"14\"
342   Option        \"FingerHigh\"    \"15\"
343   Option        \"ZAxisMapping\"   \"4 5\"
344   Option        \"MaxTapTime\"    \"180\"
345   Option        \"MaxTapMove\"    \"50\"
346   Option        \"MaxDoubleTapTime\"    \"100\"
347   Option        \"VertScrollDelta\" \"20\"
348   Option        \"HorizScrollDelta\" \"20\"
349   Option        \"MinSpeed\"      \"0.3\"
350   Option        \"MaxSpeed\"      \"2.00\"
351   Option        \"AccelFactor\" \"0.030\"
352   Option        \"UpDownScrolling\" \"1\"
353   Option        \"EmulateMiddleButtonTime\" \"75\"
354   Option        \"CircularScrolling\" \"1\"
355   Option        \"CircScrollDelta\" \"0.1\"
356   Option        \"CircScrollTrigger\" \"8\"
357 #  Option       \"SHMConfig\"     \"on\"
358 #  Option       \"Repeater\"      \"/dev/ps2mouse\"
359 EndSection
360 "
361      else
362       MOUSEDRIVER='mouse'
363       SYNMOUSEDETAIL=""
364       SYNMOUSE='# No alps touchpad detected.'
365      fi
366     else
367       SYNMOUSE='# No synaptics/alps touchpad present.'
368     fi
369    fi
370
371    # USB-PS/2 Optical Mouse
372    if [ -n "$USE_USB" ] ; then
373      USBMOUSE='InputDevice    "USB Mouse"     "CorePointer"'
374      USBMOUSEDETAIL="
375 Section \"InputDevice\"
376         Identifier      \"USB Mouse\"
377         Driver          \"mouse\"
378         Option          \"Device\"                \"/dev/input/mice\"
379         Option          \"Protocol\"              \"auto\"
380         Option          \"ZAxisMapping\"          \"4 5\"
381         Option          \"Buttons\"               \"5\"
382         Option          \"SendCoreEvents\"        \"true\"
383 EndSection
384 "
385    else
386      USBMOUSE='# InputDevice    "USB Mouse"     "CorePointer"'
387      USBMOUSEDETAIL=''
388    fi
389
390    if grep -q 'Device:.*Serial' "$MOUSEINFO" ; then
391      SERIAL='yes'
392      SERMOUSE='InputDevice    "Serial Mouse"     "CorePointer"'
393      SERMOUSEDETAIL="
394 Section \"InputDevice\"
395         Identifier  \"Serial Mouse\"
396         Driver      \"mouse\"
397         Option      \"Device\" \"/dev/ttyS0\"
398         Option      \"Protocol\" \"Microsoft\"
399         Option      \"Emulate3Buttons\" \"true\"
400         Option      \"Emulate3Timeout\" \"70\"
401         Option      \"SendCoreEvents\"  \"true\"
402 EndSection
403 "
404    else
405      SERMOUSE='# No serial mouse detected.'
406      SERMOUSEDETAIL=''
407    fi
408
409    # ImExPS/2 Logitech Explorer Mouse
410    # "PS2++ Logitech MX Mouse"
411    if [ -n "$USE_PS2" ] ; then
412       PS2='yes'
413       PS2MOUSE='InputDevice    "PS/2 Mouse"    "CorePointer"'
414       PS2MOUSEDETAIL="
415 Section \"InputDevice\"
416         Identifier  \"PS/2 Mouse\"
417         Driver      \"mouse\"
418         Option      \"Device\" \"/dev/input/mice\"
419         # Option      \"Device\" \"/dev/psaux\"
420         Option      \"Protocol\" \"PS/2\"
421         Option      \"Emulate3Buttons\" \"true\"
422         Option      \"Emulate3Timeout\" \"70\"
423         Option      \"SendCoreEvents\"  \"true\"
424 EndSection
425 "
426      else
427       PS2MOUSE='# InputDevice    "PS/2 Mouse"    "CorePointer"'
428       PS2MOUSEDETAIL=''
429      fi
430
431      EVDEV_MOUSE="
432 # Section \"InputDevice\"
433 #         Identifier      \"Generic Mouse\"
434 #         Driver          \"evdev\"
435 #         Option          \"Device\"                \"/dev/input/mice\"
436 #         Option          \"Protocol\"              \"auto\"
437 #         Option          \"ZAxisMapping\"          \"4 5\"
438 #         Option          \"Buttons\"               \"5\"
439 #         Option          \"SendCoreEvents\"        \"true\"
440 # EndSection
441 "
442
443    MOUSE="        $USBMOUSE
444         $PS2MOUSE
445         $SYNMOUSE
446         $SERMOUSE"
447 }
448 # }}}
449
450 # commandline parsing {{{
451 parse_options()
452 {
453    zparseopts -K -- module:=o_module help=o_help noddc=o_noddc nosync=o_nosync \
454                     vsync:=o_vsync hsync:=o_hsync mode:=o_mode force=o_force display:=o_display   \
455                     nostart=o_nostart nodpms=o_nodpms nosynaptics=o_nosynaptics nousb=o_nousb \
456                     nops2=o_nops2 genmouse=o_genmouse novref=o_novref nohsync=o_nohsync \
457                     fallback=o_fallback usb=o_usb ps2=o_ps2 composite=o_composite \
458                     xinerama=o_xinerama
459
460    if [[ $# == 0 || "$o_help" != "" || "$1" == '-h' || "$1" == '--help' ]]; then
461       usage
462    fi
463
464    if [[ "$o_force" != "" ]]; then
465       FORCE='yes'
466    fi
467
468    if [[ "$o_fallback" != "" ]]; then
469       FALLBACK="yes"
470       if [ -r /etc/X11/xorg.conf.example ] ; then
471          sudo cp /etc/X11/xorg.conf.example $XCONFIG
472          print "$bold_color$fg[blue]Copying /etc/X11/xorg.conf.example to $XCONFIG as requested via fallback option."
473       else
474          echo 'Error: /etc/X11/xorg.conf.example not readable, exiting.'
475          exit 1
476       fi
477    fi
478
479    if [[ "$o_nodpms" != "" ]]; then
480       DPMS='Option       "DPMS"      "false"'
481    else
482       DPMS='Option       "DPMS"      "true"'
483    fi
484
485    if [[ "$o_noddc" != "" ]]; then
486       NODDC="yes"
487    fi
488
489    if [[ "$o_vsync" != "" ]]; then
490       FORCE="yes"
491    fi
492
493    if [[ "$o_hsync" != "" ]]; then
494       FORCE="yes"
495    fi
496
497    if [[ "$o_nousb" != "" ]]; then
498       echo 'Warning: option -nousb is deprecated.'>&2
499    fi
500
501    if [[ "$o_usb" != "" ]]; then
502       USE_USB='yes'
503    fi
504
505    if [[ "$o_nops2" != "" ]]; then
506       echo 'Warning: optino -nops2 is deprecatedË™'>&2
507    fi
508
509    if [[ "$o_ps2" != "" ]]; then
510       USE_PS2='yes'
511    fi
512
513    if [[ "$o_genmouse" != "" ]]; then
514       GENERICMOUSE='yes'
515    fi
516
517    if [[ "$o_nosynaptics" != "" ]]; then
518       SYNAPTICS='no'
519    else
520       SYNAPTICS='yes'
521    fi
522
523    if [[ "$o_nostart" != "" ]]; then
524       NOSTART="yes"
525    fi
526
527    DISPLAY=$o_display[2]
528
529    eval WINDOWMANAGER=\${$#}
530
531    if [[ "$XKEYBOARD" == de ]] ; then
532       KEYBOARD="$KEYBOARD
533 #         Option      \"XkbVariant\" \"nodeadkeys\""
534    fi
535
536    if [ -n "$FORCE" -o ! -r "$XCONFIG" -a -z "$FALLBACK" ] ; then
537      print -n "$bold_color$fg[blue]Gathering hardware information...$fg[red]"
538
539      sync # get hsync/vsync
540
541      if [ -z "$o_hsync" ] ; then
542        o_hsync=(-hsync "$hsyncval")
543        HSYNC=$o_hsync[2]
544        HORIZSYNC="        HorizSync    $HSYNC"
545      else
546        o_hsync=(-hsync "$o_hsync[2]")
547        HSYNC=$o_hsync[2]
548        HORIZSYNC="        HorizSync    $HSYNC"
549      fi
550
551      if [ -z "$o_vsync" ] ; then
552        o_vsync=(-vsync "$vsyncval")
553        VSYNC=$o_vsync[2]
554        VERTISYNC="        VertRefresh  $VSYNC"
555      else
556        o_vsync=(-vsync "$o_vsync[2]")
557        VSYNC=$o_vsync[2]
558        VERTISYNC="        VertRefresh  $VSYNC"
559      fi
560
561      if [[ "$o_nosync" != "" ]]; then
562         HORIZSYNC="#       HorizSync   28.0 - 96.0  # deactivated via -nosync option of grml-x"
563         VERTISYNC="#       VertRefresh 50.0 - 60.0  # deactivated via -nosync option of grml-x"
564      fi
565
566      if [[ "$o_nohsync" != "" ]]; then
567         HORIZSYNC="#       HorizSync   28.0 - 96.0  # deactivated via -nohsync option of grml-x"
568      fi
569
570      if [[ "$o_novref" != "" ]]; then
571         VERTISYNC="#       VertRefresh 50.0 - 60.0  # deactivated via -novref option of grml-x"
572      fi
573
574      if [[ "$o_xinerama" != "" ]]; then
575         XINERAMA=1
576      fi
577
578      if [[ "$o_composite" != "" ]]; then
579         COMPOSITE="Section \"Extensions\"
580     Option \"Composite\" \"Enable\"
581 EndSection"
582      else
583         COMPOSITE="#Section \"Extensions\"
584 #    Option \"Composite\" \"Enable\"
585 #EndSection"
586      fi
587
588      # write hwinfo stuff
589      writehwinfo
590
591      # monitor stuff
592      [ -r "$HWINFO_TMP" ] || bailout 1
593      MONITOR=$(awk '/monitor.1:/{print $3}' $HWINFO_TMP)
594      [[ $MONITOR != 'ddc' ]] && NODDC=yes
595
596      # module handling
597      MODULE=$o_module[2]
598      if [ -z "$MODULE" ] ; then
599        MODULE="$(getBootParam xmodule 2>/dev/null)"
600        if [ -z "$MODULE" ] ; then
601          MODULE=$(grep 'XFree86 v4 Server Module:' "${HWINFO_TMP}" | head -1 | awk '{print $5}')
602          if [ -z "$MODULE" ] ; then
603            MODULE='vesa'
604          fi
605          # hwinfo >=13.28 reports driver 'intel' instead of i810
606          if [[ "$MODULE" == 'intel' ]] ; then
607             [ -r /usr/lib/xorg/modules/drivers/intel_drv.so ] || MODULE='i810'
608          fi
609        fi
610      else
611        FORCE="yes"
612      fi
613
614      mouse    # get mouse settings
615      VGA=$(lspci | grep VGA | sed 's/.*compatible controller: //' | head -1)
616
617      MODE=$o_mode[2]
618      if [ -z $MODE ] ; then
619        B_MODE="$(getBootParam xmode 2>/dev/null)"
620        if [ -n "$B_MODE" ] ; then
621          MODES="Modes \"$B_MODE\""
622          FORCE="yes"
623        fi
624        if [ -z "$MODES" ] ; then
625           mode # get available modes
626        fi
627      else
628        MODES="Modes \"$MODE\""
629        FORCE="yes"
630      fi
631
632      print "$fg[green]done$reset_color"
633      print "$bg[black]$fg[white]$bold_color"
634      print "$fg[green]Specified windowmanager is $fg[yellow]$WINDOWMANAGER"
635      print "$fg[green]Video is $fg[yellow]$VGA$fg[green] using $bg[black]$fg[yellow]${XSERVER}$fg[cyan](${MODULE})$fg[green] Server"
636      [[ -z $HSYNC ]] && [[ -z $VSYNC ]] && print "$fg[green]Monitor is $fg[yellow]$MONITOR"
637      [[ -z $HSYNC ]] && [[ -n $VSYNC ]] && print "$fg[green]Monitor is $fg[yellow]$MONITOR$fg[green], VSYNC: $fg[yellow]$VSYNC"
638      [[ -z $VSYNC ]] && [[ -n $HSYNC ]] && print "$fg[green]Monitor is $fg[yellow]$MONITOR$fg[green], HSYNC: $fg[yellow]$HSYNC"
639      [[ -n $VSYNC ]] && [[ -n $HSYNC ]] && print "$fg[green]Monitor is $fg[yellow]$MONITOR$fg[green], HSYNC: $fg[yellow]$HSYNC $fg[green]VSYNC: $fg[yellow]$VSYNC"
640      [[ -n $modes ]] && print "$fg[green]Using default X.org modes."
641      [[ -z $modes ]] && print "$fg[green]Using Mode: $fg[yellow]$MODE"
642      print "${reset_color}"
643    fi
644 }
645 parse_options $*
646 # }}}
647
648 # check for requirements {{{
649 requirements()
650 {
651 if ! [ -x $(which hwinfo) ] ; then
652   print "$bg[black]$fg[red]${bold_color}Error: hwinfo not found in path.${reset_color}
653 Note:  run 'aptitude install hwinfo' on systems running debian.
654 Exiting.${reset_color}"
655   exit -1
656 fi
657
658 if ! [[ -d /sys ]] ; then
659   print "$bg[black]$fg[red]${bold_color}Error: mounted /sys required (for hwinfo).${reset_color}
660 You may want to add the following line to your /etc/fstab:
661
662   sysfs /sys sysfs defaults 0 0
663
664 or just run 'mount /sys'. Exiting.${reset_color}"
665   exit -1
666 fi
667 }
668 requirements
669 # }}}
670
671 # xconfig {{{
672 xconfig() {
673 cat << EOX
674 ################################################################################
675 # Filename:      $XCONFIG
676 # Purpose:       config file for xserver - generated by grml-x
677 # Bug-Reports:   see http://grml.org/bugs/
678 # Latest change: ${DATE}
679 # See also:
680 #   /usr/share/doc/xserver-xorg/   and
681 #   http://wiki.x.org/wiki/Home    and
682 #   http://ftp.x.org/pub/X11R7.0/doc/html/index.html for information on Xorg
683 #
684 # Refer to the xorg.conf man page and to
685 # http://ftp.x.org/pub/X11R7.0/doc/html/xorg.conf.5.html
686 # for details about the format of this file.
687 #
688 # See http://wiki.debian.org/XStrikeForce/FAQ for information
689 # regarding Xorg packages within Debian.
690 #
691 # If you would like this file to be automatically reconfigured by debian,
692 # run the following command:
693 #   sudo dpkg-reconfigure -phigh xserver-xorg
694 ################################################################################
695
696 Section "ServerLayout"
697         Identifier     "XServer Configured"
698         Screen      0  "Screen0" 0 0
699         # InputDevice    "Keyboard0"     "CoreKeyboard"
700         # InputDevice    "Generic Mouse" "CorePointer"
701         Option "AutoAddDevices" "off" # do not depend on running dbus/hal
702 $MOUSE
703 EndSection
704
705 Section "ServerFlags"
706         Option "AllowMouseOpenFail"  "true"  # allows the server to start up even if the mouse does not work
707         Option "DontVTSwitch"        "false" # allow switching between virtual terminal
708         Option "DontZap"             "false" # enable <Crtl><Alt><BS> (server abort)
709         # Option "DontZoom"            "true"  # disable <Crtl><Alt><KP_+>/<KP_-> (resolution switching)
710 EndSection
711
712 Section "Files"
713         # More information:  http://ftp.x.org/pub/X11R7.0/doc/html/fonts.html
714 $XFONTS
715         # FontPath     "/usr/share/fonts/ttf/western"
716         # FontPath     "/usr/share/fonts/ttf/decoratives"
717         FontPath     "/usr/share/fonts/truetype/ttf-bitstream-vera"
718         FontPath     "/usr/share/fonts/latex-ttf-fonts"
719         FontPath     "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
720 EndSection
721
722 # Modules - see /usr/lib/xorg/modules/fonts and /usr/lib/xorg/modules/extensions
723 Section "Module"
724         Load  "dbe"       # double buffer extension
725         Load  "dri"       # direct rendering
726         Load  "glx"       # 3D layer / GLX extension
727         Load  "extmod"    # some commonly used server extensions (e.g. shape extension)
728         Load  "record"    # recording extension
729         Load  "evdev"     # generic input handling driver on Linux
730         Load  "xtrap"     # X Trap extension
731         # Load  "freetype"  # freetype fonts rendering
732         # Load  "i2c"       # I2C bus
733         # Load  "int10"     # initialize graphics cards via int10 call to the BIOS
734         # Load  "type1"     # type1 font module
735         # Load  "v4l"       # Video for Linux
736         # Load  "vbe"       # Vesa BIOS Extension
737         ## Deprecated/unneeded modules with Xorg >=7.0:
738         # Load  "speedo"    # font module (does not exist anymore)
739         # Load  "ddc"       # ddc probing of monitor (automatically loaded)
740         # Load  "GLcore"    # render OpenGL in software (automatically loaded)
741         # Load  "bitmap"    # bitmap fonts (automatically loaded)
742 # Valid entries - see /usr/lib/xorg/modules/[extensions/]
743 # afb bitmap cfb cfb16 cfb24 cfb32 cw damage dbe ddc dri drm extmod fb
744 # fbdevhw freetype GLcore glx i2c int10 int10 layer mfb pcidata rac ramdac
745 # record scanpci shadow shadowfb type1 vbe vgahw xaa xf1bpp xf24_32bpp xf4bpp
746 # xf8_16bpp xf8_32bpp xtrap
747 EndSection
748
749 # If you'd like to switch the positions of your capslock and control keys, use:
750 # Option "XkbOptions" "ctrl:swapcaps"
751 # Or if you just want both to be control, use:
752 # Option "XkbOptions" "ctrl:nocaps"
753 # More information: http://ftp.x.org/pub/X11R7.0/doc/html/XKB-Config.html
754 # Section "InputDevice"
755 #         Identifier  "Keyboard0"
756 #         Option      "CoreKeyboard"
757 #         $KEYBOARD
758 #         # Option      "XkbOptions" "ctrl:swapcaps,grp:alt_shift_toggle,grp_led:scroll,compose:menu"
759 # EndSection
760
761 # More information: http://ftp.x.org/pub/X11R7.0/doc/html/mouse.html
762 ${USBMOUSEDETAIL}${PS2MOUSEDETAIL}${SERMOUSEDETAIL}${SYNMOUSEDETAIL}${EVDEV_MOUSE}
763 Section "Monitor"
764         Identifier   "Monitor0"
765 #       ModelName    "Old Monitor (no DDC)"
766         $DPMS
767 #       HorizSync    28.0 - 78.0 # Warning: This may fry very old Monitors
768 #       HorizSync    28.0 - 96.0 # Warning: This may fry old Monitors
769 $HORIZSYNC
770 #       VertRefresh  50.0 - 76.0 # Very conservative. May flicker.
771 #       VertRefresh  50.0 - 60.0 # Extreme conservative. Will flicker. TFT default.
772 $VERTISYNC
773 # Need more information?
774 #  http://xtiming.sourceforge.net/cgi-bin/xtiming.pl
775 #  http://en.tldp.org/HOWTO/XFree86-Video-Timings-HOWTO/
776 EndSection
777
778 Section "Device"
779         ### Available Driver options are:
780         ## sw_cursor is needed for some ati and radeon cards
781         # Option     "sw_cursor"
782         # Option     "hw_cursor"
783         # Option     "NoAccel"
784         # Option     "ShowCache"
785         # Option     "ShadowFB"
786         # Option     "UseFBDev"
787         # Option     "Rotate"
788         ## xorg + nvidia:
789         # Option "RenderAccel" "true"
790         # Option "AllowGLXWithComposite" "true"
791         Identifier  "Card0"
792         # The following line is auto-generated by grml-x
793         Driver      "$MODULE"
794         VendorName  "All"
795         BoardName   "All"
796         ## Workaround for drivers (for example radeon) which might send output to wrong device:
797         # Option "MonitorLayout" "LVDS, AUTO"
798         # Option "MonitorLayout" "LVDS, CRT"
799         # Option "MonitorLayout" "NONE, STV"
800         # Option "MonitorLayout" "LVDS"
801         ## Specify BusID:
802         # BusID       "PCI:1:0:0"
803 EndSection
804
805 Section "Screen"
806         Identifier "Screen0"
807         Device     "Card0"
808         Monitor    "Monitor0"
809         DefaultColorDepth 16
810         SubSection "Display"
811                 Depth     1
812                 $MODES
813         EndSubSection
814         SubSection "Display"
815                 Depth     4
816                 $MODES
817         EndSubSection
818         SubSection "Display"
819                 Depth     8
820                 $MODES
821         EndSubSection
822         SubSection "Display"
823                 Depth     15
824                 $MODES
825         EndSubSection
826         SubSection "Display"
827                 Depth     16
828                 $MODES
829         EndSubSection
830         SubSection "Display"
831                 Depth     24
832                 $MODES
833         EndSubSection
834         SubSection "Display"
835                 Depth     32
836                 $MODES
837         EndSubSection
838 EndSection
839
840 # Make sure you have the relevant Debian packages on your system
841 # to be able to use DRI (libgl1-mesa-dri for example)
842 Section "DRI"
843         Mode 0666
844 EndSection
845
846 $COMPOSITE
847
848 ## END OF FILE #################################################################
849 EOX
850 }
851 # }}}
852
853 # writeit {{{
854 writeit() {
855     XCONFTMP="$(mktemp)"
856     xconfig > $XCONFTMP
857     # we do not want to have two CorePointers, deactivate one therefore
858     if grep -Eq '^[[:space:]]+InputDevice[ ]+"USB Mouse"[ ]+"CorePointer"' $XCONFTMP ; then
859        if grep -Eq '^[[:space:]]+InputDevice[ ]+"PS/2 Mouse"[ ]+"CorePointer"' $XCONFTMP ; then
860           sed -i 's|InputDevice.*PS/2.*CorePointer|# & # deactivated to avoid two CorePointers|' $XCONFTMP
861        fi
862     fi
863     [ -f $XCONFIG ] && sudo mv -f $XCONFIG $XCONFIG.old
864     sudo mv $XCONFTMP $XCONFIG
865     sudo chown root.root $XCONFIG
866     sudo chmod 644 $XCONFIG
867 }
868 # }}}
869
870 # writeconfig {{{
871 function writeconfig
872 {
873   if [[ ! -f $XCONFIG ]] ; then
874     print -n "$bold_color$fg[blue]Creating $XCONFIG: $fg[red]"
875     writeit && print "$fg[green]done$reset_color"
876   else
877     if [ -z "$FORCE" -a -z "$FALLBACK" ] ; then
878        print "$bold_color$fg[blue]Notice: $XCONFIG exists already.
879 Use the force-option (-force) to force creation.
880 $fg[red]"
881     fi
882   fi
883   if [[ -n "$FORCE" ]] ; then
884     print "$bold_color$fg[blue]Force-switch or manual option(s) detected:"
885     print -n "\-> Moving eventual existing $XCONFIG to ${XCONFIG}.old: $fg[red]"
886     writeit && print "$fg[green]done$reset_color"
887   fi
888 }
889 # }}}
890
891 # runit {{{
892 function runit
893 {
894   writeconfig
895   if [ "$(readlink /etc/X11/X)" = /bin/true ] ; then
896      print "$bold_color$fg[red]Fatal: /etc/X11/X is a symlink to /bin/true."
897      print "Fix it via running 'ln -sf /usr/bin/Xorg /etc/X11/X'"
898      exit 10
899   fi
900   if [ -z "$NOSTART" ] ; then
901     print "$reset_color"
902     if [ -x /etc/init.d/xorg-common ] ; then
903       sudo /etc/init.d/xorg-common start
904     else
905       if [ -x /etc/init.d/xfree86-common ] ; then
906         sudo /etc/init.d/xfree86-common start
907       fi
908     fi
909     print ""
910     if [ -z "$DISPLAY" ] ; then
911       print "$bold_color$fg[green]Now trying to run startx.$reset_color"
912       startx $XINITRC -- $XOPTS
913       return 1
914     else
915       print "$bold_color$fg[green]Now trying to run startx on display $DISPLAY.$reset_color"
916       startx $XINITRC -- :$DISPLAY $XOPTS
917       return 1
918     fi
919   else
920     print "$bold_color$fg[blue]Not running startx as requested via option.$reset_color"
921   fi
922 }
923 # }}}
924
925 # failed {{{
926 function failed
927 {
928   print "$fg[red]"
929   if [ -z "$ROOT" ] ; then
930     if [[ $(tty) == /dev/pts/* ]] ; then
931       print "It seems you are running $PROGRAMNAME from inside GNU screen.
932 Notice that this might fail if running as user grml!
933 Please exit screen and try to run $PROGRAMNAME again."
934     fi
935   fi
936   print "Run the following commands for getting information on your hardware:
937   hwinfo --gfxcard
938   discover -v --data-path=xfree86/server/device/driver display
939   xdebconfigurator -c -d -i -x
940   get-edid | parse-edid
941
942 Do you want to go the debian way of life? Run:
943   aptitude install xorg read-edid mdetect hwinfo xdebconfigurator
944   dpkg-reconfigure -phigh xserver-xorg
945
946 Problems with the module used for X? Try to load another one or
947 fall back to module vesa:
948   $PROGRAMNAME -module radeon ...
949   $PROGRAMNAME -module vesa  ...
950
951 Do you want to deactivate a present synaptics touchpad? Run:
952   $PROGRAMNAME -nosynaptics ...
953
954 Your monitor is very old and/or does not support DDC-probing?
955   $PROGRAMNAME -noddc ...
956
957 Do you want to create a x configuration file but do not start X?
958   $PROGRAMNAME -nostart ...
959
960 Monitor frequency too high or too low? Just specify hsync/vsync manually:
961   $PROGRAMNAME -hsync 30-65 ...
962   $PROGRAMNAME -hsync 30-65 -vsync 50-60 ...
963
964 Want to adjust the resolution? Use the mode-switch:
965   $PROGRAMNAME -mode 1024x768 ...
966   $PROGRAMNAME -mode '1280x1024 1024x768' ...
967
968 Problems? Use vesa with resolution 1024x768:
969   $PROGRAMNAME -module vesa -mode 1024x768 ...
970
971 Still problems with X? Use the fallback option:
972   $PROGRAMNAME -fallback ...
973
974 To adjust resolution while running X execute:
975   xrandr -s '1024x768'
976
977 More information on grml-x can be found in the manual page: man grml-x
978
979 Report bugs, send wishes and feedback to the grml team:
980 http://grml.org/bugs/ - contact (at) grml.org
981 "
982 print -n "$reset_color"
983 }
984 # }}}
985
986 # cleanup {{{
987 cleanup()
988 {
989   rm -f $HWINFO_TMP
990   rm -f $MONITORINFO
991   rm -f $MOUSEINFO
992   rm -f $XCONFTMP
993 }
994 cleanup
995 # }}}
996
997 # xinitrc {{{
998   if ! [ -x "$(which $WINDOWMANAGER)" ] ; then
999      print "$bg[black]$fg[red]${bold_color}Fatal: windowmanager $fg[blue]$WINDOWMANAGER$fg[red] not executable, startx will not work.${reset_color}">&2
1000      bailout
1001   fi
1002   if [ -w "$XINITRC" ] ; then
1003     sed -i "s|^[^#]*exec.*|  exec $WINDOWMANAGER|g" $XINITRC
1004     runit || failed
1005   else
1006     echo -e "#!/bin/sh\n  exec $WINDOWMANAGER" >> $XINITRC
1007     runit || failed
1008   fi
1009 # }}}
1010
1011 ## END OF FILE #################################################################
1012 # vim:foldmethod=marker expandtab ai ft=zsh