-#!/usr/bin/zsh
+#!/usr/bin/python3
+# -*- coding: utf-8 -*-
+# vim: set et ts=4:
+
# Filename: grml-x
# Purpose: wrapper for startx on grml [providing new xconfiguration tool]
-# Authors: grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
+# Authors: grml-team (grml.org), (c) Christian Hofstaedtler <ch@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
+###############################################################################
+
+import os
+import subprocess
+import sys
+import tempfile
+import time
+import traceback
+from optparse import OptionParser
+
+
+class Section(object):
+ def __init__(self, name, identifier, data):
+ self.name = name
+ self.identifer = identifier
+ self.data = data
+ self.subsect = ""
+
+ def __str__(self):
+ s = 'Section "%s"\n\tIdentifier "%s"\n' % (self.name, self.identifer)
+ for k in self.data:
+ v = self.data[k]
+ if isinstance(v, list):
+ v = '" "'.join(v)
+ elif not isinstance(v, str): # int, others
+ v = str(v)
+ elif "-" in v: # sync range
+ pass
+ else:
+ v = '"%s"' % v
+ s += "\t%s %s\n" % (k, v)
+ s += self.subsect
+ s += "EndSection\n"
+ return s
+
+
+def get_monitor_section(options, force):
+ if not options.hsync and not options.vsync and not force:
+ return None
+ d = {}
+ d["HorizSync"] = options.hsync or "28.0 - 96.0"
+ d["VertRefresh"] = options.vsync or "50.0 - 60.0"
+ return Section("Monitor", "Monitor0", d)
+
+
+def get_device_section(options):
+ if not options.module:
+ return None
+ d = {}
+ d["Driver"] = options.module
+ d["VendorName"] = "All"
+ d["BoardName"] = "All"
+ return Section("Device", "Card0", d)
+
+
+def build_bootparams():
+ lines = []
+
+ def walk_bootparams_path(p):
+ try:
+ if not os.path.exists(p):
+ return
+ for root, dirs, files in os.walk(p):
+ for name in files:
+ f = open(os.path.join(root, name))
+ lines.extend(f.readlines())
+ f.close()
+ except Exception:
+ print("W: Error while getting bootparams from %s" % p)
+
+ f = open("/proc/cmdline")
+ lines.append(f.readline())
+ f.close()
+ walk_bootparams_path("/lib/live/mount/medium/bootparams")
+ walk_bootparams_path("/run/live/medium/bootparams")
+ params = {}
+ for p in " ".join(lines).split(" "):
+ if "=" in p:
+ (k, v) = p.split("=", 1)
+ params[k] = v
+ else:
+ params[p] = True
+ return params
+
+
+def detect_qemu():
+ f = open("/proc/cpuinfo")
+ x = "".join(f.readlines())
+ f.close()
+ if "QEMU" in x:
+ return True
+ return False
+
+
+def get_program_output(args):
+ p = subprocess.Popen(
+ args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True
+ )
+ return p.communicate()[0]
+
+
+def run_program(args):
+ subprocess.Popen(args, close_fds=True).wait()
+
+
+def which(program):
+ def is_exe(fpath):
+ return os.path.exists(fpath) and os.access(fpath, os.X_OK)
+
+ fpath, fname = os.path.split(program)
+ if fpath:
+ if is_exe(program):
+ return program
+ else:
+ for path in os.environ["PATH"].split(os.pathsep):
+ exe_file = os.path.join(path, program)
+ if is_exe(exe_file):
+ return exe_file
+
+ return None
+
+
+XORG_CONF_HEADER = "# Automatically generated by grml-x.\n"
+
+
+def check_old_xorg_conf(filename, overwrite):
+ # True: no problem, we can create/overwrite the config file
+ # False: pre-existing config file, and we are not to overwrite it
+ if overwrite:
+ return True
+ if not os.path.exists(filename):
+ return True
+ try:
+ f = open(filename, "r")
+ lines = f.readlines()
+ f.close()
+ return XORG_CONF_HEADER not in lines
+ except IOError:
+ return False
+
+
+parser = OptionParser(usage="usage: %prog [options] [window-manager]")
+parser.add_option(
+ "--nostart",
+ action="store_false",
+ dest="start_server",
+ default=True,
+ help="Don't start X server",
+)
+parser.add_option(
+ "--display",
+ action="store",
+ type="string",
+ dest="display",
+ help="Start X server on display DISPLAY",
+)
+parser.add_option(
+ "--hsync",
+ action="store",
+ type="string",
+ dest="hsync",
+ help="Force writing a HorizSync range",
+)
+parser.add_option(
+ "--vsync",
+ action="store",
+ type="string",
+ dest="vsync",
+ help="Force writing a VertRefresh range",
+)
+parser.add_option(
+ "--mode",
+ action="store",
+ type="string",
+ dest="mode",
+ help="Force a specific resolution",
+)
+parser.add_option(
+ "--module",
+ action="store",
+ type="string",
+ dest="module",
+ help="Force driver MODULE instead of Xorg autodetection",
+)
+parser.add_option(
+ "-o",
+ action="store",
+ type="string",
+ dest="xorg_conf",
+ default="/etc/X11/xorg.conf",
+ help="Specify alternate xorg.conf file [default: %default]",
+)
+parser.add_option(
+ "-f",
+ "--force",
+ action="store_true",
+ dest="overwrite",
+ default=False,
+ help="Overwrite xorg.conf if it exists [default: %default]",
+)
+
+
+def main():
+ (options, args) = parser.parse_args()
+ bootparams = build_bootparams()
+
+ if os.getuid() == 0 and options.start_server:
+ print("W: running as root is unsupported and may not work.")
+ time.sleep(1)
+
+ if not check_old_xorg_conf(options.xorg_conf, options.overwrite):
+ print("E: Not overwriting existing %r without --force." % options.xorg_conf)
+ print("I: If you previously ran grml-x, use startx /usr/bin/x-window-manager")
+ return 1
+
+ if "xmode" in bootparams and not options.mode:
+ options.mode = bootparams["xmode"]
+ if "xmodule" in bootparams and not options.module:
+ options.module = bootparams["xmodule"]
+
+ force_monitor = False
+ # cirrus driver for QEMU doesn't do 1024x768 without HorizSync set
+ if detect_qemu():
+ force_monitor = True
+
+ monitor = get_monitor_section(options, force_monitor)
+ device = get_device_section(options)
+
+ # build Screen section ourselves
+ d = {}
+ if monitor:
+ d["Monitor"] = monitor.identifer
+ if device:
+ d["Device"] = device.identifer
+ screen = Section("Screen", "Screen0", d)
+ if options.mode:
+ d["DefaultColorDepth"] = 16
+ for depth in [8, 15, 16, 24, 32]:
+ screen.subsect += (
+ 'SubSection "Display"\n\tDepth %d\n\tModes "%s"\t\nEndSubSection\n'
+ % (depth, options.mode)
+ )
+
+ xinitrc = "~/.xinitrc"
+ if "XINITRC" in os.environ:
+ xinitrc = os.environ["XINITRC"]
+ xinitrc = os.path.expanduser(xinitrc)
+
+ window_manager = "x-window-manager"
+ if len(args) == 1:
+ window_manager = args[0]
+ window_manager_path = which(window_manager)
+ if not window_manager_path:
+ print("E: Cannot find window manager %r, aborting." % window_manager)
+ return 2
+
+ wm_exec = "exec %s\n" % window_manager_path
+ if not os.path.exists(xinitrc):
+ f = open(xinitrc, "w")
+ f.write("#!/bin/sh\n")
+ f.write(wm_exec)
+ f.close()
+ else:
+ f = open(xinitrc, "r")
+ lines = f.readlines()
+ f.close()
+ f = open(xinitrc, "w")
+ for line in lines:
+ if line.strip().startswith("exec "):
+ line = wm_exec
+ f.write(line)
+ os.fchmod(f.fileno(), 0o750)
+ f.close()
+
+ # write new config
+ if monitor or device or len(screen.data) > 0 or screen.subsect != "":
+ try:
+ f = tempfile.NamedTemporaryFile(mode="w+", delete=False)
+ f.write(XORG_CONF_HEADER)
+ f.write(
+ "# DO NOT MODIFY, YOUR CHANGES WILL BE LOST - OR REMOVE ALL HEADER LINES\n"
+ )
+ f.write("# See man xorg.conf or /etc/X11/xorg.conf.example for more\n")
+ if monitor:
+ f.write(str(monitor))
+ if device:
+ f.write(str(device))
+ f.write(str(screen))
+ f.flush()
+ os.fchmod(f.fileno(), 0o644)
+ run_program(["sudo", "mv", "-f", f.name, options.xorg_conf])
+ finally:
+ f.close()
+
+ if options.start_server:
+ startx = ["startx", xinitrc, "--"]
+ if options.display:
+ startx.append(":" + options.display)
+ print("Starting X: %r" % startx)
+ run_program(startx)
+
+ return 0
+
+
+if __name__ == "__main__":
+ rc = 1
+ try:
+ rc = main()
+ except Exception:
+ print("E: Exception: ", end=" ")
+ traceback.print_exc()
+ sys.exit(1)