Package: console-setup
Version: 1.7
Severity: wishlist
Tags: patch

The attached patch implements a relatively smooth upgrade from
pre-console-setup systems. If X is installed, it extracts the desired
keyboard layout from xorg.conf; failing that, it uses a pretty horrible
lookup table borrowed from Ubuntu's xserver-xorg.config (which is a
superset of Debian's, I think), with the additional bug-fix of mapping
uk to plain gb rather than gb(intl) because UK users do not expect to
have dead keys. If it finds a keyboard layout using either of these
methods, it drops the priority of the layout and variant questions from
critical to medium.

I realise this patch is less than entirely elegant, but it makes
upgrades rather smoother, which I think will be useful if/when Debian
moves to console-setup by default. I'm using this in Ubuntu.

Thanks,

-- 
Colin Watson                                       [EMAIL PROTECTED]
--- console-setup-1.7.orig/debian/config.proto  2006-07-22 21:05:55.000000000 
+0100
+++ console-setup-1.7/debian/config.proto       2006-09-10 12:05:27.000000000 
+0100
@@ -64,6 +64,7 @@
 . /usr/share/debconf/confmodule
 
 CONFIGFILE=/etc/default/console-setup
+XORGCONFIGFILE=/etc/X11/xorg.conf
 
 ## FONTSETS ## Will be replaced by assignment for $fontsets:
 
@@ -645,7 +646,7 @@
 
 default_layout=''
 default_variant=''
-layout_priority=''
+layout_priority=critical
 case "$locale" in
     # Keyboards for countries
     *_AL*)
@@ -972,14 +973,97 @@
 ######################################################################
 
 # Load the config file, if it exists.
+got_x_config=no
+got_full_config=no
 if [ -e $CONFIGFILE ]; then
     . $CONFIGFILE || true
-    
+    got_x_config=yes
+    got_full_config=yes
+elif [ -e $XORGCONFIGFILE ]; then
+    XKBMODEL="$(sed -ne 
's/^[[:space:]]\+Option[[:space:]]\+"XkbModel"[[:space:]]\+"\([^"]\+\)"/\1/ip' 
$XORGCONFIGFILE | head -n1)"
+    XKBLAYOUT="$(sed -ne 
's/^[[:space:]]\+Option[[:space:]]\+"XkbLayout"[[:space:]]\+"\([^"]\+\)"/\1/ip' 
$XORGCONFIGFILE | head -n1)"
+    XKBVARIANT="$(sed -ne 
's/^[[:space:]]\+Option[[:space:]]\+"XkbVariant"[[:space:]]\+"\([^"]\+\)"/\1/ip'
 $XORGCONFIGFILE | head -n1)"
+    XKBOPTIONS="$(sed -ne 
's/^[[:space:]]\+Option[[:space:]]\+"XkbOptions"[[:space:]]\+"\([^"]\+\)"/\1/ip'
 $XORGCONFIGFILE | head -n1)"
