From 93336e9373bfec10f6f28f2930cb33f076e7af65 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 3 Aug 2012 03:19:34 +0000 Subject: 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 --- src/win_in_gtk2.c | 26 +++++++++++++------------- src/x11_in_gtk2.c | 17 +++++++++++++++++ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/win_in_gtk2.c b/src/win_in_gtk2.c index 8367996..159639a 100644 --- a/src/win_in_gtk2.c +++ b/src/win_in_gtk2.c @@ -65,19 +65,6 @@ suil_win_wrapper_init(SuilWinWrapper* self) self->instance = NULL; } -GdkFilterReturn -event_filter(GdkXEvent* xevent, GdkEvent* event, gpointer data) -{ - SuilWinWrapper* wrap = (SuilWinWrapper*)data; - MSG* msg = (MSG*)xevent; - if (msg->message == WM_KEYDOWN || msg->message == WM_KEYUP) { - // Forward keyboard events to UI window - PostMessage((HWND)wrap->instance->ui_widget, - msg->message, msg->wParam, msg->lParam); - } - return GDK_FILTER_CONTINUE; -} - static int wrapper_resize(LV2UI_Feature_Handle handle, int width, int height) { @@ -107,6 +94,19 @@ wrapper_free(SuilWrapper* wrapper) } } +static GdkFilterReturn +event_filter(GdkXEvent* xevent, GdkEvent* event, gpointer data) +{ + SuilWinWrapper* wrap = (SuilWinWrapper*)data; + MSG* msg = (MSG*)xevent; + if (msg->message == WM_KEYDOWN || msg->message == WM_KEYUP) { + // Forward keyboard events to UI window + PostMessage((HWND)wrap->instance->ui_widget, + msg->message, msg->wParam, msg->lParam); + } + return GDK_FILTER_CONTINUE; +} + SUIL_API SuilWrapper* suil_wrapper_new(SuilHost* host, 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 #include +#include #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)); -- cgit v1.2.1