diff options
Diffstat (limited to 'src/events.c')
-rw-r--r-- | src/events.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/events.c b/src/events.c index d3da82b..45140c0 100644 --- a/src/events.c +++ b/src/events.c @@ -270,6 +270,12 @@ guint key_to_modifier(guint keyval) { } } +guint button_to_modifier(guint buttonval) { + if(buttonval <= 5) + return 1 << (7 + buttonval); + return 0; +} + /* Transform gdk key events to our own events */ void key_to_event(guint keyval, guint state, guint is_modifier, gint mode) { @@ -309,4 +315,36 @@ key_to_event(guint keyval, guint state, guint is_modifier, gint mode) { g_free(modifiers); } +/* Transform gdk button events to our own events */ +void +button_to_event(guint buttonval, guint state, gint mode) { + gchar *details; + const char *reps; + gchar *modifiers = NULL; + guint mod = button_to_modifier (buttonval); + + /* Get modifier state including this button press/release */ + modifiers = get_modifier_mask(mode != GDK_BUTTON_RELEASE ? state | mod : state & ~mod); + + switch (mode) { + case GDK_2BUTTON_PRESS: + reps = "2"; + break; + case GDK_3BUTTON_PRESS: + reps = "3"; + break; + default: + reps = ""; + break; + } + + details = g_strdup_printf("%sButton%d", reps, buttonval); + + send_event(mode == GDK_BUTTON_PRESS ? KEY_PRESS : KEY_RELEASE, NULL, + TYPE_STR, modifiers, TYPE_FORMATTEDSTR, details, NULL); + + g_free(details); + g_free(modifiers); +} + /* vi: set et ts=4: */ |