+    got_x_config=yes
+    layout_priority=medium
+elif db_get debian-installer/keymap && [ "$RET" ]; then
+    # This is a desperation measure, but required for migration from
+    # pre-console-setup systems without X installed. We just have to copy
+    # the guesswork formerly done by xserver-xorg.config.
+    got_x_config=yes
+    layout_priority=medium
+
+    di_keymap="${RET##mac-usb-}"
+    di_keymap="${di_keymap%%-latin1}"
+
+    XKBMODEL="$default_model"
+    XKBLAYOUT=''
+    XKBVARIANT=''
+    XKBOPTIONS=''
+    case "$di_keymap" in
+       be2) XKBLAYOUT="be";;
+       bg) XKBLAYOUT="bg"; XKBVARIANT="bds";;
+       br) XKBLAYOUT="us"; XKBVARIANT="intl"; XKBMODEL="pc104";;
+       br-abnt2) XKBLAYOUT="br"; XKBVARIANT="abnt2"; XKBMODEL="abnt2";;
+       by) XKBLAYOUT="by";;
+       cf) XKBLAYOUT="ca"; XKBVARIANT="fr";;
+       croat) XKBLAYOUT="hr";;
+       cz-lat2) XKBLAYOUT="cz";;
+       de-latin1-nodeadkeys) XKBLAYOUT="de"; XKBVARIANT="nodeadkeys";;
+       de) XKBLAYOUT="de";;
+       dvorak) XKBLAYOUT="us"; XKBVARIANT="dvorak"; XKBMODEL="pc104";;
+       dk) XKBLAYOUT="dk";;
+       es) XKBLAYOUT="es";;
+       et) XKBLAYOUT="ee";;
+       fi) XKBLAYOUT="fi";;
+       fr-latin9) XKBLAYOUT="fr"; XKBVARIANT="latin9";;
+       fr_CH) XKBLAYOUT="ch"; XKBVARIANT="fr";;
+       fr) XKBLAYOUT="fr";;
+       hebrew) XKBLAYOUT="il";;
+       hu) XKBLAYOUT="hu";;
+       gb) XKBLAYOUT="gb";;
+       is) XKBLAYOUT="is";;
+       it) XKBLAYOUT="it";;
+       jp106) XKBLAYOUT="jp"; XKBVARIANT="jp106";;
+       la) XKBLAYOUT="latam";;
+       lt) XKBLAYOUT="lt";; 
+       lv-latin4) XKBLAYOUT="lv";;
+       # XXX should these be XKBMODEL="macintosh"?
+       mac-us-std) XKBLAYOUT="us";;
+       mac-de2-ext) XKBLAYOUT="de"; XKBVARIANT="nodeadkeys";;
+       mac-fr2-ext) XKBLAYOUT="fr";;
+       mac-fr3) XKBLAYOUT="fr";;
+       mac-es) XKBLAYOUT="es";;
+       mk) XKBLAYOUT="mk";;
+       nl) XKBLAYOUT="nl";;
+       no) XKBLAYOUT="no";;
+       pl) XKBLAYOUT="pl";;
+       pt) XKBLAYOUT="pt";;
+       ro) XKBLAYOUT="ro";;
+       ru) XKBLAYOUT="ru";;
+       se) XKBLAYOUT="se";;
+       sg) XKBLAYOUT="ch"; XKBVARIANT="de";;
+       sk-qwerty) XKBLAYOUT="sk"; XKBVARIANT="qwerty";;
+       slovene) XKBLAYOUT="si";;
+       sr-cy) XKBLAYOUT="cs";;
+       trf|trfu) XKBLAYOUT="tr"; XKBVARIANT="f";;
+       trq|trqu) XKBLAYOUT="tr";;
+       ua) XKBLAYOUT="ua";;
+       uk) XKBLAYOUT="gb";;
+       us) XKBLAYOUT="us"; XKBMODEL="pc104";;
+       *) got_x_config=no; layout_priority=critical;;
+    esac
+fi
+
+if [ "$got_full_config" = yes ]; then
     default_ttys="$ACTIVE_CONSOLES"
     default_charmap="$CHARMAP"
     default_codeset="$CODESET"
     default_fontface="$FONTFACE"
     default_fontsize="$FONTSIZE"
+fi
+
+if [ "$got_x_config" = yes ]; then
     default_model="$XKBMODEL"
 
     case "$XKBLAYOUT" in
@@ -1078,9 +1172,11 @@
                unsupported_layout=yes;;
        esac
     done
+fi
 
-    # Store values from config file into debconf db.
+# Store values from config file into debconf db.
     
+if [ "$got_full_config" = yes ]; then
     db_set console-setup/ttys "$default_ttys"
     db_set console-setup/charmap "$default_charmap"
     db_set console-setup/codeset "$default_codeset"
@@ -1088,6 +1184,8 @@
     db_set console-setup/fontsize-text "$default_fontsize"
     db_set console-setup/fontsize-fb "$default_fontsize"
     db_set console-setup/fontsize "$default_fontsize"
+fi
+if [ "$got_x_config" = yes ]; then
     db_set console-setup/toggle "$default_toggle"
     db_set console-setup/switch "$default_switch"
     db_set console-setup/altgr "$default_altgr"
@@ -1123,7 +1275,7 @@
                    STATE=$(($STATE - 1))
                fi
            elif \
-               ask_debconf console-setup/layout critical \
+               ask_debconf console-setup/layout $layout_priority \
                    layout "$default_layout"
            then
                layout="$RET"
@@ -1138,7 +1290,7 @@
                # skip the question without making Debconf loop
                STATE=$(( $STATE + $STATE - $old_state ))
            elif \
-               ask_debconf console-setup/variant critical \
+               ask_debconf console-setup/variant $layout_priority \
                     "variant\*${layout}" "$default_variant"
            then
                variant="$RET"

Reply via email to