1 /* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
3 * Copyright (C) 2008 Peng Huang <shawn.p.huang@gmail.com>
4 * Copyright (C) 2008 Red Hat, Inc.
6 * gdk-private.c: Copied some code from gtk2
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.
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.
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.
28 #include <gdk/gdkkeysyms.h>
30 #ifdef HAVE_X11_XKBLIB_H
32 # include <X11/XKBlib.h>
36 translate_key_event (GdkDisplay *display,
40 GdkKeymap *keymap = gdk_keymap_get_for_display (display);
46 event->key.type = xevent->xany.type == KeyPress ? GDK_KEY_PRESS : GDK_KEY_RELEASE;
47 event->key.time = xevent->xkey.time;
49 event->key.state = (GdkModifierType) xevent->xkey.state;
52 event->key.group = XkbGroupForCoreState (xevent->xkey.state);
57 event->key.hardware_keycode = xevent->xkey.keycode;
59 event->key.keyval = GDK_VoidSymbol;
61 gdk_keymap_translate_keyboard_state (keymap,
62 event->key.hardware_keycode,
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);
71 event->key.is_modifier = 0;
73 /* Fill in event->string crudely, since various programs
76 event->key.string = NULL;
77 event->key.length = 0;
79 /* Don't need event->string.
82 if (event->key.keyval != GDK_VoidSymbol)
83 c = gdk_keyval_to_unicode (event->key.keyval);
90 /* Apply the control key - Taken from Xlib
92 if (event->key.state & GDK_CONTROL_MASK)
94 if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F;
97 event->key.string = g_memdup ("\0\0", 2);
98 event->key.length = 1;
102 else if (c >= '3' && c <= '7') c -= ('3' - '\033');
103 else if (c == '8') c = '\177';
104 else if (c == '/') c = '_' & 0x1F;
107 len = g_unichar_to_utf8 (c, buf);
110 event->key.string = g_locale_from_utf8 (buf, len,
111 NULL, &bytes_written,
113 if (event->key.string)
114 event->key.length = bytes_written;
116 else if (event->key.keyval == GDK_Escape)
118 event->key.length = 1;
119 event->key.string = g_strdup ("\033");
121 else if (event->key.keyval == GDK_Return ||
122 event->key.keyval == GDK_KP_Enter)
124 event->key.length = 1;
125 event->key.string = g_strdup ("\r");
128 if (!event->key.string)
130 event->key.length = 0;
131 event->key.string = g_strdup ("");