9e42a3ae200a266f7da78d49f57fd4b5f2229bb5
[platform/upstream/ibus.git] / client / x11 / gdk-private.c
1 /* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
2 /* ibus
3  * Copyright (C) 2008 Peng Huang <shawn.p.huang@gmail.com>
4  * Copyright (C) 2008 Red Hat, Inc.
5  *
6  * gdk-private.c: Copied some code from gtk2
7  *
8  * This tool is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public
19  * License along with this library; if not, write to the
20  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23
24 #include "config.h"
25
26 #include <gtk/gtk.h>
27 #include <gdk/gdkx.h>
28 #include <gdk/gdkkeysyms.h>
29
30 #ifdef HAVE_X11_XKBLIB_H
31 #  define HAVE_XKB
32 #  include <X11/XKBlib.h>
33 #endif
34
35 void
36 translate_key_event (GdkDisplay *display,
37                      GdkEvent   *event,
38                      XEvent     *xevent)
39 {
40   GdkKeymap *keymap = gdk_keymap_get_for_display (display);
41 #if 0
42   gunichar c = 0;
43   gchar buf[7];
44 #endif
45
46   event->key.type = xevent->xany.type == KeyPress ? GDK_KEY_PRESS : GDK_KEY_RELEASE;
47   event->key.time = xevent->xkey.time;
48
49   event->key.state = (GdkModifierType) xevent->xkey.state;
50
51 #ifdef HAVE_XKB
52   event->key.group = XkbGroupForCoreState (xevent->xkey.state);
53 #else
54   event->key.group = 0;
55 #endif
56
57   event->key.hardware_keycode = xevent->xkey.keycode;
58
59   event->key.keyval = GDK_VoidSymbol;
60
61   gdk_keymap_translate_keyboard_state (keymap,
62                                        event->key.hardware_keycode,
63                                        event->key.state,
64                                        event->key.group,
65                                        &event->key.keyval,
66                                        NULL, NULL, NULL);
67 #if 0
68   _gdk_keymap_add_virtual_modifiers (keymap, &event->key.state);
69   event->key.is_modifier = _gdk_keymap_key_is_modifier (keymap, event->key.hardware_keycode);
70 #endif
71   event->key.is_modifier = 0;
72
73   /* Fill in event->string crudely, since various programs
74    * depend on it.
75    */
76   event->key.string = NULL;
77   event->key.length = 0;
78
79   /* Don't need event->string.
80    */
81 #if 0
82   if (event->key.keyval != GDK_VoidSymbol)
83     c = gdk_keyval_to_unicode (event->key.keyval);
84
85   if (c)
86     {
87       gsize bytes_written;
88       gint len;
89
90       /* Apply the control key - Taken from Xlib
91        */
92       if (event->key.state & GDK_CONTROL_MASK)
93         {
94           if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F;
95           else if (c == '2')
96             {
97               event->key.string = g_memdup ("\0\0", 2);
98               event->key.length = 1;
99               buf[0] = '\0';
100               goto out;
101             }
102           else if (c >= '3' && c <= '7') c -= ('3' - '\033');
103           else if (c == '8') c = '\177';
104           else if (c == '/') c = '_' & 0x1F;
105         }
106
107       len = g_unichar_to_utf8 (c, buf);
108       buf[len] = '\0';
109
110       event->key.string = g_locale_from_utf8 (buf, len,
111                                               NULL, &bytes_written,
112                                               NULL);
113       if (event->key.string)
114         event->key.length = bytes_written;
115     }
116   else if (event->key.keyval == GDK_Escape)
117     {
118       event->key.length = 1;
119       event->key.string = g_strdup ("\033");
120     }
121   else if (event->key.keyval == GDK_Return ||
122           event->key.keyval == GDK_KP_Enter)
123     {
124       event->key.length = 1;
125       event->key.string = g_strdup ("\r");
126     }
127
128   if (!event->key.string)
129     {
130       event->key.length = 0;
131       event->key.string = g_strdup ("");
132     }
133  out:
134 #endif
135   return;
136 }
137