aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/callbacks.c33
-rw-r--r--src/events.c38
-rw-r--r--src/events.h5
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