diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/callbacks.c | 33 | ||||
-rw-r--r-- | src/events.c | 38 | ||||
-rw-r--r-- | src/events.h | 5 |
3 files changed, 67 insertions, 9 deletions
diff --git a/src/callbacks.c b/src/callbacks.c index d3501b7..446e868 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -162,7 +162,6 @@ gboolean button_press_cb (GtkWidget* window, GdkEventButton* event) { (void) window; gint context; - gchar *details; gboolean propagate = FALSE, sendev = FALSE; @@ -178,6 +177,29 @@ button_press_cb (GtkWidget* window, GdkEventButton* event) { send_event(FORM_ACTIVE, NULL, TYPE_NAME, "button1", NULL); else if((context & WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT)) send_event(ROOT_ACTIVE, NULL, TYPE_NAME, "button1", NULL); + else { + sendev = TRUE; + propagate = TRUE; + } + } + else if(event->button == 2 && !(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE)) { + sendev = TRUE; + propagate = TRUE; + } + else if(event->button > 3) { + sendev = TRUE; + propagate = TRUE; + } + + if(sendev) { + button_to_event(event->button, event->state, GDK_BUTTON_PRESS); + } + } + + if(event->type == GDK_2BUTTON_PRESS || event->type == GDK_3BUTTON_PRESS) { + if(event->button == 1 && !(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE) && (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT)) { + sendev = TRUE; + propagate = TRUE; } else if(event->button == 2 && !(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE)) { sendev = TRUE; @@ -189,9 +211,7 @@ button_press_cb (GtkWidget* window, GdkEventButton* event) { } if(sendev) { - details = g_strdup_printf("Button%d", event->button); - send_event(KEY_PRESS, NULL, TYPE_NAME, details, NULL); - g_free (details); + button_to_event(event->button, event->state, event->type); } } @@ -202,7 +222,6 @@ gboolean button_release_cb (GtkWidget* window, GdkEventButton* event) { (void) window; gint context; - gchar *details; gboolean propagate = FALSE, sendev = FALSE; @@ -218,9 +237,7 @@ button_release_cb (GtkWidget* window, GdkEventButton* event) { } if(sendev) { - details = g_strdup_printf("Button%d", event->button); - send_event(KEY_RELEASE, NULL, TYPE_NAME, details, NULL); - g_free (details); + button_to_event(event->button, event->state, GDK_BUTTON_RELEASE); } } 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: */ diff --git a/src/events.h b/src/events.h index 60ea8df..8e89899 100644 --- a/src/events.h +++ b/src/events.h @@ -47,6 +47,9 @@ gchar * get_modifier_mask(guint state); void -key_to_event(guint keyval, guint state, guint is_modifier, int mode); +key_to_event(guint keyval, guint state, guint is_modifier, gint mode); + +void +button_to_event(guint buttonval, guint state, gint mode); #endif |