From 4b106c13eb642f865c4bed2bc149c703e3fe7534 Mon Sep 17 00:00:00 2001 From: Rob Date: Fri, 19 Feb 2010 11:09:21 +0100 Subject: added modifier mask to key_press/release events --- src/callbacks.c | 4 ++-- src/events.c | 48 +++++++++++++++++++++++++++++++++++++++++++----- src/events.h | 2 +- 3 files changed, 46 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/callbacks.c b/src/callbacks.c index 703107b..c0064ec 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -549,7 +549,7 @@ key_press_cb (GtkWidget* window, GdkEventKey* event) { (void) window; if(event->type == GDK_KEY_PRESS) - key_to_event(event->keyval, GDK_KEY_PRESS); + key_to_event(event->keyval, event->is_modifier?0:event->state, GDK_KEY_PRESS); return uzbl.behave.forward_keys ? FALSE : TRUE; } @@ -559,7 +559,7 @@ key_release_cb (GtkWidget* window, GdkEventKey* event) { (void) window; if(event->type == GDK_KEY_RELEASE) - key_to_event(event->keyval, GDK_KEY_RELEASE); + key_to_event(event->keyval, event->is_modifier?0:event->state, GDK_KEY_RELEASE); return uzbl.behave.forward_keys ? FALSE : TRUE; } diff --git a/src/events.c b/src/events.c index 58dddfc..45b2ef1 100644 --- a/src/events.c +++ b/src/events.c @@ -202,11 +202,46 @@ send_event(int type, const gchar *custom_event, ...) { /* Transform gdk key events to our own events */ void -key_to_event(guint keyval, gint mode) { +key_to_event(guint keyval, guint state, gint mode) { gchar ucs[7]; gint ulen; gchar *keyname; guint32 ukval = gdk_keyval_to_unicode(keyval); + GString *modifiers = g_string_new(""); + gchar *details; + + /* check modifier state*/ + if(state & GDK_MODIFIER_MASK) { + if(state & GDK_SHIFT_MASK) + g_string_append(modifiers, "Shift|"); + if(state & GDK_LOCK_MASK) + g_string_append(modifiers, "ScrollLock|"); + if(state & GDK_CONTROL_MASK) + g_string_append(modifiers, "Ctrl|"); + if(state & GDK_MOD1_MASK) + g_string_append(modifiers,"Mod1|"); + if(state & GDK_MOD2_MASK) + g_string_append(modifiers,"Mod2|"); + if(state & GDK_MOD3_MASK) + g_string_append(modifiers,"Mod3|"); + if(state & GDK_MOD4_MASK) + g_string_append(modifiers,"Mod4|"); + if(state & GDK_MOD5_MASK) + g_string_append(modifiers,"Mod5|"); + if(state & GDK_BUTTON1_MASK) + g_string_append(modifiers,"Button1|"); + if(state & GDK_BUTTON2_MASK) + g_string_append(modifiers,"Button2|"); + if(state & GDK_BUTTON3_MASK) + g_string_append(modifiers,"Button3|"); + if(state & GDK_BUTTON4_MASK) + g_string_append(modifiers,"Button4|"); + if(state & GDK_BUTTON5_MASK) + g_string_append(modifiers,"Button5|"); + + if(modifiers->str[modifiers->len-1] == '|') + g_string_overwrite(modifiers, modifiers->len-1, " "); + } /* check for printable unicode char */ /* TODO: Pass the keyvals through a GtkIMContext so that @@ -216,15 +251,18 @@ key_to_event(guint keyval, gint mode) { ulen = g_unichar_to_utf8(ukval, ucs); ucs[ulen] = 0; - send_event(mode == GDK_KEY_PRESS ? KEY_PRESS : KEY_RELEASE, - NULL, TYPE_FORMATTEDSTR, ucs, NULL); + send_event(mode == GDK_KEY_PRESS ? KEY_PRESS : KEY_RELEASE, NULL, + TYPE_STR, modifiers->str, TYPE_FORMATTEDSTR, ucs, NULL); } /* send keysym for non-printable chars */ else if((keyname = gdk_keyval_name(keyval))){ - send_event(mode == GDK_KEY_PRESS ? KEY_PRESS : KEY_RELEASE, - NULL, TYPE_NAME, keyname , NULL); + send_event(mode == GDK_KEY_PRESS ? KEY_PRESS : KEY_RELEASE, NULL, + TYPE_STR, modifiers->str, TYPE_NAME, keyname , NULL); } + g_string_free(modifiers, TRUE); + g_free(details); + } /* vi: set et ts=4: */ diff --git a/src/events.h b/src/events.h index bd519a6..97ed0a0 100644 --- a/src/events.h +++ b/src/events.h @@ -42,6 +42,6 @@ void send_event(int type, const gchar *custom_event, ...) G_GNUC_NULL_TERMINATED; void -key_to_event(guint keyval, gint mode); +key_to_event(guint keyval, guint state, int mode); #endif -- cgit v1.2.3