Subject: Keymap import from OpenBSD
To: None <tech-kern@NetBSD.org>
From: Rui Paulo <rpaulo@NetBSD.org>
List: tech-kern
Date: 07/01/2005 01:45:03
Hi
I'm trying to add more keymaps to NetBSD by importing them from OpenBSD.
The following patch adds the keymaps present in OpenBSD but not already
in NetBSD, although I need people with the actual keyboards to test it.

Also, the OpenBSD team developed an awk script to convert PS/2 keymaps
into USB keymaps. I don't know how good it is, but I guess we should do
something similar, no?

I'm not including wscons.conf and wsconsctl(8) man page diffs.

Index: dev/wscons/wsksymdef.h
===================================================================
RCS file: /cvsroot/src/sys/dev/wscons/wsksymdef.h,v
retrieving revision 1.54
diff -u -r1.54 wsksymdef.h
--- dev/wscons/wsksymdef.h	8 Jun 2005 09:11:09 -0000	1.54
+++ dev/wscons/wsksymdef.h	1 Jul 2005 00:42:13 -0000
@@ -276,6 +276,191 @@
 #define	KS_dead_cedilla 	0x0327
 
 /*
+ * Group Cyrillic (koi8-r)
+ */
+
+#define KS_Cyrillic_A		0xe1
+#define KS_Cyrillic_BE		0xe2
+#define KS_Cyrillic_VE		0xf7
+#define KS_Cyrillic_GE		0xe7
+#define KS_Cyrillic_DE		0xe4
+#define KS_Cyrillic_IE		0xe5
+#define KS_Cyrillic_YO		0xb3
+#define KS_Cyrillic_ZHE		0xf6
+#define KS_Cyrillic_ZE		0xfa
+#define KS_Cyrillic_I		0xe9
+#define KS_Cyrillic_ISHORT	0xea
+#define KS_Cyrillic_IUKR	0xb6
+#define KS_Cyrillic_YI		0xb7
+#define KS_Cyrillic_KA		0xeb
+#define KS_Cyrillic_EL		0xec
+#define KS_Cyrillic_EM		0xed
+#define KS_Cyrillic_EN		0xee
+#define KS_Cyrillic_O		0xef
+#define KS_Cyrillic_PE		0xf0
+#define KS_Cyrillic_ER		0xf2
+#define KS_Cyrillic_ES		0xf3
+#define KS_Cyrillic_TE		0xf4
+#define KS_Cyrillic_U		0xf5
+#define KS_Cyrillic_EF		0xe6
+#define KS_Cyrillic_HA		0xe8
+#define KS_Cyrillic_TSE		0xe3
+#define KS_Cyrillic_CHE		0xfe
+#define KS_Cyrillic_SHA		0xfb
+#define KS_Cyrillic_SCHA	0xfd
+#define KS_Cyrillic_HSIGHN	0xff
+#define KS_Cyrillic_YERU	0xf9
+#define KS_Cyrillic_SSIGHN	0xf8
+#define KS_Cyrillic_E		0xfc
+#define KS_Cyrillic_YU		0xe0
+#define KS_Cyrillic_YA		0xf1
+#define KS_Cyrillic_a		0xc1
+#define KS_Cyrillic_be		0xc2
+#define KS_Cyrillic_ve		0xd7
+#define KS_Cyrillic_ge		0xc7
+#define KS_Cyrillic_de		0xc4
+#define KS_Cyrillic_ie		0xc5
+#define KS_Cyrillic_yo		0xa3
+#define KS_Cyrillic_zhe		0xd6
+#define KS_Cyrillic_ze		0xda
+#define KS_Cyrillic_i		0xc9
+#define KS_Cyrillic_ishort	0xca
+#define KS_Cyrillic_iukr	0xa6
+#define KS_Cyrillic_yi		0xa7
+#define KS_Cyrillic_ka		0xcb
+#define KS_Cyrillic_el		0xcc
+#define KS_Cyrillic_em		0xcd
+#define KS_Cyrillic_en		0xce
+#define KS_Cyrillic_o		0xcf
+#define KS_Cyrillic_pe		0xd0
+#define KS_Cyrillic_er		0xd2
+#define KS_Cyrillic_es		0xd3
+#define KS_Cyrillic_te		0xd4
+#define KS_Cyrillic_u		0xd5
+#define KS_Cyrillic_ef		0xc6
+#define KS_Cyrillic_ha		0xc8
+#define KS_Cyrillic_tse		0xc3
+#define KS_Cyrillic_che		0xde
+#define KS_Cyrillic_sha		0xdb
+#define KS_Cyrillic_scha	0xdd
+#define KS_Cyrillic_hsighn	0xdf
+#define KS_Cyrillic_yeru	0xd9
+#define KS_Cyrillic_ssighn	0xd8
+#define KS_Cyrillic_e		0xdc
+#define KS_Cyrillic_yu		0xc0
+#define KS_Cyrillic_ya		0xd1
+#define KS_Cyrillic_gheukr	0xad
+#define KS_Cyrillic_GHEUKR	0xbd
+#define KS_Cyrillic_yeukr	0xa4
+#define KS_Cyrillic_YEUKR	0xb4
+
+/*
+ * Group Latin-2 (iso8859-2)
+ */
+
+#define KS_L2_Aogonek		0xa1
+#define KS_L2_breve		0xa2
+#define KS_L2_Lstroke		0xa3
+#define KS_L2_Sacute		0xa6
+#define KS_L2_Scaron		0xa9
+#define KS_L2_Zacute		0xac
+#define KS_L2_Zcaron		0xae
+#define KS_L2_Zdotabove		0xaf
+#define KS_L2_aogonek		0xb1
+#define KS_L2_ogonek		0xb2
+#define KS_L2_lstroke		0xb3
+#define KS_L2_sacute		0xb6
+#define KS_L2_caron		0xb7
+#define KS_L2_scaron		0xb9
+#define KS_L2_zacute		0xbc
+#define KS_L2_dblacute		0xbd
+#define KS_L2_zcaron		0xbe
+#define KS_L2_zdotabove		0xbf
+#define KS_L2_Cacute		0xc6
+#define KS_L2_Ccaron		0xc8
+#define KS_L2_Eogonek		0xca
+#define KS_L2_Dstroke		0xd0
+#define KS_L2_Nacute		0xd1
+#define KS_L2_cacute		0xe6
+#define KS_L2_ccaron		0xe8
+#define KS_L2_eogonek		0xea
+#define KS_L2_dstroke		0xf0
+#define KS_L2_nacute		0xf1
+#define KS_L2_dotabove		0xff
+
+/*
+ * Group Latin-5 (iso8859-9)
+ */
+
+#define KS_L5_Gbreve		0xd0
+#define KS_L5_Idotabove		0xdd
+#define KS_L5_Scedilla		0xde
+#define KS_L5_gbreve		0xf0
+#define KS_L5_idotless		0xfd
+#define KS_L5_scedilla		0xfe
+
+/*
+ * Group Latin-7 (iso8859-13)
+ */
+
+#define KS_L7_rightdblquot	0xa1
+#define KS_L7_dbllow9quot	0xa5
+#define KS_L7_Ostroke		0xa8
+#define KS_L7_Rcedilla		0xaa
+#define KS_L7_AE		0xaf
+#define KS_L7_leftdblquot	0xb4
+#define KS_L7_ostroke		0xb8
+#define KS_L7_rcedilla		0xba
+#define KS_L7_ae		0xbf
+#define KS_L7_Aogonek		0xc0
+#define KS_L7_Iogonek		0xc1
+#define KS_L7_Amacron		0xc2
+#define KS_L7_Cacute		0xc3
+#define KS_L7_Eogonek		0xc6
+#define KS_L7_Emacron		0xc7
+#define KS_L7_Ccaron		0xc8
+#define KS_L7_Zacute		0xca
+#define KS_L7_Edot		0xcb
+#define KS_L7_Gcedilla		0xcc
+#define KS_L7_Kcedilla		0xcd
+#define KS_L7_Imacron		0xce
+#define KS_L7_Lcedilla		0xcf
+#define KS_L7_Scaron		0xd0
+#define KS_L7_Nacute		0xd1
+#define KS_L7_Ncedilla		0xd2
+#define KS_L7_Omacron		0xd4
+#define KS_L7_Uogonek		0xd8
+#define KS_L7_Lstroke		0xd9
+#define KS_L7_Sacute		0xda
+#define KS_L7_Umacron		0xdb
+#define KS_L7_Zdot		0xdd
+#define KS_L7_Zcaron		0xde
+#define KS_L7_aogonek		0xe0
+#define KS_L7_iogonek		0xe1
+#define KS_L7_amacron		0xe2
+#define KS_L7_cacute		0xe3
+#define KS_L7_eogonek		0xe6
+#define KS_L7_emacron		0xe7
+#define KS_L7_ccaron		0xe8
+#define KS_L7_zacute		0xea
+#define KS_L7_edot		0xeb
+#define KS_L7_gcedilla		0xec
+#define KS_L7_kcedilla		0xed
+#define KS_L7_imacron		0xee
+#define KS_L7_lcedilla		0xef
+#define KS_L7_scaron		0xf0
+#define KS_L7_nacute		0xf1
+#define KS_L7_ncedilla		0xf2
+#define KS_L7_omacron		0xf4
+#define KS_L7_uogonek		0xf8
+#define KS_L7_lstroke		0xf9
+#define KS_L7_sacute		0xfa
+#define KS_L7_umacron		0xfb
+#define KS_L7_zdot		0xfd
+#define KS_L7_zcaron		0xfe
+#define KS_L7_rightsnglquot	0xff
+
+/*
  * Group 1 (modifiers)
  */
 
