Subject: port-i386/6416: incorrect shifting state in pccons
To: None <gnats-bugs@gnats.netbsd.org>
From: jeff grills <jefftep@erbium.frenzy.com>
List: netbsd-bugs
Date: 11/09/1998 17:40:01
>Number:         6416
>Category:       port-i386
>Synopsis:       incorrect shifting state in pccons
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    gnats-admin (GNATS administrator)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Nov  9 15:50:01 1998
>Last-Modified:
>Originator:     jeff grills
>Organization:
GT Interactive
>Release:        1.3.2
>Environment:
System: NetBSD erbium 1.3.2 NetBSD 1.3.2 (ERBIUM-2) #2: Mon Nov 9 16:37:05 CST 1998 jefftep@erbium:/usr/src/sys/arch/i386/compile/ERBIUM-2 i386

>Description:
pccons maintains only one bit for the shifting state of the keyboard.
Pressing both shift keys, and releasing one will clear the shift state
bit when it should really still be set.

The same problem looks to exist for the control and alt keys as well, but
I did not bother to test or fix them.

>How-To-Repeat:
using a kernel with pccons, not inside X:
press left-shift.
press right-shift.
release left-shift or right shift.
press a letter on the keyboard and it will be lowercase.

>Fix:
*** orig/pccons.c	Mon Nov  9 16:14:32 1998
--- pccons.c	Mon Nov  9 16:36:35 1998
***************
*** 150,170 ****
   * important.
   */
  #define	SCROLL		0x0001	/* stop output */
  #define	NUM		0x0002	/* numeric shift  cursors vs. numeric */
  #define	CAPS		0x0004	/* caps shift -- swaps case of letter */
! #define	SHIFT		0x0008	/* keyboard shift */
  #define	CTL		0x0010	/* control shift  -- allows ctl function */
  #define	ASCII		0x0020	/* ascii code for this key */
  #define	ALT		0x0080	/* alternate shift -- alternate chars */
  #define	FUNC		0x0100	/* function key */
  #define	KP		0x0200	/* Keypad keys */
  #define	NONE		0x0400	/* no function */
  #ifdef NONUS_KBD
  #define ALTGR           0x0040  /* Alt graphic */
  #endif
  
  static unsigned int addr_6845 = MONO_BASE;
  
  char *sget __P((void));
  void sput __P((u_char *, int));
  #ifdef XSERVER
--- 150,173 ----
   * important.
   */
  #define	SCROLL		0x0001	/* stop output */
  #define	NUM		0x0002	/* numeric shift  cursors vs. numeric */
  #define	CAPS		0x0004	/* caps shift -- swaps case of letter */
! #define	SHIFT_L		0x0008	/* keyboard shift */
  #define	CTL		0x0010	/* control shift  -- allows ctl function */
  #define	ASCII		0x0020	/* ascii code for this key */
  #define	ALT		0x0080	/* alternate shift -- alternate chars */
  #define	FUNC		0x0100	/* function key */
  #define	KP		0x0200	/* Keypad keys */
  #define	NONE		0x0400	/* no function */
  #ifdef NONUS_KBD
  #define ALTGR           0x0040  /* Alt graphic */
  #endif
  
+ #define	SHIFT_R		0x0800	/* right keyboard shift */
+ #define SHIFT		(SHIFT_R | SHIFT_L)
+ 
  static unsigned int addr_6845 = MONO_BASE;
  
  char *sget __P((void));
  void sput __P((u_char *, int));
  #ifdef XSERVER
***************
*** 1431,1441 ****
  	{ ASCII,"k",		"K",		"\013" },	/* 37 k */
  	{ ASCII,"l",		"L",		"\014" },	/* 38 l */
  	{ ASCII,";",		":",		";" },		/* 39 ; */
  	{ ASCII,"'",		"\"",		"'" },		/* 40 ' */
  	{ ASCII,"`",		"~",		"`" },		/* 41 ` */
! 	{ SHIFT,"",		"",		"" },		/* 42 shift */
  	{ ASCII,"\\",		"|",		"\034" },	/* 43 \ */
  	{ ASCII,"z",		"Z",		"\032" },	/* 44 z */
  	{ ASCII,"x",		"X",		"\030" },	/* 45 x */
  	{ ASCII,"c",		"C",		"\003" },	/* 46 c */
  	{ ASCII,"v",		"V",		"\026" },	/* 47 v */
