aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/events.c
diff options
context:
space:
mode:
authorGravatar Rob <rob.manea@gmail.com>2010-02-19 11:09:21 +0100
committerGravatar Brendan Taylor <whateley@gmail.com>2011-04-18 20:23:41 -0600
commit4b106c13eb642f865c4bed2bc149c703e3fe7534 (patch)
treedabf74840d23658e7fc0b66817d84413576a5acb /src/events.c
parent30dcd884200f0ba571411ab3def30e51c90d41dd (diff)
added modifier mask to key_press/release events
Diffstat (limited to 'src/events.c')
-rw-r--r--src/events.c48
1 files changed, 43 insertions, 5 deletions
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: */