@@ -507,21 +692,28 @@
 action(KB_US,	0,	0x0200,	"us",	,	"US-English")	\
 action(KB_UK,	0,	0x0700,	"uk",	,	"UK-English")	\
 action(KB_BE,	0,	0x1300,	"be",	,	"Belgian")	\
+action(KB_BR,   0,      0x1500, "br",   ,       "Brazilian")    \
 action(KB_DK,	0,	0x0400,	"dk",	,	"Danish")	\
+action(KB_NL,	0,	0x1600, "nl",	,	"Dutch")	\
 action(KB_FI,	0,	0x0900,	"fi",	,	"Finnish")	\
 action(KB_FR,	0,	0x0600,	"fr",	,	"French")	\
 action(KB_DE, KB_NODEAD,0x0300,	"de",".nodead",	"German")	\
 action(KB_HU,	0,	0x0c00,	"hu",	,	"Hungarian")	\
 action(KB_IT,	0,	0x0500,	"it",	,	"Italian")	\
+action(KB_LA,	0,	0x1400, "la",	,	"Lao")		\
+action(KB_LT,	0,	0x1300, "lt",	,	"Lithuanian")	\
 action(KB_JP,	0,	0x0800,	"jp",	,	"Japanese")	\
 action(KB_NO,	0,	0x0a00,	"no",	,	"Norwegian")	\
 action(KB_PL,	0,	0x0d00,	"pl",	,	"Polish")	\
 action(KB_PT,	0,	0x1100,	"pt",	,	"Portugese")	\
 action(KB_RU,	0,	0x0e00,	"ru",	,	"Russian")	\
+action(KB_CF,	0,	0x1a00, "cf",	,	"Sangho")       \
+action(KB_SI,	0,	0x1900,	"si",	,	"Slovenian")	\
 action(KB_ES,	0,	0x0b00,	"es",	,	"Spanish")	\
 action(KB_SV,	0,	0x0900,	"sv",	,	"Swedish")	\
 action(KB_SF,	0,	0x1000,	"sf",	,	"Swiss French")	\
 action(KB_SG,	0,	0x0f00,	"sg",	,	"Swiss German")	\
+action(KB_TR,	0,	0x1700, "tr",	,	"Turkish")	\
 action(KB_UA,	0,	0x1200,	"ua",	,	"Ukrainian")
 #define KB_NONE 0x0000
 
Index: dev/pckbport/wskbdmap_mfii.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pckbport/wskbdmap_mfii.c,v
retrieving revision 1.9
diff -u -r1.9 wskbdmap_mfii.c
--- dev/pckbport/wskbdmap_mfii.c	5 May 2005 22:31:13 -0000	1.9
+++ dev/pckbport/wskbdmap_mfii.c	1 Jul 2005 00:42:13 -0000
@@ -413,6 +413,425 @@
     KC(184), KS_Mode_switch,	KS_Multi_key,
 };
 
+static const keysym_t pckbd_keydesc_be[] = {
+/*  pos	     normal		shifted		altgr		shift-altgr */
+    KC(2),   KS_ampersand,	KS_1,		KS_bar,
+    KC(3),   KS_eacute,		KS_2,		KS_at,
+    KC(4),   KS_quotedbl,	KS_3,		KS_numbersign,
+    KC(5),   KS_apostrophe,	KS_4,
+    KC(6),   KS_parenleft,	KS_5,
+    KC(7),   KS_section,	KS_6,		KS_asciicircum,
+    KC(8),   KS_egrave,		KS_7,
+    KC(9),   KS_exclam,		KS_8,
+    KC(10),  KS_ccedilla,	KS_9,		KS_braceleft,
+    KC(11),  KS_agrave,		KS_0,		KS_braceright,
+    KC(12),  KS_parenright,	KS_degree,
+    KC(13),  KS_minus,		KS_underscore,
+    KC(16),  KS_a,
+    KC(17),  KS_z,
+    KC(26),  KS_dead_circumflex, KS_dead_diaeresis, KS_bracketleft,
+    KC(27),  KS_dollar,		KS_asterisk,	KS_bracketright,
+    KC(30),  KS_q,
+    KC(39),  KS_m,
+    KC(40),  KS_ugrave,		KS_percent,	KS_acute,
+    KC(41),  KS_twosuperior,	KS_threesuperior,
+    KC(43),  KS_mu,		KS_sterling,	KS_grave,
+    KC(44),  KS_w,
+    KC(50),  KS_comma,		KS_question,
+    KC(51),  KS_semicolon,	KS_period,
+    KC(52),  KS_colon,		KS_slash,
+    KC(53),  KS_equal,		KS_plus,	KS_asciitilde,
+    KC(86),  KS_less,		KS_greater,	KS_backslash,
+    KC(184), KS_Mode_switch,	KS_Multi_key,
+};
+
+
+static const keysym_t pckbd_keydesc_ru[] = {
+/*  pos      normal		shifted		altgr		shift-altgr */
+    KC(7),   KS_6,		KS_asciicircum, KS_6,		KS_comma,
+    KC(8),   KS_7,		KS_ampersand,	KS_7,		KS_period,
+    KC(16),  KS_q,		KS_Q,		KS_Cyrillic_ishort,
+  KS_Cyrillic_ISHORT,
+    KC(17),  KS_w,		KS_W,		KS_Cyrillic_tse,
+  KS_Cyrillic_TSE,
+    KC(18),  KS_e,		KS_E,		KS_Cyrillic_u,	KS_Cyrillic_U,
+    KC(19),  KS_r,		KS_R,		KS_Cyrillic_ka, KS_Cyrillic_KA,
+    KC(20),  KS_t,		KS_T,		KS_Cyrillic_ie, KS_Cyrillic_IE,
+    KC(21),  KS_y,		KS_Y,		KS_Cyrillic_en, KS_Cyrillic_EN,
+    KC(22),  KS_u,		KS_U,		KS_Cyrillic_ge, KS_Cyrillic_GE,
+    KC(23),  KS_i,		KS_I,		KS_Cyrillic_sha,KS_Cyrillic_SHA,
+    KC(24),  KS_o,		KS_O,		KS_Cyrillic_scha,
+  KS_Cyrillic_SCHA,
+    KC(25),  KS_p,		KS_P,		KS_Cyrillic_ze,	KS_Cyrillic_ZE,
+    KC(26),  KS_bracketleft,	KS_braceleft,	KS_Cyrillic_ha,	KS_Cyrillic_HA,
+    KC(27),  KS_bracketright,	KS_braceright,	KS_Cyrillic_hsighn,
+  KS_Cyrillic_HSIGHN,
+    KC(30),  KS_a,		KS_A,		KS_Cyrillic_ef,	KS_Cyrillic_EF,
+    KC(31),  KS_s,		KS_S,		KS_Cyrillic_yeru,
+  KS_Cyrillic_YERU,
+    KC(32),  KS_d,		KS_D,		KS_Cyrillic_ve, KS_Cyrillic_VE,
+    KC(33),  KS_f,		KS_F,		KS_Cyrillic_a,	KS_Cyrillic_A,
+    KC(34),  KS_g,		KS_G,		KS_Cyrillic_pe,	KS_Cyrillic_PE,
+    KC(35),  KS_h,		KS_H,		KS_Cyrillic_er,	KS_Cyrillic_ER,
+    KC(36),  KS_j,		KS_J,		KS_Cyrillic_o,	KS_Cyrillic_O,
+    KC(37),  KS_k,		KS_K,		KS_Cyrillic_el, KS_Cyrillic_EL,
+    KC(38),  KS_l,		KS_L,		KS_Cyrillic_de,	KS_Cyrillic_DE,
+    KC(39),  KS_semicolon,	KS_colon,	KS_Cyrillic_zhe,KS_Cyrillic_ZHE,
+    KC(40),  KS_apostrophe,	KS_quotedbl,	KS_Cyrillic_e,	KS_Cyrillic_E,
+    KC(44),  KS_z,		KS_Z,		KS_Cyrillic_ya,	KS_Cyrillic_YA,
+    KC(45),  KS_x,		KS_X,		KS_Cyrillic_che,KS_Cyrillic_CHE,
+    KC(46),  KS_c,		KS_C,		KS_Cyrillic_es,	KS_Cyrillic_ES,
+    KC(47),  KS_v,		KS_V,		KS_Cyrillic_em,	KS_Cyrillic_EM,
+    KC(48),  KS_b,		KS_B,		KS_Cyrillic_i,	KS_Cyrillic_I,
+    KC(49),  KS_n,		KS_N,		KS_Cyrillic_te,	KS_Cyrillic_TE,
+    KC(50),  KS_m,		KS_M,		KS_Cyrillic_ssighn,
+  KS_Cyrillic_SSIGHN,
+    KC(51),  KS_comma,		KS_less,	KS_Cyrillic_be,	KS_Cyrillic_BE,
+    KC(52),  KS_period,		KS_greater,	KS_Cyrillic_yu,	KS_Cyrillic_YU,
+    KC(53),  KS_slash,		KS_question,	KS_Cyrillic_yo,	KS_Cyrillic_YO,
+    KC(184), KS_Mode_switch,	KS_Multi_key,
+};
+
+static const keysym_t pckbd_keydesc_ua[] = {
+/*  pos      normal		shifted		altgr		shift-altgr */
+    KC(7),   KS_6,		KS_asciicircum,	KS_6,		KS_comma,
+    KC(8),   KS_7,		KS_ampersand,	KS_7,		KS_period,
+    KC(12),  KS_minus,		KS_underscore,	KS_Cyrillic_iukr,
+  KS_Cyrillic_IUKR,
+    KC(13),  KS_equal,		KS_plus,	KS_Cyrillic_yeukr,
+  KS_Cyrillic_YEUKR,
+    KC(16),  KS_q,		KS_Q,		KS_Cyrillic_ishort,
+  KS_Cyrillic_ISHORT,
+    KC(17),  KS_w,		KS_W,		KS_Cyrillic_tse,KS_Cyrillic_TSE,
+    KC(18),  KS_e,		KS_E,		KS_Cyrillic_u,	KS_Cyrillic_U,
+    KC(19),  KS_r,		KS_R,		KS_Cyrillic_ka,	KS_Cyrillic_KA,
+    KC(20),  KS_t,		KS_T,		KS_Cyrillic_ie,	KS_Cyrillic_IE,
+    KC(21),  KS_y,		KS_Y,		KS_Cyrillic_en,	KS_Cyrillic_EN,
+    KC(22),  KS_u,		KS_U,		KS_Cyrillic_ge,	KS_Cyrillic_GE,
+    KC(23),  KS_i,		KS_I,		KS_Cyrillic_sha,KS_Cyrillic_SHA,
+    KC(24),  KS_o,		KS_O,		KS_Cyrillic_scha,
+  KS_Cyrillic_SCHA,
+    KC(25),  KS_p,		KS_P,		KS_Cyrillic_ze,	KS_Cyrillic_ZE,
+    KC(26),  KS_bracketleft,	KS_braceleft,	KS_Cyrillic_ha,	KS_Cyrillic_HA,
+    KC(27),  KS_bracketright,	KS_braceright,	KS_Cyrillic_hsighn,
+  KS_Cyrillic_HSIGHN,
+    KC(30),  KS_a,		KS_A,		KS_Cyrillic_ef,	KS_Cyrillic_EF,
+    KC(31),  KS_s,		KS_S,		KS_Cyrillic_yeru,
+  KS_Cyrillic_YERU,
+    KC(32),  KS_d,		KS_D,		KS_Cyrillic_ve,	KS_Cyrillic_VE,
+    KC(33),  KS_f,		KS_F,		KS_Cyrillic_a,	KS_Cyrillic_A,
+    KC(34),  KS_g,		KS_G,		KS_Cyrillic_pe,	KS_Cyrillic_PE,
+    KC(35),  KS_h,		KS_H,		KS_Cyrillic_er,	KS_Cyrillic_ER,
+    KC(36),  KS_j,		KS_J,		KS_Cyrillic_o,	KS_Cyrillic_O,
+    KC(37),  KS_k,		KS_K,		KS_Cyrillic_el,	KS_Cyrillic_EL,
+    KC(38),  KS_l,		KS_L,		KS_Cyrillic_de,	KS_Cyrillic_DE,
+    KC(39),  KS_semicolon,	KS_colon,	KS_Cyrillic_zhe,KS_Cyrillic_ZHE,
+    KC(40),  KS_apostrophe,	KS_quotedbl,	KS_Cyrillic_e,	KS_Cyrillic_E,
+    KC(41),  KS_grave,		KS_asciitilde,	KS_Cyrillic_gheukr,
+  KS_Cyrillic_GHEUKR,
+    KC(43),  KS_backslash,	KS_bar,		KS_Cyrillic_yi,	KS_Cyrillic_YI,
+    KC(44),  KS_z,		KS_Z,		KS_Cyrillic_ya,	KS_Cyrillic_YA,
+    KC(45),  KS_x,		KS_X,		KS_Cyrillic_che,KS_Cyrillic_CHE,
+    KC(46),  KS_c,		KS_C,		KS_Cyrillic_es,	KS_Cyrillic_ES,
+    KC(47),  KS_v,		KS_V,		KS_Cyrillic_em,	KS_Cyrillic_EM,
+    KC(48),  KS_b,		KS_B,		KS_Cyrillic_i,	KS_Cyrillic_I,
+    KC(49),  KS_n,		KS_N,		KS_Cyrillic_te,	KS_Cyrillic_TE,
+    KC(50),  KS_m,		KS_M,		KS_Cyrillic_ssighn,
+  KS_Cyrillic_SSIGHN,
+    KC(51),  KS_comma,		KS_less,	KS_Cyrillic_be,	KS_Cyrillic_BE,
+    KC(52),  KS_period,		KS_greater,	KS_Cyrillic_yu,	KS_Cyrillic_YU,
+    KC(53),  KS_slash,		KS_question,	KS_Cyrillic_yo,	KS_Cyrillic_YO,
+    KC(184), KS_Mode_switch,	KS_Multi_key,
+};
+
+static const keysym_t pckbd_keydesc_sg[] = {
+/*  pos      normal		shifted		altgr		shift-altgr */
+    KC(2),   KS_1,		KS_plus,	KS_bar,
+    KC(3),   KS_2,		KS_quotedbl,	KS_at,
+    KC(4),   KS_3,		KS_asterisk,	KS_numbersign,
+    KC(5),   KS_4,		KS_ccedilla,
+    KC(7),   KS_6,		KS_ampersand,	KS_notsign,
+    KC(8),   KS_7,		KS_slash,	KS_brokenbar,
+    KC(9),   KS_8,		KS_parenleft,	KS_cent,
+    KC(10),  KS_9,		KS_parenright,
+    KC(11),  KS_0,		KS_equal,
+    KC(12),  KS_apostrophe,	KS_question,	KS_dead_acute,
+    KC(13),  KS_dead_circumflex,KS_dead_grave,	KS_dead_tilde,
+    KC(18),  KS_e,		KS_E,		KS_currency,
+    KC(21),  KS_z,
+    KC(26),  KS_udiaeresis,	KS_egrave,	KS_bracketleft,
+    KC(27),  KS_dead_diaeresis,	KS_exclam,	KS_bracketright,
+    KC(39),  KS_odiaeresis,	KS_eacute,
+    KC(40),  KS_adiaeresis,	KS_agrave,	KS_braceleft,
+    KC(41),  KS_section,	KS_degree,	KS_dead_abovering,
+    KC(43),  KS_dollar,		KS_sterling,	KS_braceright,
+    KC(44),  KS_y,
+    KC(51),  KS_comma,		KS_semicolon,
+    KC(52),  KS_period,		KS_colon,
+    KC(53),  KS_minus,		KS_underscore,
+    KC(86),  KS_less,		KS_greater,	KS_backslash,
+    KC(184), KS_Mode_switch,	KS_Multi_key,
+};
+
+static const keysym_t pckbd_keydesc_sg_nodead[] = {
+/*  pos      normal		shifted		altgr		shift-altgr */
+    KC(12),  KS_apostrophe,	KS_question,	KS_acute,
+    KC(13),  KS_asciicircum,	KS_grave,	KS_asciitilde,
+    KC(27),  KS_diaeresis,	KS_exclam,	KS_bracketright
+};
+
+static const keysym_t pckbd_keydesc_sf[] = {
+/*  pos      normal		shifted		altgr		shift-altgr */
+    KC(26),  KS_egrave,		KS_udiaeresis,	KS_bracketleft,
+    KC(39),  KS_eacute,		KS_odiaeresis,
+    KC(40),  KS_agrave,		KS_adiaeresis,	KS_braceleft
+};
+
+static const keysym_t pckbd_keydesc_lt[] = {
+/*  pos      normal		shifted		altgr		shift-altgr */
+    KC(2),   KS_exclam,		KS_1,		KS_at,
+    KC(3),   KS_minus,		KS_2		,KS_underscore,
+    KC(4),   KS_slash,		KS_3,		KS_numbersign,
+    KC(5),   KS_semicolon,	KS_4,		KS_dollar,
+    KC(6),   KS_colon,		KS_5,		KS_paragraph,
+    KC(7),   KS_comma,		KS_6,		KS_asciicircum,
+    KC(8),   KS_period,		KS_7,		KS_ampersand,
+    KC(9),   KS_equal,		KS_8,		KS_asterisk,
+    KC(10),  KS_bracketleft,	KS_9,		KS_parenleft,
+    KC(11),  KS_bracketright,	KS_0,		KS_parenright,
+    KC(12),  KS_question,	KS_plus,	KS_apostrophe,
+    KC(13),  KS_x,		KS_X,		KS_percent,
+    KC(16),  KS_L7_aogonek,	KS_L7_Aogonek,
+    KC(17),  KS_L7_zcaron,	KS_L7_Zcaron,
+    KC(18),  KS_e,		KS_E,		KS_currency,
+    KC(26),  KS_L7_iogonek,	KS_L7_Iogonek,	KS_braceleft,
+    KC(27),  KS_w,		KS_W,		KS_braceright,
+    KC(33),  KS_L7_scaron,	KS_L7_Scaron,
+    KC(39),  KS_L7_uogonek,	KS_L7_Uogonek,
+    KC(40),  KS_L7_edot,	KS_L7_Edot,	KS_quotedbl,
+    KC(41),  KS_grave,		KS_asciitilde,
+    KC(43),  KS_q,		KS_Q,		KS_bar,
+    KC(45),  KS_L7_umacron,	KS_L7_Umacron,
+    KC(51),  KS_L7_ccaron,	KS_L7_Ccaron,	KS_L7_dbllow9quot,
+    KC(52),  KS_f,		KS_F,		KS_L7_leftdblquot,
+    KC(53),  KS_L7_eogonek,	KS_L7_Eogonek,	KS_backslash,
+    KC(57),  KS_space,		KS_space,	KS_nobreakspace,
+    KC(184), KS_Mode_switch,	KS_Multi_key,
+};
+
+static const keysym_t pckbd_keydesc_la[] = {
+/*  pos      normal		shifted		altgr		shift-altgr */
+    KC(2),   KS_1,		KS_exclam,
+    KC(3),   KS_2,		KS_quotedbl,
+    KC(4),   KS_3,		KS_numbersign,
+    KC(7),   KS_6,		KS_ampersand,
+    KC(8),   KS_7,		KS_slash,
+    KC(9),   KS_8,		KS_parenleft,
+    KC(10),  KS_9,		KS_parenright,
+    KC(11),  KS_0,		KS_equal,
+    KC(12),  KS_apostrophe,	KS_question,	KS_backslash,
+    KC(13),  KS_questiondown,	KS_exclamdown,
+    KC(16),  KS_q,		KS_Q,		KS_at,
+    KC(26),  KS_dead_acute,	KS_dead_diaeresis,
+    KC(27),  KS_plus,		KS_asterisk,	KS_asciitilde,
+    KC(39),  KS_ntilde,
+    KC(40),  KS_braceleft,	KS_bracketleft,	KS_dead_circumflex,
+    KC(41),  KS_bar,		KS_degree,	KS_notsign,
+    KC(43),  KS_braceright,	KS_bracketright,KS_dead_grave,
+    KC(51),  KS_comma,		KS_semicolon,
+    KC(52),  KS_period,		KS_colon,
+    KC(53),  KS_minus,		KS_underscore,
+    KC(86),  KS_less,		KS_greater,
+    KC(184), KS_Mode_switch,	KS_Multi_key,
+};
+
+static const keysym_t pckbd_keydesc_br[] = {
+/*  pos      normal		shifted		altgr		shift-altgr */
+    KC(2),   KS_1,		KS_exclam,	KS_onesuperior,
+    KC(3),   KS_2,		KS_at,		KS_twosuperior,
+    KC(4),   KS_3,		KS_numbersign,	KS_threesuperior,
+    KC(5),   KS_4,		KS_dollar,	KS_sterling,
+    KC(6),   KS_5,		KS_percent,	KS_cent,
+    KC(7),   KS_6,		KS_dead_diaeresis,KS_notsign,
+    KC(13),  KS_equal,		KS_plus,	KS_section,
+    KC(26),  KS_dead_acute,	KS_dead_grave,
+    KC(27),  KS_bracketleft,	KS_braceleft,	KS_ordfeminine,
+    KC(39),  KS_ccedilla,	KS_Ccedilla,
+    KC(40),  KS_dead_tilde,	KS_dead_circumflex,
+    KC(41),  KS_apostrophe,	KS_quotedbl,
+    KC(43),  KS_bracketright,	KS_braceright,	KS_masculine,
+    KC(53),  KS_semicolon,	KS_colon,
+    KC(83),  KS_KP_Delete,	KS_KP_Decimal,
+    KC(86),  KS_backslash,	KS_bar,
+    KC(115), KS_slash,		KS_question,	KS_degree,
+};
+
+static const keysym_t pckbd_keydesc_tr[] = {
+/*  pos      normal		shifted		altgr		shift-altgr */
+    KC(3),   KS_2,		KS_apostrophe,	KS_sterling,
+    KC(4),   KS_3,		KS_asciicircum,	KS_numbersign,
+    KC(5),   KS_4,KS_plus,	KS_dollar,
+    KC(6),   KS_5,		KS_percent,	KS_onehalf,
+    KC(7),   KS_6,		KS_ampersand,
+    KC(8),   KS_7,		KS_slash,	KS_braceleft,
+    KC(9),   KS_8,		KS_parenleft,	KS_bracketleft,
+    KC(10),  KS_9,		KS_parenright,	KS_bracketright,
+    KC(11),  KS_0,		KS_equal,	KS_braceright,
+    KC(12),  KS_asterisk,	KS_question,	KS_backslash,
+    KC(13),  KS_minus,		KS_underscore,
+    KC(16),  KS_q,		KS_Q,KS_at,
+    KC(23),  KS_L5_idotless,	KS_I,
+    KC(26),  KS_L5_gbreve,	KS_L5_Gbreve,	KS_dead_diaeresis,
+    KC(27),  KS_udiaeresis,	KS_Udiaeresis,	KS_asciitilde,
+    KC(39),  KS_L5_scedilla,	KS_L5_Scedilla,	KS_dead_acute,
+    KC(40),  KS_i,		KS_L5_Idotabove,
+    KC(41),  KS_quotedbl,	KS_eacute,
+    KC(43),  KS_comma,		KS_semicolon,	KS_dead_grave,
+    KC(51),  KS_odiaeresis,	KS_Odiaeresis,
+    KC(52),  KS_ccedilla,	KS_Ccedilla,
+    KC(53),  KS_period,		KS_colon,
+    KC(86),  KS_less,		KS_greater,	KS_bar,
+    KC(184), KS_Mode_switch,	KS_Multi_key,
+};
+
+static const keysym_t pckbd_keydesc_tr_nodead[] = {
+/*  pos      normal		shifted		altgr		shift-altgr */
+    KC(26),  KS_L5_gbreve,	KS_L5_Gbreve,
+    KC(39),  KS_L5_scedilla,	KS_L5_Scedilla,	KS_apostrophe,
+    KC(43),  KS_comma,		KS_semicolon,	KS_grave,
+};
+
+static const keysym_t pckbd_keydesc_pl[] = {
+/*  pos      normal		shifted		altgr		shift-altgr */
+    KC(18),  KS_e,		KS_E,		KS_L2_eogonek,	KS_L2_Eogonek,
+    KC(24),  KS_o,		KS_O,		KS_oacute,	KS_Oacute,
+    KC(30),  KS_a,		KS_A,		KS_L2_aogonek,	KS_L2_Aogonek,
+    KC(31),  KS_s,		KS_S,		KS_L2_sacute,	KS_L2_Sacute,
+    KC(38),  KS_l,		KS_L,		KS_L2_lstroke,	KS_L2_Lstroke,
+    KC(44),  KS_z,		KS_Z,		KS_L2_zdotabove,KS_L2_Zdotabove,
+    KC(45),  KS_x,		KS_X,		KS_L2_zacute,	KS_L2_Zacute,
+    KC(46),  KS_c,		KS_C,		KS_L2_cacute,	KS_L2_Cacute,
+    KC(49),  KS_n,		KS_N,		KS_L2_nacute,	KS_L2_Nacute,
+    KC(184), KS_Mode_switch,	KS_Multi_key,
+};
+
+static const keysym_t pckbd_keydesc_hu[] = {
+/*  pos      normal		shifted		altgr		shift-altgr */
+    KC(2),   KS_1,		KS_apostrophe,	KS_asciitilde,
+    KC(3),   KS_2,		KS_quotedbl,
+    KC(4),   KS_3,		KS_plus,	KS_asciicircum,
+    KC(5),   KS_4,		KS_exclam,
+    KC(6),   KS_5,		KS_percent,
+    KC(7),   KS_6,		KS_slash,
+    KC(8),   KS_7,		KS_equal,	KS_grave,
+    KC(9),   KS_8,		KS_parenleft,
+    KC(10),  KS_9,		KS_parenright,	KS_acute,
+    KC(11),  KS_odiaeresis,	KS_Odiaeresis,
+    KC(12),  KS_udiaeresis,	KS_Udiaeresis,
+    KC(13),  KS_oacute,		KS_Oacute,
+    KC(16),  KS_q,		KS_Q,		KS_backslash,
+    KC(17),  KS_w,		KS_W,		KS_bar,
+    KC(21),  KS_z,		KS_Z,
+    KC(23),  KS_i,		KS_I,		KS_iacute,
+    KC(26),  KS_odoubleacute,	KS_Odoubleacute,KS_division,
+    KC(27),  KS_uacute,		KS_Uacute,	KS_multiply,
+    KC(33),  KS_f,		KS_F,		KS_bracketleft,
+    KC(34),  KS_g,		KS_G,		KS_bracketright,
+    KC(36),  KS_j,		KS_J,		KS_iacute,
+    KC(39),  KS_eacute,		KS_Eacute,	KS_dollar,
+    KC(40),  KS_aacute,		KS_Aacute,	KS_ssharp,
+    KC(41),  KS_0,		KS_section,
+    KC(43),  KS_udoubleacute,	KS_Udoubleacute,KS_currency,
+    KC(44),  KS_y,		KS_Y,		KS_greater,
+    KC(45),  KS_x,		KS_X,		KS_numbersign,
+    KC(46),  KS_c,		KS_C,		KS_ampersand,
+    KC(47),  KS_v,		KS_V,		KS_at,
+    KC(48),  KS_b,		KS_B,		KS_braceleft,
+    KC(49),  KS_n,		KS_N,		KS_braceright,
+    KC(51),  KS_comma,		KS_question,	KS_semicolon,
+    KC(52),  KS_period,		KS_colon,
+    KC(53),  KS_minus,		KS_underscore,	KS_asterisk,
+    KC(86),  KS_iacute,		KS_Iacute,	KS_less,
+    KC(184), KS_Mode_switch,	KS_Multi_key,
+};
+
+static const keysym_t pckbd_keydesc_si[] = {
+/*  pos      normal		shifted		altgr		shift-altgr */
+    KC(2),   KS_1,		KS_exclam,	KS_asciitilde,
+    KC(3),   KS_2,		KS_quotedbl,	KS_L2_caron,
+    KC(4),   KS_3,		KS_numbersign,	KS_asciicircum,
+    KC(5),   KS_4,		KS_dollar,	KS_L2_breve,
+    KC(6),   KS_5,		KS_percent,	KS_degree,
+    KC(7),   KS_6,		KS_ampersand,	KS_L2_ogonek,
+    KC(8),   KS_7,		KS_slash,	KS_grave,
+    KC(9),   KS_8,		KS_parenleft,	KS_L2_dotabove,
+    KC(10),  KS_9,		KS_parenright,	KS_acute,
+    KC(11),  KS_0,		KS_equal,	KS_L2_dblacute,
+    KC(12),  KS_apostrophe,	KS_question,	KS_diaeresis,
+    KC(13),  KS_plus,		KS_asterisk,	KS_cedilla,
+    KC(16),  KS_q,		KS_Q,		KS_backslash,
+    KC(17),  KS_w,		KS_W,		KS_bar,
+    KC(21),  KS_z,		KS_Z,
+    KC(26),  KS_L2_scaron,	KS_L2_Scaron,	KS_division,
+    KC(27),  KS_L2_dstroke,	KS_L2_Dstroke,	KS_multiply,
+    KC(33),  KS_f,		KS_F,		KS_bracketleft,
+    KC(34),  KS_g,		KS_G,		KS_bracketright,
+    KC(37),  KS_k,		KS_K,		KS_L2_lstroke,
+    KC(38),  KS_l,		KS_L,		KS_L2_Lstroke,
+    KC(39),  KS_L2_ccaron,	KS_L2_Ccaron,        
+    KC(40),  KS_L2_cacute,	KS_L2_Cacute,	KS_ssharp,
+    KC(41),  KS_cedilla,	KS_diaeresis,
+    KC(43),  KS_L2_zcaron,	KS_L2_Zcaron,	KS_currency,
+    KC(44),  KS_y,		KS_Y,
+    KC(47),  KS_v,		KS_V,		KS_at,
+    KC(48),  KS_b,		KS_B,		KS_braceleft,
+    KC(49),  KS_n,		KS_N,		KS_braceright,
+    KC(50),  KS_m,		KS_M,		KS_section,
+    KC(51),  KS_comma,		KS_semicolon,
+    KC(52),  KS_period,		KS_colon,
+    KC(53),  KS_minus,		KS_underscore,
+    KC(86),  KS_less,		KS_greater,
+    KC(184), KS_Mode_switch,	KS_Multi_key,
+};
+
+static const keysym_t pckbd_keydesc_cf[] = {
+/*  pos	     normal		shifted		altgr		shift-altgr */
+    KC(2),   KS_1,		KS_exclam,	KS_plusminus,
+    KC(3),   KS_2,		KS_quotedbl,	KS_at,
+    KC(4),   KS_3,		KS_slash,	KS_sterling,
+    KC(5),   KS_4,		KS_dollar,	KS_cent,
+    KC(6),   KS_5,		KS_percent,	KS_diaeresis,
+    KC(7),   KS_6,		KS_question,	KS_macron,
+    KC(8),   KS_7,		KS_ampersand,	KS_brokenbar,
+    KC(9),   KS_8,		KS_asterisk,	KS_twosuperior,
+    KC(10),  KS_9,		KS_parenleft,	KS_threesuperior,
+    KC(11),  KS_0,		KS_parenright,	KS_onequarter,
+    KC(12),  KS_minus,		KS_underscore,	KS_onehalf,
+    KC(13),  KS_equal,		KS_plus,	KS_threequarters,
+    KC(24),  KS_o,		KS_O,		KS_section,
+    KC(25),  KS_p,		KS_P,		KS_paragraph,
+    KC(26),  KS_dead_circumflex,KS_dead_circumflex,KS_bracketleft,
+    KC(27),  KS_dead_cedilla,	KS_dead_diaeresis,KS_bracketright,
+    KC(39),  KS_semicolon,	KS_colon,	KS_asciitilde,
+    KC(40),  KS_dead_grave,	KS_dead_grave,	KS_braceleft,
+    KC(41),  KS_numbersign,	KS_bar,		KS_backslash,
+    KC(43),  KS_less,		KS_greater,	KS_braceright,
+    KC(50),  KS_m,		KS_M,		KS_mu,
+    KC(51),  KS_comma,		KS_apostrophe,	KS_hyphen,
+    KC(52),  KS_period,		KS_period,
+    KC(53),  KS_eacute,		KS_Eacute,	KS_dead_acute,
+    KC(86),  KS_guillemotleft,	KS_guillemotright,KS_degree,
+    KC(184), KS_Mode_switch,	KS_Multi_key,
+};
+
+static const keysym_t pckbd_keydesc_cf_nodead[] = {
+/*  pos      normal		shifted		altgr		shift-altgr */
+    KC(26),  KS_asciicircum,	KS_asciicircum,	KS_bracketleft,
+    KC(27),  KS_cedilla,	KS_diaeresis,	KS_bracketright,
+    KC(40),  KS_grave,		KS_grave,	KS_braceleft,
+    KC(53),  KS_eacute,		KS_Eacute,	KS_acute,
+};
+
 static const keysym_t pckbd_keydesc_us_declk[] = {
 /*  pos      normal		shifted		altgr		shift-altgr */
     KC(1),	KS_grave,	KS_asciitilde, /* replace escape */
@@ -510,6 +929,8 @@
     KC(87),  KS_Cmd_Screen9,	KS_f10,
     KC(88), 			KS_f11,
 };
+
+
 #endif /* WSKBD_USONLY */
 
 #define KBD_MAP(name, base, map) \
@@ -543,8 +964,26 @@
 		pckbd_keydesc_swapctrlcaps),
 	KBD_MAP(KB_US | KB_IOPENER | KB_SWAPCTRLCAPS,	KB_US | KB_IOPENER,
 		pckbd_keydesc_swapctrlcaps),
-	KBD_MAP(KB_ES ,			KB_US,	pckbd_keydesc_es),
+	KBD_MAP(KB_ES,			KB_US,	pckbd_keydesc_es),
 	KBD_MAP(KB_PT,			KB_US,	pckbd_keydesc_pt),
+	KBD_MAP(KB_BE,			KB_US,	pckbd_keydesc_be),
+	KBD_MAP(KB_RU,			KB_US,	pckbd_keydesc_ru),
+	KBD_MAP(KB_UA,			KB_US,	pckbd_keydesc_ua),
+	KBD_MAP(KB_SG,			KB_US,	pckbd_keydesc_sg),
+        KBD_MAP(KB_SG | KB_NODEAD,	KB_SG,	pckbd_keydesc_sg_nodead),
+        KBD_MAP(KB_SF,			KB_SG,	pckbd_keydesc_sf),
+        KBD_MAP(KB_SF | KB_NODEAD,	KB_SF,	pckbd_keydesc_sg_nodead),
+	KBD_MAP(KB_LT,			KB_US,	pckbd_keydesc_lt),
+	KBD_MAP(KB_LT,			KB_US,	pckbd_keydesc_lt),
+        KBD_MAP(KB_LA,			KB_US,	pckbd_keydesc_la),
+        KBD_MAP(KB_BR,			KB_US,	pckbd_keydesc_br),
+        KBD_MAP(KB_TR,			KB_US,	pckbd_keydesc_tr),
+        KBD_MAP(KB_TR | KB_NODEAD,	KB_TR,	pckbd_keydesc_tr_nodead),
+        KBD_MAP(KB_PL,			KB_US,	pckbd_keydesc_pl),
+        KBD_MAP(KB_HU,			KB_US,	pckbd_keydesc_hu),
+        KBD_MAP(KB_SI,			KB_US,	pckbd_keydesc_si),
+        KBD_MAP(KB_CF,			KB_US,	pckbd_keydesc_cf),
+        KBD_MAP(KB_CF | KB_NODEAD,	KB_CF,	pckbd_keydesc_cf_nodead),
 #endif /* WSKBD_USONLY */
 
 	/* placeholders */

		-- Rui Paulo