[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#229850: xserver-xfree86: Nokia 446Xpro properly detected but sync incorrect



retitle 229850 xserver-xfree86: [debconf] monitor selection methods need to be more careful about clobbering autodetected monitor sync ranges
tag 229850 - moreinfo
thanks

On Sat, Apr 24, 2004 at 07:07:02PM -0400, Jay Berkenbilt wrote:
> With this patch to xserver-xfree86.config
[...]

Thanks a lot for your comprehensive feedback.

I agree that the config script logic needs another look in the monitor
department, and I will give your patch very serious consideration.  That
is, I can't remember why I did things the way they are done presently,
and that's bad.  I either need to document why your patch is the wrong
approach, or apply it.  :)

If you're curious, I am attaching the current work-in-progress rewrite
of the config script.  I've been working on this off and on for a week
or so.

If you'd like to play around it with it, that would be great, but you've
more than done your part with your followups to date.

Thank you very much!

-- 
G. Branden Robinson                |    Kissing girls is a goodness.  It is
Debian GNU/Linux                   |    a growing closer.  It beats the
branden@debian.org                 |    hell out of card games.
http://people.debian.org/~branden/ |    -- Robert Heinlein
#!/bin/sh
# Debian xserver-xfree86 package configuration script
# Copyright 2000--2004 Branden Robinson.
# Licensed under the GNU General Public License, version 2.  See the file
# /usr/share/common-licenses/GPL or <http://www.gnu.org/copyleft/gpl.txt>.

# $Id: xserver-xfree86.config.in 1188 2004-03-25 23:06:35Z branden $

set -e

# source debconf library
. /usr/share/debconf/confmodule

THIS_PACKAGE=xserver-xfree86
THIS_SCRIPT=config

#INCLUDE_SHELL_LIB#

CONFIG_DIR=/etc/X11
SERVER_SYMLINK="$CONFIG_DIR/X"
XF86CONFIG="$CONFIG_DIR/XF86Config-4"
CONFIG_AUX_DIR=/var/lib/xfree86
SERVER_SYMLINK_CHECKSUM="$CONFIG_AUX_DIR/${SERVER_SYMLINK##*/}.md5sum"
XF86CONFIG_CHECKSUM="$CONFIG_AUX_DIR/${XF86CONFIG##*/}.md5sum"
THIS_SERVER=/usr/bin/X11/XFree86

NCARDS=0
NSERVERS=0
NDRIVERS=0
MULTIHEAD=

# get machine architecture
ARCH=$(dpkg --print-installation-architecture)

discover_video () {
  # wrapper for discover command that can distinguish Discover 1.x and 2.x

  # Ugh, Discover 1.x didn't exit with nonzero status if given an unrecongized
  # option!
  DISCOVER_TEST=$(discover --version 2>/dev/null)
  if expr "$DISCOVER_TEST" : 'discover 2.*' >/dev/null 2>&1; then
    # Discover 2.x
    # XXX: this is sort of nasty
    VENDOR_MODEL_FILE=$(tempfile)
    SERVER_FILE=$(tempfile)
    DRIVER_FILE=$(tempfile)

    CMD="discover --type-summary display"
    run $CMD >$VENDOR_MODEL_FILE
    CMD="discover --data-path=xfree86/server/name \
                  --data-version=${SOURCE_VERSION%-*} display"
    run $CMD >$SERVER_FILE
    CMD="discover --data-path=xfree86/server/device/driver \
                  --data-version=${SOURCE_VERSION%-*} display"
    run $CMD >$DRIVER_FILE

    DISCOVERED_VIDEO=$(paste $VENDOR_MODEL_FILE $SERVER_FILE $DRIVER_FILE)
    rm -f $VENDOR_MODEL_FILE $SERVER_FILE $DRIVER_FILE
  else
    # must be Discover 1.x
    DISCOVERED_VIDEO=$(run discover --disable=serial,parallel \
                                --format="%V %M\t%S\t%D\n" video 2>/dev/null)
  fi
  echo "$DISCOVERED_VIDEO"
}