--- 1434,1444 ----
  	{ ASCII,"k",		"K",		"\013" },	/* 37 k */
  	{ ASCII,"l",		"L",		"\014" },	/* 38 l */
  	{ ASCII,";",		":",		";" },		/* 39 ; */
  	{ ASCII,"'",		"\"",		"'" },		/* 40 ' */
  	{ ASCII,"`",		"~",		"`" },		/* 41 ` */
! 	{ SHIFT_L,"",		"",		"" },		/* 42 shift */
  	{ ASCII,"\\",		"|",		"\034" },	/* 43 \ */
  	{ ASCII,"z",		"Z",		"\032" },	/* 44 z */
  	{ ASCII,"x",		"X",		"\030" },	/* 45 x */
  	{ ASCII,"c",		"C",		"\003" },	/* 46 c */
  	{ ASCII,"v",		"V",		"\026" },	/* 47 v */
***************
*** 1443,1453 ****
  	{ ASCII,"n",		"N",		"\016" },	/* 49 n */
  	{ ASCII,"m",		"M",		"\r" },		/* 50 m */
  	{ ASCII,",",		"<",		"<" },		/* 51 , */
  	{ ASCII,".",		">",		">" },		/* 52 . */
  	{ ASCII,"/",		"?",		"\037" },	/* 53 / */
! 	{ SHIFT,"",		"",		"" },		/* 54 shift */
  	{ KP,	"*",		"*",		"*" },		/* 55 kp * */
  	{ ALT,	"",		"",		"" },		/* 56 alt */
  	{ ASCII," ",		" ",		"\000" },	/* 57 space */
  #ifdef CAPS_IS_CONTROL
  	{ CTL,	"",		"",		"" },		/* 58 control */
--- 1446,1456 ----
  	{ ASCII,"n",		"N",		"\016" },	/* 49 n */
  	{ ASCII,"m",		"M",		"\r" },		/* 50 m */
  	{ ASCII,",",		"<",		"<" },		/* 51 , */
  	{ ASCII,".",		">",		">" },		/* 52 . */
  	{ ASCII,"/",		"?",		"\037" },	/* 53 / */
! 	{ SHIFT_R,"",		"",		"" },		/* 54 shift */
  	{ KP,	"*",		"*",		"*" },		/* 55 kp * */
  	{ ALT,	"",		"",		"" },		/* 56 alt */
  	{ ASCII," ",		" ",		"\000" },	/* 57 space */
  #ifdef CAPS_IS_CONTROL
  	{ CTL,	"",		"",		"" },		/* 58 control */
***************
*** 1578,1588 ****
  	{ ASCII,	"k",	"K",	"\013",	"k" },	/* 37 k */
  	{ ASCII,	"l",	"L",	"\014",	"l" },	/* 38 l */
  	{ ASCII,	"m",	"M",	"\r",	"m" },	/* 39 ; */
  	{ ASCII,	"\371",	"%",	"\231",	"\371" }, /* 40 ' */
  	{ ASCII,	"\262",	"",	"\262",	"\262" }, /* 41 ` */
! 	{ SHIFT,	"",	"",	"",	"" },	/* 42 shift */
  	{ ASCII,	"*",	"\265",	"*",	"*" },	/* 43 \ */
  	{ ASCII,	"w",	"W",	"\027",	"w" },	/* 44 z */
  	{ ASCII,	"x",	"X",	"\030",	"x" },	/* 45 x */
  	{ ASCII,	"c",	"C",	"\003",	"c" },	/* 46 c */
  	{ ASCII,	"v",	"V",	"\026",	"v" },	/* 47 v */
--- 1581,1591 ----
  	{ ASCII,	"k",	"K",	"\013",	"k" },	/* 37 k */
  	{ ASCII,	"l",	"L",	"\014",	"l" },	/* 38 l */
  	{ ASCII,	"m",	"M",	"\r",	"m" },	/* 39 ; */
  	{ ASCII,	"\371",	"%",	"\231",	"\371" }, /* 40 ' */
  	{ ASCII,	"\262",	"",	"\262",	"\262" }, /* 41 ` */
