Package: kbd-chooser
Severity: important
Tags: patch l10n d-i

As explained in #276548 installing the keymap to /target when console is
in the unicode mode produces some side effects which directly effect
the Turkish keyboard.  Could you please apply the patch attached which
incorporates a workaround for #276548?

    Changelog:

    * As a workaround to #276548, temporarily switch to ascii mode
      before installing the Turkish keymap.

This patch includes a simple code change in kbd-mode which simplifies
similar workarounds.  I've tested it enough and observed that it works.
No other keymaps other than Turkish will be affected by this patch.

Regards,

-- 
roktas
diff -ruN kbd-chooser.orig/debian/prebaseconfig kbd-chooser/debian/prebaseconfig
--- kbd-chooser.orig/debian/prebaseconfig       2004-04-19 05:13:49.000000000 +0300
+++ kbd-chooser/debian/prebaseconfig    2004-10-15 21:35:30.000000000 +0300
@@ -10,20 +10,38 @@
        exit 0
 fi
 
-# Install non-Unicode variants of Turkish keymaps
-if [ "$KEYMAP" = "trqu" ]; then
-       KEYMAP="trq"
-       db_set debian-installer/keymap $KEYMAP
-fi
-if [ "$KEYMAP" = "trfu" ]; then
-       KEYMAP="trf"
-       db_set debian-installer/keymap $KEYMAP
-fi
+case "$KEYMAP" in
+       trqu|trfu)
+               # Install non-Unicode variants of Turkish keymaps
+               if [ "$KEYMAP" = "trqu" ]; then
+                       KEYMAP="trq"
+               elif [ "$KEYMAP" = "trfu" ]; then
+                       KEYMAP="trf"
+               fi
+
+               # Switch to ascii mode when installing these keymaps
+               forced_mode="ascii"
+               db_set debian-installer/keymap $KEYMAP
+               ;;
+       *)
+               # Nothing to do.
+               ;;
+esac
 
 db_get debian-installer/serial-console
 if [ "$RET" = "false" ] ; then
        apt-install console-tools console-data console-common 
+
+       if [ -n "$forced_mode" ]; then
+               saved_mode=`kbd-mode`
+               kbd-mode --$forced_mode
+       fi
+
        chroot /target install-keymap $KEYMAP
+
+       if [ -n "$saved_mode" ]; then
+               kbd-mode --$saved_mode
+       fi
 fi
 
 
diff -ruN kbd-chooser.orig/kbd-mode.c kbd-chooser/kbd-mode.c
--- kbd-chooser.orig/kbd-mode.c 2004-07-04 20:05:15.000000000 +0300
+++ kbd-chooser/kbd-mode.c      2004-10-15 21:45:59.000000000 +0300
@@ -32,6 +32,12 @@
 #define di_info(format...) di_log(DI_LOG_LEVEL_INFO, format)
 #endif
 
+/* Descriptive names for keyboard modes.  */
+#define S_XLATE     "ascii"
+#define S_MEDIUMRAW "keycode"
+#define S_RAW       "scancode"
+#define S_UNICODE   "unicode"
+
 extern int getfd (void);
 
 static char *progname = "kbd-mode";
@@ -42,11 +48,11 @@
        puts   ("Report and set keyboard mode");
        puts   ("");
        puts   ("Options are:");
-       puts   ("-h --help       print this help information and exit");
-       puts   ("-a --8bit       ASCII or 8bit mode (XLATE)");
-       puts   ("-k --keycode    keycode mode (MEDIUMRAW)");
-       puts   ("-u --unicode    UTF-8 mode (UNICODE)");
-       puts   ("-s --scancode   scancode mode (RAW)");
+       puts   ("-h --help"         "\tprint this help information and exit");
+       puts   ("-a --" S_XLATE     "\tascii or 8bit mode (XLATE)");
+       puts   ("-k --" S_MEDIUMRAW "\tkeycode mode (MEDIUMRAW)");
+       puts   ("-s --" S_RAW       "\tscancode mode (RAW)");
+       puts   ("-u --" S_UNICODE   "\tunicode mode (UNICODE)");
 }
 
 static int parse_cmdline (int argc, char *argv[])
@@ -55,12 +61,11 @@
        int c;
        const struct option long_opts[] = {
                { "help"     , no_argument, NULL, 'h' },
-               { "8bit"     , no_argument, NULL, 'a' },
-               { "ascii"    , no_argument, NULL, 'a' },
-               { "keycode"  , no_argument, NULL, 'k' },
-               { "scancode" , no_argument, NULL, 's' },
-               { "unicode"  , no_argument, NULL, 'u' },
-               { NULL, 0, NULL, 0 }
+               { S_XLATE    , no_argument, NULL, 'a' },
+               { S_MEDIUMRAW, no_argument, NULL, 'k' },
+               { S_RAW      , no_argument, NULL, 's' },
+               { S_UNICODE  , no_argument, NULL, 'u' },
+               { NULL       , 0,           NULL, 0   }
        };
        
        mode = -1;
@@ -68,19 +73,22 @@
                switch (c) {
                        case 'h':
                                usage ();
-                               exit(0);
+                               exit (0);
                        case 'a':
                                mode = K_XLATE;
                                break;
-                       case 'u':
-                               mode = K_UNICODE;
+                       case 'k':
+                               mode = K_MEDIUMRAW;
                                break;
                        case 's':
                                mode = K_RAW;
                                break;
-                       case 'k':
-                               mode = K_MEDIUMRAW;
+                       case 'u':
+                               mode = K_UNICODE;
                                break;
+                       default:
+                               di_error ("%s: error parsing command line\n", 
progname);
+                               exit (1);
                }
 
        return mode;
@@ -89,16 +97,16 @@
 static const char *desc (int mode)
 {
        switch (mode) {
-               case K_RAW:
-                       return "raw (scancode)";
-               case K_MEDIUMRAW:
-                       return "mediumraw (keycode)";
                case K_XLATE:
-                       return "ASCII (default)";
+                       return S_XLATE;
+               case K_MEDIUMRAW:
+                       return S_MEDIUMRAW;
+               case K_RAW:
+                       return S_RAW;
                case K_UNICODE:
-                       return "Unicode (UTF-8)";
+                       return S_UNICODE;
                default:
-                       return "unknown";
+                       return NULL;
        }
 }
 
@@ -111,14 +119,23 @@
 
        fd = getfd ();
        
-       /* Report console mode.  */
+       /* 
+        * Report console mode in a way so that it can 
+        * be used later as a command line option.
+        */
        if (mode == -1) {
+               const char *mode_str;
+
                if (ioctl (fd, KDGKBMODE, &mode)) {
                        di_error ("%s: error reading console mode\n", progname);
                        exit (1);
                }
 
-               printf ("Console mode: %s\n", desc (mode));
+               mode_str = desc (mode);
+               if (! mode_str)
+                       di_info ("%s: unknown console mode reported\n", progname);
+               else
+                       printf ("%s\n", mode_str);
 
                exit (0);
        }

Attachment: signature.asc
Description: Digital signature

Reply via email to