Module Name:    src
Committed By:   manu
Date:           Sat May 14 01:16:55 UTC 2022

Modified Files:
        src/sys/dev/adb: adb_kbd.c adb_keymap.h adb_usb_map.c

Log Message:
Add ISO and JIS keyboard layouts for ADB to USB emulation

The layout is configurable using sysctl machdep.adbkbdX.emulate_usb:
0 = no emulation
1 = ANSI
2 = ISO (new with this change)
3 = JIS (new with this change)

Default value is detected using the ADB keyboard handler id. JIS
default is disabled until it is tested.


To generate a diff of this commit:
cvs rdiff -u -r1.32 -r1.33 src/sys/dev/adb/adb_kbd.c
cvs rdiff -u -r1.9 -r1.10 src/sys/dev/adb/adb_keymap.h
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/adb/adb_usb_map.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/adb/adb_kbd.c
diff -u src/sys/dev/adb/adb_kbd.c:1.32 src/sys/dev/adb/adb_kbd.c:1.33
--- src/sys/dev/adb/adb_kbd.c:1.32	Sat Aug  7 16:19:09 2021
+++ src/sys/dev/adb/adb_kbd.c	Sat May 14 01:16:55 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: adb_kbd.c,v 1.32 2021/08/07 16:19:09 thorpej Exp $	*/
+/*	$NetBSD: adb_kbd.c,v 1.33 2022/05/14 01:16:55 manu Exp $	*/
 
 /*
  * Copyright (C) 1998	Colin Wood
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: adb_kbd.c,v 1.32 2021/08/07 16:19:09 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: adb_kbd.c,v 1.33 2022/05/14 01:16:55 manu Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -93,7 +93,7 @@ struct adbkbd_softc {
 #ifdef WSDISPLAY_COMPAT_RAWKBD
 	int sc_rawkbd;
 #endif
-	bool sc_emul_usb;
+	int sc_emul_usb;
 	bool sc_power_dbg;
 
 	uint32_t sc_power;
@@ -235,7 +235,7 @@ adbkbd_attach(device_t parent, device_t 
 	 */
 	sc->sc_power = 0xffff;
 	sc->sc_timestamp = 0;
-	sc->sc_emul_usb = FALSE;
+	sc->sc_emul_usb = ADB_EMUL_USB_NONE;
 #ifdef ADBKBD_POWER_DDB
 	sc->sc_power_dbg = TRUE;
 #else
