Subject: Re: kern/36762: Locking alternative layouts for wskbd
To: None <gnats-bugs@NetBSD.org>
From: Mike M. Volokhov <mishka@NetBSD.org>
List: netbsd-bugs
Date: 08/10/2007 12:11:40
Grrr, copy-pasting... Original patch is:

Index: wskbd.c
===================================================================
RCS file: /cvsroot/src/sys/dev/wscons/wskbd.c,v
retrieving revision 1.105
diff -u -r1.105 wskbd.c
--- wskbd.c	6 Aug 2007 03:07:52 -0000	1.105
+++ wskbd.c	10 Aug 2007 07:41:17 -0000
@@ -1406,16 +1406,22 @@
 }
 
 static inline void
-update_modifier(struct wskbd_internal *id, u_int type, int toggle, int mask)
+update_modifier(struct wskbd_internal *id, u_int type, int togglemode, int mask)
 {
-	if (toggle) {
-		if (type == WSCONS_EVENT_KEY_DOWN)
-			id->t_modifiers ^= mask;
-	} else {
+	switch (togglemode) {
+	case 0:	/* down - on, up - off */
 		if (type == WSCONS_EVENT_KEY_DOWN)
 			id->t_modifiers |= mask;
 		else
 			id->t_modifiers &= ~mask;
+		break;
+	case 1: /* down - invert */
+		if (type == WSCONS_EVENT_KEY_DOWN)
+			id->t_modifiers ^= mask;
+		break;
+	case 2: /* either down or up - invert */
+		id->t_modifiers ^= mask;
+		break;
 	}
 }
 
@@ -1503,6 +1509,17 @@
 	case KS_Cmd2:
 		update_modifier(sc->id, *type, 0, MOD_COMMAND2);
 		break;
+
+	case KS_Cmd_ModeToggle:
+		if (*type == WSCONS_EVENT_KEY_DOWN) {
+		    if (MOD_ONESET(sc->id, MOD_COMMAND1 | MOD_COMMAND2)) {
+			update_modifier(sc->id, *type, 1, MOD_MODESHIFT);
+			return (1);
+		    } else {
+			return (0);
+		    }
+		}
+		break;
 	}
 
 	if (*type != WSCONS_EVENT_KEY_DOWN ||
@@ -1648,7 +1665,11 @@
 		break;
 
 	case KS_Mode_switch:
-		update_modifier(id, type, 0, MOD_MODESHIFT);
+		update_modifier(id, type, 2, MOD_MODESHIFT);
+		break;
+
+	case KS_Mode_toggle:
+		update_modifier(id, type, 1, MOD_MODESHIFT);
 		break;
 
 	case KS_Num_Lock:
Index: wsksymdef.h
===================================================================
RCS file: /cvsroot/src/sys/dev/wscons/wsksymdef.h,v
retrieving revision 1.58
diff -u -r1.58 wsksymdef.h
--- wsksymdef.h	4 Apr 2007 14:50:21 -0000	1.58
+++ wsksymdef.h	10 Aug 2007 07:41:17 -0000
@@ -377,6 +377,7 @@
 #define KS_Henkan_Mode		0xf114	/* Start/Stop Conversion */
 #define KS_Henkan		0xf115	/* Alias for Henkan_Mode */
 #define KS_Muhenkan		0xf116	/* Cancel Conversion */
+#define KS_Mode_toggle		0xf117
 
 /*
  * Group 2 (keypad) character in low byte
@@ -524,6 +525,7 @@
 #define KS_Cmd_ScrollFastDown	0xf42d
 #define KS_Cmd_ScrollSlowUp	0xf42e
 #define KS_Cmd_ScrollSlowDown	0xf42f
+#define KS_Cmd_ModeToggle	0xf430
 
 /*
  * Group 5 (internal)