! 	{ SHIFT_L,	"",	"",	"",	"" },	/* 42 shift */
  	{ ASCII,	"*",	"\265",	"*",	"*" },	/* 43 \ */
  	{ ASCII,	"w",	"W",	"\027",	"w" },	/* 44 z */
  	{ ASCII,	"x",	"X",	"\030",	"x" },	/* 45 x */
  	{ ASCII,	"c",	"C",	"\003",	"c" },	/* 46 c */
  	{ ASCII,	"v",	"V",	"\026",	"v" },	/* 47 v */
***************
*** 1590,1600 ****
  	{ ASCII,	"n",	"N",	"\016",	"n" },	/* 49 n */
  	{ ASCII,	",",	"?",	",",	"," },	/* 50 m */
  	{ ASCII,	";",	".",	";",	";" },	/* 51 , */
  	{ ASCII,	":",	"/",	"\037",	":" },	/* 52 . */
  	{ ASCII,	"!",	"\266",	"!",	"!" },	/* 53 / */
! 	{ SHIFT,	"",	"",	"",	"" },	/* 54 shift */
  	{ KP,		"*",	"*",	"*",	"*" },	/* 55 kp * */
  	{ ALT,		"",	"",	"",	"" },	/* 56 alt */
  	{ ASCII,	" ",	" ",	"\000",	" " },	/* 57 space */
  	{ CAPS,	"",	"",	"",	"" },	/* 58 caps */
  	{ FUNC,	"\033[M",	"\033[Y",	"\033[k",	"" }, /* 59 f1 */
--- 1593,1603 ----
  	{ ASCII,	"n",	"N",	"\016",	"n" },	/* 49 n */
  	{ ASCII,	",",	"?",	",",	"," },	/* 50 m */
  	{ ASCII,	";",	".",	";",	";" },	/* 51 , */
  	{ ASCII,	":",	"/",	"\037",	":" },	/* 52 . */
  	{ ASCII,	"!",	"\266",	"!",	"!" },	/* 53 / */
! 	{ SHIFT_R,	"",	"",	"",	"" },	/* 54 shift */
  	{ KP,		"*",	"*",	"*",	"*" },	/* 55 kp * */
  	{ ALT,		"",	"",	"",	"" },	/* 56 alt */
  	{ ASCII,	" ",	" ",	"\000",	" " },	/* 57 space */
  	{ CAPS,	"",	"",	"",	"" },	/* 58 caps */
  	{ FUNC,	"\033[M",	"\033[Y",	"\033[k",	"" }, /* 59 f1 */
***************
*** 1713,1723 ****
  	{ ASCII,	"k",	"K",	"\013",	"k" },	/* 37 k */
  	{ ASCII,	"l",	"L",	"\014",	"l" },	/* 38 l */
  	{ ASCII,	"\xf6",	"\xd6",	"\xf6",	"\xd6" }, /* 39 ; */
  	{ ASCII,	"\xe4",	"\xc4",	"\xe4",	"\xc4" }, /* 40 ' */
  	{ ASCII,	"\136",	"\370",	"\136",	"\370" }, /* 41 ` */
! 	{ SHIFT,	"",	"",	"",	"" },	/* 42 shift */
  	{ ASCII,	"#",	"'",	"#",	"'" },	/* 43 \ */
  	{ ASCII,	"y",	"Y",	"\x19",	"y" },	/* 44 z */
  	{ ASCII,	"x",	"X",	"\030",	"x" },	/* 45 x */
  	{ ASCII,	"c",	"C",	"\003",	"c" },	/* 46 c */
  	{ ASCII,	"v",	"V",	"\026",	"v" },	/* 47 v */
--- 1716,1726 ----
  	{ ASCII,	"k",	"K",	"\013",	"k" },	/* 37 k */
  	{ ASCII,	"l",	"L",	"\014",	"l" },	/* 38 l */
  	{ ASCII,	"\xf6",	"\xd6",	"\xf6",	"\xd6" }, /* 39 ; */
  	{ ASCII,	"\xe4",	"\xc4",	"\xe4",	"\xc4" }, /* 40 ' */
  	{ ASCII,	"\136",	"\370",	"\136",	"\370" }, /* 41 ` */
