Re: GTK, keycodes and keysyms
- From: Havoc Pennington <hp redhat com>
- To: Philip Kendall <pak ast cam ac uk>
- Cc: GTK Applications Development List <gtk-app-devel-list mail gnome org>
- Subject: Re: GTK, keycodes and keysyms
- Date: 30 Dec 2000 19:00:22 -0500
Philip Kendall <pak ast cam ac uk> writes:
Basically, a much more efficient version of what I eventually came up
with:
guint unshift_keysym(guint keysym)
{
/* Oh boy is this ugly! */
return XKeycodeToKeysym(gdk_display,
XKeysymToKeycode(gdk_display,keysym),
0);
}
Slow and ugly, but it works :-)
Heh, a good bit shorter too. ;-)
I think you were getting numbers? If you want to be totally Correct
(tm) then you might be interested in this code, from
gtk/gtkimcontextsimple.c, here we're letting the user enter hex digits
with Shift-Control held down, and of course want the digits, not
punctuation on the digit keys. This code handles the case where Latin
hex digits are entered in a level other than 0, e.g. on some
international keyboards.
In case you were curious why that keymap code was so
complicated... ;-)
Havoc
static gboolean
is_hex_keyval (guint keyval)
{
gunichar ch = gdk_keyval_to_unicode (keyval);
return g_unichar_isxdigit (ch);
}
static guint
canonical_hex_keyval (GdkEventKey *event)
{
guint keyval;
guint *keyvals = NULL;
gint n_vals = 0;
gint i;
/* See if the keyval is already a hex digit */
if (is_hex_keyval (event->keyval))
return event->keyval;
/* See if this key would have generated a hex keyval in
* any other state, and return that hex keyval if so
*/
gdk_keymap_get_entries_for_keycode (NULL,
event->hardware_keycode, NULL,
&keyvals, &n_vals);
keyval = 0;
i = 0;
while (i < n_vals)
{
if (is_hex_keyval (keyvals[i]))
{
keyval = keyvals[i];
break;
}
++i;
}
g_free (keyvals);
if (keyval)
return keyval;
else
/* just return the keyval unchanged, we couldn't figure
* out a way to make it a hex digit
*/
return event->keyval;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]