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: