2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / KeyboardLayouts.cs
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 // 
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 // 
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2004 Novell, Inc.
21 //
22 // Authors:
23 //      Jackson Harper (jackson@ximian.com)
24 //
25 //
26
27 // TODO:
28 // - Move these tables into unmanaged code (libgdiplus) and access with a pointer
29 //
30
31
32 using System;
33
34 namespace System.Windows.Forms {
35
36         internal class KeyboardLayout {
37                 public string Comment;
38                 public int CodePage;
39                 public string [] Key;
40                 public short [] Scan;
41                 public VirtualKeys [] VKey;
42
43                 public KeyboardLayout (string comment, int code_page, string [] key, short [] scan, VirtualKeys [] vkey)
44                 {
45                         Comment = comment;
46                         CodePage = code_page;
47                         Key = key;
48                         Scan = scan;
49                         VKey = vkey;
50                 }
51         }
52         
53         internal class KeyboardLayouts {
54
55                 public static readonly int MainLen = 48;
56                 private static readonly string [] main_key_US = new string []
57                 {
58                         "`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","-_","=+",
59                         "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","[{","]}",
60                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";:","'\"","\\|",
61                         "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?"
62                 };
63
64                 private static string [] main_key_US_phantom = new string []
65                 {
66                         "`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","-_","=+",
67                         "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","[{","]}",
68                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";:","'\"","\\|",
69                         "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?",
70                         "<>" /* the phantom key */
71                 };
72
73                 /*** United States keyboard layout (dvorak version) */
74                 private static readonly string [] main_key_US_dvorak = new string []
75                 {
76                         "`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","[{","]}",
77                         "'\"",",<",".>","pP","yY","fF","gG","cC","rR","lL","/?","=+",
78                         "aA","oO","eE","uU","iI","dD","hH","tT","nN","sS","-_","\\|",
79                         ";:","qQ","jJ","kK","xX","bB","mM","wW","vV","zZ"
80                 };
81
82                 /*** British keyboard layout */
83                 private static readonly string [] main_key_UK = new string []
84                 {
85                         "`","1!","2\"","3£","4$","5%","6^","7&","8*","9(","0)","-_","=+",
86                         "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","[{","]}",
87                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";:","'@","#~",
88                         "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?",
89                         "\\|"
90                 };
91
92                 /*** French keyboard layout (contributed by Eric Pouech) */
93                 private static readonly string [] main_key_FR = new string []
94                 {
95                         "²","&1","é2~","\"3#","'4{","(5[","-6|","è7","_8\\","ç9^±","à0@",")°]","=+}",
96                         "aA","zZ","eE","rR","tT","yY","uU","iI","oO","pP","^¨","$£¤",
97                         "qQ","sSß","dD","fF","gG","hH","jJ","kK","lL","mM","ù%","*µ",
98                         "wW","xX","cC","vV","bB","nN",",?",";.",":/","!§",
99                         "<>"
100                 };
101
102                 /*** Icelandic keyboard layout (contributed by Ríkharður Egilsson) */
103                 private static readonly string [] main_key_IS = new string []
104                 {
105                         "°","1!","2\"","3#","4$","5%","6&","7/{","8([","9)]","0=}","öÖ\\","-_",
106                         "qQ@","wW","eE","rR","tT","yY","uU","iI","oO","pP","ðÐ","'?~",
107                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL","æÆ","´^","+*`",
108                         "zZ","xX","cC","vV","bB","nN","mM",",;",".:","þÞ",
109                         "<>|"
110                 };
111
112                 /*** German keyboard layout (contributed by Ulrich Weigand) */
113                 private static readonly string [] main_key_DE = new string []
114                 {
115                         "^°","1!","2\"²","3§³","4$","5%","6&","7/{","8([","9)]","0=}","ß?\\","'`",
116                         "qQ@","wW","eE\80","rR","tT","zZ","uU","iI","oO","pP","üÜ","+*~",
117                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL","öÖ","äÄ","#´",
118                         "yY","xX","cC","vV","bB","nN","mMµ",",;",".:","-_",
119                         "<>|"
120                 };
121
122                 /*** German keyboard layout without dead keys */
123                 private static readonly string [] main_key_DE_nodead = new string []
124                 {
125                         "^°","1!","2\"","3§","4$","5%","6&","7/{","8([","9)]","0=}","ß?\\","´",
126                         "qQ","wW","eE","rR","tT","zZ","uU","iI","oO","pP","üÜ","+*~",
127                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL","öÖ","äÄ","#'",
128                         "yY","xX","cC","vV","bB","nN","mM",",;",".:","-_",
129                         "<>"
130                 };
131
132                 /*** Swiss German keyboard layout (contributed by Jonathan Naylor) */
133                 private static readonly string [] main_key_SG = new string []
134                 {
135                         "§°","1+|","2\"@","3*#","4ç","5%","6&¬","7/¦","8(¢","9)","0=","'?´","^`~",
136                         "qQ","wW","eE","rR","tT","zZ","uU","iI","oO","pP","üè[","¨!]",
137                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL","öé","äà{","$£}",
138                         "yY","xX","cC","vV","bB","nN","mM",",;",".:","-_",
139                         "<>\\"
140                 };
141
142                 /*** Swiss French keyboard layout (contributed by Philippe Froidevaux) */
143                 private static readonly string [] main_key_SF = new string []
144                 {
145                         "§°","1+|","2\"@","3*#","4ç","5%","6&¬","7/¦","8(¢","9)","0=","'?´","^`~",
146                         "qQ","wW","eE","rR","tT","zZ","uU","iI","oO","pP","èü[","¨!]",
147                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL","éö","àä{","$£}",
148                         "yY","xX","cC","vV","bB","nN","mM",",;",".:","-_",
149                         "<>\\"
150                 };
151
152                 /*** Norwegian keyboard layout (contributed by Ove Kåven) */
153                 private static readonly string [] main_key_NO = new string []
154                 {
155                         "|§","1!","2\"@","3#£","4¤$","5%","6&","7/{","8([","9)]","0=}","+?","\\`´",
156                         "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","åÅ","¨^~",
157                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL","øØ","æÆ","'*",
158                         "zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_",
159                         "<>"
160                 };
161
162                 /*** Danish keyboard layout (contributed by Bertho Stultiens) */
163                 private static readonly string [] main_key_DA = new string []
164                 {
165                         "½§","1!","2\"@","3#£","4¤$","5%","6&","7/{","8([","9)]","0=}","+?","´`|",
166                         "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","åÅ","¨^~",
167                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL","æÆ","øØ","'*",
168                         "zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_",
169                         "<>\\"
170                 };
171
172                 /*** Swedish keyboard layout (contributed by Peter Bortas) */
173                 private static readonly string [] main_key_SE = new string []
174                 {
175                         "§½","1!","2\"@","3#£","4¤$","5%","6&","7/{","8([","9)]","0=}","+?\\","´`",
176                         "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","åÅ","¨^~",
177                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL","öÖ","äÄ","'*",
178                         "zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_",
179                         "<>|"
180                 };
181
182                 /*** Canadian French keyboard layout */
183                 private static readonly string [] main_key_CF = new string []
184                 {
185                         "#|\\","1!±","2\"@","3/£","4$¢","5%¤","6?¬","7&¦","8*²","9(³","0)¼","-_½","=+¾",
186                         "qQ","wW","eE","rR","tT","yY","uU","iI","oO§","pP¶","^^[","¸¨]",
187                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";:~","``{","<>}",
188                         "zZ","xX","cC","vV","bB","nN","mM",",'-",".","éÉ",
189                         "«»°"
190                 };
191
192                 /*** Portuguese keyboard layout */
193                 private static readonly string [] main_key_PT = new string []
194                 {
195                         "\\¦","1!","2\"@","3#£","4$§","5%","6&","7/{","8([","9)]","0=}","'?","«»",
196                         "qQ",  "wW","eE",  "rR", "tT", "yY", "uU", "iI", "oO", "pP", "+*\\¨","\\'\\`",
197                         "aA",  "sS","dD",  "fF", "gG", "hH", "jJ", "kK", "lL", "çÇ", "ºª", "\\~\\^",
198                         "zZ",  "xX","cC",  "vV", "bB", "nN", "mM", ",;", ".:", "-_",
199                         "<>"
200                 };
201
202                 /*** Italian keyboard layout */
203                 private static readonly string [] main_key_IT = new string []
204                 {
205                         "\\|","1!¹","2\"²","3£³","4$¼","5%½","6&¾","7/{","8([","9)]","0=}","'?`","ì^~",
206                         "qQ@","wW","eE","rR","tT","yY","uU","iI","oOø","pPþ","èé[","+*]",
207                         "aA","sSß","dDð","fF","gG","hH","jJ","kK","lL","òç@","à°#","ù§",
208                         "zZ","xX","cC","vV","bB","nN","mMµ",",;",".:·","-_",
209                         "<>|"
210                 };
211
212                 /*** Finnish keyboard layout */
213                 private static readonly string [] main_key_FI = new string []
214                 {
215                         "","1!","2\"@","3#","4$","5%","6&","7/{","8([","9)]","0=}","+?\\","\'`",
216                         "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","","\"^~",
217                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL","","","'*",
218                         "zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_",
219                         "<>|"
220                 };
221
222                 /*** Russian keyboard layout (contributed by Pavel Roskin) */
223                 private static readonly string [] main_key_RU = new string []
224                 {
225                         "`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","-_","=+",
226                         "qQÊê","wWÃã","eEÕõ","rRËë","tTÅå","yYÎî","uUÇç","iIÛû","oOÝý","pPÚú","[{Èè","]}ßÿ",
227                         "aAÆæ","sSÙù","dD×÷","fFÁá","gGÐð","hHÒò","jJÏï","kKÌì","lLÄä",";:Öö","'\"Üü","\\|",
228                         "zZÑñ","xXÞþ","cCÓó","vVÍí","bBÉé","nNÔô","mMØø",",<Ââ",".>Àà","/?"
229                 };
230
231                 /*** Russian keyboard layout (phantom key version) */
232                 private static readonly string [] main_key_RU_phantom = new string []
233                 {
234                         "`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","-_","=+",
235                         "qQÊê","wWÃã","eEÕõ","rRËë","tTÅå","yYÎî","uUÇç","iIÛû","oOÝý","pPÚú","[{Èè","]}ßÿ",
236                         "aAÆæ","sSÙù","dD×÷","fFÁá","gGÐð","hHÒò","jJÏï","kKÌì","lLÄä",";:Öö","'\"Üü","\\|",
237                         "zZÑñ","xXÞþ","cCÓó","vVÍí","bBÉé","nNÔô","mMØø",",<Ââ",".>Àà","/?",
238                         "<>" /* the phantom key */
239                 };
240
241                 /*** Russian keyboard layout KOI8-R */
242                 private static readonly string [] main_key_RU_koi8r = new string []
243                 {
244                         "()","1!","2\"","3/","4$","5:","6,","7.","8;","9?","0%","-_","=+",
245                         "Êê","Ãã","Õõ","Ëë","Åå","Îî","Çç","Ûû","Ýý","Úú","Èè","ßÿ",
246                         "Ææ","Ùù","×÷","Áá","Ðð","Òò","Ïï","Ìì","Ää","Öö","Üü","\\|",
247                         "Ññ","Þþ","Óó","Íí","Éé","Ôô","Øø","Ââ","Àà","/?",
248                         "<>" /* the phantom key */
249                 };
250
251                 /*** Ukrainian keyboard layout KOI8-U */
252                 private static readonly string [] main_key_UA = new string []
253                 {
254                         "`~­½","1!1!","2@2\"","3#3'","4$4*","5%5:","6^6,","7&7.","8*8;","9(9(","0)0)","-_-_","=+=+",
255                         "qQÊê","wWÃã","eEÕõ","rRËë","tTÅå","yYÎî","uUÇç","iIÛû","oOÝý","pPÚú","[{Èè","]}§·",
256                         "aAÆæ","sS¦¶","dD×÷","fFÁá","gGÐð","hHÒò","jJÏï","kKÌì","lLÄä",";:Öö","'\"¤´","\\|\\|",
257                         "zZÑñ","xXÞþ","cCÓó","vVÍí","bBÉé","nNÔô","mMØø",",<Ââ",".>Àà","/?/?",
258                         "<>" /* the phantom key */
259                 };
260
261                 /*** Spanish keyboard layout (contributed by José Marcos López) */
262                 private static readonly string [] main_key_ES = new string []
263                 {
264                         "ºª\\","1!|","2\"@","3·#","4$","5%","6&¬","7/","8(","9)","0=","'?","¡¿",
265                         "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","`^[","+*]",
266                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL","ñÑ","'¨{","çÇ}",
267                         "zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_",
268                         "<>"
269                 };
270
271                 /*** Belgian keyboard layout ***/
272                 private static readonly string [] main_key_BE = new string []
273                 {
274                         "","&1|","é2@","\"3#","'4","(5","§6^","è7","!8","ç9{","à0}",")°","-_",
275                         "aA","zZ","eE¤","rR","tT","yY","uU","iI","oO","pP","^¨[","$*]",
276                         "qQ","sSß","dD","fF","gG","hH","jJ","kK","lL","mM","ù%´","µ£`",
277                         "wW","xX","cC","vV","bB","nN",",?",";.",":/","=+~",
278                         "<>\\"
279                 };
280
281                 /*** Hungarian keyboard layout (contributed by Zoltán Kovács) */
282                 private static readonly string [] main_key_HU = new string []
283                 {
284                         "0§","1'~","2\"·","3+^","4!¢","5%°","6/²","7=`","8(ÿ","9)´","öÖ½","üܨ","óÓ¸",
285                         "qQ\\","wW|","eE","rR","tT","zZ","uU","iIÍ","oOø","pP","õÕ÷","úÚ×",
286                         "aA","sSð","dDÐ","fF[","gG]","hH","jJí","kK³","lL£","éÉ$","áÁß","ûÛ¤",
287                         "yY>","xX#","cC&","vV@","bB{","nN}","mM",",?;",".:·","-_*",
288                         "íÍ<"
289                 };
290
291                 /*** Polish (programmer's) keyboard layout ***/
292                 private static readonly string [] main_key_PL = new string []
293                 {
294                         "`~","1!","2@","3#","4$","5%","6^","7&§","8*","9(","0)","-_","=+",
295                         "qQ","wW","eEêÊ","rR","tT","yY","uU","iI","oOóÓ","pP","[{","]}",
296                         "aA±¡","sS¶¦","dD","fF","gG","hH","jJ","kK","lL³£",";:","'\"","\\|",
297                         "zZ¿¯","xX¼¬","cCæÆ","vV","bB","nNñÑ","mM",",<",".>","/?",
298                         "<>|"
299                 };
300
301                 /*** Croatian keyboard layout ***/
302                 private static readonly string [] main_key_HR = new string []
303                 {
304                         "¸¨","1!","2\"·","3#^","4$¢","5%°","6&²","7/`","8(ÿ","9)´","0=½","'?¨","+*¸",
305                         "qQ\\","wW|","eE","rR","tT","zZ","uU","iI","oO","pP","¹©÷","ðÐ×",
306                         "aA","sS","dD","fF[","gG]","hH","jJ","kK³","lL£","èÈ","æÆß","¾®¤",
307                         "yY","xX","cC","vV@","bB{","nN}","mM§",",;",".:","-_/",
308                         "<>"
309                 };
310
311                 /*** Japanese 106 keyboard layout ***/
312                 private static readonly string [] main_key_JA_jp106 = new string []
313                 {
314                         "1!","2\"","3#","4$","5%","6&","7'","8(","9)","0~","-=","^~","\\|",
315                         "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","@`","[{",
316                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";+",":*","]}",
317                         "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?",
318                         "\\_",
319                 };
320
321                 /*** Japanese pc98x1 keyboard layout ***/
322                 private static readonly string [] main_key_JA_pc98x1 = new string []
323                 {
324                         "1!","2\"","3#","4$","5%","6&","7'","8(","9)","0","-=","^`","\\|",
325                         "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","@~","[{",
326                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";+",":*","]}",
327                         "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?",
328                         "\\_",
329                 };
330
331                 /*** Brazilian ABNT-2 keyboard layout (contributed by Raul Gomes Fernandes) */
332                 private static readonly string [] main_key_PT_br = new string []
333                 {
334                         "'\"","1!","2@","3#","4$","5%","6\"","7&","8*","9(","0)","-_","=+",
335                         "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","'`","[{",
336                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL","çÇ","~^","]}",
337                         "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?"
338                 };
339
340                 /*** US international keyboard layout (contributed by Gustavo Noronha (kov@debian.org)) */
341                 private static readonly string [] main_key_US_intl = new string []
342                 {
343                         "`~", "1!", "2@", "3#", "4$", "5%", "6^", "7&", "8*", "9(", "0)", "-_", "=+", "\\|",
344                         "qQ", "wW", "eE", "rR", "tT", "yY", "uU", "iI", "oO", "pP", "[{", "]}",
345                         "aA", "sS", "dD", "fF", "gG", "hH", "jJ", "kK", "lL", ";:", "'\"",
346                         "zZ", "xX", "cC", "vV", "bB", "nN", "mM", ",<", ".>", "/?"
347                 };
348
349                 /*** Slovak keyboard layout (see cssk_ibm(sk_qwerty) in xkbsel)
350                      - dead_abovering replaced with degree - no symbol in iso8859-2
351                      - brokenbar replaced with bar                                      */
352                 private static readonly string [] main_key_SK = new string []
353                 {
354                         ";°`'","+1","µ2","¹3","è4","»5","¾6","ý7","á8","í9","é0)","=%","",
355                         "qQ\\","wW|","eE","rR","tT","yY","uU","iI","oO","pP","ú/÷","ä(×",
356                         "aA","sSð","dDÐ","fF[","gG]","hH","jJ","kK³","lL£","ô\"$","§!ß","ò)¤",
357                         "zZ>","xX#","cC&","vV@","bB{","nN}","mM",",?<",".:>","-_*",
358                         "<>\\|"
359                 };
360
361                 /*** Slovak and Czech (programmer's) keyboard layout (see cssk_dual(cs_sk_ucw)) */
362                 private static readonly string [] main_key_SK_prog = new string []
363                 {
364                         "`~","1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","-_","=+",
365                         "qQäÄ","wWìÌ","eEéÉ","rRøØ","tT»«","yYýÝ","uUùÙ","iIíÍ","oOóÓ","pPöÖ","[{","]}",
366                         "aAáÁ","sS¹©","dDïÏ","fFëË","gGàÀ","hHúÚ","jJüÜ","kKôÔ","lLµ¥",";:","'\"","\\|",
367                         "zZ¾®","xX¤","cCèÈ","vVçÇ","bB","nNòÒ","mMåÅ",",<",".>","/?",
368                         "<>"
369                 };
370
371                 /*** Czech keyboard layout (see cssk_ibm(cs_qwerty) in xkbsel) */
372                 private static readonly string [] main_key_CS = new string []
373                 {
374                         ";","+1","ì2","¹3","è4","ø5","¾6","ý7","á8","í9","é0½)","=%","",
375                         "qQ\\","wW|","eE","rR","tT","yY","uU","iI","oO","pP","ú/[{",")(]}",
376                         "aA","sSð","dDÐ","fF[","gG]","hH","jJ","kK³","lL£","ù\"$","§!ß","¨'",
377                         "zZ>","xX#","cC&","vV@","bB{","nN}","mM",",?<",".:>","-_*",
378                         "<>\\|"
379                 };
380
381                 /*** Latin American keyboard layout (contributed by Gabriel Orlando Garcia) */
382                 private static readonly string [] main_key_LA = new string []
383                 {
384                         "|°¬","1!","2\"","3#","4$","5%","6&","7/","8(","9)","0=","'?\\","¡¿",
385                         "qQ@","wW","eE","rR","tT","yY","uU","iI","oO","pP","´¨","+*~",
386                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL","ñÑ","{[^","}]`",
387                         "zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_",
388                         "<>"
389                 };
390
391                 /*** Lithuanian (Baltic) keyboard layout (contributed by Nerijus Baliûnas) */
392                 private static readonly string [] main_key_LT_B = new string []
393                 {
394                         "`~","àÀ","èÈ","æÆ","ëË","áÁ","ðÐ","øØ","ûÛ","((","))","-_","þÞ",
395                         "qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","[{","]}",
396                         "aA","sS","dD","fF","gG","hH","jJ","kK","lL",";:","'\"","\\|",
397                         "zZ","xX","cC","vV","bB","nN","mM",",<",".>","/?"
398                 };
399
400                 /*** Turkish keyboard Layout */
401                 private static readonly string [] main_key_TK = new string []
402                 {
403                         "\"é","1!","2'","3^#","4+$","5%","6&","7/{","8([","9)]","0=}","*?\\","-_",
404                         "qQ@","wW","eE","rR","tT","yY","uU","ýIî","oO","pP","ðÐ","üÜ~",
405                         "aAæ","sSß","dD","fF","gG","hH","jJ","kK","lL","þÞ","iÝ",",;`",
406                         "zZ","xX","cC","vV","bB","nN","mM","öÖ","çÇ",".:"
407                 };
408
409                 private static readonly string [] main_key_vnc = new string []
410                 {
411                         "1!","2@","3#","4$","5%","6^","7&","8*","9(","0)","-_","=+","[{","]}",";:","'\"","`~",",<",".>","/?","\\|",
412                         "aA","bB","cC","dD","eE","fF","gG","hH","iI","jJ","kK","lL","mM","nN","oO","pP","qQ","rR","sS","tT","uU","vV","wW","xX","yY","zZ"
413                 };
414
415                 /*** VNC keyboard layout */
416                 private static readonly short [] main_key_scan_vnc = new short []
417                 {
418                         0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x1A,0x1B,0x27,0x28,0x29,0x33,0x34,0x35,0x2B,
419                         0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,0x17,0x24,0x25,0x26,0x32,0x31,0x18,0x19,0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,0x15,0x2C,
420                         0x56
421                 };
422
423                 private static readonly VirtualKeys [] main_key_vkey_vnc = new VirtualKeys []
424                 {
425                         VirtualKeys.VK_1, VirtualKeys.VK_2, VirtualKeys.VK_3, VirtualKeys.VK_4, VirtualKeys.VK_5, VirtualKeys.VK_6, 
426                         VirtualKeys.VK_7, VirtualKeys.VK_8, VirtualKeys.VK_9, VirtualKeys.VK_0, VirtualKeys.VK_OEM_MINUS, 
427                         VirtualKeys.VK_OEM_PLUS, VirtualKeys.VK_OEM_4, VirtualKeys.VK_OEM_6, VirtualKeys.VK_OEM_1, 
428                         VirtualKeys.VK_OEM_7, VirtualKeys.VK_OEM_3, VirtualKeys.VK_OEM_COMMA, VirtualKeys.VK_OEM_PERIOD, 
429                         VirtualKeys.VK_OEM_2, VirtualKeys.VK_OEM_5, VirtualKeys.VK_A, VirtualKeys.VK_B, VirtualKeys.VK_C, 
430                         VirtualKeys.VK_D, VirtualKeys.VK_E, VirtualKeys.VK_F, VirtualKeys.VK_G, VirtualKeys.VK_H, 
431                         VirtualKeys.VK_I, VirtualKeys.VK_J, VirtualKeys.VK_K, VirtualKeys.VK_L, VirtualKeys.VK_M, 
432                         VirtualKeys.VK_N, VirtualKeys.VK_O, VirtualKeys.VK_P, VirtualKeys.VK_Q, VirtualKeys.VK_R, 
433                         VirtualKeys.VK_S, VirtualKeys.VK_T, VirtualKeys.VK_U, VirtualKeys.VK_V, VirtualKeys.VK_W, 
434                         VirtualKeys.VK_X, VirtualKeys.VK_Y, VirtualKeys.VK_Z, VirtualKeys.VK_OEM_102
435                 };
436
437                 private static readonly short [] main_key_scan_qwerty = new short []
438                 {
439                         /* this is my (102-key) keyboard layout, sorry if it doesn't quite match yours */
440                         /* `    1    2    3    4    5    6    7    8    9    0    -    = */
441                         0x29,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,
442                         /* q    w    e    r    t    y    u    i    o    p    [    ] */
443                         0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,
444                         /* a    s    d    f    g    h    j    k    l    ;    '    \ */
445                         0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x2B,
446                         /* z    x    c    v    b    n    m    ,    .    / */
447                         0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,
448                         0x56 /* the 102nd key (actually to the right of l-shift) */
449                 };
450
451                 private static readonly short [] main_key_scan_dvorak = new short []
452                 {
453                         /* `    1    2    3    4    5    6    7    8    9    0    [    ] */
454                         0x29,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x1A,0x1B,
455                         /* '    ,    .    p    y    f    g    c    r    l    /    = */
456                         0x28,0x33,0x34,0x19,0x15,0x21,0x22,0x2E,0x13,0x26,0x35,0x0D,
457                         /* a    o    e    u    i    d    h    t    n    s    -    \ */
458                         0x1E,0x18,0x12,0x16,0x17,0x20,0x23,0x14,0x31,0x1F,0x0C,0x2B,
459                         /* ;    q    j    k    x    b    m    w    v    z */
460                         0x27,0x10,0x24,0x25,0x2D,0x30,0x32,0x11,0x2F,0x2C,
461                         0x56 /* the 102nd key (actually to the right of l-shift) */
462                 };
463
464                 private static readonly VirtualKeys [] main_key_vkey_qwerty = new VirtualKeys []
465                 {
466                         // NOTE: this layout must concur with the scan codes layout above
467                         VirtualKeys.VK_OEM_3, VirtualKeys.VK_1, VirtualKeys.VK_2, VirtualKeys.VK_3, VirtualKeys.VK_4, 
468                         VirtualKeys.VK_5, VirtualKeys.VK_6, VirtualKeys.VK_7, VirtualKeys.VK_8, VirtualKeys.VK_9, 
469                         VirtualKeys.VK_0, VirtualKeys.VK_OEM_MINUS, VirtualKeys.VK_OEM_PLUS,  VirtualKeys.VK_Q, 
470                         VirtualKeys.VK_W, VirtualKeys.VK_E, VirtualKeys.VK_R, VirtualKeys.VK_T, VirtualKeys.VK_Y, 
471                         VirtualKeys.VK_U, VirtualKeys.VK_I, VirtualKeys.VK_O, VirtualKeys.VK_P, VirtualKeys.VK_OEM_4, 
472                         VirtualKeys.VK_OEM_6, VirtualKeys.VK_A, VirtualKeys.VK_S, VirtualKeys.VK_D, VirtualKeys.VK_F, 
473                         VirtualKeys.VK_G, VirtualKeys.VK_H, VirtualKeys.VK_J, VirtualKeys.VK_K, VirtualKeys.VK_L, 
474                         VirtualKeys.VK_OEM_1, VirtualKeys.VK_OEM_7, VirtualKeys.VK_OEM_5, VirtualKeys.VK_Z, 
475                         VirtualKeys.VK_X, VirtualKeys.VK_C, VirtualKeys.VK_V, VirtualKeys.VK_B, VirtualKeys.VK_N, 
476                         VirtualKeys.VK_M, VirtualKeys.VK_OEM_COMMA, VirtualKeys.VK_OEM_PERIOD, VirtualKeys.VK_OEM_2, 
477                         VirtualKeys.VK_OEM_102 // the 102nd key (actually to the right of l-shift)
478                 };
479
480                 private static readonly VirtualKeys [] main_key_vkey_dvorak = new VirtualKeys []
481                 {
482                         // NOTE: this layout must concur with the scan codes layout above
483                         VirtualKeys.VK_OEM_3, VirtualKeys.VK_1, VirtualKeys.VK_2, VirtualKeys.VK_3, VirtualKeys.VK_4,
484                         VirtualKeys.VK_5, VirtualKeys.VK_6, VirtualKeys.VK_7, VirtualKeys.VK_8, VirtualKeys.VK_9,
485                         VirtualKeys.VK_0, VirtualKeys.VK_OEM_4, VirtualKeys.VK_OEM_6, VirtualKeys.VK_OEM_7,
486                         VirtualKeys.VK_OEM_COMMA, VirtualKeys.VK_OEM_PERIOD, VirtualKeys.VK_P, VirtualKeys.VK_Y,
487                         VirtualKeys.VK_F, VirtualKeys.VK_G, VirtualKeys.VK_C, VirtualKeys.VK_R, VirtualKeys.VK_L,
488                         VirtualKeys.VK_OEM_2, VirtualKeys.VK_OEM_PLUS, VirtualKeys.VK_A, VirtualKeys.VK_O,
489                         VirtualKeys.VK_E, VirtualKeys.VK_U, VirtualKeys.VK_I, VirtualKeys.VK_D, VirtualKeys.VK_H,
490                         VirtualKeys.VK_T, VirtualKeys.VK_N, VirtualKeys.VK_S, VirtualKeys.VK_OEM_MINUS, VirtualKeys.VK_OEM_5, 
491                         VirtualKeys.VK_OEM_1, VirtualKeys.VK_Q, VirtualKeys.VK_J, VirtualKeys.VK_K, VirtualKeys.VK_X,
492                         VirtualKeys.VK_B, VirtualKeys.VK_M, VirtualKeys.VK_W, VirtualKeys.VK_V, VirtualKeys.VK_Z,
493                         VirtualKeys.VK_OEM_102 // the 102nd key (actually to the right of l-shift)
494                 };
495
496                 private static readonly VirtualKeys [] main_key_vkey_azerty = new VirtualKeys []
497                 {
498                         // NOTE: this layout must concur with the scan codes layout above
499                         VirtualKeys.VK_OEM_7, VirtualKeys.VK_1, VirtualKeys.VK_2, VirtualKeys.VK_3, VirtualKeys.VK_4,
500                         VirtualKeys.VK_5, VirtualKeys.VK_6, VirtualKeys.VK_7, VirtualKeys.VK_8, VirtualKeys.VK_9,
501                         VirtualKeys.VK_0, VirtualKeys.VK_OEM_4, VirtualKeys.VK_OEM_PLUS, VirtualKeys.VK_A, VirtualKeys.VK_Z,
502                         VirtualKeys.VK_E, VirtualKeys.VK_R, VirtualKeys.VK_T, VirtualKeys.VK_Y, VirtualKeys.VK_U,
503                         VirtualKeys.VK_I, VirtualKeys.VK_O, VirtualKeys.VK_P, VirtualKeys.VK_OEM_6, VirtualKeys.VK_OEM_1, 
504                         VirtualKeys.VK_Q, VirtualKeys.VK_S, VirtualKeys.VK_D, VirtualKeys.VK_F, VirtualKeys.VK_G,
505                         VirtualKeys.VK_H, VirtualKeys.VK_J, VirtualKeys.VK_K, VirtualKeys.VK_L, VirtualKeys.VK_M,
506                         VirtualKeys.VK_OEM_3, VirtualKeys.VK_OEM_5, VirtualKeys.VK_W, VirtualKeys.VK_X, VirtualKeys.VK_C,
507                         VirtualKeys.VK_V, VirtualKeys.VK_B, VirtualKeys.VK_N, VirtualKeys.VK_OEM_COMMA, VirtualKeys.VK_OEM_PERIOD,
508                         VirtualKeys.VK_OEM_2, VirtualKeys.VK_OEM_8, 
509                         VirtualKeys.VK_OEM_102 // the 102nd key (actually to the right of l-shift)
510                 };
511
512                 public static int [] nonchar_key_vkey = new int []
513                 {
514                         /* unused */
515                         0, 0, 0, 0, 0, 0, 0, 0,                                     /* FF00 */
516                         /* special keys */
517                         (int) VirtualKeys.VK_BACK, (int) VirtualKeys.VK_TAB, 0, (int) VirtualKeys.VK_CLEAR, 0, (int) VirtualKeys.VK_RETURN, 0, 0,           /* FF08 */
518                         0, 0, 0, (int) VirtualKeys.VK_PAUSE, (int) VirtualKeys.VK_SCROLL, 0, 0, 0,                           /* FF10 */
519                         0, 0, 0, (int) VirtualKeys.VK_ESCAPE, 0, 0, 0, 0,                             /* FF18 */
520                         /* unused */
521                         0, 0, 0, 0, 0, 0, 0, 0,                                     /* FF20 */
522                         0, 0, 0, 0, 0, 0, 0, 0,                                     /* FF28 */
523                         0, 0, 0, 0, 0, 0, 0, 0,                                     /* FF30 */
524                         0, 0, 0, 0, 0, 0, 0, 0,                                     /* FF38 */
525                         0, 0, 0, 0, 0, 0, 0, 0,                                     /* FF40 */
526                         0, 0, 0, 0, 0, 0, 0, 0,                                     /* FF48 */
527                         /* cursor keys */
528                         (int) VirtualKeys.VK_HOME, (int) VirtualKeys.VK_LEFT, (int) VirtualKeys.VK_UP, (int) VirtualKeys.VK_RIGHT,                          /* FF50 */
529                         (int) VirtualKeys.VK_DOWN, (int) VirtualKeys.VK_PRIOR, (int) VirtualKeys.VK_NEXT, (int) VirtualKeys.VK_END,
530                         0, 0, 0, 0, 0, 0, 0, 0,                                     /* FF58 */
531                         /* misc keys */
532                         (int) VirtualKeys.VK_SELECT, (int) VirtualKeys.VK_SNAPSHOT, (int) VirtualKeys.VK_EXECUTE, (int) VirtualKeys.VK_INSERT, 0, 0, 0, 0,  /* FF60 */
533                         (int) VirtualKeys.VK_CANCEL, (int) VirtualKeys.VK_HELP, (int) VirtualKeys.VK_CANCEL, (int) VirtualKeys.VK_CANCEL, 0, 0, 0, 0,       /* FF68 */
534                         0, 0, 0, 0, 0, 0, 0, 0,                                     /* FF70 */
535                         /* keypad keys */
536                         0, 0, 0, 0, 0, 0, 0, (int) VirtualKeys.VK_NUMLOCK,                            /* FF78 */
537                         0, 0, 0, 0, 0, 0, 0, 0,                                     /* FF80 */
538                         0, 0, 0, 0, 0, (int) VirtualKeys.VK_RETURN, 0, 0,                             /* FF88 */
539                         0, 0, 0, 0, 0, (int) VirtualKeys.VK_HOME, (int) VirtualKeys.VK_LEFT, (int) VirtualKeys.VK_UP,                     /* FF90 */
540                         (int) VirtualKeys.VK_RIGHT, (int) VirtualKeys.VK_DOWN, (int) VirtualKeys.VK_PRIOR, (int) VirtualKeys.VK_NEXT,                       /* FF98 */
541                         (int) VirtualKeys.VK_END, 0, (int) VirtualKeys.VK_INSERT, (int) VirtualKeys.VK_DELETE,
542                         0, 0, 0, 0, 0, 0, 0, 0,                                     /* FFA0 */
543                         0, 0, (int) VirtualKeys.VK_MULTIPLY, (int) VirtualKeys.VK_ADD,                                  /* FFA8 */
544                         (int) VirtualKeys.VK_SEPARATOR, (int) VirtualKeys.VK_SUBTRACT, (int) VirtualKeys.VK_DECIMAL, (int) VirtualKeys.VK_DIVIDE,
545                         (int) VirtualKeys.VK_NUMPAD0, (int) VirtualKeys.VK_NUMPAD1, (int) VirtualKeys.VK_NUMPAD2, (int) VirtualKeys.VK_NUMPAD3,             /* FFB0 */
546                         (int) VirtualKeys.VK_NUMPAD4, (int) VirtualKeys.VK_NUMPAD5, (int) VirtualKeys.VK_NUMPAD6, (int) VirtualKeys.VK_NUMPAD7,
547                         (int) VirtualKeys.VK_NUMPAD8, (int) VirtualKeys.VK_NUMPAD9, 0, 0, 0, 0,                         /* FFB8 */
548                         /* function keys */
549                         (int) VirtualKeys.VK_F1, (int) VirtualKeys.VK_F2,
550                         (int) VirtualKeys.VK_F3, (int) VirtualKeys.VK_F4, (int) VirtualKeys.VK_F5, (int) VirtualKeys.VK_F6, (int) VirtualKeys.VK_F7, (int) VirtualKeys.VK_F8, (int) VirtualKeys.VK_F9, (int) VirtualKeys.VK_F10,    /* FFC0 */
551                         (int) VirtualKeys.VK_F11, (int) VirtualKeys.VK_F12, (int) VirtualKeys.VK_F13, (int) VirtualKeys.VK_F14, (int) VirtualKeys.VK_F15, (int) VirtualKeys.VK_F16, 0, 0,       /* FFC8 */
552                         0, 0, 0, 0, 0, 0, 0, 0,                                     /* FFD0 */
553                         0, 0, 0, 0, 0, 0, 0, 0,                                     /* FFD8 */
554                         /* modifier keys */
555                         0, (int) VirtualKeys.VK_SHIFT, (int) VirtualKeys.VK_SHIFT, (int) VirtualKeys.VK_CONTROL,                          /* FFE0 */
556                         (int) VirtualKeys.VK_CONTROL, (int) VirtualKeys.VK_CAPITAL, 0, (int) VirtualKeys.VK_MENU,
557                         (int) VirtualKeys.VK_MENU, (int) VirtualKeys.VK_MENU, (int) VirtualKeys.VK_MENU, 0, 0, 0, 0, 0,                   /* FFE8 */
558                         0, 0, 0, 0, 0, 0, 0, 0,                                     /* FFF0 */
559                         0, 0, 0, 0, 0, 0, 0, (int) VirtualKeys.VK_DELETE                              /* FFF8 */
560                 };
561
562                 public static readonly int [] nonchar_key_scan = new int []
563                 {
564                         /* unused */
565                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FF00 */
566                         /* special keys */
567                         0x0E, 0x0F, 0x00, /*?*/ 0, 0x00, 0x1C, 0x00, 0x00,           /* FF08 */
568                         0x00, 0x00, 0x00, 0x45, 0x46, 0x00, 0x00, 0x00,              /* FF10 */
569                         0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,              /* FF18 */
570                         /* unused */
571                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FF20 */
572                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FF28 */
573                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FF30 */
574                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FF38 */
575                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FF40 */
576                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FF48 */
577                         /* cursor keys */
578                         0x147, 0x14B, 0x148, 0x14D, 0x150, 0x149, 0x151, 0x14F,      /* FF50 */
579                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FF58 */
580                         /* misc keys */
581                         /*?*/ 0, 0x137, /*?*/ 0, 0x152, 0x00, 0x00, 0x00, 0x00,      /* FF60 */
582                         /*?*/ 0, /*?*/ 0, 0x38, 0x146, 0x00, 0x00, 0x00, 0x00,       /* FF68 */
583                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FF70 */
584                         /* keypad keys */
585                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x138, 0x145,            /* FF78 */
586                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FF80 */
587                         0x00, 0x00, 0x00, 0x00, 0x00, 0x11C, 0x00, 0x00,             /* FF88 */
588                         0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x4B, 0x48,              /* FF90 */
589                         0x4D, 0x50, 0x49, 0x51, 0x4F, 0x4C, 0x52, 0x53,              /* FF98 */
590                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FFA0 */
591                         0x00, 0x00, 0x37, 0x4E, /*?*/ 0, 0x4A, 0x53, 0x135,          /* FFA8 */
592                         0x52, 0x4F, 0x50, 0x51, 0x4B, 0x4C, 0x4D, 0x47,              /* FFB0 */
593                         0x48, 0x49, 0x00, 0x00, 0x00, 0x00,                          /* FFB8 */
594                         /* function keys */
595                         0x3B, 0x3C,
596                         0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44,              /* FFC0 */
597                         0x57, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FFC8 */
598                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FFD0 */
599                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FFD8 */
600                         /* modifier keys */
601                         0x00, 0x2A, 0x36, 0x1D, 0x11D, 0x3A, 0x00, 0x38,             /* FFE0 */
602                         0x138, 0x38, 0x138, 0x00, 0x00, 0x00, 0x00, 0x00,            /* FFE8 */
603                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,              /* FFF0 */
604                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x153              /* FFF8 */
605                 };
606
607                 public static readonly KeyboardLayout US = new KeyboardLayout ("United States keyboard layout", 28591,
608                                 main_key_US, main_key_scan_qwerty, main_key_vkey_qwerty);
609                 public static readonly KeyboardLayout US_phantom = new KeyboardLayout ("United States keyboard layout (phantom key version)", 28591,
610                                 main_key_US_phantom, main_key_scan_qwerty, main_key_vkey_qwerty);
611                 public static readonly KeyboardLayout US_dvorak = new KeyboardLayout ("United States keyboard layout (dvorak)", 28591,
612                                 main_key_US_dvorak, main_key_scan_dvorak, main_key_vkey_dvorak);
613                 public static readonly KeyboardLayout UK = new KeyboardLayout ("British keyboard layout", 28591,
614                                 main_key_UK, main_key_scan_qwerty, main_key_vkey_qwerty);
615                 public static readonly KeyboardLayout German = new KeyboardLayout ("German keyboard layout", 28591,
616                                 main_key_DE, main_key_scan_qwerty, main_key_vkey_qwerty);
617                 public static readonly KeyboardLayout German_nodead = new KeyboardLayout ("German keyboard layout without dead keys", 28591,
618                                 main_key_DE_nodead, main_key_scan_qwerty, main_key_vkey_qwerty);
619                 public static readonly KeyboardLayout SwissGerman = new KeyboardLayout ("Swiss German keyboard layout", 28591,
620                                 main_key_SG, main_key_scan_qwerty, main_key_vkey_qwerty);
621                 public static readonly KeyboardLayout Se = new KeyboardLayout ("Swedish keyboard layout", 28591,
622                                 main_key_SE, main_key_scan_qwerty, main_key_vkey_qwerty);
623                 public static readonly KeyboardLayout No = new KeyboardLayout ("Norwegian keyboard layout", 28591,
624                                 main_key_NO, main_key_scan_qwerty, main_key_vkey_qwerty);
625                 public static readonly KeyboardLayout Da = new KeyboardLayout ("Danish keyboard layout", 28591,
626                                 main_key_DA, main_key_scan_qwerty, main_key_vkey_qwerty);
627                 public static readonly KeyboardLayout Fr = new KeyboardLayout ("French keyboard layout", 28591,
628                                 main_key_FR, main_key_scan_qwerty, main_key_vkey_azerty);
629                 public static readonly KeyboardLayout CF = new KeyboardLayout ("Canadian French keyboard layout", 28591,
630                                 main_key_CF, main_key_scan_qwerty, main_key_vkey_qwerty);
631                 public static readonly KeyboardLayout Be = new KeyboardLayout ("Belgian keyboard layout", 28591,
632                                 main_key_BE, main_key_scan_qwerty, main_key_vkey_azerty);
633                 public static readonly KeyboardLayout SF = new KeyboardLayout ("Swiss French keyboard layout", 28591,
634                                 main_key_SF, main_key_scan_qwerty, main_key_vkey_qwerty);
635                 public static readonly KeyboardLayout Pt = new KeyboardLayout ("Portuguese keyboard layout", 28591,
636                                 main_key_PT, main_key_scan_qwerty, main_key_vkey_qwerty);
637                 public static readonly KeyboardLayout Pt_br = new KeyboardLayout ("Brazilian ABNT-2 keyboard layout", 28591,
638                                 main_key_PT_br, main_key_scan_qwerty, main_key_vkey_qwerty);
639                 public static readonly KeyboardLayout US_intl = new KeyboardLayout ("United States International keyboard layout", 28591,
640                                 main_key_US_intl, main_key_scan_qwerty, main_key_vkey_qwerty);
641                 public static readonly KeyboardLayout Fi = new KeyboardLayout ("Finnish keyboard layout", 28591,
642                                 main_key_FI, main_key_scan_qwerty, main_key_vkey_qwerty);
643                 public static readonly KeyboardLayout Ru = new KeyboardLayout ("Russian keyboard layout", 20866,
644                                 main_key_RU, main_key_scan_qwerty, main_key_vkey_qwerty);
645                 public static readonly KeyboardLayout Ru_phantom = new KeyboardLayout ("Russian keyboard layout (phantom key version)", 20866,
646                                 main_key_RU_phantom, main_key_scan_qwerty, main_key_vkey_qwerty);
647                 public static readonly KeyboardLayout Ru_koi8r = new KeyboardLayout ("Russian keyboard layout KOI8-R", 20866,
648                                 main_key_RU_koi8r, main_key_scan_qwerty, main_key_vkey_qwerty);
649                 public static readonly KeyboardLayout Ua = new KeyboardLayout ("Ukrainian keyboard layout KOI8-U", 20866,
650                                 main_key_UA, main_key_scan_qwerty, main_key_vkey_qwerty);
651                 public static readonly KeyboardLayout Es = new KeyboardLayout ("Spanish keyboard layout", 28591,
652                                 main_key_ES, main_key_scan_qwerty, main_key_vkey_qwerty);
653                 public static readonly KeyboardLayout It = new KeyboardLayout ("Italian keyboard layout", 28591,
654                                 main_key_IT, main_key_scan_qwerty, main_key_vkey_qwerty);
655                 public static readonly KeyboardLayout Is = new KeyboardLayout ("Icelandic keyboard layout", 28591,
656                                 main_key_IS, main_key_scan_qwerty, main_key_vkey_qwerty);
657                 public static readonly KeyboardLayout Hu = new KeyboardLayout ("Hungarian keyboard layout", 28592,
658                                 main_key_HU, main_key_scan_qwerty, main_key_vkey_qwerty);
659                 public static readonly KeyboardLayout Pl = new KeyboardLayout ("Polish (programmer's) keyboard layout", 28592,
660                                 main_key_PL, main_key_scan_qwerty, main_key_vkey_qwerty);
661                 public static readonly KeyboardLayout Hr = new KeyboardLayout ("Croatian keyboard layout", 28592,
662                                 main_key_HR, main_key_scan_qwerty, main_key_vkey_qwerty);
663                 public static readonly KeyboardLayout Ja_jp106 = new KeyboardLayout ("Japanese 106 keyboard layout", 932,
664                                 main_key_JA_jp106, main_key_scan_qwerty, main_key_vkey_qwerty);
665                 public static readonly KeyboardLayout Ja_pc98x1 = new KeyboardLayout ("Japanese pc98x1 keyboard layout", 932,
666                                 main_key_JA_pc98x1, main_key_scan_qwerty, main_key_vkey_qwerty);
667                 public static readonly KeyboardLayout Sk = new KeyboardLayout ("Slovak keyboard layout", 28592,
668                                 main_key_SK, main_key_scan_qwerty, main_key_vkey_qwerty);
669                 public static readonly KeyboardLayout Sk_prog = new KeyboardLayout ("Slovak and Czech keyboard layout without dead keys", 28592,
670                                 main_key_SK_prog, main_key_scan_qwerty, main_key_vkey_qwerty);
671                 public static readonly KeyboardLayout Cz = new KeyboardLayout ("Czech keyboard layout", 28592,
672                                 main_key_CS, main_key_scan_qwerty, main_key_vkey_qwerty);
673                 public static readonly KeyboardLayout LA = new KeyboardLayout ("Latin American keyboard layout", 28591,
674                                 main_key_LA, main_key_scan_qwerty, main_key_vkey_qwerty);
675                 public static readonly KeyboardLayout LT_B = new KeyboardLayout ("Lithuanian (Baltic) keyboard layout", 28603,
676                                 main_key_LT_B, main_key_scan_qwerty, main_key_vkey_qwerty);
677                 public static readonly KeyboardLayout Tk = new KeyboardLayout ("Turkish keyboard layout", 28599,
678                                 main_key_TK, main_key_scan_qwerty, main_key_vkey_qwerty);
679                 public static readonly KeyboardLayout Vnc = new KeyboardLayout ("VNC keyboard layout", 28591,
680                                 main_key_vnc, main_key_scan_vnc, main_key_vkey_vnc);
681                 
682                 
683                 public static readonly KeyboardLayout [] layouts = new KeyboardLayout []
684                 {
685                         US, US_phantom, US_dvorak, UK, German, German_nodead, SwissGerman, Se, No, Da, Fr, CF, Be, SF, Pt,
686                         Pt_br, US_intl, Fi, Ru, Ru_phantom, Ru_koi8r, Ua, Es, It, Is, Hu, Pl, Hr, Ja_jp106, Ja_pc98x1, Sk,
687                         Sk_prog, Cz, LA, LT_B, Tk, Vnc
688                 };
689                 
690                 public static KeyboardLayout [] Layouts {
691                         get {
692                                 return layouts;
693                         }
694                 }
695         }
696 }
697