@@ -386,8 +386,56 @@ adbkbd_attach(device_t parent, device_t 
 	sc->sc_wskbddev = config_found(self, &a, wskbddevprint,
 	    CFARGS(.iattr = "wskbddev"));
 #ifdef ADBKBD_EMUL_USB
-	sc->sc_emul_usb = TRUE;
-	wskbd_set_evtrans(sc->sc_wskbddev, adb_to_usb, 128);
+	/* Values from Linux's drivers/macintosh/adbhud.c */
+        switch (sc->sc_adbdev->handler_id) {
+	case ADB_ISOKBD:	/* FALLTHROUGH */
+	case ADB_EXTISOKBD:	/* FALLTHROUGH */
+	case 0x07:		/* FALLTHROUGH */
+	case ADB_ISOKBDII:	/* FALLTHROUGH */
+	case ADB_PBISOKBD:	/* FALLTHROUGH */
+	case ADB_ADJISOKBD:	/* FALLTHROUGH */
+	case ADB_PBEXTISOKBD:	/* FALLTHROUGH */
+	case 0x19:		/* FALLTHROUGH */
+	case 0x1d:		/* FALLTHROUGH */
+	case 0xc1:		/* FALLTHROUGH */
+	case ADB_IBOOKKBD:	/* FALLTHROUGH */
+	case 0xc7:
+		sc->sc_emul_usb = ADB_EMUL_USB_ISO;
+		wskbd_set_evtrans(sc->sc_wskbddev, adb_to_usb_iso, 128);
+		break;
+#ifdef notyet
+	case ADB_ADJJAPKBD:	/* FALLTHROUGH */
+	case ADB_PBEXTJAPKBD:	/* FALLTHROUGH */
+	case ADB_JPKBDII:	/* FALLTHROUGH */
+	case 0x17:		/* FALLTHROUGH */
+	case 0x1a:		/* FALLTHROUGH */
+	case ADB_PBJPKBD:	/* FALLTHROUGH */
+	case 0xc2:		/* FALLTHROUGH */
+	case 0xc5:		/* FALLTHROUGH */
+	case 0xc8:		/* FALLTHROUGH */
+	case 0xc9:
+		sc->sc_emul_usb = ADB_EMUL_USB_JIS;
+		wskbd_set_evtrans(sc->sc_wskbddev, adb_to_usb_jis, 128);
+		break;
+#endif
+	case ADB_STDKBD:	/* FALLTHROUGH */
+	case ADB_EXTKBD:	/* FALLTHROUGH */
+	case 0x03:		/* FALLTHROUGH */
+	case 0x06:		/* FALLTHROUGH */
+	case ADB_KBDII:		/* FALLTHROUGH */
+	case ADB_PBKBD:		/* FALLTHROUGH */
+	case ADB_ADJKBD:	/* FALLTHROUGH */
+	case ADB_PBEXTKBD:	/* FALLTHROUGH */
+	case ADB_DESIGNKBD:	/* FALLTHROUGH */
+	case 0x1c:		/* FALLTHROUGH */
+	case 0xc0:		/* FALLTHROUGH */
+	case ADB_PBG3KBD:	/* FALLTHROUGH */
+	case 0xc6:		/* FALLTHROUGH */
+	default:	/* default to ANSI for unknown values */
+		sc->sc_emul_usb = ADB_EMUL_USB_ANSI;
+		wskbd_set_evtrans(sc->sc_wskbddev, adb_to_usb_ansi, 128);
+		break;
+	}
 #endif /* ADBKBD_EMUL_USB */
 
 #if NWSMOUSE > 0
@@ -633,7 +681,7 @@ adbkbd_ioctl(void *v, u_long cmd, void *
 	switch (cmd) {
 
 	case WSKBDIO_GTYPE:
-		if (sc->sc_emul_usb) {
+		if (sc->sc_emul_usb != ADB_EMUL_USB_NONE) {
 			*(int *)data = WSKBD_TYPE_USB;
 		} else {
 			*(int *)data = WSKBD_TYPE_ADB;
@@ -798,7 +846,7 @@ adbkbd_sysctl_usb(SYSCTLFN_ARGS)
 	struct sysctlnode node = *rnode;
 	struct adbkbd_softc *sc=(struct adbkbd_softc *)node.sysctl_data;
 	const int *np = newp;
-	bool reg;
+	int reg;
 
 	DPRINTF("%s\n", __func__);
 	reg = sc->sc_emul_usb;
@@ -807,12 +855,26 @@ adbkbd_sysctl_usb(SYSCTLFN_ARGS)
 		node.sysctl_data = &reg;
 		if (sysctl_lookup(SYSCTLFN_CALL(&node)) == 0) {
 			
-			sc->sc_emul_usb = *(bool *)node.sysctl_data;
-			if (sc->sc_emul_usb) {
-				wskbd_set_evtrans(sc->sc_wskbddev,
-				    adb_to_usb, 128);
-			} else {
+			sc->sc_emul_usb = *(int *)node.sysctl_data;
+			switch (sc->sc_emul_usb) {
+			case ADB_EMUL_USB_NONE:
 				wskbd_set_evtrans(sc->sc_wskbddev, NULL, 0);
+				break;
+			case ADB_EMUL_USB_ANSI:
+				wskbd_set_evtrans(sc->sc_wskbddev,
+				    adb_to_usb_ansi, 128);
+				break;
+			case ADB_EMUL_USB_ISO:
+				wskbd_set_evtrans(sc->sc_wskbddev,
+				    adb_to_usb_iso, 128);
+				break;
+			case ADB_EMUL_USB_JIS:
+				wskbd_set_evtrans(sc->sc_wskbddev,
+				    adb_to_usb_jis, 128);
+				break;
+			default:
+				return EINVAL;
+				break;
 			}
 			return 0;
 		}
@@ -865,7 +927,7 @@ adbkbd_setup_sysctl(struct adbkbd_softc 
 	ret = sysctl_createv(NULL, 0, NULL,
 	    (void *)&node, 
 	    CTLFLAG_READWRITE | CTLFLAG_OWNDESC,
-	    CTLTYPE_BOOL, "emulate_usb", "USB keyboard emulation", 
+	    CTLTYPE_INT, "emulate_usb", "USB keyboard emulation", 
 	    adbkbd_sysctl_usb, 1, (void *)sc, 0, CTL_MACHDEP, 
 	    me->sysctl_num, CTL_CREATE, CTL_EOL);
 	ret = sysctl_createv(NULL, 0, NULL,

Index: src/sys/dev/adb/adb_keymap.h
diff -u src/sys/dev/adb/adb_keymap.h:1.9 src/sys/dev/adb/adb_keymap.h:1.10
--- src/sys/dev/adb/adb_keymap.h:1.9	Wed Apr  6 17:14:42 2022
+++ src/sys/dev/adb/adb_keymap.h	Sat May 14 01:16:55 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: adb_keymap.h,v 1.9 2022/04/06 17:14:42 macallan Exp $	*/
+/*	$NetBSD: adb_keymap.h,v 1.10 2022/05/14 01:16:55 manu Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -492,4 +492,11 @@ static const struct wscons_keydesc akbd_
 #undef KBD_MAP
 #undef KC
 
-extern keysym_t adb_to_usb[];
+#define ADB_EMUL_USB_NONE	0
+#define ADB_EMUL_USB_ANSI	1
+#define ADB_EMUL_USB_ISO	2 
+#define ADB_EMUL_USB_JIS	3
+
+extern keysym_t adb_to_usb_ansi[];
+extern keysym_t adb_to_usb_iso[];
+extern keysym_t adb_to_usb_jis[];

Index: src/sys/dev/adb/adb_usb_map.c
diff -u src/sys/dev/adb/adb_usb_map.c:1.2 src/sys/dev/adb/adb_usb_map.c:1.3
--- src/sys/dev/adb/adb_usb_map.c:1.2	Sat Nov  8 16:52:35 2014
+++ src/sys/dev/adb/adb_usb_map.c	Sat May 14 01:16:55 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: adb_usb_map.c,v 1.2 2014/11/08 16:52:35 macallan Exp $ */
+/*	$NetBSD: adb_usb_map.c,v 1.3 2022/05/14 01:16:55 manu Exp $ */
 
 /*-
  * Copyright (c) 2006 Michael Lorenz
@@ -27,14 +27,38 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: adb_usb_map.c,v 1.2 2014/11/08 16:52:35 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: adb_usb_map.c,v 1.3 2022/05/14 01:16:55 manu Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
 
 #include <dev/wscons/wsksymvar.h>
 
-keysym_t adb_to_usb[] = {
+/*
+ * Explanation of the differences between ANSI, ISO and JIS:
+ * https://github.com/tmk/tmk_keyboard/blob/master/converter/adb_usb/matrix.c
+ * Summary:
+ *   ADB scan code        USB scan code
+ *   ANSI    ISO    JIS    ANSI        ISO         JIS
+ *     50     10     50   GRAVE/53  GRAVE/53  GRAVE/53
+ *   ----     50   ----    ----     NUBS/100      ----
+ *     42    112     42   BSLS/49   NUHS/50    NUHS/50
+ *   ----   ----     93    ----       ----     JPY/137
+ *   ----   ----     94    ----       ----      RO/135
+ *
+ * With:
+ *  NUBS = Non-US Backslash
+ *  NUHS = Non-US Hash
+ *  BSLS = Backslash
+ *  JPY  = Japaneese Yen
+ *  RO   = ?
+ *
+ * ANSI backslash should be USB scancode 49 but is 50 in the 
+ * array below. For most encoding in sys/dev/hid/hidkbdmap.c
+ * (all used for ADB?), 49 and 50 have the same definition. 
+ */
+
+keysym_t adb_to_usb_ansi[] = {
 /*   0, KS_a 		*/		4,
 /*   1, KS_s 		*/		22,
 /*   2, KS_d 		*/		7,
@@ -77,7 +101,7 @@ keysym_t adb_to_usb[] = {
 /*  39, KS_apostrophe	*/		52,
 /*  40, KS_k		*/		14,
 /*  41, KS_semicolon	*/		51,
-/*  42, KS_backslash	*/		50,
+/*  42, KS_backslash	*/		50, /* Should be 49 */
 /*  43, KS_comma	*/		54,
 /*  44, KS_slash	*/		56,
 /*  45, KS_n		*/		17,
@@ -164,3 +188,266 @@ keysym_t adb_to_usb[] = {
 /* 126			*/		0,
 /* 127, KS_Cmd_Debugger	*/		102
 };
+
+keysym_t adb_to_usb_iso[] = {
+/*   0, KS_a 		*/		4,
+/*   1, KS_s 		*/		22,
+/*   2, KS_d 		*/		7,
+/*   3, KS_f 		*/		9,
+/*   4, KS_h 		*/		11,
+/*   5, KS_g 		*/		10,
+/*   6, KS_z 		*/		29,
+/*   7, KS_x 		*/		27,
+/*   8, KS_c 		*/		6,
+/*   9, KS_v		*/		25,
+/*  10, KS_paragraph	*/		53,
+/*  11, KS_b		*/		5,
+/*  12, KS_q		*/		20,
+/*  13, KS_w		*/		26,
+/*  14, KS_e		*/		8,
+/*  15, KS_r		*/		21,
+/*  16, KS_y		*/		28,
+/*  17, KS_t		*/		23,
+/*  18, KS_1		*/		30,
+/*  19, KS_2		*/		31,
+/*  20, KS_3		*/		32,
+/*  21, KS_4		*/		33,
+/*  22, KS_6		*/		35,
+/*  23, KS_5		*/		34,
+/*  24, KS_equal	*/		46,
+/*  25, KS_9		*/		38,
+/*  26, KS_7		*/		36,
+/*  27, KS_minus	*/		45,
+/*  28, KS_8		*/		37,
+/*  29, KS_0		*/		39,
+/*  30, KS_bracketright	*/		48,
+/*  31, KS_o		*/		18,
+/*  32, KS_u		*/		24,
+/*  33, KS_bracketleft	*/		47,
+/*  34, KS_i		*/		12,
+/*  35, KS_p		*/		19,
+/*  36, KS_Return	*/		40,
+/*  37, KS_l		*/		15,
+/*  38, KS_j		*/		13,
+/*  39, KS_apostrophe	*/		52,
+/*  40, KS_k		*/		14,
+/*  41, KS_semicolon	*/		51,
+/*  42, KS_backslash	*/		50,
+/*  43, KS_comma	*/		54,
+/*  44, KS_slash	*/		56,
+/*  45, KS_n		*/		17,
+/*  46, KS_m		*/		16,
+/*  47, KS_period	*/		55,
+/*  48, KS_Tab		*/		43,
+/*  49, KS_space	*/		44,
+/*  50, KS_grave	*/		100,
+/*  51, KS_Delete	*/		42,
+/*  52, KS_KP_Enter	*/		88,
+/*  53, KS_Escape	*/		41,
+/*  54, KS_Control_L	*/		224,
+/*  55, KS_Cmd		*/		227,	/* left meta */
+/*  56, KS_Shift_L	*/		225,
+/*  57, KS_Caps_Lock	*/		57,
+/*  58, KS_Option	*/		226,
+/*  59, KS_Left		*/		80,
+/*  60, KS_Right	*/		79,
+/*  61, KS_Down		*/		81,
+/*  62, KS_Up		*/		82,
+/*  63			*/		0,
+/*  64			*/		0,
+/*  65, KS_KP_Decimal	*/		99,
+/*  66			*/		0,
+/*  67, KS_KP_Multiply	*/		85,
+/*  68			*/		0,
+/*  69, KS_KP_Add	*/		87,
+/*  70			*/		0,
+/*  71, KS_Num_Lock	*/		83,
+/*  72			*/		0,
+/*  73			*/		0,
+/*  74			*/		0,
+/*  75, KS_KP_Divide	*/		84,
+/*  76, KS_KP_Enter	*/		88,
+/*  77			*/		0,
+/*  78, KS_KP_Subtract	*/		86,
+/*  79			*/		0,
+/*  80			*/		0,
+/*  81, KS_KP_Equal	*/		46,	/* no KP_EQUAL on USB? */
+/*  82, KS_KP_Insert, 0	*/		98,
+/*  83, KS_KP_End,    1	*/		89,
+/*  84, KS_KP_Down,   2	*/		90,
+/*  85, KS_KP_Next,   3	*/		91,
+/*  86, KS_KP_Left,   4	*/		92,
+/*  87, KS_KP_Begin   5	*/		93,
+/*  88, KS_KP_Right   6	*/		94,
+/*  89, KS_KP_Home    7	*/		95,
+/*  90			*/		0,
+/*  91, KS_KP_Up      8	*/		96,
+/*  92, KS_KP_Prior   9	*/		97,
+/*  93, KS_backslash	*/		100,
+/*  94, KS_underscore	*/		45,
+/*  95, KS_KP_Delete  . */		99,
+/*  96, KS_f5		*/		62,
+/*  97, KS_f6		*/		63,
+/*  98, KS_f7		*/		64,
+/*  99, KS_f3		*/		60,
+/* 100, KS_f8		*/		65,
+/* 101, KS_f9		*/		66,
+/* 102			*/		0,
+/* 103, KS_f11		*/		68,
+/* 104			*/		0,
+/* 105, KS_Print_Screen	*/		70,
+/* 106, KS_KP_Enter	*/		88,
+/* 107, KS_Hold_Screen	*/		71,
+/* 108			*/		0,
+/* 109, KS_f10		*/		67,
+/* 110			*/		0,
+/* 111, KS_f12		*/		69,
+/* 112			*/		0,
+/* 113, KS_Pause	*/		72,
+/* 114, KS_Insert	*/		73,
+/* 115, KS_Home		*/		74,
+/* 116, KS_Prior	*/		75,
+/* 117, KS_BackSpace	*/		76,
+/* 118, KS_f4		*/		61,
+/* 119, KS_End		*/		77,
+/* 120, KS_f2		*/		59,
+/* 121, KS_Next		*/		78,
+/* 122, KS_f1		*/		58,
+/* 123, KS_Shift_R	*/		229,
+/* 124, KS_Alt_R	*/		230,
+/* 125, KS_Control_R	*/		228,
+/* 126			*/		0,
+/* 127, KS_Cmd_Debugger	*/		102
+};
+
+keysym_t adb_to_usb_jis[] = { /* XXX not updated from ansi yet */
+/*   0, KS_a 		*/		4,
+/*   1, KS_s 		*/		22,
+/*   2, KS_d 		*/		7,
+/*   3, KS_f 		*/		9,
+/*   4, KS_h 		*/		11,
+/*   5, KS_g 		*/		10,
+/*   6, KS_z 		*/		29,
+/*   7, KS_x 		*/		27,
+/*   8, KS_c 		*/		6,
+/*   9, KS_v		*/		25,
+/*  10, KS_paragraph	*/		53,
+/*  11, KS_b		*/		5,
+/*  12, KS_q		*/		20,
+/*  13, KS_w		*/		26,
+/*  14, KS_e		*/		8,
+/*  15, KS_r		*/		21,
+/*  16, KS_y		*/		28,
+/*  17, KS_t		*/		23,
+/*  18, KS_1		*/		30,
+/*  19, KS_2		*/		31,
+/*  20, KS_3		*/		32,
+/*  21, KS_4		*/		33,
+/*  22, KS_6		*/		35,
+/*  23, KS_5		*/		34,
+/*  24, KS_equal	*/		46,
+/*  25, KS_9		*/		38,
+/*  26, KS_7		*/		36,
+/*  27, KS_minus	*/		45,
+/*  28, KS_8		*/		37,
+/*  29, KS_0		*/		39,
+/*  30, KS_bracketright	*/		48,
+/*  31, KS_o		*/		18,
+/*  32, KS_u		*/		24,
+/*  33, KS_bracketleft	*/		47,
+/*  34, KS_i		*/		12,
+/*  35, KS_p		*/		19,
+/*  36, KS_Return	*/		40,
+/*  37, KS_l		*/		15,
+/*  38, KS_j		*/		13,
+/*  39, KS_apostrophe	*/		52,
+/*  40, KS_k		*/		14,
+/*  41, KS_semicolon	*/		51,
+/*  42, KS_backslash	*/		50,
+/*  43, KS_comma	*/		54,
+/*  44, KS_slash	*/		56,
+/*  45, KS_n		*/		17,
+/*  46, KS_m		*/		16,
+/*  47, KS_period	*/		55,
+/*  48, KS_Tab		*/		43,
+/*  49, KS_space	*/		44,
+/*  50, KS_grave	*/		53,
+/*  51, KS_Delete	*/		42,
+/*  52, KS_KP_Enter	*/		88,
+/*  53, KS_Escape	*/		41,
+/*  54, KS_Control_L	*/		224,
+/*  55, KS_Cmd		*/		227,	/* left meta */
+/*  56, KS_Shift_L	*/		225,
+/*  57, KS_Caps_Lock	*/		57,
+/*  58, KS_Option	*/		226,
+/*  59, KS_Left		*/		80,
+/*  60, KS_Right	*/		79,
+/*  61, KS_Down		*/		81,
+/*  62, KS_Up		*/		82,
+/*  63			*/		0,
+/*  64			*/		0,
+/*  65, KS_KP_Decimal	*/		99,
+/*  66			*/		0,
+/*  67, KS_KP_Multiply	*/		85,
+/*  68			*/		0,
+/*  69, KS_KP_Add	*/		87,
+/*  70			*/		0,
+/*  71, KS_Num_Lock	*/		83,
+/*  72			*/		0,
+/*  73			*/		0,
+/*  74			*/		0,
+/*  75, KS_KP_Divide	*/		84,
+/*  76, KS_KP_Enter	*/		88,
+/*  77			*/		0,
+/*  78, KS_KP_Subtract	*/		86,
+/*  79			*/		0,
+/*  80			*/		0,
+/*  81, KS_KP_Equal	*/		46,	/* no KP_EQUAL on USB? */
+/*  82, KS_KP_Insert, 0	*/		98,
+/*  83, KS_KP_End,    1	*/		89,
+/*  84, KS_KP_Down,   2	*/		90,
+/*  85, KS_KP_Next,   3	*/		91,
+/*  86, KS_KP_Left,   4	*/		92,
+/*  87, KS_KP_Begin   5	*/		93,
+/*  88, KS_KP_Right   6	*/		94,
+/*  89, KS_KP_Home    7	*/		95,
+/*  90			*/		0,
+/*  91, KS_KP_Up      8	*/		96,
+/*  92, KS_KP_Prior   9	*/		97,
+/*  93, KS_backslash	*/		137,	/* JPY */
+/*  94, KS_underscore	*/		135,	/* RO */
+/*  95, KS_KP_Delete  . */		99,
+/*  96, KS_f5		*/		62,
+/*  97, KS_f6		*/		63,
+/*  98, KS_f7		*/		64,
+/*  99, KS_f3		*/		60,
+/* 100, KS_f8		*/		65,
+/* 101, KS_f9		*/		66,
+/* 102			*/		0,
+/* 103, KS_f11		*/		68,
+/* 104			*/		0,
+/* 105, KS_Print_Screen	*/		70,
+/* 106, KS_KP_Enter	*/		88,
+/* 107, KS_Hold_Screen	*/		71,
+/* 108			*/		0,
+/* 109, KS_f10		*/		67,
+/* 110			*/		0,
+/* 111, KS_f12		*/		69,
+/* 112			*/		0,
+/* 113, KS_Pause	*/		72,
+/* 114, KS_Insert	*/		73,
+/* 115, KS_Home		*/		74,
+/* 116, KS_Prior	*/		75,
+/* 117, KS_BackSpace	*/		76,
+/* 118, KS_f4		*/		61,
+/* 119, KS_End		*/		77,
+/* 120, KS_f2		*/		59,
+/* 121, KS_Next		*/		78,
+/* 122, KS_f1		*/		58,
+/* 123, KS_Shift_R	*/		229,
+/* 124, KS_Alt_R	*/		230,
+/* 125, KS_Control_R	*/		228,
+/* 126			*/		0,
+/* 127, KS_Cmd_Debugger	*/		102
+};
+

Reply via email to