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

Bug#276752: Switching console to unicode mode produces some side effects



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 to: