summaryrefslogtreecommitdiffstats
path: root/src
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
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')
-rw-r--r--src/win_in_gtk2.c26
-rw-r--r--src/x11_in_gtk2.c17
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 <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));