! 	{ SHIFT_L,	"",	"",	"",	"" },	/* 42 shift */
  	{ ASCII,	"#",	"'",	"#",	"'" },	/* 43 \ */
  	{ ASCII,	"y",	"Y",	"\x19",	"y" },	/* 44 z */
  	{ ASCII,	"x",	"X",	"\030",	"x" },	/* 45 x */
  	{ ASCII,	"c",	"C",	"\003",	"c" },	/* 46 c */
  	{ ASCII,	"v",	"V",	"\026",	"v" },	/* 47 v */
***************
*** 1725,1735 ****
  	{ ASCII,	"n",	"N",	"\016",	"n" },	/* 49 n */
  	{ ASCII,	"m",	"M",	"\r",	"m" },	/* 50 m */
  	{ ASCII,	",",	";",	",",	";" },	/* 51 , */
  	{ ASCII,	".",	":",	".",	":" },	/* 52 . */
  	{ ASCII,	"-",	"_",	"-",	"_" },	/* 53 / */
! 	{ SHIFT,	"",	"",	"",	"" },	/* 54 shift */
  	{ KP,	"*",	"*",	"*",	"*" },	/* 55 kp * */
  	{ ALT,	"",	"",	"",	"" },	/* 56 alt */
  	{ ASCII,	" ",	" ",	"\000",	" " },	/* 57 space */
  	{ CAPS,	"",	"",	"",	"" },	/* 58 caps */
  	{ FUNC,	"\033[M",	"\033[Y",	"\033[k",	"" }, /* 59 f1 */
--- 1728,1738 ----
  	{ ASCII,	"n",	"N",	"\016",	"n" },	/* 49 n */
  	{ ASCII,	"m",	"M",	"\r",	"m" },	/* 50 m */
  	{ ASCII,	",",	";",	",",	";" },	/* 51 , */
  	{ ASCII,	".",	":",	".",	":" },	/* 52 . */
  	{ ASCII,	"-",	"_",	"-",	"_" },	/* 53 / */
! 	{ SHIFT_R,	"",	"",	"",	"" },	/* 54 shift */
  	{ KP,	"*",	"*",	"*",	"*" },	/* 55 kp * */
  	{ ALT,	"",	"",	"",	"" },	/* 56 alt */
  	{ ASCII,	" ",	" ",	"\000",	" " },	/* 57 space */
  	{ CAPS,	"",	"",	"",	"" },	/* 58 caps */
  	{ FUNC,	"\033[M",	"\033[Y",	"\033[k",	"" }, /* 59 f1 */
***************
*** 1847,1857 ****
  	{ ASCII,	"k",	"K",	"\013",	"k" },	/* 37 k */
  	{ ASCII,	"l",	"L",	"\014",	"l" },	/* 38 l */
  	{ ASCII,	"\370",	"\330",	"\326",	"\366" },	/* 39 ; */
  	{ ASCII,	"\346",	"\306",	"\304",	"\344" },	/* 40 ' */
  	{ ASCII,	"|",	"@",	"\034",	"\247" },	/* 41 ` */
! 	{ SHIFT,	"",	"",	"",	"" },	/* 42 shift */
  	{ ASCII,	"'",	"*",	"'",	"'" },	/* 43 \ */
  	{ ASCII,	"z",	"Z",	"\032",	"z" },	/* 44 z */
  	{ ASCII,	"x",	"X",	"\030",	"x" },	/* 45 x */
  	{ ASCII,	"c",	"C",	"\003",	"c" },	/* 46 c */
  	{ ASCII,	"v",	"V",	"\026",	"v" },	/* 47 v */
--- 1850,1860 ----
  	{ ASCII,	"k",	"K",	"\013",	"k" },	/* 37 k */
  	{ ASCII,	"l",	"L",	"\014",	"l" },	/* 38 l */
  	{ ASCII,	"\370",	"\330",	"\326",	"\366" },	/* 39 ; */
  	{ ASCII,	"\346",	"\306",	"\304",	"\344" },	/* 40 ' */
  	{ ASCII,	"|",	"@",	"\034",	"\247" },	/* 41 ` */
! 	{ SHIFT_L,	"",	"",	"",	"" },	/* 42 shift */
  	{ ASCII,	"'",	"*",	"'",	"'" },	/* 43 \ */
  	{ ASCII,	"z",	"Z",	"\032",	"z" },	/* 44 z */
  	{ ASCII,	"x",	"X",	"\030",	"x" },	/* 45 x */
  	{ ASCII,	"c",	"C",	"\003",	"c" },	/* 46 c */
  	{ ASCII,	"v",	"V",	"\026",	"v" },	/* 47 v */
***************
*** 1859,1869 ****
  	{ ASCII,	"n",	"N",	"\016",	"n" },	/* 49 n */
  	{ ASCII,	"m",	"M",	"\015",	"m" },	/* 50 m */
  	{ ASCII,	",",	";",	",",	"," },	/* 51 , */
  	{ ASCII,	".",	":",	".",	"." },	/* 52 . */
  	{ ASCII,	"-",	"_",	"\037",	"-" },	/* 53 / */
! 	{ SHIFT,	"",	"",	"",	"" },	/* 54 shift */
  	{ KP,	"*",	"*",	"*",	"*" },	/* 55 kp * */
  	{ ALT,	"",	"",	"",	"" },	/* 56 alt */
  	{ ASCII,	" ",	" ",	"\000",	" " },	/* 57 space */
  	{ CAPS,	"",	"",	"",	"" },	/* 58 caps */
  	{ FUNC,	"\033[M",	"\033[Y",	"\033[k",	"" }, /* 59 f1 */
--- 1862,1872 ----
  	{ ASCII,	"n",	"N",	"\016",	"n" },	/* 49 n */
  	{ ASCII,	"m",	"M",	"\015",	"m" },	/* 50 m */
  	{ ASCII,	",",	";",	",",	"," },	/* 51 , */
  	{ ASCII,	".",	":",	".",	"." },	/* 52 . */
  	{ ASCII,	"-",	"_",	"\037",	"-" },	/* 53 / */
! 	{ SHIFT_R,	"",	"",	"",	"" },	/* 54 shift */
  	{ KP,	"*",	"*",	"*",	"*" },	/* 55 kp * */
  	{ ALT,	"",	"",	"",	"" },	/* 56 alt */
  	{ ASCII,	" ",	" ",	"\000",	" " },	/* 57 space */
  	{ CAPS,	"",	"",	"",	"" },	/* 58 caps */
  	{ FUNC,	"\033[M",	"\033[Y",	"\033[k",	"" }, /* 59 f1 */
***************
*** 1980,1990 ****
  	{ ASCII,	"k",	"K",	"\013",	"k" },	/* 37 k */
  	{ ASCII,	"l",	"L",	"\014",	"l" },	/* 38 l */
  	{ ASCII,	"\366",	"\326",	"\034",	"|" },	/* 39 ; */
  	{ ASCII,	"\344",	"\304",	"\033",	"{" },	/* 40 ' */
  	{ ASCII,	"\247",	"\275",	"\000",	"@" },	/* 41 ` */
! 	{ SHIFT,	"",	"",	"",	"" },	/* 42 shift */
  	{ ASCII,	"'",	"*",	"'",	"'" },	/* 43 \ */
  	{ ASCII,	"z",	"Z",	"\032",	"z" },	/* 44 z */
  	{ ASCII,	"x",	"X",	"\030",	"x" },	/* 45 x */
  	{ ASCII,	"c",	"C",	"\003",	"c" },	/* 46 c */
  	{ ASCII,	"v",	"V",	"\026",	"v" },	/* 47 v */
--- 1983,1993 ----
  	{ ASCII,	"k",	"K",	"\013",	"k" },	/* 37 k */
  	{ ASCII,	"l",	"L",	"\014",	"l" },	/* 38 l */
  	{ ASCII,	"\366",	"\326",	"\034",	"|" },	/* 39 ; */
  	{ ASCII,	"\344",	"\304",	"\033",	"{" },	/* 40 ' */
  	{ ASCII,	"\247",	"\275",	"\000",	"@" },	/* 41 ` */
! 	{ SHIFT_L,	"",	"",	"",	"" },	/* 42 shift */
  	{ ASCII,	"'",	"*",	"'",	"'" },	/* 43 \ */
  	{ ASCII,	"z",	"Z",	"\032",	"z" },	/* 44 z */
  	{ ASCII,	"x",	"X",	"\030",	"x" },	/* 45 x */
  	{ ASCII,	"c",	"C",	"\003",	"c" },	/* 46 c */
  	{ ASCII,	"v",	"V",	"\026",	"v" },	/* 47 v */
