diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2014-05-28 14:15:44 +0200 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2014-06-17 13:45:57 +1200 |
commit | f7fb50be8d2634ab1a1a82b21b97175446c221c5 (patch) | |
tree | 7c4b9140f0ee4d6521624f194a3153a74f9e9601 | |
parent | f0bc0d955d447de6ea0d696f84269f9ddb4409fc (diff) | |
download | gtk+-f7fb50be8d2634ab1a1a82b21b97175446c221c5.tar.gz |
Set KeyEvent string field
-rw-r--r-- | gdk/mir/gdkmireventsource.c | 63 |
1 files changed, 60 insertions, 3 deletions
diff --git a/gdk/mir/gdkmireventsource.c b/gdk/mir/gdkmireventsource.c index f7908fc146..5be955dcc1 100644 --- a/gdk/mir/gdkmireventsource.c +++ b/gdk/mir/gdkmireventsource.c @@ -334,6 +334,65 @@ send_event (GdkWindow *window, GdkDevice *device, GdkEvent *event) } static void +set_key_event_string (GdkEventKey *event) +{ + gunichar c = 0; + + if (event->keyval != GDK_KEY_VoidSymbol) + c = gdk_keyval_to_unicode (event->keyval); + + if (c) + { + gchar buf[7]; + gint len; + gsize bytes_written; + + /* Apply the control key - Taken from Xlib + */ + if (event->state & GDK_CONTROL_MASK) + { + if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F; + else if (c == '2') + { + event->string = g_memdup ("\0\0", 2); + event->length = 1; + buf[0] = '\0'; + return; + } + else if (c >= '3' && c <= '7') c -= ('3' - '\033'); + else if (c == '8') c = '\177'; + else if (c == '/') c = '_' & 0x1F; + } + + len = g_unichar_to_utf8 (c, buf); + buf[len] = '\0'; + + event->string = g_locale_from_utf8 (buf, len, + NULL, &bytes_written, + NULL); + if (event->string) + event->length = bytes_written; + } + else if (event->keyval == GDK_KEY_Escape) + { + event->length = 1; + event->string = g_strdup ("\033"); + } + else if (event->keyval == GDK_KEY_Return || + event->keyval == GDK_KEY_KP_Enter) + { + event->length = 1; + event->string = g_strdup ("\r"); + } + + if (!event->string) + { + event->length = 0; + event->string = g_strdup (""); + } +} + +static void generate_key_event (GdkWindow *window, GdkEventType type, guint state, guint keyval, guint16 keycode, gboolean is_modifier) { GdkEvent *event; @@ -341,11 +400,9 @@ generate_key_event (GdkWindow *window, GdkEventType type, guint state, guint key event = gdk_event_new (type); event->key.state = state; event->key.keyval = keyval; - event->key.length = 0; - event->key.string = NULL; // FIXME: Is this still needed? event->key.hardware_keycode = keycode; - event->key.group = 0; // FIXME event->key.is_modifier = is_modifier; + set_key_event_string (&event->key); send_event (window, _gdk_mir_device_manager_get_keyboard (gdk_display_get_device_manager (gdk_window_get_display (window))), event); } |