Do not display usage information when using the -nostart option
[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 # make sure /tmp is writeable {{{
10   if ! [ -w /tmp ] ; then
11      echo 'Fatal: /tmp is not writeable. Can not resume therefore, sorry.' >&2
12      exit 1
13   fi
14 # }}}
15
16 # debugging {{{
17 # usage: DEBUG=1 grml-x ..... 2>/tmp/grml-x-debug.log
18   if [[ $DEBUG -gt 0 ]]; then
19       setopt xtrace
20   fi
21 # }}}
22
23 # functions and color {{{
24   # use colors only if not booted with nocolor bootoption
25   if ! grep -q nocolor /proc/cmdline ; then
26      autoload colors ; colors
27      [ -r /etc/grml_colors ] && . /etc/grml_colors
28   fi
29
30   # some functions like getBootParam
31   if [ -r /etc/grml/script-functions -a -r /etc/grml/sh-lib ] ; then
32      source /etc/grml/script-functions
33      source /etc/grml/sh-lib
34   else
35     echo 'Error: sourcing function files failed. Exiting.'
36     exit 1
37   fi
38
39   check4root &>/dev/null && ROOT='1' || ROOT=''
40 # }}}
41
42 # set variables  {{{
43   PROGRAMNAME=${0##*/}
44   HWINFO='/usr/sbin/hwinfo'
45   DATE=$(date)
46   [ -n "$XINITRC" ] || XINITRC="$HOME/.xinitrc"
47
48   # temporary files
49   HWINFO_TMP="/tmp/hwinfo.$$"
50   MONITORINFO="/tmp/monitorinfo.$$"
51   MOUSEINFO="/tmp/mouse.$$"
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 wmii
131   $PROGRAMNAME fluxbox
132   $PROGRAMNAME openbox
133   $PROGRAMNAME -force -nostart fluxbox
134   $PROGRAMNAME -nosynaptics fluxbox
135   $PROGRAMNAME -nosync fluxbox
136   $PROGRAMNAME -noddc wmii
137   $PROGRAMNAME -xinerama -composite wmii
138   $PROGRAMNAME -module radeon -mode 1024x768 -vsync 60 openbox
139   XINITRC=~/.xinitrc $PROGRAMNAME openbox
140   $PROGRAMNAME -display 8 openbox
141
142 More information on grml-x can be found in the manual page: man grml-x
143
144 Report bugs, send wishes and feedback to the grml team:
145 http://grml.org/bugs/ - contact (at) grml.org
146 "
147   print "${reset_color}"
148   exit 2
149 }
150 # }}}
151
152 # writehwinfo {{{
153 writehwinfo()
154 {
155    if [ -n "$ROOT" ] ; then
156      su - $fstabuser -c "$HWINFO > $HWINFO_TMP"
157    else
158      $HWINFO > $HWINFO_TMP
159    fi
160 }
161 # }}}
162
163 # monitor {{{
164 monitor()
165 {
166   sudo $HWINFO --monitor > $MONITORINFO
167 }
168 # }}}
169
170 # mode {{{
171 mode()
172 {
173    [ -r "$MONITORINFO" ] || monitor # get monitor settings
174    modes=$(perl -e 'while (<STDIN>) {if (/  Resolution:/) { s/.*\s+(\d+x\d+).*/$1/; print} }' < $MONITORINFO |
175 sort -nur | perl -ne 's/\s+/ /; s/(\d+x\d+)/"$1"/; print')
176
177    if [ -n "$XINERAMA" ] ; then
178
179       print "$fg[green]
180
181 Option for $fg[yellow]Xinerama$fg[green] found, please use xrandr inside X.org for your further configuration!
182 Trying to identify monitors now..."
183
184       # make sure we have information from 2 monitors:
185       # - first one from 'hwinfo --monitor'      => $MONITORINFO
186       # - second one from 'hwinfo --framebuffer' => $FRAMEBUFFER
187       FRAMEBUFFER=$(hwinfo --framebuffer | grep 'Mode 0x.* bits' | head -1)
188       if [ -z "$FRAMEBUFFER" ] ; then
189          print "$fg[red]
190 Fatal: could not identify two monitors - no chance to
191        set up multihead using Xinerama - sorry. :-(
192
193 Please run grml-x without the -xinerama option to start
194 X anyway (dropping support for Xinerama of course) and
195 contact grml developers if you have any further useful
196 information.                  => http://grml.org/bugs/
197 "
198          bailout 10
199       fi
200
201       # check whether we can read the $MONITORINFO file
202       if ! [ -r "$MONITORINFO" ] ; then
203          print "$fg[red]
204 Fatal: could not identify monitor - no chance to
205        set up multihead using Xinerama - sorry. :-(
206 "
207          bailout 11
208       else
209          # Currently we only know that it works with current intel driver,
210          # so inform user about that:
211          if [[ "$MODULE" != "intel" ]] ; then
212             print "$fg[red]
213
214 Warning: using a non-intel driver - trying Xinerama setup anyway.
215 If it worked please contact grml developers providing information
216 about your setup so we can adjust grml-x according!
217
218       -> http://grml.org/contact/
219
220 Sleeping for 10 seconds now... Will continue then...
221 Just press Ctrl-C to cancel operation.
222 "
223             sleep 10
224          fi
225
226          # now calculate Virtual size for use with Xinerama
227          HORIZ_RES1="$(grep 'Max. Resolution:' $MONITORINFO | sed 's/    Max\. Resolution: \(.*\)x\(.*\)/\1/')"
228          VERIZ_RES1="$(grep 'Max. Resolution:' $MONITORINFO | sed 's/    Max\. Resolution: \(.*\)x\(.*\)/\2/')"
229          # it might happen that we don't have a Max Resolution in hwinfo output :-/
230          # fall back to a generic value then...
231          # TODO: check out how to get resolution of external monitor from console
232          if [ -z "$HORIZ_RES1" ] ; then
233             HORIZ_RES1="1024"
234             VERIZ_RES1="768"
235          fi
236
237          # get maximum of output
238          HORIZ_RES2="$(echo $FRAMEBUFFER | grep 'Mode 0x' | sed 's/  Mode 0x.*: \(.*\)x.*/\1/'| sort -u | head -1)"
239          VERIZ_RES2="$(echo $FRAMEBUFFER | grep 'Mode 0x' | sed 's/  Mode 0x.*x\(.*\) (.*/\1/' | sort -u | head -1)"
240
241          if [ -n "$HORIZ_RES1" -a -n "$VERIZ_RES1" -a -n "$HORIZ_RES2" -a -n "$VERIZ_RES2" ] ; then
242             if [ "$(echo $VERIZ_RES1" - "$VERIZ_RES2 | bc -l)" -eq 0 ] ; then
243             VERIZ_RESULT="$VERIZ_RES1"
244             elif [ "$VERIZ_RES1" -gt "$VERIZ_RES2" ] ; then
245                VERIZ_RESULT="$VERIZ_RES1"
246             else
247                VERIZ_RESULT="$VERIZ_RES2"
248             fi
249
250             HORIZ_RESULT=$(echo $HORIZ_RES1 + $HORIZ_RES2 | bc -l)
251
252             # important: keep newline for appropriate placing below $MODES!
253             if [ -n "$HORIZ_RESULT" ] ; then
254                VIRTUAL="
255                 Virtual $HORIZ_RESULT $VERIZ_RES1"
256             fi
257          fi
258        fi
259    fi
260
261    if [[ -n $NODDC ]] ; then
262      MODES="Modes \"1024x768\" \"800x600\" \"640x480\"  \"1600x1200\" \"1280x1024\" \"1280x960\"$VIRTUAL"
263    elif [[ "$modes" == "\"1024x768\" " || -z $modes ]] ; then
264      MODES="# Modes \"1024x768\" \"800x600\" \"640x480\"  \"1600x1200\" \"1280x1024\" \"1280x960\"$VIRTUAL"
265    else
266      MODES="# Modes $modes$VIRTUAL"
267    fi
268 }
269 # }}}
270
271 # sync - get hsync/vsync settings {{{
272 sync()
273 {
274    [ -r "$MONITORINFO" ] || monitor # get monitor settings
275    [ -r "$MONITORINFO" ] || bailout 1
276    vsyncval=$(awk '/Vert. Sync Range:/{print $4}' $MONITORINFO | sed 's/-/.0 - / ; s/$/.0/' | head -1)
277    hsyncval=$(awk '/Hor. Sync Range:/{print $4}'  $MONITORINFO | sed 's/-/.0 - / ; s/$/.0/' | head -1)
278    if [ -z $vsyncval ] ; then
279      vsyncval='50.0 - 60.0'
280    fi
281    if [ -z $hsyncval ] ; then
282      hsyncval='28.0 - 96.0'
283    fi
284 }
285 # }}}
286
287 # mouse {{{
288 mouse()
289 {
290    sudo $HWINFO --mouse > $MOUSEINFO
291
292    # SynPS/2 Synaptics TouchPad
293    if grep -q 'Device:.*Synaptics' "$MOUSEINFO" ; then
294     if [[ "$SYNAPTICS" == "yes" ]] ; then # check for '-nosynaptics'-option
295      MOUSEDRIVER='synaptics'
296      SYNMOUSE='InputDevice    "Synaptics" # "AlwaysCore"'
297      SYNMOUSEDETAIL="
298 Section \"InputDevice\"
299   Driver        \"synaptics\"
300   Identifier    \"Synaptics\"
301   Option        \"Device\"        \"/dev/psaux\"
302   Option        \"Protocol\"      \"auto-dev\"
303   Option        \"LeftEdge\"      \"1700\"
304   Option        \"RightEdge\"     \"5300\"
305   Option        \"TopEdge\"       \"1700\"
306   Option        \"BottomEdge\"    \"4200\"
307   Option        \"FingerLow\"     \"25\"
308   Option        \"FingerHigh\"    \"30\"
309   Option        \"ZAxisMapping\"   \"4 5\"
310   Option        \"MaxTapTime\"    \"180\"
311   Option        \"MaxTapMove\"    \"220\"
312   Option        \"VertScrollDelta\" \"100\"
313   Option        \"MinSpeed\"      \"0.06\"
314   Option        \"MaxSpeed\"      \"0.12\"
315   Option        \"AccelFactor\" \"0.0010\"
316 #  Option       \"SHMConfig\"     \"on\"
317 #  Option       \"Repeater\"      \"/dev/ps2mouse\"
318 EndSection
319 "
320     else
321      MOUSEDRIVER='mouse'
322      SYNMOUSEDETAIL=""
323      SYNMOUSE='# No synaptics touchpad detected.'
324     fi
325    else
326
327     # AlpsPS/2 ALPS TouchPad (with Synapticsdriver)
328     if grep -q 'Device:.*ALPS' "$MOUSEINFO" ; then
329      if [[ "$SYNAPTICS" == "yes" ]] ; then # check for '-nosynaptics'-option
330       MOUSEDRIVER='synaptics'
331       SYNMOUSE='InputDevice    "Synaptics" # "AlwaysCore"'
332       SYNMOUSEDETAIL="
333 Section \"InputDevice\"
334   Driver        \"synaptics\"
335   Identifier    \"Synaptics\"
336   Option        \"Device\"        \"/dev/psaux\"
337   Option        \"Protocol\"      \"auto-dev\"
338   Option        \"LeftEdge\"      \"120\"
339   Option        \"RightEdge\"     \"850\"
340   Option        \"TopEdge\"       \"120\"
341   Option        \"BottomEdge\"    \"650\"
342   Option        \"FingerLow\"     \"14\"
343   Option        \"FingerHigh\"    \"15\"
344   Option        \"ZAxisMapping\"   \"4 5\"
345   Option        \"MaxTapTime\"    \"180\"
346   Option        \"MaxTapMove\"    \"50\"
347   Option        \"MaxDoubleTapTime\"    \"100\"
348   Option        \"VertScrollDelta\" \"20\"
349   Option        \"HorizScrollDelta\" \"20\"
350   Option        \"MinSpeed\"      \"0.3\"
351   Option        \"MaxSpeed\"      \"2.00\"
352   Option        \"AccelFactor\" \"0.030\"
353   Option        \"UpDownScrolling\" \"1\"
354   Option        \"EmulateMiddleButtonTime\" \"75\"
355   Option        \"CircularScrolling\" \"1\"
356   Option        \"CircScrollDelta\" \"0.1\"
357   Option        \"CircScrollTrigger\" \"8\"
358 #  Option       \"SHMConfig\"     \"on\"
359 #  Option       \"Repeater\"      \"/dev/ps2mouse\"
360 EndSection
361 "
362      else
363       MOUSEDRIVER='mouse'
364       SYNMOUSEDETAIL=""
365       SYNMOUSE='# No alps touchpad detected.'
366      fi
367     else
368       SYNMOUSE='# No synaptics/alps touchpad present.'
369     fi
370    fi
371
372    # USB-PS/2 Optical Mouse
373    if [ -n "$USE_USB" ] ; then
374      USBMOUSE='InputDevice    "USB Mouse"     "CorePointer"'
375      USBMOUSEDETAIL="
376 Section \"InputDevice\"
377         Identifier      \"USB Mouse\"
378         Driver          \"mouse\"
379         Option          \"Device\"                \"/dev/input/mice\"
380         Option          \"Protocol\"              \"auto\"
381         Option          \"ZAxisMapping\"          \"4 5\"
382         Option          \"Buttons\"               \"5\"
383         Option          \"SendCoreEvents\"        \"true\"
384 EndSection
385 "
386    else
387      USBMOUSE='# InputDevice    "USB Mouse"     "CorePointer"'
388      USBMOUSEDETAIL=''
389    fi
390
391    if grep -q 'Device:.*Serial' "$MOUSEINFO" ; then
392      SERIAL='yes'
393      SERMOUSE='InputDevice    "Serial Mouse"     "CorePointer"'
394      SERMOUSEDETAIL="
395 Section \"InputDevice\"
396         Identifier  \"Serial Mouse\"
397         Driver      \"mouse\"
398         Option      \"Device\" \"/dev/ttyS0\"
399         Option      \"Protocol\" \"Microsoft\"
400         Option      \"Emulate3Buttons\" \"true\"
401         Option      \"Emulate3Timeout\" \"70\"
402         Option      \"SendCoreEvents\"  \"true\"
403 EndSection
404 "
405    else
406      SERMOUSE='# No serial mouse detected.'
407      SERMOUSEDETAIL=''
408    fi
409
410    # ImExPS/2 Logitech Explorer Mouse
411    # "PS2++ Logitech MX Mouse"
412    if [ -n "$USE_PS2" ] ; then
413       PS2='yes'
414       PS2MOUSE='InputDevice    "PS/2 Mouse"    "CorePointer"'
415       PS2MOUSEDETAIL="
416 Section \"InputDevice\"
417         Identifier  \"PS/2 Mouse\"
418         Driver      \"mouse\"
419         Option      \"Device\" \"/dev/input/mice\"
420         # Option      \"Device\" \"/dev/psaux\"
421         Option      \"Protocol\" \"PS/2\"
422         Option      \"Emulate3Buttons\" \"true\"
423         Option      \"Emulate3Timeout\" \"70\"
424         Option      \"SendCoreEvents\"  \"true\"
425 EndSection
426 "
427      else
428       PS2MOUSE='# InputDevice    "PS/2 Mouse"    "CorePointer"'
429       PS2MOUSEDETAIL=''
430      fi
431
432      EVDEV_MOUSE="
433 # Section \"InputDevice\"
434 #         Identifier      \"Generic Mouse\"
435 #         Driver          \"evdev\"
436 #         Option          \"Device\"                \"/dev/input/mice\"
437 #         Option          \"Protocol\"              \"auto\"
438 #         Option          \"ZAxisMapping\"          \"4 5\"
439 #         Option          \"Buttons\"               \"5\"
440 #         Option          \"SendCoreEvents\"        \"true\"
441 # EndSection
442 "
443
444    MOUSE="        $USBMOUSE
445         $PS2MOUSE
446         $SYNMOUSE
447         $SERMOUSE"
448 }
449 # }}}
450
451 # commandline parsing {{{
452 parse_options()
453 {
454    zparseopts -K -- module:=o_module help=o_help noddc=o_noddc nosync=o_nosync \
455                     vsync:=o_vsync hsync:=o_hsync mode:=o_mode force=o_force display:=o_display   \
456                     nostart=o_nostart nodpms=o_nodpms nosynaptics=o_nosynaptics nousb=o_nousb \
457                     nops2=o_nops2 genmouse=o_genmouse novref=o_novref nohsync=o_nohsync \
458                     fallback=o_fallback usb=o_usb ps2=o_ps2 composite=o_composite \
459                     xinerama=o_xinerama
460
461    if [[ $# == 0 || "$o_help" != "" || "$1" == '-h' || "$1" == '--help' ]]; then
462       usage
463    fi
464
465    if [[ "$o_force" != "" ]]; then
466       FORCE='yes'
467    fi
468
469    if [[ "$o_fallback" != "" ]]; then
470       FALLBACK="yes"
471       if [ -r /etc/X11/xorg.conf.example ] ; then
472          sudo cp /etc/X11/xorg.conf.example $XCONFIG
473          print "$bold_color$fg[blue]Copying /etc/X11/xorg.conf.example to $XCONFIG as requested via fallback option."
474       else
475          echo 'Error: /etc/X11/xorg.conf.example not readable, exiting.'
476          exit 1
477       fi
478    fi
479
480    if [[ "$o_nodpms" != "" ]]; then
481       DPMS='Option       "DPMS"      "false"'
482    else
483       DPMS='Option       "DPMS"      "true"'
484    fi
485
486    if [[ "$o_noddc" != "" ]]; then
487       NODDC="yes"
488    fi
489
490    if [[ "$o_vsync" != "" ]]; then
491       FORCE="yes"
492    fi
493
494    if [[ "$o_hsync" != "" ]]; then
495       FORCE="yes"
496    fi
497
498    if [[ "$o_nousb" != "" ]]; then
499       echo 'Warning: option -nousb is deprecated.'>&2
500    fi
501
502    if [[ "$o_usb" != "" ]]; then
503       USE_USB='yes'
504    fi
505
506    if [[ "$o_nops2" != "" ]]; then
507       echo 'Warning: optino -nops2 is deprecatedË™'>&2
508    fi
509
510    if [[ "$o_ps2" != "" ]]; then
511       USE_PS2='yes'
512    fi
513
514    if [[ "$o_genmouse" != "" ]]; then
515       GENERICMOUSE='yes'
516    fi
517
518    if [[ "$o_nosynaptics" != "" ]]; then
519       SYNAPTICS='no'
520    else
521       SYNAPTICS='yes'
522    fi
523
524    if [[ "$o_nostart" != "" ]]; then
525       NOSTART="yes"
526    fi
527
528    DISPLAY=$o_display[2]
529
530    eval WINDOWMANAGER=\${$#}
531
532    if [[ "$XKEYBOARD" == de ]] ; then
533       KEYBOARD="$KEYBOARD
534 #         Option      \"XkbVariant\" \"nodeadkeys\""
535    fi
536
537    if [ -n "$FORCE" -o ! -r "$XCONFIG" -a -z "$FALLBACK" ] ; then
538      print -n "$bold_color$fg[blue]Gathering hardware information...$fg[red]"
539
540      sync # get hsync/vsync
541
542      if [ -z "$o_hsync" ] ; then
543        o_hsync=(-hsync "$hsyncval")
544        HSYNC=$o_hsync[2]
545        HORIZSYNC="        HorizSync    $HSYNC"
546      else
547        o_hsync=(-hsync "$o_hsync[2]")
548        HSYNC=$o_hsync[2]
549        HORIZSYNC="        HorizSync    $HSYNC"
550      fi
551
552      if [ -z "$o_vsync" ] ; then
553        o_vsync=(-vsync "$vsyncval")
554        VSYNC=$o_vsync[2]
555        VERTISYNC="        VertRefresh  $VSYNC"
556      else
557        o_vsync=(-vsync "$o_vsync[2]")
558        VSYNC=$o_vsync[2]
559        VERTISYNC="        VertRefresh  $VSYNC"
560      fi
561
562      if [[ "$o_nosync" != "" ]]; then
563         HORIZSYNC="#       HorizSync   28.0 - 96.0  # deactivated via -nosync option of grml-x"
564         VERTISYNC="#       VertRefresh 50.0 - 60.0  # deactivated via -nosync option of grml-x"
565      fi
566
567      if [[ "$o_nohsync" != "" ]]; then
568         HORIZSYNC="#       HorizSync   28.0 - 96.0  # deactivated via -nohsync option of grml-x"
569      fi
570
571      if [[ "$o_novref" != "" ]]; then
572         VERTISYNC="#       VertRefresh 50.0 - 60.0  # deactivated via -novref option of grml-x"
573      fi
574
575      if [[ "$o_xinerama" != "" ]]; then
576         XINERAMA=1
577      fi
578
579      if [[ "$o_composite" != "" ]]; then
580         COMPOSITE="Section \"Extensions\"
581     Option \"Composite\" \"Enable\"
582 EndSection"
583      else
584         COMPOSITE="#Section \"Extensions\"
585 #    Option \"Composite\" \"Enable\"
586 #EndSection"
587      fi
588
589      # write hwinfo stuff
590      writehwinfo
591
592      # monitor stuff
593      [ -r "$HWINFO_TMP" ] || bailout 1
594      MONITOR=$(awk '/monitor.1:/{print $3}' $HWINFO_TMP)
595      [[ $MONITOR != 'ddc' ]] && NODDC=yes
596
597      # module handling
598      MODULE=$o_module[2]
599      if [ -z "$MODULE" ] ; then
600        MODULE="$(getBootParam xmodule 2>/dev/null)"
601        if [ -z "$MODULE" ] ; then
602          MODULE=$(grep 'XFree86 v4 Server Module:' "${HWINFO_TMP}" | head -1 | awk '{print $5}')
603          if [ -z "$MODULE" ] ; then
604            MODULE='vesa'
605          fi
606          # hwinfo >=13.28 reports driver 'intel' instead of i810
607          if [[ "$MODULE" == 'intel' ]] ; then
608             [ -r /usr/lib/xorg/modules/drivers/intel_drv.so ] || MODULE='i810'
609          fi
610        fi
611      else
612        FORCE="yes"
613      fi
614
615      mouse    # get mouse settings
616      VGA=$(lspci | grep VGA | sed 's/.*compatible controller: //' | head -1)
617
618      MODE=$o_mode[2]
619      if [ -z $MODE ] ; then
620        B_MODE="$(getBootParam xmode 2>/dev/null)"
621        if [ -n "$B_MODE" ] ; then
622          MODES="Modes \"$B_MODE\""
623          FORCE="yes"
624        fi
625        if [ -z "$MODES" ] ; then
626           mode # get available modes
627        fi
628      else
629        MODES="Modes \"$MODE\""
630        FORCE="yes"
631      fi
632
633      print "$fg[green]done$reset_color"
634      print "$bg[black]$fg[white]$bold_color"
635      print "$fg[green]Specified windowmanager is $fg[yellow]$WINDOWMANAGER"
636      print "$fg[green]Video is $fg[yellow]$VGA$fg[green] using $bg[black]$fg[yellow]${XSERVER}$fg[cyan](${MODULE})$fg[green] Server"
637      [[ -z $HSYNC ]] && [[ -z $VSYNC ]] && print "$fg[green]Monitor is $fg[yellow]$MONITOR"
638      [[ -z $HSYNC ]] && [[ -n $VSYNC ]] && print "$fg[green]Monitor is $fg[yellow]$MONITOR$fg[green], VSYNC: $fg[yellow]$VSYNC"
639      [[ -z $VSYNC ]] && [[ -n $HSYNC ]] && print "$fg[green]Monitor is $fg[yellow]$MONITOR$fg[green], HSYNC: $fg[yellow]$HSYNC"
640      [[ -n $VSYNC ]] && [[ -n $HSYNC ]] && print "$fg[green]Monitor is $fg[yellow]$MONITOR$fg[green], HSYNC: $fg[yellow]$HSYNC $fg[green]VSYNC: $fg[yellow]$VSYNC"
641      [[ -n $modes ]] && print "$fg[green]Using default X.org modes."
642      [[ -z $modes ]] && print "$fg[green]Using Mode: $fg[yellow]$MODE"
643      print "${reset_color}"
644    fi
645 }
646 parse_options $*
647 # }}}
648
649 # check for requirements {{{
650 requirements()
651 {
652 if ! [ -x $(which hwinfo) ] ; then
653   print "$bg[black]$fg[red]${bold_color}Error: hwinfo not found in path.${reset_color}
654 Note:  run 'aptitude install hwinfo' on systems running debian.
655 Exiting.${reset_color}"
656   exit -1
657 fi
658
659 if ! [[ -d /sys ]] ; then
660   print "$bg[black]$fg[red]${bold_color}Error: mounted /sys required (for hwinfo).${reset_color}
661 You may want to add the following line to your /etc/fstab:
662
663   sysfs /sys sysfs defaults 0 0
664
665 or just run 'mount /sys'. Exiting.${reset_color}"
666   exit -1
667 fi
668 }
669 requirements
670 # }}}
671
672 # xconfig {{{
673 xconfig() {
674 cat << EOX
675 ################################################################################
676 # Filename:      $XCONFIG
677 # Purpose:       config file for xserver - generated by grml-x
678 # Bug-Reports:   see http://grml.org/bugs/
679 # Latest change: ${DATE}
680 # See also:
681 #   /usr/share/doc/xserver-xorg/   and
682 #   http://wiki.x.org/wiki/Home    and
683 #   http://ftp.x.org/pub/X11R7.0/doc/html/index.html for information on Xorg
684
685 # Refer to the xorg.conf man page and to
686 # http://ftp.x.org/pub/X11R7.0/doc/html/xorg.conf.5.html
687 # for details about the format of this file.
688 #
689 # See http://wiki.debian.org/XStrikeForce/FAQ for information
690 # regarding Xorg packages within Debian.
691 #
692 # If you would like this file to be automatically reconfigured by debian,
693 # run the following command:
694 #   sudo dpkg-reconfigure -phigh xserver-xorg
695 ################################################################################
696
697 Section "ServerLayout"
698         Identifier     "XServer Configured"
699         Screen      0  "Screen0" 0 0
700         # InputDevice    "Keyboard0"     "CoreKeyboard"
701         # InputDevice    "Generic Mouse" "CorePointer"
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"             "true"  # disable <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  "type1"     # type1 font module
728         Load  "freetype"  # freetype fonts rendering
729         Load  "extmod"    # some commonly used server extensions (e.g. shape extension)
730         Load  "record"    # recording extension
731         Load  "evdev"     # generic input handling driver on Linux
732         Load  "xtrap"     # X Trap extension
733         # Load  "vbe"       # Vesa BIOS Extension
734         # Load  "i2c"       # I2C bus
735         # Load  "int10"     # initialize graphics cards via int10 call to the BIOS
736         # Load  "v4l"       # Video for Linux
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="/tmp/xconfig.$$"
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