***************
*** 1992,2002 ****
  	{ ASCII,	"n",	"N",	"\016",	"n" },	/* 49 n */
  	{ ASCII,	"m",	"M",	"\015",	"m" },	/* 50 m */
  	{ ASCII,	",",	";",	",",	"," },	/* 51 , */
  	{ ASCII,	".",	":",	".",	"." },	/* 52 . */
  	{ ASCII,	"-",	"_",	"\037",	"-" },	/* 53 / */
! 	{ SHIFT,	"",	"",	"",	"" },	/* 54 shift */
  	{ KP,	"*",	"*",	"*",	"*" },	/* 55 kp * */
  	{ ALT,	"",	"",	"",	"" },	/* 56 alt */
  	{ ASCII,	" ",	" ",	"\000",	" " },	/* 57 space */
  	{ CAPS,	"",	"",	"",	"" },	/* 58 caps */
  	{ FUNC,	"\033[M",	"\033[Y",	"\033[k",	"" },	/* 59 f1 */
--- 1995,2005 ----
  	{ ASCII,	"n",	"N",	"\016",	"n" },	/* 49 n */
  	{ ASCII,	"m",	"M",	"\015",	"m" },	/* 50 m */
  	{ ASCII,	",",	";",	",",	"," },	/* 51 , */
  	{ ASCII,	".",	":",	".",	"." },	/* 52 . */
  	{ ASCII,	"-",	"_",	"\037",	"-" },	/* 53 / */
! 	{ SHIFT_R,	"",	"",	"",	"" },	/* 54 shift */
  	{ KP,	"*",	"*",	"*",	"*" },	/* 55 kp * */
  	{ ALT,	"",	"",	"",	"" },	/* 56 alt */
  	{ ASCII,	" ",	" ",	"\000",	" " },	/* 57 space */
  	{ CAPS,	"",	"",	"",	"" },	/* 58 caps */
  	{ FUNC,	"\033[M",	"\033[Y",	"\033[k",	"" },	/* 59 f1 */
***************
*** 2082,2092 ****
   */
  char *
  sget()
  {
  	u_char dt;
! 	static u_char extended = 0, shift_state = 0;
  	static u_char capchar[2];
  
  top:
  	KBD_DELAY;
  	dt = inb(KBDATAP);
--- 2085,2096 ----
   */
  char *
  sget()
  {
  	u_char dt;
! 	static u_char extended = 0;
! 	static u_int  shift_state = 0;
  	static u_char capchar[2];
  
  top:
  	KBD_DELAY;
  	dt = inb(KBDATAP);
***************
*** 2187,2198 ****
  			shift_state &= ~CAPS;
  			break;
  		case SCROLL:
  			shift_state &= ~SCROLL;
  			break;
! 		case SHIFT:
! 			shift_state &= ~SHIFT;
  			break;
  		case ALT:
  #ifdef NONUS_KBD
  			if (extended) 
  			        shift_state &= ~ALTGR;
--- 2191,2205 ----
  			shift_state &= ~CAPS;
  			break;
  		case SCROLL:
  			shift_state &= ~SCROLL;
  			break;
! 		case SHIFT_L:
! 			shift_state &= ~SHIFT_L;
! 			break;
! 		case SHIFT_R:
! 			shift_state &= ~SHIFT_R;
  			break;
  		case ALT:
  #ifdef NONUS_KBD
  			if (extended) 
  			        shift_state &= ~ALTGR;
***************
*** 2245,2256 ****
  			extended = 0;
  			return (capchar);
  		/*
  		 * non-locking keys
  		 */
! 		case SHIFT:
! 			shift_state |= SHIFT;
  			break;
  		case ALT:
  #ifdef NONUS_KBD
  			if (extended)  
  			        shift_state |= ALTGR;
--- 2252,2266 ----
  			extended = 0;
  			return (capchar);
  		/*
  		 * non-locking keys
  		 */
! 		case SHIFT_L:
! 			shift_state |= SHIFT_L;
! 			break;
! 		case SHIFT_R:
! 			shift_state |= SHIFT_R;
  			break;
  		case ALT:
  #ifdef NONUS_KBD
  			if (extended)  
  			        shift_state |= ALTGR;

>Audit-Trail:
>Unformatted: