]> Pileus Git - ~andy/gtk/blob - gdk/directfb/gdkkeys-directfb.c
e87b67834a35aa6e39197041358e483934981484
[~andy/gtk] / gdk / directfb / gdkkeys-directfb.c
1 /* GDK - The GIMP Drawing Kit
2  * Copyright (C) 2000 Red Hat, Inc.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 /*
21  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
22  * file for a list of people on the GTK+ Team.
23  */
24
25 /*
26  * GTK+ DirectFB backend
27  * Copyright (C) 2001-2002  convergence integrated media GmbH
28  * Copyright (C) 2002       convergence GmbH
29  * Written by Denis Oliver Kropp <dok@convergence.de> and
30  *            Sven Neumann <sven@convergence.de>
31  */
32
33 #include "config.h"
34 #include "gdk.h"
35
36 #include <stdlib.h>
37 #include <string.h>
38
39
40 #include "gdkdirectfb.h"
41 #include "gdkprivate-directfb.h"
42
43 #include "gdkkeysyms.h"
44 #include "gdkalias.h"
45
46 static struct gdk_key *gdk_keys_by_name = NULL;
47
48 GdkModifierType  _gdk_directfb_modifiers = 0;
49
50 static guint     *directfb_keymap        = NULL;
51 static gint       directfb_min_keycode   = 0;
52 static gint       directfb_max_keycode   = 0;
53
54
55 /* 
56  *  This array needs to be sorted by key values. It can be generated
57  *  from gdkkeysyms.h using a few lines of Perl. This is a bit more
58  *  complex as one would expect since GDK defines multiple names for a
59  *  few key values. We throw the most akward of them away (GDK_Ln and
60  *  GDK_Rn).  This code seems to do the trick:
61  *
62  *      while (<>) {
63  *          if (/^\#define GDK\_(\w+) 0x([0-9|a-f|A-F|]+)/) {
64  *              push @{ $names{hex $2} }, $1;
65  *          }
66  *      }
67  *      foreach $value (sort { $a <=> $b } keys %names) {
68  *          for (@{ $names{$value} } ) {
69  *              next if (/^[R|L]\d+/);
70  *              print "  { GDK_$_, \"$_\" },\n";
71  *          }
72  *      }
73  */
74 static const struct gdk_key
75 {
76   guint        keyval;
77   const gchar *name;
78 } gdk_keys_by_keyval[] = {
79   { GDK_space, "space" },
80   { GDK_exclam, "exclam" },
81   { GDK_quotedbl, "quotedbl" },
82   { GDK_numbersign, "numbersign" },
83   { GDK_dollar, "dollar" },
84   { GDK_percent, "percent" },
85   { GDK_ampersand, "ampersand" },
86   { GDK_apostrophe, "apostrophe" },
87   { GDK_quoteright, "quoteright" },
88   { GDK_parenleft, "parenleft" },
89   { GDK_parenright, "parenright" },
90   { GDK_asterisk, "asterisk" },
91   { GDK_plus, "plus" },
92   { GDK_comma, "comma" },
93   { GDK_minus, "minus" },
94   { GDK_period, "period" },
95   { GDK_slash, "slash" },
96   { GDK_0, "0" },
97   { GDK_1, "1" },
98   { GDK_2, "2" },
99   { GDK_3, "3" },
100   { GDK_4, "4" },
101   { GDK_5, "5" },
102   { GDK_6, "6" },
103   { GDK_7, "7" },
104   { GDK_8, "8" },
105   { GDK_9, "9" },
106   { GDK_colon, "colon" },
107   { GDK_semicolon, "semicolon" },
108   { GDK_less, "less" },
109   { GDK_equal, "equal" },
110   { GDK_greater, "greater" },
111   { GDK_question, "question" },
112   { GDK_at, "at" },
113   { GDK_A, "A" },
114   { GDK_B, "B" },
115   { GDK_C, "C" },
116   { GDK_D, "D" },
117   { GDK_E, "E" },
118   { GDK_F, "F" },
119   { GDK_G, "G" },
120   { GDK_H, "H" },
121   { GDK_I, "I" },
122   { GDK_J, "J" },
123   { GDK_K, "K" },
124   { GDK_L, "L" },
125   { GDK_M, "M" },
126   { GDK_N, "N" },
127   { GDK_O, "O" },
128   { GDK_P, "P" },
129   { GDK_Q, "Q" },
130   { GDK_R, "R" },
131   { GDK_S, "S" },
132   { GDK_T, "T" },
133   { GDK_U, "U" },
134   { GDK_V, "V" },
135   { GDK_W, "W" },
136   { GDK_X, "X" },
137   { GDK_Y, "Y" },
138   { GDK_Z, "Z" },
139   { GDK_bracketleft, "bracketleft" },
140   { GDK_backslash, "backslash" },
141   { GDK_bracketright, "bracketright" },
142   { GDK_asciicircum, "asciicircum" },
143   { GDK_underscore, "underscore" },
144   { GDK_grave, "grave" },
145   { GDK_quoteleft, "quoteleft" },
146   { GDK_a, "a" },
147   { GDK_b, "b" },
148   { GDK_c, "c" },
149   { GDK_d, "d" },
150   { GDK_e, "e" },
151   { GDK_f, "f" },
152   { GDK_g, "g" },
153   { GDK_h, "h" },
154   { GDK_i, "i" },
155   { GDK_j, "j" },
156   { GDK_k, "k" },
157   { GDK_l, "l" },
158   { GDK_m, "m" },
159   { GDK_n, "n" },
160   { GDK_o, "o" },
161   { GDK_p, "p" },
162   { GDK_q, "q" },
163   { GDK_r, "r" },
164   { GDK_s, "s" },
165   { GDK_t, "t" },
166   { GDK_u, "u" },
167   { GDK_v, "v" },
168   { GDK_w, "w" },
169   { GDK_x, "x" },
170   { GDK_y, "y" },
171   { GDK_z, "z" },
172   { GDK_braceleft, "braceleft" },
173   { GDK_bar, "bar" },
174   { GDK_braceright, "braceright" },
175   { GDK_asciitilde, "asciitilde" },
176   { GDK_nobreakspace, "nobreakspace" },
177   { GDK_exclamdown, "exclamdown" },
178   { GDK_cent, "cent" },
179   { GDK_sterling, "sterling" },
180   { GDK_currency, "currency" },
181   { GDK_yen, "yen" },
182   { GDK_brokenbar, "brokenbar" },
183   { GDK_section, "section" },
184   { GDK_diaeresis, "diaeresis" },
185   { GDK_copyright, "copyright" },
186   { GDK_ordfeminine, "ordfeminine" },
187   { GDK_guillemotleft, "guillemotleft" },
188   { GDK_notsign, "notsign" },
189   { GDK_hyphen, "hyphen" },
190   { GDK_registered, "registered" },
191   { GDK_macron, "macron" },
192   { GDK_degree, "degree" },
193   { GDK_plusminus, "plusminus" },
194   { GDK_twosuperior, "twosuperior" },
195   { GDK_threesuperior, "threesuperior" },
196   { GDK_acute, "acute" },
197   { GDK_mu, "mu" },
198   { GDK_paragraph, "paragraph" },
199   { GDK_periodcentered, "periodcentered" },
200   { GDK_cedilla, "cedilla" },
201   { GDK_onesuperior, "onesuperior" },
202   { GDK_masculine, "masculine" },
203   { GDK_guillemotright, "guillemotright" },
204   { GDK_onequarter, "onequarter" },
205   { GDK_onehalf, "onehalf" },
206   { GDK_threequarters, "threequarters" },
207   { GDK_questiondown, "questiondown" },
208   { GDK_Agrave, "Agrave" },
209   { GDK_Aacute, "Aacute" },
210   { GDK_Acircumflex, "Acircumflex" },
211   { GDK_Atilde, "Atilde" },
212   { GDK_Adiaeresis, "Adiaeresis" },
213   { GDK_Aring, "Aring" },
214   { GDK_AE, "AE" },
215   { GDK_Ccedilla, "Ccedilla" },
216   { GDK_Egrave, "Egrave" },
217   { GDK_Eacute, "Eacute" },
218   { GDK_Ecircumflex, "Ecircumflex" },
219   { GDK_Ediaeresis, "Ediaeresis" },
220   { GDK_Igrave, "Igrave" },
221   { GDK_Iacute, "Iacute" },
222   { GDK_Icircumflex, "Icircumflex" },
223   { GDK_Idiaeresis, "Idiaeresis" },
224   { GDK_ETH, "ETH" },
225   { GDK_Eth, "Eth" },
226   { GDK_Ntilde, "Ntilde" },
227   { GDK_Ograve, "Ograve" },
228   { GDK_Oacute, "Oacute" },
229   { GDK_Ocircumflex, "Ocircumflex" },
230   { GDK_Otilde, "Otilde" },
231   { GDK_Odiaeresis, "Odiaeresis" },
232   { GDK_multiply, "multiply" },
233   { GDK_Ooblique, "Ooblique" },
234   { GDK_Ugrave, "Ugrave" },
235   { GDK_Uacute, "Uacute" },
236   { GDK_Ucircumflex, "Ucircumflex" },
237   { GDK_Udiaeresis, "Udiaeresis" },
238   { GDK_Yacute, "Yacute" },
239   { GDK_THORN, "THORN" },
240   { GDK_Thorn, "Thorn" },
241   { GDK_ssharp, "ssharp" },
242   { GDK_agrave, "agrave" },
243   { GDK_aacute, "aacute" },
244   { GDK_acircumflex, "acircumflex" },
245   { GDK_atilde, "atilde" },
246   { GDK_adiaeresis, "adiaeresis" },
247   { GDK_aring, "aring" },
248   { GDK_ae, "ae" },
249   { GDK_ccedilla, "ccedilla" },
250   { GDK_egrave, "egrave" },
251   { GDK_eacute, "eacute" },
252   { GDK_ecircumflex, "ecircumflex" },
253   { GDK_ediaeresis, "ediaeresis" },
254   { GDK_igrave, "igrave" },
255   { GDK_iacute, "iacute" },
256   { GDK_icircumflex, "icircumflex" },
257   { GDK_idiaeresis, "idiaeresis" },
258   { GDK_eth, "eth" },
259   { GDK_ntilde, "ntilde" },
260   { GDK_ograve, "ograve" },
261   { GDK_oacute, "oacute" },
262   { GDK_ocircumflex, "ocircumflex" },
263   { GDK_otilde, "otilde" },
264   { GDK_odiaeresis, "odiaeresis" },
265   { GDK_division, "division" },
266   { GDK_oslash, "oslash" },
267   { GDK_ugrave, "ugrave" },
268   { GDK_uacute, "uacute" },
269   { GDK_ucircumflex, "ucircumflex" },
270   { GDK_udiaeresis, "udiaeresis" },
271   { GDK_yacute, "yacute" },
272   { GDK_thorn, "thorn" },
273   { GDK_ydiaeresis, "ydiaeresis" },
274   { GDK_Aogonek, "Aogonek" },
275   { GDK_breve, "breve" },
276   { GDK_Lstroke, "Lstroke" },
277   { GDK_Lcaron, "Lcaron" },
278   { GDK_Sacute, "Sacute" },
279   { GDK_Scaron, "Scaron" },
280   { GDK_Scedilla, "Scedilla" },
281   { GDK_Tcaron, "Tcaron" },
282   { GDK_Zacute, "Zacute" },
283   { GDK_Zcaron, "Zcaron" },
284   { GDK_Zabovedot, "Zabovedot" },
285   { GDK_aogonek, "aogonek" },
286   { GDK_ogonek, "ogonek" },
287   { GDK_lstroke, "lstroke" },
288   { GDK_lcaron, "lcaron" },
289   { GDK_sacute, "sacute" },
290   { GDK_caron, "caron" },
291   { GDK_scaron, "scaron" },
292   { GDK_scedilla, "scedilla" },
293   { GDK_tcaron, "tcaron" },
294   { GDK_zacute, "zacute" },
295   { GDK_doubleacute, "doubleacute" },
296   { GDK_zcaron, "zcaron" },
297   { GDK_zabovedot, "zabovedot" },
298   { GDK_Racute, "Racute" },
299   { GDK_Abreve, "Abreve" },
300   { GDK_Lacute, "Lacute" },
301   { GDK_Cacute, "Cacute" },
302   { GDK_Ccaron, "Ccaron" },
303   { GDK_Eogonek, "Eogonek" },
304   { GDK_Ecaron, "Ecaron" },
305   { GDK_Dcaron, "Dcaron" },
306   { GDK_Dstroke, "Dstroke" },
307   { GDK_Nacute, "Nacute" },
308   { GDK_Ncaron, "Ncaron" },
309   { GDK_Odoubleacute, "Odoubleacute" },
310   { GDK_Rcaron, "Rcaron" },
311   { GDK_Uring, "Uring" },
312   { GDK_Udoubleacute, "Udoubleacute" },
313   { GDK_Tcedilla, "Tcedilla" },
314   { GDK_racute, "racute" },
315   { GDK_abreve, "abreve" },
316   { GDK_lacute, "lacute" },
317   { GDK_cacute, "cacute" },
318   { GDK_ccaron, "ccaron" },
319   { GDK_eogonek, "eogonek" },
320   { GDK_ecaron, "ecaron" },
321   { GDK_dcaron, "dcaron" },
322   { GDK_dstroke, "dstroke" },
323   { GDK_nacute, "nacute" },
324   { GDK_ncaron, "ncaron" },
325   { GDK_odoubleacute, "odoubleacute" },
326   { GDK_rcaron, "rcaron" },
327   { GDK_uring, "uring" },
328   { GDK_udoubleacute, "udoubleacute" },
329   { GDK_tcedilla, "tcedilla" },
330   { GDK_abovedot, "abovedot" },
331   { GDK_Hstroke, "Hstroke" },
332   { GDK_Hcircumflex, "Hcircumflex" },
333   { GDK_Iabovedot, "Iabovedot" },
334   { GDK_Gbreve, "Gbreve" },
335   { GDK_Jcircumflex, "Jcircumflex" },
336   { GDK_hstroke, "hstroke" },
337   { GDK_hcircumflex, "hcircumflex" },
338   { GDK_idotless, "idotless" },
339   { GDK_gbreve, "gbreve" },
340   { GDK_jcircumflex, "jcircumflex" },
341   { GDK_Cabovedot, "Cabovedot" },
342   { GDK_Ccircumflex, "Ccircumflex" },
343   { GDK_Gabovedot, "Gabovedot" },
344   { GDK_Gcircumflex, "Gcircumflex" },
345   { GDK_Ubreve, "Ubreve" },
346   { GDK_Scircumflex, "Scircumflex" },
347   { GDK_cabovedot, "cabovedot" },
348   { GDK_ccircumflex, "ccircumflex" },
349   { GDK_gabovedot, "gabovedot" },
350   { GDK_gcircumflex, "gcircumflex" },
351   { GDK_ubreve, "ubreve" },
352   { GDK_scircumflex, "scircumflex" },
353   { GDK_kra, "kra" },
354   { GDK_kappa, "kappa" },
355   { GDK_Rcedilla, "Rcedilla" },
356   { GDK_Itilde, "Itilde" },
357   { GDK_Lcedilla, "Lcedilla" },
358   { GDK_Emacron, "Emacron" },
359   { GDK_Gcedilla, "Gcedilla" },
360   { GDK_Tslash, "Tslash" },
361   { GDK_rcedilla, "rcedilla" },
362   { GDK_itilde, "itilde" },
363   { GDK_lcedilla, "lcedilla" },
364   { GDK_emacron, "emacron" },
365   { GDK_gcedilla, "gcedilla" },
366   { GDK_tslash, "tslash" },
367   { GDK_ENG, "ENG" },
368   { GDK_eng, "eng" },
369   { GDK_Amacron, "Amacron" },
370   { GDK_Iogonek, "Iogonek" },
371   { GDK_Eabovedot, "Eabovedot" },
372   { GDK_Imacron, "Imacron" },
373   { GDK_Ncedilla, "Ncedilla" },
374   { GDK_Omacron, "Omacron" },
375   { GDK_Kcedilla, "Kcedilla" },
376   { GDK_Uogonek, "Uogonek" },
377   { GDK_Utilde, "Utilde" },
378   { GDK_Umacron, "Umacron" },
379   { GDK_amacron, "amacron" },
380   { GDK_iogonek, "iogonek" },
381   { GDK_eabovedot, "eabovedot" },
382   { GDK_imacron, "imacron" },
383   { GDK_ncedilla, "ncedilla" },
384   { GDK_omacron, "omacron" },
385   { GDK_kcedilla, "kcedilla" },
386   { GDK_uogonek, "uogonek" },
387   { GDK_utilde, "utilde" },
388   { GDK_umacron, "umacron" },
389   { GDK_overline, "overline" },
390   { GDK_kana_fullstop, "kana_fullstop" },
391   { GDK_kana_openingbracket, "kana_openingbracket" },
392   { GDK_kana_closingbracket, "kana_closingbracket" },
393   { GDK_kana_comma, "kana_comma" },
394   { GDK_kana_conjunctive, "kana_conjunctive" },
395   { GDK_kana_middledot, "kana_middledot" },
396   { GDK_kana_WO, "kana_WO" },
397   { GDK_kana_a, "kana_a" },
398   { GDK_kana_i, "kana_i" },
399   { GDK_kana_u, "kana_u" },
400   { GDK_kana_e, "kana_e" },
401   { GDK_kana_o, "kana_o" },
402   { GDK_kana_ya, "kana_ya" },
403   { GDK_kana_yu, "kana_yu" },
404   { GDK_kana_yo, "kana_yo" },
405   { GDK_kana_tsu, "kana_tsu" },
406   { GDK_kana_tu, "kana_tu" },
407   { GDK_prolongedsound, "prolongedsound" },
408   { GDK_kana_A, "kana_A" },
409   { GDK_kana_I, "kana_I" },
410   { GDK_kana_U, "kana_U" },
411   { GDK_kana_E, "kana_E" },
412   { GDK_kana_O, "kana_O" },
413   { GDK_kana_KA, "kana_KA" },
414   { GDK_kana_KI, "kana_KI" },
415   { GDK_kana_KU, "kana_KU" },
416   { GDK_kana_KE, "kana_KE" },
417   { GDK_kana_KO, "kana_KO" },
418   { GDK_kana_SA, "kana_SA" },
419   { GDK_kana_SHI, "kana_SHI" },
420   { GDK_kana_SU, "kana_SU" },
421   { GDK_kana_SE, "kana_SE" },
422   { GDK_kana_SO, "kana_SO" },
423   { GDK_kana_TA, "kana_TA" },
424   { GDK_kana_CHI, "kana_CHI" },
425   { GDK_kana_TI, "kana_TI" },
426   { GDK_kana_TSU, "kana_TSU" },
427   { GDK_kana_TU, "kana_TU" },
428   { GDK_kana_TE, "kana_TE" },
429   { GDK_kana_TO, "kana_TO" },
430   { GDK_kana_NA, "kana_NA" },
431   { GDK_kana_NI, "kana_NI" },
432   { GDK_kana_NU, "kana_NU" },
433   { GDK_kana_NE, "kana_NE" },
434   { GDK_kana_NO, "kana_NO" },
435   { GDK_kana_HA, "kana_HA" },
436   { GDK_kana_HI, "kana_HI" },
437   { GDK_kana_FU, "kana_FU" },
438   { GDK_kana_HU, "kana_HU" },
439   { GDK_kana_HE, "kana_HE" },
440   { GDK_kana_HO, "kana_HO" },
441   { GDK_kana_MA, "kana_MA" },
442   { GDK_kana_MI, "kana_MI" },
443   { GDK_kana_MU, "kana_MU" },
444   { GDK_kana_ME, "kana_ME" },
445   { GDK_kana_MO, "kana_MO" },
446   { GDK_kana_YA, "kana_YA" },
447   { GDK_kana_YU, "kana_YU" },
448   { GDK_kana_YO, "kana_YO" },
449   { GDK_kana_RA, "kana_RA" },
450   { GDK_kana_RI, "kana_RI" },
451   { GDK_kana_RU, "kana_RU" },
452   { GDK_kana_RE, "kana_RE" },
453   { GDK_kana_RO, "kana_RO" },
454   { GDK_kana_WA, "kana_WA" },
455   { GDK_kana_N, "kana_N" },
456   { GDK_voicedsound, "voicedsound" },
457   { GDK_semivoicedsound, "semivoicedsound" },
458   { GDK_Arabic_comma, "Arabic_comma" },
459   { GDK_Arabic_semicolon, "Arabic_semicolon" },
460   { GDK_Arabic_question_mark, "Arabic_question_mark" },
461   { GDK_Arabic_hamza, "Arabic_hamza" },
462   { GDK_Arabic_maddaonalef, "Arabic_maddaonalef" },
463   { GDK_Arabic_hamzaonalef, "Arabic_hamzaonalef" },
464   { GDK_Arabic_hamzaonwaw, "Arabic_hamzaonwaw" },
465   { GDK_Arabic_hamzaunderalef, "Arabic_hamzaunderalef" },
466   { GDK_Arabic_hamzaonyeh, "Arabic_hamzaonyeh" },
467   { GDK_Arabic_alef, "Arabic_alef" },
468   { GDK_Arabic_beh, "Arabic_beh" },
469   { GDK_Arabic_tehmarbuta, "Arabic_tehmarbuta" },
470   { GDK_Arabic_teh, "Arabic_teh" },
471   { GDK_Arabic_theh, "Arabic_theh" },
472   { GDK_Arabic_jeem, "Arabic_jeem" },
473   { GDK_Arabic_hah, "Arabic_hah" },
474   { GDK_Arabic_khah, "Arabic_khah" },
475   { GDK_Arabic_dal, "Arabic_dal" },
476   { GDK_Arabic_thal, "Arabic_thal" },
477   { GDK_Arabic_ra, "Arabic_ra" },
478   { GDK_Arabic_zain, "Arabic_zain" },
479   { GDK_Arabic_seen, "Arabic_seen" },
480   { GDK_Arabic_sheen, "Arabic_sheen" },
481   { GDK_Arabic_sad, "Arabic_sad" },
482   { GDK_Arabic_dad, "Arabic_dad" },
483   { GDK_Arabic_tah, "Arabic_tah" },
484   { GDK_Arabic_zah, "Arabic_zah" },
485   { GDK_Arabic_ain, "Arabic_ain" },
486   { GDK_Arabic_ghain, "Arabic_ghain" },
487   { GDK_Arabic_tatweel, "Arabic_tatweel" },
488   { GDK_Arabic_feh, "Arabic_feh" },
489   { GDK_Arabic_qaf, "Arabic_qaf" },
490   { GDK_Arabic_kaf, "Arabic_kaf" },
491   { GDK_Arabic_lam, "Arabic_lam" },
492   { GDK_Arabic_meem, "Arabic_meem" },
493   { GDK_Arabic_noon, "Arabic_noon" },
494   { GDK_Arabic_ha, "Arabic_ha" },
495   { GDK_Arabic_heh, "Arabic_heh" },
496   { GDK_Arabic_waw, "Arabic_waw" },
497   { GDK_Arabic_alefmaksura, "Arabic_alefmaksura" },
498   { GDK_Arabic_yeh, "Arabic_yeh" },
499   { GDK_Arabic_fathatan, "Arabic_fathatan" },
500   { GDK_Arabic_dammatan, "Arabic_dammatan" },
501   { GDK_Arabic_kasratan, "Arabic_kasratan" },
502   { GDK_Arabic_fatha, "Arabic_fatha" },
503   { GDK_Arabic_damma, "Arabic_damma" },
504   { GDK_Arabic_kasra, "Arabic_kasra" },
505   { GDK_Arabic_shadda, "Arabic_shadda" },
506   { GDK_Arabic_sukun, "Arabic_sukun" },
507   { GDK_Serbian_dje, "Serbian_dje" },
508   { GDK_Macedonia_gje, "Macedonia_gje" },
509   { GDK_Cyrillic_io, "Cyrillic_io" },
510   { GDK_Ukrainian_ie, "Ukrainian_ie" },
511   { GDK_Ukranian_je, "Ukranian_je" },
512   { GDK_Macedonia_dse, "Macedonia_dse" },
513   { GDK_Ukrainian_i, "Ukrainian_i" },
514   { GDK_Ukranian_i, "Ukranian_i" },
515   { GDK_Ukrainian_yi, "Ukrainian_yi" },
516   { GDK_Ukranian_yi, "Ukranian_yi" },
517   { GDK_Cyrillic_je, "Cyrillic_je" },
518   { GDK_Serbian_je, "Serbian_je" },
519   { GDK_Cyrillic_lje, "Cyrillic_lje" },
520   { GDK_Serbian_lje, "Serbian_lje" },
521   { GDK_Cyrillic_nje, "Cyrillic_nje" },
522   { GDK_Serbian_nje, "Serbian_nje" },
523   { GDK_Serbian_tshe, "Serbian_tshe" },
524   { GDK_Macedonia_kje, "Macedonia_kje" },
525   { GDK_Byelorussian_shortu, "Byelorussian_shortu" },
526   { GDK_Cyrillic_dzhe, "Cyrillic_dzhe" },
527   { GDK_Serbian_dze, "Serbian_dze" },
528   { GDK_numerosign, "numerosign" },
529   { GDK_Serbian_DJE, "Serbian_DJE" },
530   { GDK_Macedonia_GJE, "Macedonia_GJE" },
531   { GDK_Cyrillic_IO, "Cyrillic_IO" },
532   { GDK_Ukrainian_IE, "Ukrainian_IE" },
533   { GDK_Ukranian_JE, "Ukranian_JE" },
534   { GDK_Macedonia_DSE, "Macedonia_DSE" },
535   { GDK_Ukrainian_I, "Ukrainian_I" },
536   { GDK_Ukranian_I, "Ukranian_I" },
537   { GDK_Ukrainian_YI, "Ukrainian_YI" },
538   { GDK_Ukranian_YI, "Ukranian_YI" },
539   { GDK_Cyrillic_JE, "Cyrillic_JE" },
540   { GDK_Serbian_JE, "Serbian_JE" },
541   { GDK_Cyrillic_LJE, "Cyrillic_LJE" },
542   { GDK_Serbian_LJE, "Serbian_LJE" },
543   { GDK_Cyrillic_NJE, "Cyrillic_NJE" },
544   { GDK_Serbian_NJE, "Serbian_NJE" },
545   { GDK_Serbian_TSHE, "Serbian_TSHE" },
546   { GDK_Macedonia_KJE, "Macedonia_KJE" },
547   { GDK_Byelorussian_SHORTU, "Byelorussian_SHORTU" },
548   { GDK_Cyrillic_DZHE, "Cyrillic_DZHE" },
549   { GDK_Serbian_DZE, "Serbian_DZE" },
550   { GDK_Cyrillic_yu, "Cyrillic_yu" },
551   { GDK_Cyrillic_a, "Cyrillic_a" },
552   { GDK_Cyrillic_be, "Cyrillic_be" },
553   { GDK_Cyrillic_tse, "Cyrillic_tse" },
554   { GDK_Cyrillic_de, "Cyrillic_de" },
555   { GDK_Cyrillic_ie, "Cyrillic_ie" },
556   { GDK_Cyrillic_ef, "Cyrillic_ef" },
557   { GDK_Cyrillic_ghe, "Cyrillic_ghe" },
558   { GDK_Cyrillic_ha, "Cyrillic_ha" },
559   { GDK_Cyrillic_i, "Cyrillic_i" },
560   { GDK_Cyrillic_shorti, "Cyrillic_shorti" },
561   { GDK_Cyrillic_ka, "Cyrillic_ka" },
562   { GDK_Cyrillic_el, "Cyrillic_el" },
563   { GDK_Cyrillic_em, "Cyrillic_em" },
564   { GDK_Cyrillic_en, "Cyrillic_en" },
565   { GDK_Cyrillic_o, "Cyrillic_o" },
566   { GDK_Cyrillic_pe, "Cyrillic_pe" },
567   { GDK_Cyrillic_ya, "Cyrillic_ya" },
568   { GDK_Cyrillic_er, "Cyrillic_er" },
569   { GDK_Cyrillic_es, "Cyrillic_es" },
570   { GDK_Cyrillic_te, "Cyrillic_te" },
571   { GDK_Cyrillic_u, "Cyrillic_u" },
572   { GDK_Cyrillic_zhe, "Cyrillic_zhe" },
573   { GDK_Cyrillic_ve, "Cyrillic_ve" },
574   { GDK_Cyrillic_softsign, "Cyrillic_softsign" },
575   { GDK_Cyrillic_yeru, "Cyrillic_yeru" },
576   { GDK_Cyrillic_ze, "Cyrillic_ze" },
577   { GDK_Cyrillic_sha, "Cyrillic_sha" },
578   { GDK_Cyrillic_e, "Cyrillic_e" },
579   { GDK_Cyrillic_shcha, "Cyrillic_shcha" },
580   { GDK_Cyrillic_che, "Cyrillic_che" },
581   { GDK_Cyrillic_hardsign, "Cyrillic_hardsign" },
582   { GDK_Cyrillic_YU, "Cyrillic_YU" },
583   { GDK_Cyrillic_A, "Cyrillic_A" },
584   { GDK_Cyrillic_BE, "Cyrillic_BE" },
585   { GDK_Cyrillic_TSE, "Cyrillic_TSE" },
586   { GDK_Cyrillic_DE, "Cyrillic_DE" },
587   { GDK_Cyrillic_IE, "Cyrillic_IE" },
588   { GDK_Cyrillic_EF, "Cyrillic_EF" },
589   { GDK_Cyrillic_GHE, "Cyrillic_GHE" },
590   { GDK_Cyrillic_HA, "Cyrillic_HA" },
591   { GDK_Cyrillic_I, "Cyrillic_I" },
592   { GDK_Cyrillic_SHORTI, "Cyrillic_SHORTI" },
593   { GDK_Cyrillic_KA, "Cyrillic_KA" },
594   { GDK_Cyrillic_EL, "Cyrillic_EL" },
595   { GDK_Cyrillic_EM, "Cyrillic_EM" },
596   { GDK_Cyrillic_EN, "Cyrillic_EN" },
597   { GDK_Cyrillic_O, "Cyrillic_O" },
598   { GDK_Cyrillic_PE, "Cyrillic_PE" },
599   { GDK_Cyrillic_YA, "Cyrillic_YA" },
600   { GDK_Cyrillic_ER, "Cyrillic_ER" },
601   { GDK_Cyrillic_ES, "Cyrillic_ES" },
602   { GDK_Cyrillic_TE, "Cyrillic_TE" },
603   { GDK_Cyrillic_U, "Cyrillic_U" },
604   { GDK_Cyrillic_ZHE, "Cyrillic_ZHE" },
605   { GDK_Cyrillic_VE, "Cyrillic_VE" },
606   { GDK_Cyrillic_SOFTSIGN, "Cyrillic_SOFTSIGN" },
607   { GDK_Cyrillic_YERU, "Cyrillic_YERU" },
608   { GDK_Cyrillic_ZE, "Cyrillic_ZE" },
609   { GDK_Cyrillic_SHA, "Cyrillic_SHA" },
610   { GDK_Cyrillic_E, "Cyrillic_E" },
611   { GDK_Cyrillic_SHCHA, "Cyrillic_SHCHA" },
612   { GDK_Cyrillic_CHE, "Cyrillic_CHE" },
613   { GDK_Cyrillic_HARDSIGN, "Cyrillic_HARDSIGN" },
614   { GDK_Greek_ALPHAaccent, "Greek_ALPHAaccent" },
615   { GDK_Greek_EPSILONaccent, "Greek_EPSILONaccent" },
616   { GDK_Greek_ETAaccent, "Greek_ETAaccent" },
617   { GDK_Greek_IOTAaccent, "Greek_IOTAaccent" },
618   { GDK_Greek_IOTAdiaeresis, "Greek_IOTAdiaeresis" },
619   { GDK_Greek_OMICRONaccent, "Greek_OMICRONaccent" },
620   { GDK_Greek_UPSILONaccent, "Greek_UPSILONaccent" },
621   { GDK_Greek_UPSILONdieresis, "Greek_UPSILONdieresis" },
622   { GDK_Greek_OMEGAaccent, "Greek_OMEGAaccent" },
623   { GDK_Greek_accentdieresis, "Greek_accentdieresis" },
624   { GDK_Greek_horizbar, "Greek_horizbar" },
625   { GDK_Greek_alphaaccent, "Greek_alphaaccent" },
626   { GDK_Greek_epsilonaccent, "Greek_epsilonaccent" },
627   { GDK_Greek_etaaccent, "Greek_etaaccent" },
628   { GDK_Greek_iotaaccent, "Greek_iotaaccent" },
629   { GDK_Greek_iotadieresis, "Greek_iotadieresis" },
630   { GDK_Greek_iotaaccentdieresis, "Greek_iotaaccentdieresis" },
631   { GDK_Greek_omicronaccent, "Greek_omicronaccent" },
632   { GDK_Greek_upsilonaccent, "Greek_upsilonaccent" },
633   { GDK_Greek_upsilondieresis, "Greek_upsilondieresis" },
634   { GDK_Greek_upsilonaccentdieresis, "Greek_upsilonaccentdieresis" },
635   { GDK_Greek_omegaaccent, "Greek_omegaaccent" },
636   { GDK_Greek_ALPHA, "Greek_ALPHA" },
637   { GDK_Greek_BETA, "Greek_BETA" },
638   { GDK_Greek_GAMMA, "Greek_GAMMA" },
639   { GDK_Greek_DELTA, "Greek_DELTA" },
640   { GDK_Greek_EPSILON, "Greek_EPSILON" },
641   { GDK_Greek_ZETA, "Greek_ZETA" },
642   { GDK_Greek_ETA, "Greek_ETA" },
643   { GDK_Greek_THETA, "Greek_THETA" },
644   { GDK_Greek_IOTA, "Greek_IOTA" },
645   { GDK_Greek_KAPPA, "Greek_KAPPA" },
646   { GDK_Greek_LAMDA, "Greek_LAMDA" },
647   { GDK_Greek_LAMBDA, "Greek_LAMBDA" },
648   { GDK_Greek_MU, "Greek_MU" },
649   { GDK_Greek_NU, "Greek_NU" },
650   { GDK_Greek_XI, "Greek_XI" },
651   { GDK_Greek_OMICRON, "Greek_OMICRON" },
652   { GDK_Greek_PI, "Greek_PI" },
653   { GDK_Greek_RHO, "Greek_RHO" },
654   { GDK_Greek_SIGMA, "Greek_SIGMA" },
655   { GDK_Greek_TAU, "Greek_TAU" },
656   { GDK_Greek_UPSILON, "Greek_UPSILON" },
657   { GDK_Greek_PHI, "Greek_PHI" },
658   { GDK_Greek_CHI, "Greek_CHI" },
659   { GDK_Greek_PSI, "Greek_PSI" },
660   { GDK_Greek_OMEGA, "Greek_OMEGA" },
661   { GDK_Greek_alpha, "Greek_alpha" },
662   { GDK_Greek_beta, "Greek_beta" },
663   { GDK_Greek_gamma, "Greek_gamma" },
664   { GDK_Greek_delta, "Greek_delta" },
665   { GDK_Greek_epsilon, "Greek_epsilon" },
666   { GDK_Greek_zeta, "Greek_zeta" },
667   { GDK_Greek_eta, "Greek_eta" },
668   { GDK_Greek_theta, "Greek_theta" },
669   { GDK_Greek_iota, "Greek_iota" },
670   { GDK_Greek_kappa, "Greek_kappa" },
671   { GDK_Greek_lamda, "Greek_lamda" },
672   { GDK_Greek_lambda, "Greek_lambda" },
673   { GDK_Greek_mu, "Greek_mu" },
674   { GDK_Greek_nu, "Greek_nu" },
675   { GDK_Greek_xi, "Greek_xi" },
676   { GDK_Greek_omicron, "Greek_omicron" },
677   { GDK_Greek_pi, "Greek_pi" },
678   { GDK_Greek_rho, "Greek_rho" },
679   { GDK_Greek_sigma, "Greek_sigma" },
680   { GDK_Greek_finalsmallsigma, "Greek_finalsmallsigma" },
681   { GDK_Greek_tau, "Greek_tau" },
682   { GDK_Greek_upsilon, "Greek_upsilon" },
683   { GDK_Greek_phi, "Greek_phi" },
684   { GDK_Greek_chi, "Greek_chi" },
685   { GDK_Greek_psi, "Greek_psi" },
686   { GDK_Greek_omega, "Greek_omega" },
687   { GDK_leftradical, "leftradical" },
688   { GDK_topleftradical, "topleftradical" },
689   { GDK_horizconnector, "horizconnector" },
690   { GDK_topintegral, "topintegral" },
691   { GDK_botintegral, "botintegral" },
692   { GDK_vertconnector, "vertconnector" },
693   { GDK_topleftsqbracket, "topleftsqbracket" },
694   { GDK_botleftsqbracket, "botleftsqbracket" },
695   { GDK_toprightsqbracket, "toprightsqbracket" },
696   { GDK_botrightsqbracket, "botrightsqbracket" },
697   { GDK_topleftparens, "topleftparens" },
698   { GDK_botleftparens, "botleftparens" },
699   { GDK_toprightparens, "toprightparens" },
700   { GDK_botrightparens, "botrightparens" },
701   { GDK_leftmiddlecurlybrace, "leftmiddlecurlybrace" },
702   { GDK_rightmiddlecurlybrace, "rightmiddlecurlybrace" },
703   { GDK_topleftsummation, "topleftsummation" },
704   { GDK_botleftsummation, "botleftsummation" },
705   { GDK_topvertsummationconnector, "topvertsummationconnector" },
706   { GDK_botvertsummationconnector, "botvertsummationconnector" },
707   { GDK_toprightsummation, "toprightsummation" },
708   { GDK_botrightsummation, "botrightsummation" },
709   { GDK_rightmiddlesummation, "rightmiddlesummation" },
710   { GDK_lessthanequal, "lessthanequal" },
711   { GDK_notequal, "notequal" },
712   { GDK_greaterthanequal, "greaterthanequal" },
713   { GDK_integral, "integral" },
714   { GDK_therefore, "therefore" },
715   { GDK_variation, "variation" },
716   { GDK_infinity, "infinity" },
717   { GDK_nabla, "nabla" },
718   { GDK_approximate, "approximate" },
719   { GDK_similarequal, "similarequal" },
720   { GDK_ifonlyif, "ifonlyif" },
721   { GDK_implies, "implies" },
722   { GDK_identical, "identical" },
723   { GDK_radical, "radical" },
724   { GDK_includedin, "includedin" },
725   { GDK_includes, "includes" },
726   { GDK_intersection, "intersection" },
727   { GDK_union, "union" },
728   { GDK_logicaland, "logicaland" },
729   { GDK_logicalor, "logicalor" },
730   { GDK_partialderivative, "partialderivative" },
731   { GDK_function, "function" },
732   { GDK_leftarrow, "leftarrow" },
733   { GDK_uparrow, "uparrow" },
734   { GDK_rightarrow, "rightarrow" },
735   { GDK_downarrow, "downarrow" },
736   { GDK_blank, "blank" },
737   { GDK_soliddiamond, "soliddiamond" },
738   { GDK_checkerboard, "checkerboard" },
739   { GDK_ht, "ht" },
740   { GDK_ff, "ff" },
741   { GDK_cr, "cr" },
742   { GDK_lf, "lf" },
743   { GDK_nl, "nl" },
744   { GDK_vt, "vt" },
745   { GDK_lowrightcorner, "lowrightcorner" },
746   { GDK_uprightcorner, "uprightcorner" },
747   { GDK_upleftcorner, "upleftcorner" },
748   { GDK_lowleftcorner, "lowleftcorner" },
749   { GDK_crossinglines, "crossinglines" },
750   { GDK_horizlinescan1, "horizlinescan1" },
751   { GDK_horizlinescan3, "horizlinescan3" },
752   { GDK_horizlinescan5, "horizlinescan5" },
753   { GDK_horizlinescan7, "horizlinescan7" },
754   { GDK_horizlinescan9, "horizlinescan9" },
755   { GDK_leftt, "leftt" },
756   { GDK_rightt, "rightt" },
757   { GDK_bott, "bott" },
758   { GDK_topt, "topt" },
759   { GDK_vertbar, "vertbar" },
760   { GDK_emspace, "emspace" },
761   { GDK_enspace, "enspace" },
762   { GDK_em3space, "em3space" },
763   { GDK_em4space, "em4space" },
764   { GDK_digitspace, "digitspace" },
765   { GDK_punctspace, "punctspace" },
766   { GDK_thinspace, "thinspace" },
767   { GDK_hairspace, "hairspace" },
768   { GDK_emdash, "emdash" },
769   { GDK_endash, "endash" },
770   { GDK_signifblank, "signifblank" },
771   { GDK_ellipsis, "ellipsis" },
772   { GDK_doubbaselinedot, "doubbaselinedot" },
773   { GDK_onethird, "onethird" },
774   { GDK_twothirds, "twothirds" },
775   { GDK_onefifth, "onefifth" },
776   { GDK_twofifths, "twofifths" },
777   { GDK_threefifths, "threefifths" },
778   { GDK_fourfifths, "fourfifths" },
779   { GDK_onesixth, "onesixth" },
780   { GDK_fivesixths, "fivesixths" },
781   { GDK_careof, "careof" },
782   { GDK_figdash, "figdash" },
783   { GDK_leftanglebracket, "leftanglebracket" },
784   { GDK_decimalpoint, "decimalpoint" },
785   { GDK_rightanglebracket, "rightanglebracket" },
786   { GDK_marker, "marker" },
787   { GDK_oneeighth, "oneeighth" },
788   { GDK_threeeighths, "threeeighths" },
789   { GDK_fiveeighths, "fiveeighths" },
790   { GDK_seveneighths, "seveneighths" },
791   { GDK_trademark, "trademark" },
792   { GDK_signaturemark, "signaturemark" },
793   { GDK_trademarkincircle, "trademarkincircle" },
794   { GDK_leftopentriangle, "leftopentriangle" },
795   { GDK_rightopentriangle, "rightopentriangle" },
796   { GDK_emopencircle, "emopencircle" },
797   { GDK_emopenrectangle, "emopenrectangle" },
798   { GDK_leftsinglequotemark, "leftsinglequotemark" },
799   { GDK_rightsinglequotemark, "rightsinglequotemark" },
800   { GDK_leftdoublequotemark, "leftdoublequotemark" },
801   { GDK_rightdoublequotemark, "rightdoublequotemark" },
802   { GDK_prescription, "prescription" },
803   { GDK_minutes, "minutes" },
804   { GDK_seconds, "seconds" },
805   { GDK_latincross, "latincross" },
806   { GDK_hexagram, "hexagram" },
807   { GDK_filledrectbullet, "filledrectbullet" },
808   { GDK_filledlefttribullet, "filledlefttribullet" },
809   { GDK_filledrighttribullet, "filledrighttribullet" },
810   { GDK_emfilledcircle, "emfilledcircle" },
811   { GDK_emfilledrect, "emfilledrect" },
812   { GDK_enopencircbullet, "enopencircbullet" },
813   { GDK_enopensquarebullet, "enopensquarebullet" },
814   { GDK_openrectbullet, "openrectbullet" },
815   { GDK_opentribulletup, "opentribulletup" },
816   { GDK_opentribulletdown, "opentribulletdown" },
817   { GDK_openstar, "openstar" },
818   { GDK_enfilledcircbullet, "enfilledcircbullet" },
819   { GDK_enfilledsqbullet, "enfilledsqbullet" },
820   { GDK_filledtribulletup, "filledtribulletup" },
821   { GDK_filledtribulletdown, "filledtribulletdown" },
822   { GDK_leftpointer, "leftpointer" },
823   { GDK_rightpointer, "rightpointer" },
824   { GDK_club, "club" },
825   { GDK_diamond, "diamond" },
826   { GDK_heart, "heart" },
827   { GDK_maltesecross, "maltesecross" },
828   { GDK_dagger, "dagger" },
829   { GDK_doubledagger, "doubledagger" },
830   { GDK_checkmark, "checkmark" },
831   { GDK_ballotcross, "ballotcross" },
832   { GDK_musicalsharp, "musicalsharp" },
833   { GDK_musicalflat, "musicalflat" },
834   { GDK_malesymbol, "malesymbol" },
835   { GDK_femalesymbol, "femalesymbol" },
836   { GDK_telephone, "telephone" },
837   { GDK_telephonerecorder, "telephonerecorder" },
838   { GDK_phonographcopyright, "phonographcopyright" },
839   { GDK_caret, "caret" },
840   { GDK_singlelowquotemark, "singlelowquotemark" },
841   { GDK_doublelowquotemark, "doublelowquotemark" },
842   { GDK_cursor, "cursor" },
843   { GDK_leftcaret, "leftcaret" },
844   { GDK_rightcaret, "rightcaret" },
845   { GDK_downcaret, "downcaret" },
846   { GDK_upcaret, "upcaret" },
847   { GDK_overbar, "overbar" },
848   { GDK_downtack, "downtack" },
849   { GDK_upshoe, "upshoe" },
850   { GDK_downstile, "downstile" },
851   { GDK_underbar, "underbar" },
852   { GDK_jot, "jot" },
853   { GDK_quad, "quad" },
854   { GDK_uptack, "uptack" },
855   { GDK_circle, "circle" },
856   { GDK_upstile, "upstile" },
857   { GDK_downshoe, "downshoe" },
858   { GDK_rightshoe, "rightshoe" },
859   { GDK_leftshoe, "leftshoe" },
860   { GDK_lefttack, "lefttack" },
861   { GDK_righttack, "righttack" },
862   { GDK_hebrew_doublelowline, "hebrew_doublelowline" },
863   { GDK_hebrew_aleph, "hebrew_aleph" },
864   { GDK_hebrew_bet, "hebrew_bet" },
865   { GDK_hebrew_beth, "hebrew_beth" },
866   { GDK_hebrew_gimel, "hebrew_gimel" },
867   { GDK_hebrew_gimmel, "hebrew_gimmel" },
868   { GDK_hebrew_dalet, "hebrew_dalet" },
869   { GDK_hebrew_daleth, "hebrew_daleth" },
870   { GDK_hebrew_he, "hebrew_he" },
871   { GDK_hebrew_waw, "hebrew_waw" },
872   { GDK_hebrew_zain, "hebrew_zain" },
873   { GDK_hebrew_zayin, "hebrew_zayin" },
874   { GDK_hebrew_chet, "hebrew_chet" },
875   { GDK_hebrew_het, "hebrew_het" },
876   { GDK_hebrew_tet, "hebrew_tet" },
877   { GDK_hebrew_teth, "hebrew_teth" },
878   { GDK_hebrew_yod, "hebrew_yod" },
879   { GDK_hebrew_finalkaph, "hebrew_finalkaph" },
880   { GDK_hebrew_kaph, "hebrew_kaph" },
881   { GDK_hebrew_lamed, "hebrew_lamed" },
882   { GDK_hebrew_finalmem, "hebrew_finalmem" },
883   { GDK_hebrew_mem, "hebrew_mem" },
884   { GDK_hebrew_finalnun, "hebrew_finalnun" },
885   { GDK_hebrew_nun, "hebrew_nun" },
886   { GDK_hebrew_samech, "hebrew_samech" },
887   { GDK_hebrew_samekh, "hebrew_samekh" },
888   { GDK_hebrew_ayin, "hebrew_ayin" },
889   { GDK_hebrew_finalpe, "hebrew_finalpe" },
890   { GDK_hebrew_pe, "hebrew_pe" },
891   { GDK_hebrew_finalzade, "hebrew_finalzade" },
892   { GDK_hebrew_finalzadi, "hebrew_finalzadi" },
893   { GDK_hebrew_zade, "hebrew_zade" },
894   { GDK_hebrew_zadi, "hebrew_zadi" },
895   { GDK_hebrew_qoph, "hebrew_qoph" },
896   { GDK_hebrew_kuf, "hebrew_kuf" },
897   { GDK_hebrew_resh, "hebrew_resh" },
898   { GDK_hebrew_shin, "hebrew_shin" },
899   { GDK_hebrew_taw, "hebrew_taw" },
900   { GDK_hebrew_taf, "hebrew_taf" },
901   { GDK_Thai_kokai, "Thai_kokai" },
902   { GDK_Thai_khokhai, "Thai_khokhai" },
903   { GDK_Thai_khokhuat, "Thai_khokhuat" },
904   { GDK_Thai_khokhwai, "Thai_khokhwai" },
905   { GDK_Thai_khokhon, "Thai_khokhon" },
906   { GDK_Thai_khorakhang, "Thai_khorakhang" },
907   { GDK_Thai_ngongu, "Thai_ngongu" },
908   { GDK_Thai_chochan, "Thai_chochan" },
909   { GDK_Thai_choching, "Thai_choching" },
910   { GDK_Thai_chochang, "Thai_chochang" },
911   { GDK_Thai_soso, "Thai_soso" },
912   { GDK_Thai_chochoe, "Thai_chochoe" },
913   { GDK_Thai_yoying, "Thai_yoying" },
914   { GDK_Thai_dochada, "Thai_dochada" },
915   { GDK_Thai_topatak, "Thai_topatak" },
916   { GDK_Thai_thothan, "Thai_thothan" },
917   { GDK_Thai_thonangmontho, "Thai_thonangmontho" },
918   { GDK_Thai_thophuthao, "Thai_thophuthao" },
919   { GDK_Thai_nonen, "Thai_nonen" },
920   { GDK_Thai_dodek, "Thai_dodek" },
921   { GDK_Thai_totao, "Thai_totao" },
922   { GDK_Thai_thothung, "Thai_thothung" },
923   { GDK_Thai_thothahan, "Thai_thothahan" },
924   { GDK_Thai_thothong, "Thai_thothong" },
925   { GDK_Thai_nonu, "Thai_nonu" },
926   { GDK_Thai_bobaimai, "Thai_bobaimai" },
927   { GDK_Thai_popla, "Thai_popla" },
928   { GDK_Thai_phophung, "Thai_phophung" },
929   { GDK_Thai_fofa, "Thai_fofa" },
930   { GDK_Thai_phophan, "Thai_phophan" },
931   { GDK_Thai_fofan, "Thai_fofan" },
932   { GDK_Thai_phosamphao, "Thai_phosamphao" },
933   { GDK_Thai_moma, "Thai_moma" },
934   { GDK_Thai_yoyak, "Thai_yoyak" },
935   { GDK_Thai_rorua, "Thai_rorua" },
936   { GDK_Thai_ru, "Thai_ru" },
937   { GDK_Thai_loling, "Thai_loling" },
938   { GDK_Thai_lu, "Thai_lu" },
939   { GDK_Thai_wowaen, "Thai_wowaen" },
940   { GDK_Thai_sosala, "Thai_sosala" },
941   { GDK_Thai_sorusi, "Thai_sorusi" },
942   { GDK_Thai_sosua, "Thai_sosua" },
943   { GDK_Thai_hohip, "Thai_hohip" },
944   { GDK_Thai_lochula, "Thai_lochula" },
945   { GDK_Thai_oang, "Thai_oang" },
946   { GDK_Thai_honokhuk, "Thai_honokhuk" },
947   { GDK_Thai_paiyannoi, "Thai_paiyannoi" },
948   { GDK_Thai_saraa, "Thai_saraa" },
949   { GDK_Thai_maihanakat, "Thai_maihanakat" },
950   { GDK_Thai_saraaa, "Thai_saraaa" },
951   { GDK_Thai_saraam, "Thai_saraam" },
952   { GDK_Thai_sarai, "Thai_sarai" },
953   { GDK_Thai_saraii, "Thai_saraii" },
954   { GDK_Thai_saraue, "Thai_saraue" },
955   { GDK_Thai_sarauee, "Thai_sarauee" },
956   { GDK_Thai_sarau, "Thai_sarau" },
957   { GDK_Thai_sarauu, "Thai_sarauu" },
958   { GDK_Thai_phinthu, "Thai_phinthu" },
959   { GDK_Thai_maihanakat_maitho, "Thai_maihanakat_maitho" },
960   { GDK_Thai_baht, "Thai_baht" },
961   { GDK_Thai_sarae, "Thai_sarae" },
962   { GDK_Thai_saraae, "Thai_saraae" },
963   { GDK_Thai_sarao, "Thai_sarao" },
964   { GDK_Thai_saraaimaimuan, "Thai_saraaimaimuan" },
965   { GDK_Thai_saraaimaimalai, "Thai_saraaimaimalai" },
966   { GDK_Thai_lakkhangyao, "Thai_lakkhangyao" },
967   { GDK_Thai_maiyamok, "Thai_maiyamok" },
968   { GDK_Thai_maitaikhu, "Thai_maitaikhu" },
969   { GDK_Thai_maiek, "Thai_maiek" },
970   { GDK_Thai_maitho, "Thai_maitho" },
971   { GDK_Thai_maitri, "Thai_maitri" },
972   { GDK_Thai_maichattawa, "Thai_maichattawa" },
973   { GDK_Thai_thanthakhat, "Thai_thanthakhat" },
974   { GDK_Thai_nikhahit, "Thai_nikhahit" },
975   { GDK_Thai_leksun, "Thai_leksun" },
976   { GDK_Thai_leknung, "Thai_leknung" },
977   { GDK_Thai_leksong, "Thai_leksong" },
978   { GDK_Thai_leksam, "Thai_leksam" },
979   { GDK_Thai_leksi, "Thai_leksi" },
980   { GDK_Thai_lekha, "Thai_lekha" },
981   { GDK_Thai_lekhok, "Thai_lekhok" },
982   { GDK_Thai_lekchet, "Thai_lekchet" },
983   { GDK_Thai_lekpaet, "Thai_lekpaet" },
984   { GDK_Thai_lekkao, "Thai_lekkao" },
985   { GDK_Hangul_Kiyeog, "Hangul_Kiyeog" },
986   { GDK_Hangul_SsangKiyeog, "Hangul_SsangKiyeog" },
987   { GDK_Hangul_KiyeogSios, "Hangul_KiyeogSios" },
988   { GDK_Hangul_Nieun, "Hangul_Nieun" },
989   { GDK_Hangul_NieunJieuj, "Hangul_NieunJieuj" },
990   { GDK_Hangul_NieunHieuh, "Hangul_NieunHieuh" },
991   { GDK_Hangul_Dikeud, "Hangul_Dikeud" },
992   { GDK_Hangul_SsangDikeud, "Hangul_SsangDikeud" },
993   { GDK_Hangul_Rieul, "Hangul_Rieul" },
994   { GDK_Hangul_RieulKiyeog, "Hangul_RieulKiyeog" },
995   { GDK_Hangul_RieulMieum, "Hangul_RieulMieum" },
996   { GDK_Hangul_RieulPieub, "Hangul_RieulPieub" },
997   { GDK_Hangul_RieulSios, "Hangul_RieulSios" },
998   { GDK_Hangul_RieulTieut, "Hangul_RieulTieut" },
999   { GDK_Hangul_RieulPhieuf, "Hangul_RieulPhieuf" },
1000   { GDK_Hangul_RieulHieuh, "Hangul_RieulHieuh" },
1001   { GDK_Hangul_Mieum, "Hangul_Mieum" },
1002   { GDK_Hangul_Pieub, "Hangul_Pieub" },
1003   { GDK_Hangul_SsangPieub, "Hangul_SsangPieub" },
1004   { GDK_Hangul_PieubSios, "Hangul_PieubSios" },
1005   { GDK_Hangul_Sios, "Hangul_Sios" },
1006   { GDK_Hangul_SsangSios, "Hangul_SsangSios" },
1007   { GDK_Hangul_Ieung, "Hangul_Ieung" },
1008   { GDK_Hangul_Jieuj, "Hangul_Jieuj" },
1009   { GDK_Hangul_SsangJieuj, "Hangul_SsangJieuj" },
1010   { GDK_Hangul_Cieuc, "Hangul_Cieuc" },
1011   { GDK_Hangul_Khieuq, "Hangul_Khieuq" },
1012   { GDK_Hangul_Tieut, "Hangul_Tieut" },
1013   { GDK_Hangul_Phieuf, "Hangul_Phieuf" },
1014   { GDK_Hangul_Hieuh, "Hangul_Hieuh" },
1015   { GDK_Hangul_A, "Hangul_A" },
1016   { GDK_Hangul_AE, "Hangul_AE" },
1017   { GDK_Hangul_YA, "Hangul_YA" },
1018   { GDK_Hangul_YAE, "Hangul_YAE" },
1019   { GDK_Hangul_EO, "Hangul_EO" },
1020   { GDK_Hangul_E, "Hangul_E" },
1021   { GDK_Hangul_YEO, "Hangul_YEO" },
1022   { GDK_Hangul_YE, "Hangul_YE" },
1023   { GDK_Hangul_O, "Hangul_O" },
1024   { GDK_Hangul_WA, "Hangul_WA" },
1025   { GDK_Hangul_WAE, "Hangul_WAE" },
1026   { GDK_Hangul_OE, "Hangul_OE" },
1027   { GDK_Hangul_YO, "Hangul_YO" },
1028   { GDK_Hangul_U, "Hangul_U" },
1029   { GDK_Hangul_WEO, "Hangul_WEO" },
1030   { GDK_Hangul_WE, "Hangul_WE" },
1031   { GDK_Hangul_WI, "Hangul_WI" },
1032   { GDK_Hangul_YU, "Hangul_YU" },
1033   { GDK_Hangul_EU, "Hangul_EU" },
1034   { GDK_Hangul_YI, "Hangul_YI" },
1035   { GDK_Hangul_I, "Hangul_I" },
1036   { GDK_Hangul_J_Kiyeog, "Hangul_J_Kiyeog" },
1037   { GDK_Hangul_J_SsangKiyeog, "Hangul_J_SsangKiyeog" },
1038   { GDK_Hangul_J_KiyeogSios, "Hangul_J_KiyeogSios" },
1039   { GDK_Hangul_J_Nieun, "Hangul_J_Nieun" },
1040   { GDK_Hangul_J_NieunJieuj, "Hangul_J_NieunJieuj" },
1041   { GDK_Hangul_J_NieunHieuh, "Hangul_J_NieunHieuh" },
1042   { GDK_Hangul_J_Dikeud, "Hangul_J_Dikeud" },
1043   { GDK_Hangul_J_Rieul, "Hangul_J_Rieul" },
1044   { GDK_Hangul_J_RieulKiyeog, "Hangul_J_RieulKiyeog" },
1045   { GDK_Hangul_J_RieulMieum, "Hangul_J_RieulMieum" },
1046   { GDK_Hangul_J_RieulPieub, "Hangul_J_RieulPieub" },
1047   { GDK_Hangul_J_RieulSios, "Hangul_J_RieulSios" },
1048   { GDK_Hangul_J_RieulTieut, "Hangul_J_RieulTieut" },
1049   { GDK_Hangul_J_RieulPhieuf, "Hangul_J_RieulPhieuf" },
1050   { GDK_Hangul_J_RieulHieuh, "Hangul_J_RieulHieuh" },
1051   { GDK_Hangul_J_Mieum, "Hangul_J_Mieum" },
1052   { GDK_Hangul_J_Pieub, "Hangul_J_Pieub" },
1053   { GDK_Hangul_J_PieubSios, "Hangul_J_PieubSios" },
1054   { GDK_Hangul_J_Sios, "Hangul_J_Sios" },
1055   { GDK_Hangul_J_SsangSios, "Hangul_J_SsangSios" },
1056   { GDK_Hangul_J_Ieung, "Hangul_J_Ieung" },
1057   { GDK_Hangul_J_Jieuj, "Hangul_J_Jieuj" },
1058   { GDK_Hangul_J_Cieuc, "Hangul_J_Cieuc" },
1059   { GDK_Hangul_J_Khieuq, "Hangul_J_Khieuq" },
1060   { GDK_Hangul_J_Tieut, "Hangul_J_Tieut" },
1061   { GDK_Hangul_J_Phieuf, "Hangul_J_Phieuf" },
1062   { GDK_Hangul_J_Hieuh, "Hangul_J_Hieuh" },
1063   { GDK_Hangul_RieulYeorinHieuh, "Hangul_RieulYeorinHieuh" },
1064   { GDK_Hangul_SunkyeongeumMieum, "Hangul_SunkyeongeumMieum" },
1065   { GDK_Hangul_SunkyeongeumPieub, "Hangul_SunkyeongeumPieub" },
1066   { GDK_Hangul_PanSios, "Hangul_PanSios" },
1067   { GDK_Hangul_KkogjiDalrinIeung, "Hangul_KkogjiDalrinIeung" },
1068   { GDK_Hangul_SunkyeongeumPhieuf, "Hangul_SunkyeongeumPhieuf" },
1069   { GDK_Hangul_YeorinHieuh, "Hangul_YeorinHieuh" },
1070   { GDK_Hangul_AraeA, "Hangul_AraeA" },
1071   { GDK_Hangul_AraeAE, "Hangul_AraeAE" },
1072   { GDK_Hangul_J_PanSios, "Hangul_J_PanSios" },
1073   { GDK_Hangul_J_KkogjiDalrinIeung, "Hangul_J_KkogjiDalrinIeung" },
1074   { GDK_Hangul_J_YeorinHieuh, "Hangul_J_YeorinHieuh" },
1075   { GDK_Korean_Won, "Korean_Won" },
1076   { GDK_OE, "OE" },
1077   { GDK_oe, "oe" },
1078   { GDK_Ydiaeresis, "Ydiaeresis" },
1079   { GDK_EcuSign, "EcuSign" },
1080   { GDK_ColonSign, "ColonSign" },
1081   { GDK_CruzeiroSign, "CruzeiroSign" },
1082   { GDK_FFrancSign, "FFrancSign" },
1083   { GDK_LiraSign, "LiraSign" },
1084   { GDK_MillSign, "MillSign" },
1085   { GDK_NairaSign, "NairaSign" },
1086   { GDK_PesetaSign, "PesetaSign" },
1087   { GDK_RupeeSign, "RupeeSign" },
1088   { GDK_WonSign, "WonSign" },
1089   { GDK_NewSheqelSign, "NewSheqelSign" },
1090   { GDK_DongSign, "DongSign" },
1091   { GDK_EuroSign, "EuroSign" },
1092   { GDK_3270_Duplicate, "3270_Duplicate" },
1093   { GDK_3270_FieldMark, "3270_FieldMark" },
1094   { GDK_3270_Right2, "3270_Right2" },
1095   { GDK_3270_Left2, "3270_Left2" },
1096   { GDK_3270_BackTab, "3270_BackTab" },
1097   { GDK_3270_EraseEOF, "3270_EraseEOF" },
1098   { GDK_3270_EraseInput, "3270_EraseInput" },
1099   { GDK_3270_Reset, "3270_Reset" },
1100   { GDK_3270_Quit, "3270_Quit" },
1101   { GDK_3270_PA1, "3270_PA1" },
1102   { GDK_3270_PA2, "3270_PA2" },
1103   { GDK_3270_PA3, "3270_PA3" },
1104   { GDK_3270_Test, "3270_Test" },
1105   { GDK_3270_Attn, "3270_Attn" },
1106   { GDK_3270_CursorBlink, "3270_CursorBlink" },
1107   { GDK_3270_AltCursor, "3270_AltCursor" },
1108   { GDK_3270_KeyClick, "3270_KeyClick" },
1109   { GDK_3270_Jump, "3270_Jump" },
1110   { GDK_3270_Ident, "3270_Ident" },
1111   { GDK_3270_Rule, "3270_Rule" },
1112   { GDK_3270_Copy, "3270_Copy" },
1113   { GDK_3270_Play, "3270_Play" },
1114   { GDK_3270_Setup, "3270_Setup" },
1115   { GDK_3270_Record, "3270_Record" },
1116   { GDK_3270_ChangeScreen, "3270_ChangeScreen" },
1117   { GDK_3270_DeleteWord, "3270_DeleteWord" },
1118   { GDK_3270_ExSelect, "3270_ExSelect" },
1119   { GDK_3270_CursorSelect, "3270_CursorSelect" },
1120   { GDK_3270_PrintScreen, "3270_PrintScreen" },
1121   { GDK_3270_Enter, "3270_Enter" },
1122   { GDK_ISO_Lock, "ISO_Lock" },
1123   { GDK_ISO_Level2_Latch, "ISO_Level2_Latch" },
1124   { GDK_ISO_Level3_Shift, "ISO_Level3_Shift" },
1125   { GDK_ISO_Level3_Latch, "ISO_Level3_Latch" },
1126   { GDK_ISO_Level3_Lock, "ISO_Level3_Lock" },
1127   { GDK_ISO_Group_Latch, "ISO_Group_Latch" },
1128   { GDK_ISO_Group_Lock, "ISO_Group_Lock" },
1129   { GDK_ISO_Next_Group, "ISO_Next_Group" },
1130   { GDK_ISO_Next_Group_Lock, "ISO_Next_Group_Lock" },
1131   { GDK_ISO_Prev_Group, "ISO_Prev_Group" },
1132   { GDK_ISO_Prev_Group_Lock, "ISO_Prev_Group_Lock" },
1133   { GDK_ISO_First_Group, "ISO_First_Group" },
1134   { GDK_ISO_First_Group_Lock, "ISO_First_Group_Lock" },
1135   { GDK_ISO_Last_Group, "ISO_Last_Group" },
1136   { GDK_ISO_Last_Group_Lock, "ISO_Last_Group_Lock" },
1137   { GDK_ISO_Left_Tab, "ISO_Left_Tab" },
1138   { GDK_ISO_Move_Line_Up, "ISO_Move_Line_Up" },
1139   { GDK_ISO_Move_Line_Down, "ISO_Move_Line_Down" },
1140   { GDK_ISO_Partial_Line_Up, "ISO_Partial_Line_Up" },
1141   { GDK_ISO_Partial_Line_Down, "ISO_Partial_Line_Down" },
1142   { GDK_ISO_Partial_Space_Left, "ISO_Partial_Space_Left" },
1143   { GDK_ISO_Partial_Space_Right, "ISO_Partial_Space_Right" },
1144   { GDK_ISO_Set_Margin_Left, "ISO_Set_Margin_Left" },
1145   { GDK_ISO_Set_Margin_Right, "ISO_Set_Margin_Right" },
1146   { GDK_ISO_Release_Margin_Left, "ISO_Release_Margin_Left" },
1147   { GDK_ISO_Release_Margin_Right, "ISO_Release_Margin_Right" },
1148   { GDK_ISO_Release_Both_Margins, "ISO_Release_Both_Margins" },
1149   { GDK_ISO_Fast_Cursor_Left, "ISO_Fast_Cursor_Left" },
1150   { GDK_ISO_Fast_Cursor_Right, "ISO_Fast_Cursor_Right" },
1151   { GDK_ISO_Fast_Cursor_Up, "ISO_Fast_Cursor_Up" },
1152   { GDK_ISO_Fast_Cursor_Down, "ISO_Fast_Cursor_Down" },
1153   { GDK_ISO_Continuous_Underline, "ISO_Continuous_Underline" },
1154   { GDK_ISO_Discontinuous_Underline, "ISO_Discontinuous_Underline" },
1155   { GDK_ISO_Emphasize, "ISO_Emphasize" },
1156   { GDK_ISO_Center_Object, "ISO_Center_Object" },
1157   { GDK_ISO_Enter, "ISO_Enter" },
1158   { GDK_dead_grave, "dead_grave" },
1159   { GDK_dead_acute, "dead_acute" },
1160   { GDK_dead_circumflex, "dead_circumflex" },
1161   { GDK_dead_tilde, "dead_tilde" },
1162   { GDK_dead_macron, "dead_macron" },
1163   { GDK_dead_breve, "dead_breve" },
1164   { GDK_dead_abovedot, "dead_abovedot" },
1165   { GDK_dead_diaeresis, "dead_diaeresis" },
1166   { GDK_dead_abovering, "dead_abovering" },
1167   { GDK_dead_doubleacute, "dead_doubleacute" },
1168   { GDK_dead_caron, "dead_caron" },
1169   { GDK_dead_cedilla, "dead_cedilla" },
1170   { GDK_dead_ogonek, "dead_ogonek" },
1171   { GDK_dead_iota, "dead_iota" },
1172   { GDK_dead_voiced_sound, "dead_voiced_sound" },
1173   { GDK_dead_semivoiced_sound, "dead_semivoiced_sound" },
1174   { GDK_dead_belowdot, "dead_belowdot" },
1175   { GDK_AccessX_Enable, "AccessX_Enable" },
1176   { GDK_AccessX_Feedback_Enable, "AccessX_Feedback_Enable" },
1177   { GDK_RepeatKeys_Enable, "RepeatKeys_Enable" },
1178   { GDK_SlowKeys_Enable, "SlowKeys_Enable" },
1179   { GDK_BounceKeys_Enable, "BounceKeys_Enable" },
1180   { GDK_StickyKeys_Enable, "StickyKeys_Enable" },
1181   { GDK_MouseKeys_Enable, "MouseKeys_Enable" },
1182   { GDK_MouseKeys_Accel_Enable, "MouseKeys_Accel_Enable" },
1183   { GDK_Overlay1_Enable, "Overlay1_Enable" },
1184   { GDK_Overlay2_Enable, "Overlay2_Enable" },
1185   { GDK_AudibleBell_Enable, "AudibleBell_Enable" },
1186   { GDK_First_Virtual_Screen, "First_Virtual_Screen" },
1187   { GDK_Prev_Virtual_Screen, "Prev_Virtual_Screen" },
1188   { GDK_Next_Virtual_Screen, "Next_Virtual_Screen" },
1189   { GDK_Last_Virtual_Screen, "Last_Virtual_Screen" },
1190   { GDK_Terminate_Server, "Terminate_Server" },
1191   { GDK_Pointer_Left, "Pointer_Left" },
1192   { GDK_Pointer_Right, "Pointer_Right" },
1193   { GDK_Pointer_Up, "Pointer_Up" },
1194   { GDK_Pointer_Down, "Pointer_Down" },
1195   { GDK_Pointer_UpLeft, "Pointer_UpLeft" },
1196   { GDK_Pointer_UpRight, "Pointer_UpRight" },
1197   { GDK_Pointer_DownLeft, "Pointer_DownLeft" },
1198   { GDK_Pointer_DownRight, "Pointer_DownRight" },
1199   { GDK_Pointer_Button_Dflt, "Pointer_Button_Dflt" },
1200   { GDK_Pointer_Button1, "Pointer_Button1" },
1201   { GDK_Pointer_Button2, "Pointer_Button2" },
1202   { GDK_Pointer_Button3, "Pointer_Button3" },
1203   { GDK_Pointer_Button4, "Pointer_Button4" },
1204   { GDK_Pointer_Button5, "Pointer_Button5" },
1205   { GDK_Pointer_DblClick_Dflt, "Pointer_DblClick_Dflt" },
1206   { GDK_Pointer_DblClick1, "Pointer_DblClick1" },
1207   { GDK_Pointer_DblClick2, "Pointer_DblClick2" },
1208   { GDK_Pointer_DblClick3, "Pointer_DblClick3" },
1209   { GDK_Pointer_DblClick4, "Pointer_DblClick4" },
1210   { GDK_Pointer_DblClick5, "Pointer_DblClick5" },
1211   { GDK_Pointer_Drag_Dflt, "Pointer_Drag_Dflt" },
1212   { GDK_Pointer_Drag1, "Pointer_Drag1" },
1213   { GDK_Pointer_Drag2, "Pointer_Drag2" },
1214   { GDK_Pointer_Drag3, "Pointer_Drag3" },
1215   { GDK_Pointer_Drag4, "Pointer_Drag4" },
1216   { GDK_Pointer_EnableKeys, "Pointer_EnableKeys" },
1217   { GDK_Pointer_Accelerate, "Pointer_Accelerate" },
1218   { GDK_Pointer_DfltBtnNext, "Pointer_DfltBtnNext" },
1219   { GDK_Pointer_DfltBtnPrev, "Pointer_DfltBtnPrev" },
1220   { GDK_Pointer_Drag5, "Pointer_Drag5" },
1221   { GDK_BackSpace, "BackSpace" },
1222   { GDK_Tab, "Tab" },
1223   { GDK_Linefeed, "Linefeed" },
1224   { GDK_Clear, "Clear" },
1225   { GDK_Return, "Return" },
1226   { GDK_Pause, "Pause" },
1227   { GDK_Scroll_Lock, "Scroll_Lock" },
1228   { GDK_Sys_Req, "Sys_Req" },
1229   { GDK_Escape, "Escape" },
1230   { GDK_Multi_key, "Multi_key" },
1231   { GDK_Kanji, "Kanji" },
1232   { GDK_Muhenkan, "Muhenkan" },
1233   { GDK_Henkan_Mode, "Henkan_Mode" },
1234   { GDK_Henkan, "Henkan" },
1235   { GDK_Romaji, "Romaji" },
1236   { GDK_Hiragana, "Hiragana" },
1237   { GDK_Katakana, "Katakana" },
1238   { GDK_Hiragana_Katakana, "Hiragana_Katakana" },
1239   { GDK_Zenkaku, "Zenkaku" },
1240   { GDK_Hankaku, "Hankaku" },
1241   { GDK_Zenkaku_Hankaku, "Zenkaku_Hankaku" },
1242   { GDK_Touroku, "Touroku" },
1243   { GDK_Massyo, "Massyo" },
1244   { GDK_Kana_Lock, "Kana_Lock" },
1245   { GDK_Kana_Shift, "Kana_Shift" },
1246   { GDK_Eisu_Shift, "Eisu_Shift" },
1247   { GDK_Eisu_toggle, "Eisu_toggle" },
1248   { GDK_Hangul, "Hangul" },
1249   { GDK_Hangul_Start, "Hangul_Start" },
1250   { GDK_Hangul_End, "Hangul_End" },
1251   { GDK_Hangul_Hanja, "Hangul_Hanja" },
1252   { GDK_Hangul_Jamo, "Hangul_Jamo" },
1253   { GDK_Hangul_Romaja, "Hangul_Romaja" },
1254   { GDK_Codeinput, "Codeinput" },
1255   { GDK_Kanji_Bangou, "Kanji_Bangou" },
1256   { GDK_Hangul_Codeinput, "Hangul_Codeinput" },
1257   { GDK_Hangul_Jeonja, "Hangul_Jeonja" },
1258   { GDK_Hangul_Banja, "Hangul_Banja" },
1259   { GDK_Hangul_PreHanja, "Hangul_PreHanja" },
1260   { GDK_Hangul_PostHanja, "Hangul_PostHanja" },
1261   { GDK_SingleCandidate, "SingleCandidate" },
1262   { GDK_Hangul_SingleCandidate, "Hangul_SingleCandidate" },
1263   { GDK_MultipleCandidate, "MultipleCandidate" },
1264   { GDK_Zen_Koho, "Zen_Koho" },
1265   { GDK_Hangul_MultipleCandidate, "Hangul_MultipleCandidate" },
1266   { GDK_PreviousCandidate, "PreviousCandidate" },
1267   { GDK_Mae_Koho, "Mae_Koho" },
1268   { GDK_Hangul_PreviousCandidate, "Hangul_PreviousCandidate" },
1269   { GDK_Hangul_Special, "Hangul_Special" },
1270   { GDK_Home, "Home" },
1271   { GDK_Left, "Left" },
1272   { GDK_Up, "Up" },
1273   { GDK_Right, "Right" },
1274   { GDK_Down, "Down" },
1275   { GDK_Prior, "Prior" },
1276   { GDK_Page_Up, "Page_Up" },
1277   { GDK_Next, "Next" },
1278   { GDK_Page_Down, "Page_Down" },
1279   { GDK_End, "End" },
1280   { GDK_Begin, "Begin" },
1281   { GDK_Select, "Select" },
1282   { GDK_Print, "Print" },
1283   { GDK_Execute, "Execute" },
1284   { GDK_Insert, "Insert" },
1285   { GDK_Undo, "Undo" },
1286   { GDK_Redo, "Redo" },
1287   { GDK_Menu, "Menu" },
1288   { GDK_Find, "Find" },
1289   { GDK_Cancel, "Cancel" },
1290   { GDK_Help, "Help" },
1291   { GDK_Break, "Break" },
1292   { GDK_Mode_switch, "Mode_switch" },
1293   { GDK_script_switch, "script_switch" },
1294   { GDK_ISO_Group_Shift, "ISO_Group_Shift" },
1295   { GDK_kana_switch, "kana_switch" },
1296   { GDK_Arabic_switch, "Arabic_switch" },
1297   { GDK_Greek_switch, "Greek_switch" },
1298   { GDK_Hebrew_switch, "Hebrew_switch" },
1299   { GDK_Hangul_switch, "Hangul_switch" },
1300   { GDK_Num_Lock, "Num_Lock" },
1301   { GDK_KP_Space, "KP_Space" },
1302   { GDK_KP_Tab, "KP_Tab" },
1303   { GDK_KP_Enter, "KP_Enter" },
1304   { GDK_KP_F1, "KP_F1" },
1305   { GDK_KP_F2, "KP_F2" },
1306   { GDK_KP_F3, "KP_F3" },
1307   { GDK_KP_F4, "KP_F4" },
1308   { GDK_KP_Home, "KP_Home" },
1309   { GDK_KP_Left, "KP_Left" },
1310   { GDK_KP_Up, "KP_Up" },
1311   { GDK_KP_Right, "KP_Right" },
1312   { GDK_KP_Down, "KP_Down" },
1313   { GDK_KP_Prior, "KP_Prior" },
1314   { GDK_KP_Page_Up, "KP_Page_Up" },
1315   { GDK_KP_Next, "KP_Next" },
1316   { GDK_KP_Page_Down, "KP_Page_Down" },
1317   { GDK_KP_End, "KP_End" },
1318   { GDK_KP_Begin, "KP_Begin" },
1319   { GDK_KP_Insert, "KP_Insert" },
1320   { GDK_KP_Delete, "KP_Delete" },
1321   { GDK_KP_Multiply, "KP_Multiply" },
1322   { GDK_KP_Add, "KP_Add" },
1323   { GDK_KP_Separator, "KP_Separator" },
1324   { GDK_KP_Subtract, "KP_Subtract" },
1325   { GDK_KP_Decimal, "KP_Decimal" },
1326   { GDK_KP_Divide, "KP_Divide" },
1327   { GDK_KP_0, "KP_0" },
1328   { GDK_KP_1, "KP_1" },
1329   { GDK_KP_2, "KP_2" },
1330   { GDK_KP_3, "KP_3" },
1331   { GDK_KP_4, "KP_4" },
1332   { GDK_KP_5, "KP_5" },
1333   { GDK_KP_6, "KP_6" },
1334   { GDK_KP_7, "KP_7" },
1335   { GDK_KP_8, "KP_8" },
1336   { GDK_KP_9, "KP_9" },
1337   { GDK_KP_Equal, "KP_Equal" },
1338   { GDK_F1, "F1" },
1339   { GDK_F2, "F2" },
1340   { GDK_F3, "F3" },
1341   { GDK_F4, "F4" },
1342   { GDK_F5, "F5" },
1343   { GDK_F6, "F6" },
1344   { GDK_F7, "F7" },
1345   { GDK_F8, "F8" },
1346   { GDK_F9, "F9" },
1347   { GDK_F10, "F10" },
1348   { GDK_F11, "F11" },
1349   { GDK_F12, "F12" },
1350   { GDK_F13, "F13" },
1351   { GDK_F14, "F14" },
1352   { GDK_F15, "F15" },
1353   { GDK_F16, "F16" },
1354   { GDK_F17, "F17" },
1355   { GDK_F18, "F18" },
1356   { GDK_F19, "F19" },
1357   { GDK_F20, "F20" },
1358   { GDK_F21, "F21" },
1359   { GDK_F22, "F22" },
1360   { GDK_F23, "F23" },
1361   { GDK_F24, "F24" },
1362   { GDK_F25, "F25" },
1363   { GDK_F26, "F26" },
1364   { GDK_F27, "F27" },
1365   { GDK_F28, "F28" },
1366   { GDK_F29, "F29" },
1367   { GDK_F30, "F30" },
1368   { GDK_F31, "F31" },
1369   { GDK_F32, "F32" },
1370   { GDK_F33, "F33" },
1371   { GDK_F34, "F34" },
1372   { GDK_F35, "F35" },
1373   { GDK_Shift_L, "Shift_L" },
1374   { GDK_Shift_R, "Shift_R" },
1375   { GDK_Control_L, "Control_L" },
1376   { GDK_Control_R, "Control_R" },
1377   { GDK_Caps_Lock, "Caps_Lock" },
1378   { GDK_Shift_Lock, "Shift_Lock" },
1379   { GDK_Meta_L, "Meta_L" },
1380   { GDK_Meta_R, "Meta_R" },
1381   { GDK_Alt_L, "Alt_L" },
1382   { GDK_Alt_R, "Alt_R" },
1383   { GDK_Super_L, "Super_L" },
1384   { GDK_Super_R, "Super_R" },
1385   { GDK_Hyper_L, "Hyper_L" },
1386   { GDK_Hyper_R, "Hyper_R" },
1387   { GDK_Delete, "Delete" },
1388   { GDK_VoidSymbol, "VoidSymbol" }
1389 };
1390
1391 #define GDK_NUM_KEYS (G_N_ELEMENTS (gdk_keys_by_keyval))
1392
1393
1394 static gint
1395 gdk_keys_keyval_compare (const void *pkey,
1396                          const void *pbase)
1397 {
1398   return (*(gint *) pkey) - ((struct gdk_key *) pbase)->keyval;
1399 }
1400
1401 gchar *
1402 gdk_keyval_name (guint keyval)
1403 {
1404   struct gdk_key *found;
1405
1406   /* these keyvals have two entries (PageUp/Prior | PageDown/Next) */
1407   switch (keyval)
1408     {
1409     case GDK_Page_Up:
1410       return "Page_Up";
1411     case GDK_Page_Down:
1412       return "Page_Down";
1413     case GDK_KP_Page_Up:
1414       return "KP_Page_Up";
1415     case GDK_KP_Page_Down:
1416       return "KP_Page_Down";
1417     }
1418
1419   found = bsearch (&keyval, gdk_keys_by_keyval,
1420                    GDK_NUM_KEYS, sizeof (struct gdk_key),
1421                    gdk_keys_keyval_compare);
1422
1423   if (found)
1424     return (gchar *) found->name;
1425   else
1426     return NULL;
1427 }
1428
1429 static gint
1430 gdk_key_compare_by_name (const void *a,
1431                          const void *b)
1432 {
1433   return strcmp (((const struct gdk_key *) a)->name,
1434                  ((const struct gdk_key *) b)->name);
1435 }
1436
1437 static gint
1438 gdk_keys_name_compare (const void *pkey,
1439                        const void *pbase)
1440 {
1441   return strcmp ((const char *) pkey,
1442                  ((const struct gdk_key *) pbase)->name);
1443 }
1444
1445 guint
1446 gdk_keyval_from_name (const gchar *keyval_name)
1447 {
1448   struct gdk_key *found;
1449
1450   g_return_val_if_fail (keyval_name != NULL, 0);
1451
1452   if (gdk_keys_by_name == NULL)
1453     {
1454       gdk_keys_by_name = g_new (struct gdk_key, GDK_NUM_KEYS);
1455       
1456       memcpy (gdk_keys_by_name, gdk_keys_by_keyval,
1457               GDK_NUM_KEYS * sizeof (struct gdk_key));
1458       
1459       qsort (gdk_keys_by_name, GDK_NUM_KEYS, sizeof (struct gdk_key),
1460              gdk_key_compare_by_name);
1461     }
1462   
1463   found = bsearch (keyval_name, gdk_keys_by_name,
1464                    GDK_NUM_KEYS, sizeof (struct gdk_key),
1465                    gdk_keys_name_compare);
1466   
1467   if (found)
1468     return found->keyval;
1469   else
1470     return GDK_VoidSymbol;
1471 }
1472
1473 static void
1474 gdk_directfb_convert_modifiers (DFBInputDeviceModifierMask dfbmod,
1475                 DFBInputDeviceLockState    dfblock)
1476 {
1477         if (dfbmod & DIMM_ALT)
1478                 _gdk_directfb_modifiers |= GDK_MOD1_MASK;
1479         else
1480                 _gdk_directfb_modifiers &= ~GDK_MOD1_MASK;
1481
1482         if (dfbmod & DIMM_ALTGR)
1483                 _gdk_directfb_modifiers |= GDK_MOD2_MASK;
1484         else
1485                 _gdk_directfb_modifiers &= ~GDK_MOD2_MASK;
1486
1487         if (dfbmod & DIMM_CONTROL)
1488                 _gdk_directfb_modifiers |= GDK_CONTROL_MASK;
1489         else
1490                 _gdk_directfb_modifiers &= ~GDK_CONTROL_MASK;
1491
1492         if (dfbmod & DIMM_SHIFT)
1493                 _gdk_directfb_modifiers |= GDK_SHIFT_MASK;
1494         else
1495                 _gdk_directfb_modifiers &= ~GDK_SHIFT_MASK;
1496
1497         if (dfblock & DILS_CAPS)
1498                 _gdk_directfb_modifiers |= GDK_LOCK_MASK;
1499         else
1500                 _gdk_directfb_modifiers &= ~GDK_LOCK_MASK;
1501 }
1502
1503 static guint
1504 gdk_directfb_translate_key (DFBInputDeviceKeyIdentifier key_id,
1505                 DFBInputDeviceKeySymbol     key_symbol)
1506 {
1507         guint keyval = GDK_VoidSymbol;
1508
1509         /* special case numpad */
1510         if (key_id >= DIKI_KP_DIV && key_id <= DIKI_KP_9)
1511         {
1512                 switch (key_symbol)
1513                 {
1514                         case DIKS_SLASH:         keyval = GDK_KP_Divide;    break;
1515                         case DIKS_ASTERISK:      keyval = GDK_KP_Multiply;  break;
1516                         case DIKS_PLUS_SIGN:     keyval = GDK_KP_Add;       break;
1517                         case DIKS_MINUS_SIGN:    keyval = GDK_KP_Subtract;  break;
1518                         case DIKS_ENTER:         keyval = GDK_KP_Enter;     break;
1519                         case DIKS_SPACE:         keyval = GDK_KP_Space;     break;
1520                         case DIKS_TAB:           keyval = GDK_KP_Tab;       break;
1521                         case DIKS_EQUALS_SIGN:   keyval = GDK_KP_Equal;     break;
1522                         case DIKS_COMMA:
1523                         case DIKS_PERIOD:        keyval = GDK_KP_Decimal;   break;
1524                         case DIKS_HOME:          keyval = GDK_KP_Home;      break;
1525                         case DIKS_END:           keyval = GDK_KP_End;       break;
1526                         case DIKS_PAGE_UP:       keyval = GDK_KP_Page_Up;   break;
1527                         case DIKS_PAGE_DOWN:     keyval = GDK_KP_Page_Down; break;
1528                         case DIKS_CURSOR_LEFT:   keyval = GDK_KP_Left;      break;
1529                         case DIKS_CURSOR_RIGHT:  keyval = GDK_KP_Right;     break;
1530                         case DIKS_CURSOR_UP:     keyval = GDK_KP_Up;        break;
1531                         case DIKS_CURSOR_DOWN:   keyval = GDK_KP_Down;      break;
1532                         case DIKS_BEGIN:         keyval = GDK_KP_Begin;     break;
1533
1534                         case DIKS_0 ... DIKS_9:
1535                                                  keyval = GDK_KP_0 + key_symbol - DIKS_0;
1536                                                  break;
1537                         case DIKS_F1 ... DIKS_F4:
1538                                                  keyval = GDK_KP_F1 + key_symbol - DIKS_F1;
1539                                                  break;
1540
1541                         default:
1542                                                  break;
1543                 }
1544         }
1545         else
1546         {
1547                 switch (DFB_KEY_TYPE (key_symbol))
1548                 {
1549                         case DIKT_UNICODE:
1550                                 switch (key_symbol)
1551                                 {
1552                                         case DIKS_NULL:       keyval = GDK_VoidSymbol; break;
1553                                         case DIKS_BACKSPACE:  keyval = GDK_BackSpace;  break;
1554                                         case DIKS_TAB:        keyval = GDK_Tab;        break;
1555                                         case DIKS_RETURN:     keyval = GDK_Return;     break;
1556                                         case DIKS_CANCEL:     keyval = GDK_Cancel;     break;
1557                                         case DIKS_ESCAPE:     keyval = GDK_Escape;     break;
1558                                         case DIKS_SPACE:      keyval = GDK_space;      break;
1559                                         case DIKS_DELETE:     keyval = GDK_Delete;     break;
1560
1561                                         default:
1562                                                               keyval = gdk_unicode_to_keyval (key_symbol);
1563                                                               if (keyval & 0x01000000)
1564                                                                       keyval = GDK_VoidSymbol;
1565                                 }
1566                                 break;
1567
1568                         case DIKT_SPECIAL:
1569                                 switch (key_symbol)
1570                                 {
1571                                         case DIKS_CURSOR_LEFT:   keyval = GDK_Left;      break;
1572                                         case DIKS_CURSOR_RIGHT:  keyval = GDK_Right;     break;
1573                                         case DIKS_CURSOR_UP:     keyval = GDK_Up;        break;
1574                                         case DIKS_CURSOR_DOWN:   keyval = GDK_Down;      break;
1575                                         case DIKS_INSERT:        keyval = GDK_Insert;    break;
1576                                         case DIKS_HOME:          keyval = GDK_Home;      break;
1577                                         case DIKS_END:           keyval = GDK_End;       break;
1578                                         case DIKS_PAGE_UP:       keyval = GDK_Page_Up;   break;
1579                                         case DIKS_PAGE_DOWN:     keyval = GDK_Page_Down; break;
1580                                         case DIKS_PRINT:         keyval = GDK_Print;     break;
1581                                         case DIKS_PAUSE:         keyval = GDK_Pause;     break;
1582                                         case DIKS_SELECT:        keyval = GDK_Select;    break;
1583                                         case DIKS_CLEAR:         keyval = GDK_Clear;     break;
1584                                         case DIKS_MENU:          keyval = GDK_Menu;      break;
1585                                         case DIKS_HELP:          keyval = GDK_Help;      break;
1586                                         case DIKS_NEXT:          keyval = GDK_Next;      break;
1587                                         case DIKS_BEGIN:         keyval = GDK_Begin;     break;
1588                                         case DIKS_BREAK:         keyval = GDK_Break;     break;
1589                                         default:
1590                                                                  break;
1591                                 }
1592                                 break;
1593
1594                         case DIKT_FUNCTION:
1595                                 keyval = GDK_F1 + key_symbol - DIKS_F1;
1596                                 if (keyval > GDK_F35)
1597                                         keyval = GDK_VoidSymbol;
1598                                 break;
1599
1600                         case DIKT_MODIFIER:
1601                                 switch (key_id)
1602                                 {
1603                                         case DIKI_SHIFT_L:    keyval = GDK_Shift_L;     break;
1604                                         case DIKI_SHIFT_R:    keyval = GDK_Shift_R;     break;
1605                                         case DIKI_CONTROL_L:  keyval = GDK_Control_L;   break;
1606                                         case DIKI_CONTROL_R:  keyval = GDK_Control_R;   break;
1607                                         case DIKI_ALT_L:      keyval = GDK_Alt_L;       break;
1608                                         case DIKI_ALT_R:      keyval = GDK_Alt_R;       break;
1609                                         case DIKI_META_L:     keyval = GDK_Meta_L;      break;
1610                                         case DIKI_META_R:     keyval = GDK_Meta_R;      break;
1611                                         case DIKI_SUPER_L:    keyval = GDK_Super_L;     break;
1612                                         case DIKI_SUPER_R:    keyval = GDK_Super_R;     break;
1613                                         case DIKI_HYPER_L:    keyval = GDK_Hyper_L;     break;
1614                                         case DIKI_HYPER_R:    keyval = GDK_Hyper_R;     break;
1615                                         default:
1616                                                               break;
1617                                 }
1618                                 break;
1619
1620                         case DIKT_LOCK:
1621                                 switch (key_symbol)
1622                                 {
1623                                         case DIKS_CAPS_LOCK:    keyval = GDK_Caps_Lock;   break;
1624                                         case DIKS_NUM_LOCK:     keyval = GDK_Num_Lock;    break;
1625                                         case DIKS_SCROLL_LOCK:  keyval = GDK_Scroll_Lock; break;
1626                                         default:
1627                                                                 break;
1628                                 }
1629                                 break;
1630
1631                         case DIKT_DEAD:
1632                                 switch (key_symbol)
1633                                 {
1634                                         case DIKS_DEAD_ABOVEDOT:     keyval = GDK_dead_abovedot;     break;
1635                                         case DIKS_DEAD_ABOVERING:    keyval = GDK_dead_abovering;    break;
1636                                         case DIKS_DEAD_ACUTE:        keyval = GDK_dead_acute;        break;
1637                                         case DIKS_DEAD_BREVE:        keyval = GDK_dead_breve;        break;
1638                                         case DIKS_DEAD_CARON:        keyval = GDK_dead_caron;        break;
1639                                         case DIKS_DEAD_CEDILLA:      keyval = GDK_dead_cedilla;      break;
1640                                         case DIKS_DEAD_CIRCUMFLEX:   keyval = GDK_dead_circumflex;   break;
1641                                         case DIKS_DEAD_DIAERESIS:    keyval = GDK_dead_diaeresis;    break;
1642                                         case DIKS_DEAD_DOUBLEACUTE:  keyval = GDK_dead_doubleacute;  break;
1643                                         case DIKS_DEAD_GRAVE:        keyval = GDK_dead_grave;        break;
1644                                         case DIKS_DEAD_IOTA:         keyval = GDK_dead_iota;         break;
1645                                         case DIKS_DEAD_MACRON:       keyval = GDK_dead_macron;       break;
1646                                         case DIKS_DEAD_OGONEK:       keyval = GDK_dead_ogonek;       break;
1647                                         case DIKS_DEAD_SEMIVOICED_SOUND:
1648                                                                      keyval = GDK_dead_semivoiced_sound;                        break;
1649                                         case DIKS_DEAD_TILDE:        keyval = GDK_dead_tilde;        break;
1650                                         case DIKS_DEAD_VOICED_SOUND: keyval = GDK_dead_voiced_sound; break;
1651                                         default:
1652                                                                      break;
1653                                 }
1654                                 break;
1655
1656                         case DIKT_CUSTOM:
1657                                 break;
1658                 }
1659         }
1660
1661         return keyval;
1662 }
1663
1664         void
1665 _gdk_directfb_keyboard_init (void)
1666 {
1667         DFBInputDeviceDescription desc;
1668         gint i, n, length;
1669         IDirectFBInputDevice   *keyboard=_gdk_display->keyboard;
1670
1671         if (!keyboard)
1672                 return;
1673     if( directfb_keymap )    
1674             return;
1675
1676         keyboard->GetDescription (keyboard, &desc);
1677         _gdk_display->keymap=g_object_new (gdk_keymap_get_type (), NULL);
1678
1679         if (desc.min_keycode < 0 || desc.max_keycode < desc.min_keycode)
1680                 return;
1681
1682         directfb_min_keycode = desc.min_keycode;
1683         directfb_max_keycode = desc.max_keycode;
1684
1685         length = directfb_max_keycode - desc.min_keycode + 1;
1686
1687
1688         directfb_keymap = g_new0 (guint, 4 * length);
1689
1690         for (i = 0; i < length; i++)
1691         {
1692                 DFBInputDeviceKeymapEntry  entry;
1693
1694                 if (keyboard->GetKeymapEntry (keyboard,
1695                                         i + desc.min_keycode, &entry) != DFB_OK)
1696                         continue;
1697                 for (n = 0; n < 4; n++) {
1698                         directfb_keymap[i * 4 + n] = 
1699                                 gdk_directfb_translate_key (entry.identifier, entry.symbols[n]);
1700                 }
1701         }
1702 }
1703
1704         void
1705 _gdk_directfb_keyboard_exit (void)
1706 {
1707         if (!directfb_keymap)
1708                 return;
1709
1710         g_free (directfb_keymap);
1711         g_free(_gdk_display->keymap);
1712         _gdk_display->keymap = NULL;
1713         directfb_keymap = NULL;
1714 }
1715
1716 void
1717 gdk_directfb_translate_key_event (DFBWindowEvent *dfb_event,
1718                 GdkEventKey    *event)
1719 {
1720         gint  len;
1721         gchar buf[6];
1722
1723         g_return_if_fail (dfb_event != NULL);
1724         g_return_if_fail (event != NULL);
1725
1726         gdk_directfb_convert_modifiers (dfb_event->modifiers, dfb_event->locks);
1727
1728         event->state            = _gdk_directfb_modifiers;
1729         event->group            = (dfb_event->modifiers & DIMM_ALTGR) ? 1 : 0;
1730         event->hardware_keycode = dfb_event->key_code;
1731         event->keyval           = gdk_directfb_translate_key (dfb_event->key_id,
1732                         dfb_event->key_symbol);
1733         /* If the device driver didn't send a key_code (happens with remote
1734            controls), we try to find a suitable key_code by looking at the
1735            default keymap. */
1736         if (dfb_event->key_code == -1 && directfb_keymap)
1737         {
1738                 gint i;
1739
1740                 for (i = directfb_min_keycode; i <= directfb_max_keycode; i++)
1741                 {
1742                         if (directfb_keymap[(i - directfb_min_keycode) * 4] == event->keyval)
1743                         {
1744                                 event->hardware_keycode = i;
1745                                 break;
1746                         }
1747                 }
1748         } 
1749
1750         len = g_unichar_to_utf8 (dfb_event->key_symbol, buf);
1751
1752         event->string = g_strndup (buf, len);
1753         event->length = len;
1754 }
1755
1756 /**
1757  * gdk_keymap_get_entries_for_keycode:
1758  * @keymap: a #GdkKeymap or %NULL to use the default keymap
1759  * @hardware_keycode: a keycode
1760  * @keys: return location for array of #GdkKeymapKey, or NULL
1761  * @keyvals: return location for array of keyvals, or NULL
1762  * @n_entries: length of @keys and @keyvals
1763  *
1764  * Returns the keyvals bound to @hardware_keycode.
1765  * The Nth #GdkKeymapKey in @keys is bound to the Nth
1766  * keyval in @keyvals. Free the returned arrays with g_free().
1767  * When a keycode is pressed by the user, the keyval from
1768  * this list of entries is selected by considering the effective
1769  * keyboard group and level. See gdk_keymap_translate_keyboard_state().
1770  *
1771  * Returns: %TRUE if there were any entries
1772  **/
1773 gboolean
1774 gdk_keymap_get_entries_for_keycode (GdkKeymap     *keymap,
1775                 guint          hardware_keycode,
1776                 GdkKeymapKey **keys,
1777                 guint        **keyvals,
1778                 gint          *n_entries)
1779 {
1780         gint num = 0;
1781         gint i, j;
1782         gint index;
1783
1784         index = (hardware_keycode - directfb_min_keycode) * 4;
1785
1786         if (directfb_keymap && (hardware_keycode >= directfb_min_keycode && 
1787                                 hardware_keycode <= directfb_max_keycode))
1788         {
1789                 for (i = 0; i < 4; i++)
1790                         if (directfb_keymap[index + i] != GDK_VoidSymbol)
1791                                 num++;
1792         }
1793
1794         if (keys)
1795         {
1796                 *keys = g_new (GdkKeymapKey, num);
1797
1798                 for (i = 0, j = 0; num > 0 && i < 4; i++)
1799                         if (directfb_keymap[index + i] != GDK_VoidSymbol)
1800                         {
1801                                 (*keys)[j].keycode = hardware_keycode;
1802                                 (*keys)[j].level   = j % 2;
1803                                 (*keys)[j].group   = j > DIKSI_BASE_SHIFT ? 1 : 0;
1804                                 j++;
1805                         }
1806         }
1807         if (keyvals)
1808         {
1809                 *keyvals = g_new (guint, num);
1810
1811                 for (i = 0, j = 0; num > 0 && i < 4; i++)
1812                         if (directfb_keymap[index + i] != GDK_VoidSymbol)
1813                         {
1814                                 (*keyvals)[j] = directfb_keymap[index + i];
1815                                 j++;
1816                         }
1817         }
1818
1819         if (n_entries)
1820                 *n_entries = num;
1821
1822         return (num > 0);
1823 }
1824
1825 static inline void
1826 append_keymap_key (GArray *array,
1827                 guint   keycode,
1828                 gint    group,
1829                 gint    level)
1830 {
1831         GdkKeymapKey key = { keycode, group, level };
1832
1833         g_array_append_val (array, key);
1834 }
1835
1836 /**
1837  * gdk_keymap_get_entries_for_keyval:
1838  * @keymap: a #GdkKeymap, or %NULL to use the default keymap
1839  * @keyval: a keyval, such as %GDK_a, %GDK_Up, %GDK_Return, etc.
1840  * @keys: return location for an array of #GdkKeymapKey
1841  * @n_keys: return location for number of elements in returned array
1842  * 
1843  * Obtains a list of keycode/group/level combinations that will
1844  * generate @keyval. Groups and levels are two kinds of keyboard mode;
1845  * in general, the level determines whether the top or bottom symbol
1846  * on a key is used, and the group determines whether the left or
1847  * right symbol is used. On US keyboards, the shift key changes the
1848  * keyboard level, and there are no groups. A group switch key might
1849  * convert a keyboard between Hebrew to English modes, for example.
1850  * #GdkEventKey contains a %group field that indicates the active
1851  * keyboard group. The level is computed from the modifier mask.
1852  * The returned array should be freed
1853  * with g_free().
1854  *
1855  * Return value: %TRUE if keys were found and returned
1856  **/
1857 gboolean
1858 gdk_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
1859                 guint          keyval,
1860                 GdkKeymapKey **keys,
1861                 gint          *n_keys)
1862 {
1863         GArray *retval;
1864         gint    i, j;
1865
1866         g_return_val_if_fail (keys != NULL, FALSE);
1867         g_return_val_if_fail (n_keys != NULL, FALSE);
1868         g_return_val_if_fail (keyval != GDK_VoidSymbol, FALSE);
1869
1870         retval = g_array_new (FALSE, FALSE, sizeof (GdkKeymapKey));
1871
1872         for (i = directfb_min_keycode;
1873                         directfb_keymap && i <= directfb_max_keycode;
1874                         i++)
1875         {
1876                 gint index = i - directfb_min_keycode;
1877
1878                 for (j = 0; j < 4; j++)
1879                 {
1880                         if (directfb_keymap[index * 4 + j] == keyval)
1881                                 append_keymap_key (retval, i, j % 2, j > DIKSI_BASE_SHIFT ? 1 : 0);
1882                 }
1883         }
1884
1885         if (retval->len > 0)
1886         {
1887                 *keys = (GdkKeymapKey *) retval->data;
1888                 *n_keys = retval->len;
1889         }
1890         else
1891         {
1892                 *keys = NULL;
1893                 *n_keys = 0;
1894         }
1895
1896         g_array_free (retval, retval->len > 0 ? FALSE : TRUE);
1897
1898         return (*n_keys > 0);
1899 }
1900
1901 gboolean
1902 gdk_keymap_translate_keyboard_state (GdkKeymap       *keymap,
1903                 guint            keycode,
1904                 GdkModifierType  state,
1905                 gint             group,
1906                 guint           *keyval,
1907                 gint            *effective_group,
1908                 gint            *level,
1909                 GdkModifierType *consumed_modifiers)
1910 {
1911         if (directfb_keymap &&
1912                         (keycode >= directfb_min_keycode && keycode <= directfb_max_keycode) &&
1913                         (group == 0 || group == 1))
1914         {
1915                 gint index = (keycode - directfb_min_keycode) * 4;
1916                 gint i =     (state & GDK_SHIFT_MASK) ? 1 : 0;
1917
1918                 if (directfb_keymap[index + i + 2 * group] != GDK_VoidSymbol)
1919                 {
1920                         if (keyval)
1921                                 *keyval = directfb_keymap[index + i + 2 * group];
1922
1923                         if (group && directfb_keymap[index + i] == *keyval)
1924                         {
1925                                 if (effective_group)
1926                                         *effective_group = 0;
1927                 if(consumed_modifiers)
1928                                     *consumed_modifiers = 0;
1929                         }
1930                         else
1931                         {
1932                                 if (effective_group)
1933                                         *effective_group = group;
1934                 if(consumed_modifiers)
1935                                     *consumed_modifiers = GDK_MOD2_MASK;
1936                         }
1937                         if (level)
1938                                 *level = i;
1939
1940                         if (i && directfb_keymap[index + 2 * *effective_group] != *keyval)
1941                 if(consumed_modifiers)
1942                                     *consumed_modifiers |= GDK_SHIFT_MASK;
1943
1944                         return TRUE;
1945                 }
1946         }
1947         if (keyval)
1948                 *keyval             = 0;
1949         if (effective_group)
1950                 *effective_group    = 0;
1951         if (level)
1952                 *level              = 0;
1953     if(consumed_modifiers)
1954             *consumed_modifiers = 0;
1955
1956         return FALSE;
1957 }
1958
1959         GdkKeymap*
1960 gdk_keymap_get_for_display (GdkDisplay *display)
1961 {
1962         if( display == NULL ) return NULL;
1963         g_assert(GDK_IS_DISPLAY_DFB(display));
1964         GdkDisplayDFB *gdisplay = GDK_DISPLAY_DFB(display);
1965         g_assert( gdisplay->keymap != NULL);
1966         return gdisplay->keymap;
1967 }
1968
1969         PangoDirection
1970 gdk_keymap_get_direction (GdkKeymap *keymap)
1971 {
1972         return PANGO_DIRECTION_NEUTRAL;
1973 }
1974
1975 /**
1976  * gdk_keymap_lookup_key:
1977  * @keymap: a #GdkKeymap or %NULL to use the default keymap
1978  * @key: a #GdkKeymapKey with keycode, group, and level initialized
1979  *
1980  * Looks up the keyval mapped to a keycode/group/level triplet.
1981  * If no keyval is bound to @key, returns 0. For normal user input,
1982  * you want to use gdk_keymap_translate_keyboard_state() instead of
1983  * this function, since the effective group/level may not be
1984  * the same as the current keyboard state.
1985  *
1986  * Return value: a keyval, or 0 if none was mapped to the given @key
1987  **/
1988 guint
1989 gdk_keymap_lookup_key (GdkKeymap          *keymap,
1990                 const GdkKeymapKey *key)
1991 {
1992         g_warning("gdk_keymap_lookup_key unimplemented \n");    
1993         return 0;
1994 }
1995
1996
1997 #define __GDK_KEYS_DIRECTFB_C__
1998 #include "gdkaliasdef.c"