validate_string_db_input () {
  # Syntax: validate_string_db_input priority template
  #
  # validate string input; can't have doublequotes
  # If $MAY_BE_NULL is a non-null value (e.g., "yes"), the string may be null.
  if [ $# -ne 2 ]; then
    internal_error "validate_string_db_input() called with wrong number of" \
                   "arguments: $*"
  fi
  PRIORITY=$1
  TEMPLATE=$2
  db_get "$TEMPLATE"
  SAFE="$RET"
  set +e
  while :; do
    db_input "$PRIORITY" "$TEMPLATE"
    # is the question going to be asked?
    if [ $? -eq 30 ]; then
      break # no; bail out of validation loop
    fi
    db_go
    db_get "$TEMPLATE"
    if [ -n "$RET" ]; then
      if ! expr "$RET" : '.*".*' >/dev/null 2>&1; then
        break # valid input
      else
        ERROR=xserver-xfree86/config/doublequote_in_string_error
      fi
    else
      if [ -n "$MAY_BE_NULL" ]; then
        break # valid (null) input
      else
        ERROR=xserver-xfree86/config/null_string_error
      fi
    fi
    # we only get to this point if the input was invalid; restore the known
    # good value in case we are interrupted before the user provides a valid
    # one
    db_set "$TEMPLATE" "$SAFE"
    db_fset "$TEMPLATE" seen false
    # now show the user the error message
    db_fset "$ERROR" seen false
    db_input critical "$ERROR"
    db_go
  done
  set -e
}

validate_numeric_db_input () {
  # Syntax: validate_numeric_db_input priority template
  #
  # validate numeric input; must have only digits, can be null
  if [ $# -ne 2 ]; then
    internal_error "validate_numeric_db_input() called with wrong number of" \
                   "arguments: $*"
  fi
  PRIORITY=$1
  TEMPLATE=$2
  db_get "$TEMPLATE"
  SAFE="$RET"
  set +e
  while :; do
    db_input "$PRIORITY" "$TEMPLATE"
    # is the question going to be asked?
    if [ $? -eq 30 ]; then
      break # no; bail out of validation loop
    fi
    db_go
    db_get "$TEMPLATE"
    if [ -z "$RET" ] || expr "$RET" : "[0-9]\+$" >/dev/null 2>&1; then
      break # valid input
    fi
    # we only get to this point if the input was invalid; restore the known
    # good value in case we are interrupted before the user provides a valid
    # one
    db_set "$TEMPLATE" "$SAFE"
    db_fset "$TEMPLATE" seen false
    # now show the user the error message
    db_fset xserver-xfree86/config/nonnumeric_string_error seen false
    db_input critical xserver-xfree86/config/nonnumeric_string_error
    db_go
  done
  set -e
}

validate_bus_id_db_input () {
  # Syntax: validate_bus_id_db_input priority template
  #
  # validate BusID input
  if [ $# -ne 2 ]; then
    internal_error "validate_bus_id_db_input() called with wrong number of" \
                   "arguments: $*"
  fi
  PRIORITY=$1
  TEMPLATE=$2
  db_get "$TEMPLATE"
  SAFE="$RET"
  set +e
  while :; do
    db_input "$PRIORITY" "$TEMPLATE"
    # is the question going to be asked?
    if [ $? -eq 30 ]; then
      break # no; bail out of validation loop
    fi
    db_go
    db_get "$TEMPLATE"
    if [ -z "$RET" ] \
      || expr "$RET" : "[A-Z]\+:[0-9]\{1,3\}:[0-9]\{1,3\}:[0-9]\{1,3\}$" \
      >/dev/null 2>&1; then
      break # valid input
    fi
    # we only get to this point if the input was invalid; restore the known good
    # value in case we are interrupted before the user provides a valid one
    db_set "$TEMPLATE" "$SAFE"
    db_fset "$TEMPLATE" seen false
    # now show the user the error message
    db_fset xserver-xfree86/config/device/bus_id_error seen false
    db_input critical xserver-xfree86/config/device/bus_id_error
    db_go
  done
  set -e
}

validate_monitor_frequency_db_input () {
  # Syntax: validate_monitor_frequency_db_input priority template
  #
  # validate monitor frequency input
  if [ $# -ne 2 ]; then
    internal_error "validate_monitor_frequency_db_input() called with wrong" \
                   "number of arguments: $*"
  fi
  PRIORITY=$1
  TEMPLATE=$2
  db_get "$TEMPLATE"
  SAFE="$RET"
  set +e
  while :; do
    db_input "$PRIORITY" "$TEMPLATE"
    # is the question going to be asked?
    if [ $? -eq 30 ]; then
      break # no; bail out of validation loop
    fi
    db_go
    db_get "$TEMPLATE"
    # string, needs input validation; a simple regex match will have to do;
    # force first character to be a number to avoid hideous problems in the
    # debconf dialog frontend in 0.3.83 (it needs to be one anyway)
    if expr "$RET" : "^[0-9][-0-9,. ]\+$" >/dev/null 2>&1; then
      break # valid input
    fi
    # we only get to this point if the input was invalid; restore the known
    # good value in case we are interrupted before the user provides a
    # valid one
    db_set "$TEMPLATE" "$SAFE"
    db_fset "$TEMPLATE" seen false
    # now show the user the error message
    db_fset xserver-xfree86/config/monitor/range_input_error seen false
    db_input critical xserver-xfree86/config/monitor/range_input_error
    db_go
  done
  set -e
}

auto_answer () {
  # Syntax: auto_answer input_command priority template default_answer
  #
  # Used to auto-answer questions that don't have reasonable defaults.  Some
  # people insist on running the xserver-xfree86 config script with the
  # non-interactive frontend.  For this to work, the debconf database will need
  # to be pre-loaded with answers to several questions.  You have been
  # warned...
  if [ $# -ne 4 ]; then
    internal_error "auto_answer() called with wrong number of arguments: $*"
  fi
  INPUT_COMMAND=$1
  PRIORITY=$2
  TEMPLATE=$3
  DEFAULT_ANSWER=$4
  set +e
  observe "auto_answer() \"$INPUT_COMMAND $PRIORITY $TEMPLATE\" with default" \
          "\"$DEFAULT_ANSWER\""
  # are we re-configuring?
  if [ -n "$RECONFIGURE" ]; then
    # yes, we are reconfiguring
    db_get "$TEMPLATE"
    observe "auto_answer: (reconfiguring) preserving existing answer \"$RET\""
  else
    # not reconfiguring; has the question been seen before?
    db_fget "$TEMPLATE" seen
    if [ "$RET" = "true" ]; then
      db_get "$TEMPLATE"
      observe "auto_answer: (not reconfiguring) preserving existing answer" \
              "\"$RET\""
    else
      observe "auto_answer: auto-answering with \"$DEFAULT_ANSWER\""
      db_set $TEMPLATE "$DEFAULT_ANSWER"
    fi
  fi
  "$INPUT_COMMAND" "$PRIORITY" "$TEMPLATE"
  if [ $? -eq 30 ]; then
    observe "auto_answer: $TEMPLATE is not being asked"
  else
    observe "auto_answer: asking $TEMPLATE"
  fi
  set -e
  db_go
  db_get "$TEMPLATE"
  observe "auto_answer: $TEMPLATE is \"$RET\""
}

set_db_priority () {
  # syntax: set_db_priority requested_priority
  #
  # Given a variable PRIORITY_CEILING and a "requested_priority" argument, set
  # the PRIORITY environment variable to the lesser of the two.

  # Implementation note: a clever version of this could be done using "eval", or
  # embedding a Perl script, but those would be more difficult to maintain.
  # Better just to go the simple and stupid route.  Yes, I know this is not very
  # efficient.

  local priority_ceiling requested_priority

  # Validate arguments.
  if [ $# -ne 1 ]; then
    warn "set_db_priority() called with empty or bogus arguments \"$*\";" \
         "assuming argument of \"low\""
    requested_priority=low
  else
    requested_priority="$1"
  fi

  # If PRIORITY_CEILING is null or unset, it's same as not having one at all;
  # the sky's the limit.  We use a locally scoped priority_ceiling variable
  # because we don't want to affect the value of the global one.
  if [ -n "$PRIORITY_CEILING" ]; then
    priority_ceiling="$PRIORITY_CEILING"
  else
    priority_ceiling=critical
  fi

  # Ensure the value of PRIORITY_CEILING is reasonable.
  if [ "$priority_ceiling" != "critical" ] \
     && [ "$priority_ceiling" != "high" ] \
     && [ "$priority_ceiling" != "medium" ] \
     && [ "$priority_ceiling" != "low" ]; then
    warn "set_db_priority() called with bogus value of \$PRIORITY_CEILING" \
         "\"$PRIORITY_CEILING\"; treating as \"critical\""
    priority_ceiling=critical
  fi

  case "$requested_priority" in
    critical)
      # This is the highest priority, so there is nowhere to go but down.
      PRIORITY="$priority_ceiling"
      ;;
    high)
      case "$priority_ceiling" in
        critical)
          PRIORITY="$requested_priority"
          ;;
        high|medium|low)
          PRIORITY="$priority_ceiling"
          ;;
      esac
      ;;
    medium)
      case "$priority_ceiling" in
        critical|high)
          PRIORITY="$requested_priority"
          ;;
        medium|low)
          PRIORITY="$priority_ceiling"
          ;;
      esac
      ;;
    low)
      # This is the lowest priority, so we can't go any lower.
      PRIORITY="$requested_priority"
      ;;
    *)
      warn "set_db_priority() called with bogus argument" \
           "\"$requested_priority\"; returning \"low\""
      PRIORITY="low"
      ;;
  esac
}

