#!/bin/bash # xorg - xorg plugin for postplug # Copyright (c) 2004-2023 by Silvan Calarco # Copyright (c) 2004-2007 by Davide Madrisan if [ $UID != 0 ]; then echo "$0: must be superuser." >&2 exit 1 fi [ -r /etc/sysconfig/keyboard ] && . /etc/sysconfig/keyboard [ -r /etc/sysconfig/postplug ] && . /etc/sysconfig/postplug [ -r /etc/sysconfig/machine ] && . /etc/sysconfig/machine me="xorg" . /etc/postplug/postplug.defs XORGCONF=/etc/X11/xorg.conf # xorg_section_screen_config() # write a new xorg configuration # args: # $1 : default color depth # $2 : file with the video modes (one per line) function xorg_section_screen_config() { # fixme: this deletes from first subsection "Display" to the endsection sed '/SubSection "Display"/,/EndSection/s/.*//p' $XORGCONF | \ grep -v "^\s*$" > $XORGCONF.new for i in `seq 1 ${#COLORDEPTHS[@]}`; do echo -n "\ SubSection \"Display\" Modes " >> $XORGCONF.new grep "${COLORDEPTHS[$i-1]} bpp" $2 | tac | \ while read mode skip; do echo -n "\"${mode%,*}\" " >> $XORGCONF.new done echo " Depth ${COLORDEPTHS[$i-1]} EndSubSection" >> $XORGCONF.new done echo "EndSection" >> $XORGCONF.new mv $XORGCONF $XORGCONF.save mv $XORGCONF.new $XORGCONF } ## xorg_set_alternatives() ## set alternatives and xorg configuration for specific video drivers #function xorg_set_alternatives() { #if [ "$VIDEODRIVER" = "nvidia" ]; then # grep -q '^[^#]*\"AllowGLXWithComposite\"' $XORGCONF || # sed -i -e '/Driver\W*"nvidia"/a\ # Option \"RenderAccel\" \"true\"\ # Option \"AllowGLXWithComposite\" \"on\"\ # Option \"NoLogo\" \"true\"' $XORGCONF #fi #} function xorg_d_configure_input() { # Keyboard configuration (Xorg >= 1.8 uses /etc/X11/xorg.conf.d) [ ! -e /etc/X11/xorg.conf.d/00-keyboard.conf ] && { if [ ! "$XKB_MODEL" -o ! "$XKB_LAYOUT" ]; then case "${LANG:0:2}" in it) # XKB_MODEL="pc105" XKB_LAYOUT="it" ;; de) # XKB_MODEL="pc105" XKB_LAYOUT="de" ;; es) # XKB_MODEL="pc105" XKB_LAYOUT="es" ;; fr) # XKB_MODEL="pc105" XKB_LAYOUT="fr" ;; *) # XKB_MODEL="pc104" XKB_LAYOUT="us" ;; esac fi cat > /etc/X11/xorg.conf.d/00-keyboard.conf << __EOF # Created by postplug Section "InputClass" Identifier "system-keyboard" MatchIsKeyboard "on" Option "XkbLayout" "$XKB_LAYOUT" __EOF [ "$XKB_MODEL" ] && echo " Option \"XkbModel\" \"$XKB_MODEL\"" >>/etc/X11/xorg.conf.d/00-keyboard.conf [ "$XKB_VARIANT" ] && echo " Option \"XkbVariant\" \"$XKB_VARIANT\"" >>/etc/X11/xorg.conf.d/00-keyboard.conf if [ "${SYSTEM_MANUFACTURER:0:5}" = "Apple" ]; then XKB_OPTIONS="${XKB_OPTIONS},lv3:rwin_switch" fi [ "$XKB_OPTIONS" ] && echo " Option \"XkbOptions\" \"$XKB_OPTIONS\"" >>/etc/X11/xorg.conf.d/00-keyboard.conf echo "EndSection" >>/etc/X11/xorg.conf.d/00-keyboard.conf } if [ -e /etc/X11/xorg.conf.d/10-keyboard.conf ]; then rm -f /etc/X11/xorg.conf.d/10-keyboard.conf fi if [ -e /etc/X11/xorg.conf.d/15-keyboard-apple.conf ]; then rm -f /etc/X11/xorg.conf.d/15-keyboard-apple.conf fi } # (re)create the '/tmp/.ICE-unix' directory with the right permissions rm -fr /tmp/.ICE-unix install -m 1777 -o root -g root -d /tmp/.ICE-unix # video hardware change detection if [ -e /dev/nvhost-ctrl ]; then VIDEO_DEV="NVIDIA TEGRA" else VIDEO_DEV="`lspci -n 2>/dev/null | grep " 03[0-9][0-9]: "`" [ "$VIDEO_DEV" ] || VIDEO_DEV="embedded-unknown" fi if [ -e $XORGCONF -a -e $postpluglibdir/xorg.cache ]; then VIDEO_DEV_CACHED="`cat $postpluglibdir/xorg.cache`" [ "$VIDEO_DEV" = "$VIDEO_DEV_CACHED" ] || { logmsg "$me" "warning: video device appears to have changed; re-probing" mv $XORGCONF $XORGCONF.postplug.save } fi if [ -e $XORGCONF ]; then VIDEODRIVERS=(`sed -n "/Section[ \t]\"Device\"/,/EndSection/{s/^[ \t]*Driver[ \t]*\"\(.*\)\"/\1/p}" $XORGCONF`) # assume first driver as default videodriver VIDEODRIVER=${VIDEODRIVERS[0]} [ -e /sys/module/nouveau/parameters/modeset ] && NOUVEAU_MODESET=`cat /sys/module/nouveau/parameters/modeset` [ "$NOUVEAU_MODESET" = "-1" ] && NOUVEAU_MODESET=1 [ -e /sys/module/radeon/parameters/modeset ] && RADEON_MODESET=`cat /sys/module/radeon/parameters/modeset` [ "$RADEON_MODESET" = "-1" ] && RADEON_MODESET=1 if [ "$VIDEODRIVER" = "nvidia" -a "$NOUVEAU_MODESET" = "1" ]; then # replace nvidia with nouveau mv $XORGCONF $XORGCONF.postplug.nvidia.save rmmod nvidia echo "blacklist nvidia" > /etc/modprobe.d/postplug-nouveau.conf VIDEODRIVER="" elif [ "$NOUVEAU_MODESET" = "0" ]; then # replace nouveau with nvidia (NOUVEAU_MODESET=0 means we have nvidia chip) mv $XORGCONF $XORGCONF.postplug.nouveau.save rmmod nouveau rm -f /etc/modprobe.d/postplug-nouveau.conf VIDEODRIVER="nvidia" fi fi if [ ! -e $XORGCONF ]; then # # Create a new Xorg configuration file # if [ -e /dev/nvhost-ctrl -a -e $XORGCONF.tegra ]; then # use default xorg.conf for Tegra cp $XORGCONF.tegra $XORGCONF else # remove any nvidia driver loaded as they don't load according to PCIID [ "`/sbin/lsmod 2>/dev/null | grep ^nvidia `" ] && rmmod nvidia # sync to avoid filesystem corruption in case of system hang on probe sync rm -f /tmp/xorg.conf.new logmsg "$me" "info: running Xorg -configure" tmpfile=`mktemp` HOME=/tmp Xorg :5 -configure 2>>$tmpfile RET=$? grep "Server terminated with error" $tmpfile >/dev/null && RET=255 logmsg "$me" "info: Xorg -configure return code was $RET" if [ $RET -ne 0 -a "$NOUVEAU_MODESET" != "0" ]; then logmsg "$me" "warning: xorg autoprobed configuration failed; using xorg autoconfig" echo "# Dummy empty xorg.conf file created by postplug" > $XORGCONF else mv /tmp/xorg.conf.new $XORGCONF sed -i "s|#DisplaySize|DisplaySize|" $XORGCONF # disable autoconfigured multiple screens sed -i "s|^\([[:space:]]*Screen[[:space:]]*[1-9].*\)|#\1|" $XORGCONF fi fi let "CONFCREATED = 1" VIDEODRIVERS=(`sed -n "/Section[ \t]\"Device\"/,/EndSection/{s/^[ \t]*Driver[ \t]*\"\(.*\)\"/\1/p}" $XORGCONF`) # assume first driver as default videodriver VIDEODRIVER=${VIDEODRIVERS[0]} fi if [ "$CONFCREATED" = "1" -a "$VIDEODRIVER" ]; then [ "`grep nomodeset /proc/cmdline`" ] && nomodeset=1 if [ "$nomodeset" = "1" -a "$VIDEODRIVER" = "nouveau" ]; then sed -i "s|Driver\W*\"nouveau\"|Driver \"nvidia\"|" $XORGCONF VIDEODRIVER=nvidia rmmod nouveau nvidia fi case "$VIDEODRIVER" in vesa|vga) sed -i -e '/Section "Screen"/a\ #DefaultColorDepth 24' $XORGCONF ;; *) sed -i -e '/Section "Screen"/a\ DefaultColorDepth 24' $XORGCONF ;; esac # NVIDIA Compiz/3d configuration options if [ "$VIDEODRIVER" == "nvidia" ]; then sed -i -e '/Section "Screen"/a\ Option "AddARGBGLXVisuals" "true"\ Option "DisableGLXRootClipping" "true"' $XORGCONF fi # Nouveau configuration options if [ "$VIDEODRIVER" == "nouveau" ]; then sed -i -e '/Driver.*"nouveau"/a\ Option "GLXVBlank" "true"' $XORGCONF fi # configure VirtualBox mouse driver if [ "$VIDEODRIVER" = "vboxvideo" ]; then sed -i "s|\"mouse\"|\"vboxmouse\"|" $XORGCONF fi # Configure fonts sed -i '/fonts\/Type1/d;s@\(.*X11/fonts.*\)/@\1:unscaled@' $XORGCONF fc-cache # Configure keyboard # NOTE: # see: /etc/X11/xkb/README.config # /usr/lib/X11/doc/README.XKB-Config # The X Keyboard Extension: Protocol Specification # # xkb configuration # # # /etc/X11/xkb/rules/xfree86.lst (commonest file of rules) # # The parameters are: # XkbRules - files of rules to be used for keyboard mapping composition # XkbModel - name of model of your keyboard type # XkbLayout - layout(s) you intend to use # XkbVariant - variant(s) of layout you intend to use # XkbOptions - extra xkb configuration options # # XkbVariant has been left out: that means the default variant named basic is loaded. if [ ! "$XKB_MODEL" -o ! "$XKB_LAYOUT" ]; then case "${LANG:0:2}" in it) XKB_MODEL="pc105" XKB_LAYOUT="it" ;; de) XKB_MODEL="pc105" XKB_LAYOUT="de" ;; es) XKB_MODEL="pc105" XKB_LAYOUT="es" ;; fr) XKB_MODEL="pc105" XKB_LAYOUT="fr" ;; *) XKB_MODEL="pc104" XKB_LAYOUT="us" ;; esac fi if [ -n "XKbOptions" ]; then sed -i -e "/Identifier\W*\"Keyboard.*\"/a\\ Option \"XkbModel\" \"$XKB_MODEL\"\\ Option \"XkbLayout\" \"$XKB_LAYOUT\"\\ Option \"XKbOptions\" \"$XKB_OPTIONS\"" $XORGCONF else sed -i -e "/Identifier\W*\"Keyboard.*\"/a\\ Option \"XkbModel\" \"$XKB_MODEL\"\\ Option \"XkbLayout\" \"$XKB_LAYOUT\"" $XORGCONF fi # global mouse modifications to default configuration sed -i -e '/"CorePointer"/i \ Option "AllowMouseOpenFail"' $XORGCONF # echo "$XORGCONF" > $postplugnew_file # Final probe [ -f /var/log/Xorg.5.log ] && rm -f /var/log/Xorg.5.log # sync to avoid filesystem corruption in case of system hang on probe sync xinit /bin/true -- :5 if [ -r /var/log/Xorg.5.log ]; then if [ "`grep '\[KMS\] Kernel modesetting enabled' /var/log/Xorg.5.log`" ]; then logmsg "$me" "info: "$"KMS enabled: assuming autodetect works for PANEL_SIZE and HSYNC_RANGE" PANEL_SIZE_DETECTED="true" HSYNC_RANGE_NOT_DETECTED="" else if [ "`grep 'hsync range of 28.00-33.00 kHz' /var/log/Xorg.5.log`" -o \ "`grep 'The EDID read for display device CRT-0 is invalid' /var/log/Xorg.5.log`" ]; then # no values could be autodetected by DDC, so use a failsafe low value (30-49) HSYNC_RANGE_NOT_DETECTED="true" fi [ "`grep 'Printing DDC gathered Modelines' /var/log/Xorg.5.log`" ] && PANEL_SIZE_DETECTED="true" [ "`grep 'EDID vendor \"' /var/log/Xorg.5.log`" ] && PANEL_SIZE_DETECTED="true" [ "`grep 'Adding EDID-provided mode' /var/log/Xorg.5.log`" ] && PANEL_SIZE_DETECTED="true" [ "`grep -i 'Panel size from' /var/log/Xorg.5.log`" ] && PANEL_SIZE_DETECTED="true" [ "`grep -i 'Panel size is' /var/log/Xorg.5.log`" ] && PANEL_SIZE_DETECTED="true" [ "`grep -i 'Panel Size ' /var/log/Xorg.5.log`" ] && PANEL_SIZE_DETECTED="true" [ "`grep 'VESA VBE DDC read successfully' /var/log/Xorg.5.log`" ] && PANEL_SIZE_DETECTED="true" [ "`grep 'LCD on internal LVDS' /var/log/Xorg.5.log`" ] && PANEL_SIZE_DETECTED="true" [ "`grep 'LCD on internal LVDS' /var/log/Xorg.5.log`" ] && PANEL_SIZE_DETECTED="true" [ "`grep 'LVDS.* using initial mode' /var/log/Xorg.5.log`" ] && PANEL_SIZE_DETECTED="true" # nvidia driver: CRT-. EDID not got? if [ "`grep 'Unable to read EDID for display device CRT-.' /var/log/Xorg.5.log`" -o \ "`grep 'Unable to get display device CRT-..s EDID' /var/log/Xorg.5.log`" ]; then # nvidia driver: disable CRT-x from being used by default if DFP-0 is present [ "`grep 'DFP-0' /var/log/Xorg.5.log`" ] && { sed -i -e '/Section "Screen"/a\ Option "ConnectedMonitor" "DFP"' $XORGCONF } || { HSYNC_RANGE_NOT_DETECTED="true" unset PANEL_SIZE_DETECTED } else # nvidia driver: we trust in nvidia-auto-select [ "`grep 'nvidia-auto-select' /var/log/Xorg.5.log`" ] && PANEL_SIZE_DETECTED="true" fi # fglrx driver [ "`grep 'EDID Version:' /var/log/Xorg.5.log`" ] && PANEL_SIZE_DETECTED="true" [ "$autoresvideo" ] && PANEL_SIZE_DETECTED="true" fi [ "$XORG_DETECT_SCREEN_SIZE" = off -o "$lowresvideo" ] && unset PANEL_SIZE_DETECTED [ "$HSYNC_RANGE_NOT_DETECTED" ] && { logmsg "$me" "\ warning: DDC hsync range cannot be detected, setting default of 30-49 kHz" sed -i -e '/Section\W*"Monitor"/a\ HorizSync 30-49' $XORGCONF } [ "$HSYNC_RANGE_NOT_DETECTED" -a ! "$PANEL_SIZE_DETECTED" ] && sed -i -e '/SubSection "Display"/a\ Modes "1024x768" "800x600" "640x480"' $XORGCONF else logmsg "$me" "warning: "$"Xorg probe failed!" fi fi [ "$VIDEO_DEV" -a "$VIDEO_DEV" != "$VIDEO_DEV_CACHED" ] && echo "$VIDEO_DEV" > $postpluglibdir/xorg.cache #################################### # # Xorg dynamic configuration section # #################################### # radeon: enable a conservative power profile (mid) by default if [ -e /sys/class/drm/card0/device/power_profile ]; then [ "$XORG_POWER_PROFILE" ] || XORG_POWER_PROFILE="mid" echo $XORG_POWER_PROFILE > /sys/class/drm/card0/device/power_profile fi # Configure keyboard xorg_d_configure_input if [ -d /sys/devices/platform/sunxi-rtc -a ! -e /etc/X11/xorg.conf.d/30-serverflags.conf ]; then # Workaround: disable DPMS on BananaPi cat > /etc/X11/xorg.conf.d/30-serverflags.conf << _EOF Section "ServerFlags" Option "StandbyTime" "0" Option "SuspendTime" "0" Option "OffTime" "0" EndSection _EOF fi # enable 'Composite' extensions if [ "$VIDEODRIVER" -a "$VIDEODRIVER" != "mga" -a ! -e /etc/X11/xorg.conf.d/40-extensions.conf ]; then cat > /etc/X11/xorg.conf.d/40-extensions.conf << _EOF Section "Extensions" Option "Composite" "true" EndSection _EOF elif [ "$VIDEODRIVER" != "mga" -a -e /etc/X11/xorg.conf.d/40-extensions.conf ]; then rm -f /etc/X11/xorg.conf.d/40-extensions.conf fi # add 'Section "DRI"' if [ "$VIDEODRIVER" -a "$VIDEODRIVER" != "mga" -a ! -e /etc/X11/xorg.conf.d/50-dri.conf ]; then cat > /etc/X11/xorg.conf.d/50-dri.conf << _EOF Section "DRI" Mode 0666 EndSection _EOF fi if [ -d /sys/devices/platform/sunxi-rtc -a ! -e /etc/X11/xorg.conf.d/30-serverflags.conf ]; then # Workaround: disable DPMS on BananaPi cat > /etc/X11/xorg.conf.d/30-serverflags.conf << _EOF Section "ServerFlags" Option "StandbyTime" "0" Option "SuspendTime" "0" Option "OffTime" "0" EndSection _EOF fi # Workaround symlink for libglx.so (or Xorg will choose the wrong one) if [ -e /usr/lib/xorg/modules/extensions/libglx.so -a ! -e /usr/lib/xorg/modules/libglx.so ]; then ln -s extensions/libglx.so /usr/lib/xorg/modules/extensions/libglx.so fi if [ -e /usr/lib64/xorg/modules/extensions/libglx.so -a ! -e /usr/lib64/xorg/modules/libglx.so ]; then ln -s extensions/libglx.so /usr/lib64/xorg/modules/libglx.so fi [ -e $XORGCONF -a "$VIDEODRIVER" ] || exit 0 # add missing brackets to Xorg.conf device entries sed -i "s|^[ \t]*Driver[ \t]*\([A-Za-z0-9]*\)[ \t]*$| Driver \"\1\"|g" $XORGCONF # Configure Mice... # remove wrong configuration for USBMouse (duplicating PS2MOUSE) sed -i "/[\W]*InputDevice[\W]*"USBMouse".*/d" $XORGCONF # remove obsolete input pointers configuration (since xorg-server 1.7) sed -i "/[[:space:]]*InputDevice[[:space:]]*.*PS2Mouse.*/d; \ /[[:space:]]*InputDevice[[:space:]]*.*Synaptics.*/d; \ /[[:space:]]*InputDevice[[:space:]]*.*Alps.*/d" $XORGCONF # remove all devices set sed -i "/\W*Option \"Device\".*/d" $XORGCONF # remove obsoleted XAANoOffscreenPixmaps sed -i '/^[[:space:]]*Option[[:space:]]*"XAANoOffscreenPixmaps" "true"/d' $XORGCONF # disable keyboard configuration for Xorg >= 1.4 sed -i "s|^\([[:space:]]*InputDevice\W*\"Keyboard0\".*\)|#\1|" $XORGCONF # FIXME: delete empty lines sed -i '/./,$!d' $XORGCONF exit 0