summaryrefslogtreecommitdiffstats
path: root/src/x11_in_gtk2.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-08-03 03:19:34 +0000
committerDavid Robillard <d@drobilla.net>2012-08-03 03:19:34 +0000
commit93336e9373bfec10f6f28f2930cb33f076e7af65 (patch)
tree9e012bdbf3afe3b28920aeaa11afaf562318ee2a /src/x11_in_gtk2.c
parent6e2098398135804da9b397ad22137ee0ff14dea0 (diff)
downloadsuil-93336e9373bfec10f6f28f2930cb33f076e7af65.tar.gz
suil-93336e9373bfec10f6f28f2930cb33f076e7af65.tar.bz2
suil-93336e9373bfec10f6f28f2930cb33f076e7af65.zip
Explicitly forward keyboard events to X11 UIs in Gtk.
git-svn-id: http://svn.drobilla.net/lad/trunk/suil@4606 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/x11_in_gtk2.c')
-rw-r--r--src/x11_in_gtk2.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/x11_in_gtk2.c b/src/x11_in_gtk2.c
index abb58f6..c2c73e3 100644
--- a/src/x11_in_gtk2.c
+++ b/src/x11_in_gtk2.c
@@ -17,6 +17,7 @@
#include <string.h>
#include <gtk/gtk.h>
+#include <gdk/gdkx.h>
#include "./suil_internal.h"
@@ -129,6 +130,19 @@ wrapper_free(SuilWrapper* wrapper)
}
}
+static GdkFilterReturn
+event_filter(GdkXEvent* xevent, GdkEvent* event, gpointer data)
+{
+ SuilX11Wrapper* wrap = (SuilX11Wrapper*)data;
+ XEvent* ev = (XEvent*)xevent;
+ if (wrap->instance->handle && (ev->type == KeyPress || ev->type == KeyRelease)) {
+ // Forward keyboard events to UI window
+ XSendEvent(ev->xkey.display, (Window)wrap->instance->ui_widget, 1, 0, ev);
+ XSync(ev->xkey.display, TRUE);
+ }
+ return GDK_FILTER_CONTINUE;
+}
+
SUIL_API
SuilWrapper*
suil_wrapper_new(SuilHost* host,
@@ -150,6 +164,9 @@ suil_wrapper_new(SuilHost* host,
wrapper->resize.handle = wrap;
wrapper->resize.ui_resize = wrapper_resize;
+ GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(wrap));
+ gdk_window_add_filter(window, event_filter, wrap);
+
suil_add_feature(features, &n_features, LV2_UI__parent,
(void*)(intptr_t)gtk_plug_get_id(wrap->plug));