select_default_x_server () {
  # Ask debconf questions that determine the destination of the default X server
  # symbolic link.

  local bailout

  # If the symbolic link to the default X server is under manual control, do
  # nothing.  Perform tests to determine if this is the case.

  # First, assume we're going to be configuring it.
  bailout=

  # Is the symbolic link really a symbolic link?  If not, bail.
  if [ -e "$SERVER_SYMLINK" ] && [ ! -L "$SERVER_SYMLINK" ]; then
    # The symbolic link is not a symbolic link.
    observe "$SERVER_SYMLINK exists but is not a symbolic link"
    bailout=yes
  else
    # Does the symbolic link's checksum exist but not match the actual
    # destination?  If so, bail.
    if [ -e "$SERVER_SYMLINK_CHECKSUM" ]; then
      if [ "$(readlink "$SERVER_SYMLINK" | md5sum)" != \
           "$(cat "$SERVER_SYMLINK_CHECKSUM")" ]; then
        observe "$SERVER_SYMLINK link destination has been manually modified"
        bailout=yes
      fi
    else
      observe "no stored checksum available for $SERVER_SYMLINK"
      bailout=yes
    fi
  fi

  # Bail out now if we're supposed to.
  if [ -n "$bailout" ]; then
    return 1
  fi

  # If the X server symlink file already exists and points to an executable X
  # server, it's not as important to ask questions related to it (these
  # questions "have a reasonable default").
  PRIORITY_CEILING=
  if [ -e "$SERVER_SYMLINK" ]; then
    if [ -x "$(readlink "$SERVER_SYMLINK")" ]; then
      observe "X server symlink exists and points to executable X server;" \
              "capping X server question priority at medium"
      PRIORITY_CEILING=medium
    fi
  fi

  # priority of shared/default-x-server
  set_db_priority "high"

  db_metaget shared/default-x-server owners
  OWNERS="$RET"
  db_metaget shared/default-x-server choices
  CHOICES="$RET"

  if [ "$OWNERS" != "$CHOICES" ]; then
    observe "\$OWNERS does not equal \$CHOICES: \"$OWNERS\" != \"$CHOICES\""
    db_subst shared/default-x-server choices $OWNERS
    db_fset shared/default-x-server seen false
  fi

  if ! expr "$OWNERS" : ".*,.*" >/dev/null 2>&1; then
    observe "\$OWNERS has only one value; shared/default-x-server will not be" \
            "asked"
  fi

  # set a failsafe default answer for shared/default-x-server
  DEFAULT="$THIS_PACKAGE"

  # if configuring for the first time, ask if user wants to autodetect
  if [ -z "$RECONFIGURE" ]; then
    if which discover >/dev/null 2>&1; then
      set_db_priority "medium"
      auto_answer db_input "$PRIORITY" \
        xserver-xfree86/autodetect_video_card "false"
      db_get xserver-xfree86/autodetect_video_card
      AUTODETECT_VIDEO_CARD="$RET"
      if [ "$AUTODETECT_VIDEO_CARD" = "true" ]; then
        if [ $NSERVERS -eq 0 ]; then
          observe "could not autodetect X server: no video card detected, or" \
                  "no server known for it"
          set_db_priority "high"
          run db_input "$PRIORITY" shared/no_known_x-server
          db_go
        elif [ $NSERVERS -eq 1 ]; then
          observe "autodetected X server: $SERVERS"
          if [ "$SERVERS" = "${THIS_SERVER##*/}" ]; then
            # the autodetected X server is the only one on the system, and the
            # one we're currently configuring; it's unlikely the user will want
            # to use something else
            set_db_priority "low"
          else
            observe "X server autodetected, but does not correspond to this" \
                    "package"
            # we do not set shared/default-x-server here, because the
            # autodetected X server might not be getting installed
          fi
        elif [ $NSERVERS -gt 1 ]; then
          observe "could not autodetect X server: multiple servers for video" \
                  "cards"
          VIDEOCARD_SERVER_REPORT=$(echo "$DISCOVERED_VIDEO" \
            | awk 'BEGIN { FS="\t"; printf " %-40s%20s\n .\n", "Detected Video Card", "Suggested X server" } { printf " %-50s%10s\n", $1, $2 } END { printf " .\n" }')
          # can't do this until there is a way to embed newlines into debconf
          # command streams :(
          # db_subst shared/multiple_possible_x-servers detected_cards \
          #   "$VIDEOCARD_SERVER_REPORT"
          observe "$VIDEOCARD_SERVER_REPORT"
          set_db_priority "high"
          run db_input "$PRIORITY" shared/multiple_possible_x-servers
          db_go
        fi
      else
        observe "user declined video card autodetection (server)"
      fi
    else
      observe "could not autodetect X server: discover not found"
    fi
  else
    observe "not prompting for video card autodetection; reconfiguring"
  fi

  # now the default-x-server question may be asked
  db_fget shared/default-x-server seen
  observe "seen flag of shared/default-x-server is $RET"
  observe "db_input $PRIORITY shared/default-x-server"
  auto_answer db_input $PRIORITY shared/default-x-server \
    "$DEFAULT"
}

configure_xfree86_x_server () {
  # Ask debconf questions that determine what XF86Config-4 will look like.

  # TODO: This function should be broken up into several sub-functions, probably
  # roughly mapping to the Section elements of the XF86Config-4 file.  We could
  # then construct a menu of available "functions", and give the user a lot more
  # flexibility in configuring the XFree86 X server with debconf.

  local bailout

  # If the XF86Config-4 configuration file is under manual control, do nothing.
  # Perform tests to determine if this is the case.

  # First, assume we're going to be configuring it.
  bailout=

  # Does the configuration file exist?
  if [ -e "$XF86CONFIG" ]; then
    # If so, check for the existence of the checksum file; if it doesn't exist,
    # the file is under manual control.
    if [ -e "$XF86CONFIG_CHECKSUM" ]; then
      # Compare the current and stored checksums; if they do not match, the
      # file is under manual control.
      if [ "$(md5sum "$XF86CONFIG")" != "$(cat "$XF86CONFIG_CHECKSUM")" ]; then
        observe "$XF86CONFIG file has been customized"
        bailout=yes
      fi
    else
      observe "no stored checksum available for $XF86CONFIG"
      bailout=yes
    fi
  fi

  # Bail out now if we're supposed to.
  if [ -n "$bailout" ]; then
    return 1
  fi

  # if the XFree86 4.x X server configuration file already exists, it's not as
  # important to ask questions related to it (these questions "have a reasonable
  # default")
  PRIORITY_CEILING=
  if [ -e "$XF86CONFIG" ]; then
    observe "$XF86CONFIG file exists; capping configuration question" \
            "priority at medium"
    PRIORITY_CEILING=medium
  fi

  # video driver selection

  # priority of xserver-xfree86/config/device/driver
  set_db_priority "high"

  DRIVER_DIR=/usr/X11R6/lib/modules/drivers

  # Build list of available video drivers, omitting the atimisc, r128, and
  # radeon sub-modules (the ati driver knows when and how to load these).
  # v4l is not a display driver, and dummy is for advanced users.
  DRIVER_LIST="$(echo $(find "$DRIVER_DIR" -name '*_drv.o' 2>/dev/null \
                        | sed 's|^.*/\(.*\)_drv\.o|\1|' \
                        | egrep -v '(atimisc|dummy|r128|radeon|v4l)' | sort) \
                 | sed 's/ /, /g')"

  if [ -z "$DRIVER_LIST" ]; then
    observe "no video driver modules found in $DRIVER_DIR"
  fi

  # Set a hard-coded module list (if necessary) and default driver module on an
  # architecture-specific basis.
  case "$ARCH" in
    alpha)
      DRIVER_LIST=${DRIVER_LIST:=ati, cirrus, glint, mga, nv, rendition, s3, s3virge, savage, siliconmotion, tdfx, tga, vga}
      DEFAULT_DRIVER=vga
      ;;
    arm|hppa)
      DRIVER_LIST=${DRIVER_LIST:=ati, chips, fbdev, glint, mga, nv, s3, s3virge, savage, sis, tdfx, trident, vga}
      DEFAULT_DRIVER=fbdev
      ;;
    hurd-i386)
      DRIVER_LIST=${DRIVER_LIST:=apm, ark, ati, chips, cirrus, cyrix, fbdev, glint, i128, i740, i810, imstt, mga, neomagic, newport, nsc, nv, rendition, s3, s3virge, savage, siliconmotion, sis, tdfx, tga, trident, tseng, vesa, vga, vmware}
      DEFAULT_DRIVER=vesa
      ;;
    i386)
      DRIVER_LIST=${DRIVER_LIST:=apm, ark, ati, chips, cirrus, cyrix, fbdev, glide, glint, i128, i740, i810, imstt, mga, neomagic, newport, nsc, nv, rendition, s3, s3virge, savage, siliconmotion, sis, tdfx, tga, trident, tseng, vesa, vga, vmware}
      DEFAULT_DRIVER=vesa
      ;;
    ia64)
      DRIVER_LIST=${DRIVER_LIST:=apm, ark, ati, chips, cirrus, cyrix, fbdev, glint, i128, i740, i810, imstt, mga, neomagic, newport, nv, rendition, s3, s3virge, savage, siliconmotion, sis, tdfx, tga, trident, tseng, vesa, vga, vmware}
      DEFAULT_DRIVER=fbdev
      ;;
    m68k|powerpc)
      DRIVER_LIST=${DRIVER_LIST:=ati, chips, fbdev, glint, imstt, mga, nv, s3, s3virge, savage, sis, tdfx, trident, vga}
      DEFAULT_DRIVER=fbdev
      ;;
    mips|mipsel)
     DRIVER_LIST=${DRIVER_LIST:=ati, chips, fbdev, glint, mga, newport, nv, s3, s3virge, savage, sis, tdfx, trident}
     DEFAULT_DRIVER=fbdev
      ;;
    sparc)
      DRIVER_LIST=${DRIVER_LIST:=apm, ark, ati, chips, cirrus, fbdev, glint, i128, i740, imstt, mga, neomagic, nv, rendition, s3virge, savage, siliconmotion, sunbw2, suncg14, suncg3, suncg6, sunffb, sunleo, suntcx, tdfx, trident, vesa, vga}
      DEFAULT_DRIVER=fbdev
      ;;
    *)
      internal_error "no driver list known for architecture $ARCH"
      ;;
  esac

  observe "available video driver list set to \"$DRIVER_LIST\""

  # attempt to autodetect
  if which discover >/dev/null 2>&1; then
    if [ "$AUTODETECT_VIDEO_CARD" = "true" ]; then
      if [ $NDRIVERS -eq 0 ]; then
        observe "could not autodetect X server driver: no video card" \
                "detected, or no driver known for it"
      elif [ $NDRIVERS -eq 1 ]; then
        observe "autodetected X server driver: $DRIVERS"
        set_db_priority "low"
        DEFAULT_DRIVER="$DRIVERS"
      elif [ $NDRIVERS -gt 1 ]; then
        observe "could not autodetect X server driver: multiple drivers for" \
                "video cards"
        VIDEOCARD_DRIVER_REPORT=$(echo "$DISCOVERED_VIDEO" \
          | awk 'BEGIN { FS="\t"; printf " %-30s%30s\n .\n", "Detected Video Card", "Suggested driver module" } { printf " %-50s%10s\n", $1, $3 } END { printf " .\n" }')
        # can't do this until there is a way to embed newlines into debconf
        # command streams :(
        # db_subst shared/multiple_possible_x-drivers detected_cards \
        #   "$VIDEOCARD_DRIVER_REPORT"
        observe "$VIDEOCARD_DRIVER_REPORT"
        set_db_priority "high"
        run db_input "$PRIORITY" xserver-xfree86/multiple_possible_x-drivers
        db_go
      fi
    else
      observe "user declined video card autodetection (driver)"
    fi
  else
    observe "could not autodetect X server driver: discover not found"
  fi

  db_subst xserver-xfree86/config/device/driver choices "$DRIVER_LIST"
  auto_answer db_input "$PRIORITY" \
    xserver-xfree86/config/device/driver "$DEFAULT_DRIVER"

  # card identifier; try to set a sensible default
  DEFAULT=
  if [ -n "$NDRIVERS" ] && [ -n "$NCARDS" ] && [ $NDRIVERS -eq 1 ] \
     && [ $NCARDS -eq 1 ]; then
    if which discover >/dev/null 2>&1; then
      if [ "$AUTODETECT_VIDEO_CARD" = "true" ]; then
        DEFAULT=$(echo "$DISCOVERED_VIDEO" | cut -f1)
      fi
    fi
  fi
  if [ -z "$DEFAULT" ]; then
    # fall back to some language-specific generic text
    # TODO: make this a read-only debconf template
    case "${LC_ALL:-${LC_MESSAGES:-$LANG}}" in
      ca_*) DEFAULT="Targeta de v�o gen�ca" ;;
      # da
      de_*) DEFAULT="Standardgrafikkarte" ;;
      es_*) DEFAULT="Tarjeta de v�o gen�ca" ;;
      fr_*) DEFAULT="Carte vid�g�rique" ;;
      gl_*) DEFAULT="Tarxeta de Video Xen�ca" ;;
      it_*) DEFAULT="Scheda video generica" ;;
      # ja
      # nl
      pt_BR) DEFAULT="Placa de V�o Gen�ca" ;;
      # ru
      # sv
      *) DEFAULT="Generic Video Card" ;;
    esac
  fi
  set_db_priority "low"
  # this question requires input validation
  MAY_BE_NULL= auto_answer validate_string_db_input "$PRIORITY" \
    xserver-xfree86/config/device/identifier "$DEFAULT"

  # BusID
  set_db_priority "low"
  DEFAULT=
  if [ "$ARCH" = "powerpc" ] || [ "$MULTIHEAD" = "yes" ]; then
    if [ "$ARCH" = "powerpc" ]; then
      set_db_priority "medium"
    fi
    if [ "$MULTIHEAD" = "yes" ]; then
      set_db_priority "high"
    fi
    if which lspci >/dev/null 2>&1; then
      # try to guess the correct BusID
      VIDEO_CARD=$(LC_ALL=C lspci -n | grep "Class 0300:" | head -n 1 \
                   | cut -d\  -f1)
      if [ -n "$VIDEO_CARD" ]; then
        # we now have an entry in "hex:hex.hex" format, need
        # "PCI:decimal:decimal:decimal"
        BUS=$(printf "%d" 0x$(echo $VIDEO_CARD | cut -d: -f1) )
        DEVICE=$(printf "%d" 0x$(echo $VIDEO_CARD | cut -d: -f2 | cut -d. -f1) )
        FUNCTION=$(printf "%d" 0x$(echo $VIDEO_CARD | cut -d. -f2) )
        DEFAULT=PCI:$BUS:$DEVICE:$FUNCTION
      fi
    fi
  fi
  # this question requires input validation
  if [ -n "$DEFAULT" ]; then
    auto_answer validate_bus_id_db_input "$PRIORITY" \
      xserver-xfree86/config/device/bus_id "$DEFAULT"
  else
    run validate_bus_id_db_input "$PRIORITY" \
      xserver-xfree86/config/device/bus_id
  fi

  set_db_priority "low"
  # this question requires input validation
  run validate_numeric_db_input "$PRIORITY" \
    xserver-xfree86/config/device/video_ram

  # Use fbcon kernel interface?
  set_db_priority "high"
  case "$ARCH" in
    alpha|hurd-i386|i386)
      DEFAULT_USEFBDEV=false
      ;;
    *)
      DEFAULT_USEFBDEV=true
      ;;
  esac

  DEFAULT_USEFBDEV=
  # XXX: is this a good test for /proc being mounted?
  if [ -e /proc/self ]; then
    if [ -e /proc/fb ]; then
      FB_TYPE="$(grep '^0 ' /proc/fb | sed 's/[^[:space:]] //')"
      observe "/proc/fb reports framebuffer type \"$FB_TYPE\""
      # did we actually get back anything?
      if [ -n "$FB_TYPE" ]; then
        set_db_priority "medium"
        case "$FB_TYPE" in
          OFfb|VESA)
            observe "this framebuffer type does not support UseFBDev"
            DEFAULT_USEFBDEV=false
            ;;
          *)
            # other framebuffers do support UseFBDev
            DEFAULT_USEFBDEV=true
            ;;
        esac
      fi
    else
      observe "/proc/fb does not exist; assuming fbcon not in use"
    fi
  else
    observe "/proc not mounted; cannot determine if fbcon in use"
  fi

  # re-set the default answer to false if need be
  run db_get xserver-xfree86/config/device/use_fbdev
  if [ "$RET" = "true" ] && [ "$DEFAULT_USEFBDEV" = "false" ]; then
    observe "xserver-xfree86/config/device/use_fbdev is \"true\" but" \
            "/proc/fb does not exist, is empty, or reports a framebuffer" \
            "type with which UseFBDev cannot be used; setting template to" \
            "\"false\""
    db_set xserver-xfree86/config/device/use_fbdev false
  fi

  auto_answer db_input "$PRIORITY" xserver-xfree86/config/device/use_fbdev \
    "$DEFAULT_USEFBDEV"

  # keyboard setup

  # TODO: query of debian-installer's keyboard configuration debconf template
  # goes here

  # these questions require input validation
  set_db_priority "medium"

  if [ "$ARCH" = "sparc" ]; then
    DEFAULT=sun
  else
    DEFAULT=xfree86
  fi
  MAY_BE_NULL= auto_answer validate_string_db_input \
    "$PRIORITY" \
    xserver-xfree86/config/inputdevice/keyboard/rules "$DEFAULT"

  db_get xserver-xfree86/config/inputdevice/keyboard/rules
  if [ "$RET" = "sun" ]; then
    DEFAULT=type5
  elif [ "$RET" = "xfree86" ]; then
    if [ "$ARCH" = "powerpc" ]; then
      DEFAULT=macintosh
      # good old-fashioned BRAIN DAMAGE
      if [ -e /proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes ]; then
        if [ "$(cat /proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes)" \
             = "0" ]; then
          DEFAULT=macintosh_old
        fi
      fi
    else
      DEFAULT=pc104
    fi
  fi
  MAY_BE_NULL= auto_answer validate_string_db_input \
    "$PRIORITY" \
    xserver-xfree86/config/inputdevice/keyboard/model "$DEFAULT"

  MAY_BE_NULL= auto_answer validate_string_db_input \
    "$PRIORITY" \
    xserver-xfree86/config/inputdevice/keyboard/layout "us"

  db_get xserver-xfree86/config/inputdevice/keyboard/layout
  if [ "$RET" != "us" ]; then
    set_db_priority "medium"
  else
    set_db_priority "low"
  fi
  MAY_BE_NULL=yes validate_string_db_input \
    "$PRIORITY" \
    xserver-xfree86/config/inputdevice/keyboard/variant

  MAY_BE_NULL=yes validate_string_db_input \
    "$PRIORITY" \
    xserver-xfree86/config/inputdevice/keyboard/options

  # mouse device detection

  # priority of xserver-xfree86/config/inputdevice/mouse/{port,protocol}
  set_db_priority "high"
  AUTODETECTED_PORT=
  AUTODETECTED_PROTOCOL=

  # determine if we're using devfs
  if [ -c /dev/.devfsd ]; then
    USING_DEVFS=true
  else
    USING_DEVFS=
  fi

  if [ -n "$USING_DEVFS" ]; then
    MOUSE_PORT_CHOICES="/dev/misc/psaux, /dev/tts/0, /dev/tts/1, /dev/tts/2, /dev/tts/3, /dev/input/mice, /dev/misc/atixl, /dev/gpmdata"
    DEFAULT_PORT="/dev/misc/psaux"
  else
    MOUSE_PORT_CHOICES="/dev/psaux, /dev/ttyS0, /dev/ttyS1, /dev/ttyS2, /dev/ttyS3, /dev/input/mice, /dev/atibm, /dev/sunmouse, /dev/gpmdata"
    DEFAULT_PORT="/dev/psaux"
  fi

  # if configuring for the first time, ask if user wants to autodetect
  if [ -z "$RECONFIGURE" ]; then
    while :; do
      # bail out if autodetection tool not available
      which mdetect >/dev/null 2>&1 || break
      auto_answer db_input "$PRIORITY" \
        xserver-xfree86/autodetect_mouse "false"
      db_get xserver-xfree86/autodetect_mouse
      if [ "$RET" = "true" ]; then
        MDETECT_OUTPUT=$(run mdetect -x)
        if [ -n "$MDETECT_OUTPUT" ]; then
          if [ $(echo "$MDETECT_OUTPUT" | wc -l) -ne 2 ]; then
            observe "bug in mdetect; did not return two lines of output"
            break
          fi
          AUTODETECTED_PORT=$(echo "$MDETECT_OUTPUT" | head -n 1)
          AUTODETECTED_PROTOCOL=$(echo "$MDETECT_OUTPUT" | tail -n 1)
          observe "mdetect returned port \"$AUTODETECTED_PORT\"; protocol" \
                  "\"$AUTODETECTED_PROTOCOL\""
          if [ -n "$AUTODETECTED_PORT" ]; then
            # /dev/input/mouse* means we autodetected a USB pointer; we will
            # store /dev/input/mice instead.
            if expr "$AUTODETECTED_PORT" : "/dev/input/mouse.*" >/dev/null \
              2>&1; then
              AUTODETECTED_PORT="/dev/input/mice"
            fi
          else
            observe "bug in mdetect: returned nothing for mouse port"
            break
          fi
          if [ -z "$AUTODETECTED_PROTOCOL" ]; then
            observe "bug in mdetect: returned nothing for mouse protocol"
            break
          fi
        else
          observe "mdetect returned no output; unable to autodetect mouse"
          # permit user to retry, but set to false in the case question doesn't
          # get asked (for noninteractive configuration)
          db_set xserver-xfree86/autodetect_mouse "false"
        fi
        if [ -n "$AUTODETECTED_PORT" ] && [ -n "$AUTODETECTED_PROTOCOL" ]; then
          set_db_priority "medium"
          break # port and protocol determined
        fi
      else
        observe "user declined mouse autodetection"
        break # bail out; autodetection not desired
      fi
    done
  else
    observe "not prompting for mouse autodetection; reconfiguring"
  fi

  db_subst xserver-xfree86/config/inputdevice/mouse/port choices \
    "$MOUSE_PORT_CHOICES"
  auto_answer db_input "$PRIORITY" \
    xserver-xfree86/config/inputdevice/mouse/port \
    "${AUTODETECTED_PORT:-$DEFAULT_PORT}"

  db_get xserver-xfree86/config/inputdevice/mouse/port
  case "$RET" in
    *psaux)
      MOUSE_PROTOCOL_CHOICES="PS/2, ImPS/2, GlidePointPS/2, NetMousePS/2, NetScrollPS/2, ThinkingMousePS/2, MouseManPlusPS/2, ExplorerPS/2"
      DEFAULT_PROTOCOL="PS/2"
      ;;
    *ttyS*|*tts/*)
      MOUSE_PROTOCOL_CHOICES="Auto, Microsoft, MouseSystems, GlidePoint, ThinkingMouse, MouseMan, Logitech, IntelliMouse, MMSeries, MMHitTab"
      DEFAULT_PROTOCOL="Auto"
      ;;
    *input/mice)
      MOUSE_PROTOCOL_CHOICES="ImPS/2"
      DEFAULT_PROTOCOL="ImPS/2"
      ;;
    *atibm|*atixl|*sunmouse)
      MOUSE_PROTOCOL_CHOICES="BusMouse"
      DEFAULT_PROTOCOL="BusMouse"
      ;;
    *gpmdata)
      MOUSE_PROTOCOL_CHOICES="IntelliMouse"
      DEFAULT_PROTOCOL="IntelliMouse"
      ;;
  esac
  db_subst xserver-xfree86/config/inputdevice/mouse/protocol choices \
    "$MOUSE_PROTOCOL_CHOICES"
  if ! expr "$MOUSE_PROTOCOL_CHOICES" : ".*,.*" >/dev/null 2>&1; then
    observe "\$MOUSE_PROTOCOL_CHOICES has only one value; setting" \
            "xserver-xfree86/config/inputdevice/mouse/protocol to" \
            "\"$DEFAULT_PROTOCOL\""
    db_set xserver-xfree86/config/inputdevice/mouse/protocol "$DEFAULT_PROTOCOL"
  else
    auto_answer db_input "$PRIORITY" \
      xserver-xfree86/config/inputdevice/mouse/protocol \
      "${AUTODETECTED_PROTOCOL:-$DEFAULT_PROTOCOL}"
  fi

  set_db_priority "low"
  run db_input "$PRIORITY" \
    xserver-xfree86/config/inputdevice/mouse/emulate3buttons
  run db_input "$PRIORITY" \
    xserver-xfree86/config/inputdevice/mouse/zaxismapping
  db_go

  # monitor setup
  set_db_priority "high"
  DEFAULT_HORIZ_SYNC="28-50"
  DEFAULT_VERT_REFRESH="43-75"

  db_fget xserver-xfree86/config/monitor/identifier seen
  if [ "$RET" = "false" ]; then
    observe "xserver-xfree86/config/monitor/identifier has not been seen"
  fi

  db_get xserver-xfree86/config/monitor/identifier
  observe "xserver-xfree86/config/monitor/identifier is already set to \"$RET\""

  # The horiz-sync and vert-refresh questions may have answers even though they
  # haven't been seen; autodetection, pre-loading, and the simple and medium
  # selection methods can fill them in.

  db_fget xserver-xfree86/config/monitor/horiz-sync seen
  if [ "$RET" = "false" ]; then
    observe "xserver-xfree86/config/monitor/horiz-sync has not been seen"
  fi

  db_get xserver-xfree86/config/monitor/horiz-sync
  observe "xserver-xfree86/config/monitor/horiz-sync is already set to \"$RET\""

  db_fget xserver-xfree86/config/monitor/vert-refresh seen
  if [ "$RET" = "false" ]; then
    observe "xserver-xfree86/config/monitor/vert-refresh has not been seen"
  fi

  db_get xserver-xfree86/config/monitor/vert-refresh
  observe "xserver-xfree86/config/monitor/vert-refresh is already set to" \
          "\"$RET\""

  # if configuring for the first time, ask if user wants to autodetect
  if [ -z "$RECONFIGURE" ]; then
    if which get-edid >/dev/null 2>&1; then
      auto_answer db_input "$PRIORITY" \
        xserver-xfree86/autodetect_monitor "false"
      db_get xserver-xfree86/autodetect_monitor
      if [ "$RET" = "true" ]; then
        set +e
        EDID_DUMP=$( (get-edid | parse-edid) 2>/dev/null)
        set -e
        if [ $? -eq 0 ]; then
          # quite crude
          MONITOR_IDENTIFIER=$(echo "$EDID_DUMP" | grep Identifier \
            | cut -f2 -d\")
          if [ -n "$MONITOR_IDENTIFIER" ]; then
            observe "get-edid reports monitor identifier of" \
                    "\"$MONITOR_IDENTIFIER\""
            DEFAULT_MONITOR_IDENTIFIER="$MONITOR_IDENTIFIER"
          else
            observe "got null monitor identifier from get-edid"
          fi
          # even cruder
          HORIZ_SYNC=$(echo "$EDID_DUMP" | grep HorizSync | awk '{print $2}')
          VERT_REFRESH=$(echo "$EDID_DUMP" | grep VertRefresh \
            | awk '{print $2}')
          # get-edid may succeed but be unable to return info anyway
          if [ -n "$HORIZ_SYNC" ]; then
            observe "get-edid reports horizonal sync of \"$HORIZ_SYNC\""
            DEFAULT_HORIZ_SYNC="$HORIZ_SYNC"
          else
            observe "get-edid returned blank hsync"
          fi
          if [ -n "$VERT_REFRESH" ]; then
            observe "get-edid reports vertical refresh of \"$VERT_REFRESH\""
            DEFAULT_VERT_REFRESH="$VERT_REFRESH"
          else
            observe "get-edid returned blank vrefresh"
          fi
        else
          observe "get-edid returned an error"
        fi
      else
        observe "user declined monitor autodetection"
      fi
    else
      observe "could not autodetect monitor frequencies; get-edid not found"
    fi
  else
    observe "not prompting for monitor autodetection; reconfiguring"
  fi

  # priority of xserver-xfree86/config/monitor/identifier
  set_db_priority "low"

  # monitor identifier; try to set a sensible default
  if [ -n "$DEFAULT_MONITOR_IDENTIFIER" ]; then
    DEFAULT="$DEFAULT_MONITOR_IDENTIFIER"
  else
    # fall back to some language-specific generic text
    # TODO: make this a read-only debconf template
    case "${LC_ALL:-${LC_MESSAGES:-$LANG}}" in
      ca_*) DEFAULT="Monitor gen�c" ;;
      # da
      de_*) DEFAULT="Standardbildschirm" ;;
      es_*) DEFAULT="Monitor gen�co" ;;
      # fr
      # gl
      it_*) DEFAULT="Monitor Generico" ;;
      # ja
      # nl
      pt_BR) DEFAULT="Monitor Gen�co" ;;
      # ru
      # sv
      *) DEFAULT="Generic Monitor" ;;
    esac
  fi
  # this question requires input validation
  MAY_BE_NULL= auto_answer validate_string_db_input \
    "$PRIORITY" xserver-xfree86/config/monitor/identifier \
    "$DEFAULT"

  # priority of xserver-xfree86/config/monitor/selection-method
  set_db_priority "medium"

  if [ -n "$HORIZ_SYNC" ] && [ -n "$VERT_REFRESH" ]; then
    observe "\$HORIZ_SYNC: \"$HORIZ_SYNC\" ; \$VERT_REFRESH:" \
            "\"$VERT_REFRESH\"; setting question priority to low"
    set_db_priority "low"
  else
    observe "at least of one of hsync \"$HORIZ_SYNC\" or vrefresh" \
            "\"$VERT_REFRESH\" is null; not setting question priority to low"
  fi

  observe "monitor hsync and vrefresh question priority is $PRIORITY"

  auto_answer db_input "$PRIORITY" \
    xserver-xfree86/config/monitor/lcd "false"
  db_get xserver-xfree86/config/monitor/lcd
  observe "xserver-xfree86/config/monitor/lcd is $RET"
  MONITOR_IS_LCD="$RET"
  if [ "$RET" = "true" ]; then
    db_subst xserver-xfree86/config/monitor/selection-method choices \
      "Medium, Advanced"
  else # not an LCD
    db_subst xserver-xfree86/config/monitor/selection-method choices \
      "Simple, Medium, Advanced"
  fi

  # Flat panels are more and more common, so set the default to medium.
  db_subst xserver-xfree86/config/monitor/selection-method default "Medium"

  run db_input "$PRIORITY" xserver-xfree86/config/monitor/selection-method

  # priority of xserver-xfree86/config/monitor/{several things}
  set_db_priority "high"

  db_get xserver-xfree86/config/monitor/selection-method
  case "$RET" in
    Simple)
      run db_input "$PRIORITY" \
        xserver-xfree86/config/monitor/screen-size
      db_go
      db_get xserver-xfree86/config/monitor/screen-size
      case "$RET" in
        'Up to 14 inches (355 mm)')
          db_set xserver-xfree86/config/monitor/horiz-sync "28-33"
          db_set xserver-xfree86/config/monitor/vert-refresh "43-72"
          ;;
        '15 inches (380 mm)')
          db_set xserver-xfree86/config/monitor/horiz-sync "28-50"
          db_set xserver-xfree86/config/monitor/vert-refresh "43-75"
          ;;
        '17 inches (430 mm)')
          db_set xserver-xfree86/config/monitor/horiz-sync "30-70"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-160"
          ;;
        '19-20 inches (480-510 mm)')
          db_set xserver-xfree86/config/monitor/horiz-sync "30-100"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-160"
          ;;
        '21 inches (530 mm) or more')
          db_set xserver-xfree86/config/monitor/horiz-sync "30-130"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-160"
          ;;
      esac
      ;;
    Medium)
      run db_input "$PRIORITY" \
        xserver-xfree86/config/monitor/mode-list
      db_go
      db_get xserver-xfree86/config/monitor/mode-list
      case "$RET" in
        "640x480 @ 60Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "28-33"
          db_set xserver-xfree86/config/monitor/vert-refresh "43-72"
          DEFAULT_MODES="640x480"
          ;;
        "640x480 @ 72Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "28-38"
          db_set xserver-xfree86/config/monitor/vert-refresh "43-72"
          DEFAULT_MODES="640x480"
          ;;
        "800x600 @ 60Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "28-38"
          db_set xserver-xfree86/config/monitor/vert-refresh "43-72"
          DEFAULT_MODES="800x600"
          ;;
        "800x600 @ 72Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "28-48"
          db_set xserver-xfree86/config/monitor/vert-refresh "43-72"
          DEFAULT_MODES="800x600"
          ;;
        "800x600 @ 85Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-54"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-85"
          DEFAULT_MODES="800x600"
          ;;
        "1024x768 @ 60Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "28-49"
          db_set xserver-xfree86/config/monitor/vert-refresh "43-72"
          DEFAULT_MODES="1024x768"
          ;;
        "1024x768 @ 70Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-57"
          db_set xserver-xfree86/config/monitor/vert-refresh "43-72"
          DEFAULT_MODES="1024x768"
          ;;
        "1024x768 @ 75Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-60"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-75"
          DEFAULT_MODES="1024x768"
          ;;
        "1152x864 @ 75Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-68"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-85"
          DEFAULT_MODES="1152x864"
          ;;
        "1280x960 @ 60Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-60"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-75"
          DEFAULT_MODES="1280x960"
          ;;
        "1280x960 @ 85Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-92"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-85"
          DEFAULT_MODES="1280x960"
          ;;
        "1600x1200 @ 60Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-75"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-85"
          DEFAULT_MODES="1600x1200"
          ;;
        "1600x1200 @ 75Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-94"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-75"
          DEFAULT_MODES="1600x1200"
          ;;
        "1600x1200 @ 85Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-107"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-85"
          DEFAULT_MODES="1600x1200"
          ;;
        "1792x1344 @ 75Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-107"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-85"
          DEFAULT_MODES="1792x1344"
          ;;
        "1792x1344 @ 60Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-84"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-75"
          DEFAULT_MODES="1792x1344"
          ;;
        "1856x1392 @ 60Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-87"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-75"
          DEFAULT_MODES="1856x1392"
          ;;
        "1856x1392 @ 75Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-113"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-75"
          DEFAULT_MODES="1856x1392"
          ;;
        "1920x1440 @ 60Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-90"
          db_set xserver-xfree86/config/monitor/vert-refresh "50-75"
          DEFAULT_MODES="1920x1440"
          ;;
        "1920x1440 @ 75Hz")
          db_set xserver-xfree86/config/monitor/horiz-sync "30-130"
          db_set xserver-xfree86/config/monitor/vert-refresh "60-160"
          DEFAULT_MODES="1920x1440"
          ;;
      esac
      ;;
    Advanced)
      auto_answer validate_monitor_frequency_db_input \
        "$PRIORITY" \
        xserver-xfree86/config/monitor/horiz-sync "28-50"
      auto_answer validate_monitor_frequency_db_input \
        "$PRIORITY" \
        xserver-xfree86/config/monitor/vert-refresh "43-75"
      ;;
  esac

  # Configure available video modes.  For certain drivers we will override any
  # existing value of $DEFAULT_MODES, because they only support certain modes.
  # Otherwise, the existing value of $DEFAULT_MODES is preserved.
  db_get xserver-xfree86/config/device/driver
  case "$RET" in
    newport)
      DEFAULT_DEPTH=8
      DEFAULT_MODES="1280x1024"
      ;;
    vga)
      DEFAULT_DEPTH=4
      DEFAULT_MODES="640x480"
      ;;
    *)
      DEFAULT_DEPTH=24
      DEFAULT_MODES=${DEFAULT_MODES:="800x600, 640x480"}
      ;;
  esac

  observe "\"xserver-xfree86/config/device/driver\" is \"$RET\"; set default" \
          "color depth to $DEFAULT_DEPTH and available video modes to" \
          "\"$DEFAULT_MODES\""

  set_db_priority "medium"

  # list of desired display modes
  auto_answer db_input "$PRIORITY" xserver-xfree86/config/display/modes \
    "$DEFAULT_MODES"

  # default display depth
  auto_answer db_input "$PRIORITY" \
    xserver-xfree86/config/display/default_depth "$DEFAULT_DEPTH"

  # server modules to load
  db_get xserver-xfree86/config/device/driver
  set_db_priority "low"
  db_input "$PRIORITY" xserver-xfree86/config/modules
  db_go

  # files and dri sections
  run db_input "$PRIORITY" xserver-xfree86/config/write_files_section
  run db_input "$PRIORITY" xserver-xfree86/config/write_dri_section
  db_go
}

# analyze arguments; used by auto_answer()
if [ "$1" = "reconfigure" ] || [ -n "$2" ]; then
  # if we are reconfiguring, or already have installed the package at least
  # once before, we should not let auto_answer stomp on existing answers to
  # debconf questions
  observe "package being reconfigured"
  RECONFIGURE=true
else
  RECONFIGURE=
fi

# migrate from old select-type templates
for TEMPLATE in xserver-xfree86/config/inputdevice/mouse/emulate3buttons \
                xserver-xfree86/config/inputdevice/mouse/zaxismapping; do
  db_get "$TEMPLATE"
  if [ "$RET" = "Yes" ]; then
    observe "migrating template \"$TEMPLATE\" from \"Yes\" to \"true\""
    db_set $TEMPLATE "true"
  elif [ "$RET" = "No" ]; then
    observe "migrating template \"$TEMPLATE\" from \"No\" to \"false\""
    db_set $TEMPLATE "false"
  fi
done

# migrate from "expert" to "advanced"
db_get xserver-xfree86/config/monitor/selection-method
if [ "$RET" = "Expert" ]; then
  observe "migrating template" \
          "\"xserver-xfree86/config/monitor/selection-method\" from" \
          "\"Expert\" to \"Advanced\""
  db_set xserver-xfree86/config/monitor/selection-method "Advanced"
fi

# migrate to XFree86 4.2 or later, where there are no pex or xie modules
db_get xserver-xfree86/config/modules
SELECTED_MODULES="$(echo $RET | awk 'BEGIN { RS=", "} {print $1}')"
# are the pex or xie modules selected?
if echo "$SELECTED_MODULES" | egrep -q "(pex|xie)"; then
  observe "removing pex and xie modules from list of selected modules"
  observe "old value of template \"xserver-xfree86/config/modules\": \"$RET\""
  # get rid of them
  SELECTED_MODULES=$(echo "$SELECTED_MODULES" | egrep -v "(pex|xie)")
  SELECTED_MODULES=$(echo $SELECTED_MODULES | sed 's/ /, /g')
  db_set xserver-xfree86/config/modules "$SELECTED_MODULES"
  db_get xserver-xfree86/config/modules
  observe "new value of template \"xserver-xfree86/config/modules\": \"$RET\""
fi

# migrate from ATI driver sub-modules to ATI driver
db_get xserver-xfree86/config/device/driver
case "$RET" in
  atimisc|r128|radeon)
    observe "migrating template \"xserver-xfree86/config/device/driver\" from" \
            "\"$RET\" to \"ati\""
    db_set xserver-xfree86/config/device/driver "ati"
    ;;
  *)
    ;;
esac

# The only supported protocol (per Zephaniah Hull) for the GPM repeater is
# IntelliMouse; migrate anyone using that mouse device to that protocol.  Other
# values used to work as well, but no longer do since the XFree86 mouse driver
# was rewritten for XFree86 4.3.0.  See Debian bug #233933 for more details.
db_get xserver-xfree86/config/inputdevice/mouse/port
if [ "$RET" = "/dev/gpmdata" ]; then
  db_get xserver-xfree86/config/inputdevice/mouse/protocol
  if [ "$RET" != "IntelliMouse" ]; then
    observe "migrating template" \
            "\"xserver-xfree86/config/inputdevice/mouse/protocol\" from" \
            "\"$RET\" to \"IntelliMouse\""
    db_set xserver-xfree86/config/inputdevice/mouse/protocol "IntelliMouse"
  fi
fi

# collect information about installed video card(s), if possible
if which discover >/dev/null 2>&1; then
  DISCOVERED_VIDEO=$(discover_video)
  if [ -n "$DISCOVERED_VIDEO" ]; then
    NCARDS=$(echo "$DISCOVERED_VIDEO" | wc -l | tr -d '[:blank:]')
    SERVERS=$(echo "$DISCOVERED_VIDEO" | cut -f2 | grep -v unknown | sort -u)
    NSERVERS=$(echo "$SERVERS" | wc -l | tr -d '[:blank:]')
    DRIVERS=$(echo "$DISCOVERED_VIDEO" | cut -f3 | grep -v unknown | sort -u)
    NDRIVERS=$(echo "$DRIVERS" | wc -l | tr -d '[:blank:]')
    if [ $NCARDS -gt 1 ]; then
      MULTIHEAD=yes
    fi
  else
    observe "discover reported nothing"
  fi
else
  observe "discover command not available"
fi

# select default X server

SKIP_XFREE86_X_SERVER_CONFIG=
if select_default_x_server; then
  # is this the selected X server?
  db_get shared/default-x-server
  if [ "$RET" != "$THIS_PACKAGE" ]; then
    # nothing else to do in this script
    observe "skipping further configuration of $THIS_PACKAGE; it is not the" \
            "default X server package"
    SKIP_XFREE86_X_SERVER_CONFIG=yes
  fi
else
  if [ -n "$RECONFIGURE" ]; then
    warn "not reconfiguring default X server; manual modifications have been" \
         "made --- please see /usr/share/doc/xfree86-common/FAQ.gz"
  else
    observe "not configuring default X server; manual modifications have been" \
         "made --- please see /usr/share/doc/xfree86-common/FAQ.gz"
  fi
fi

# configure XFree86 X server

# Do not be tempted to move this into the "if select_default_x_server" block
# above; we want to permit the user to reconfigure the XF86Config-4 file even if
# the default X server is being handled manually.

if [ -z "$SKIP_XFREE86_X_SERVER_CONFIG" ]; then
  if ! configure_xfree86_x_server; then
    if [ -n "$RECONFIGURE" ]; then
      warn "not reconfiguring XFree86 X server; manual modifications have" \
           "been made --- please see /usr/share/doc/xfree86-common/FAQ.gz"
    else
      observe "not configuring XFree86 X server; manual modifications have" \
              "been made --- please see /usr/share/doc/xfree86-common/FAQ.gz"
    fi
  fi
fi

exit 0

# vim:set ai et sts=2 sw=2 tw=80:

Attachment: signature.asc
Description: Digital signature


Reply to: