From 808144772e3be3495529c3b3e4bc36d4cd23f85f Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 22 Feb 2013 23:43:27 +0000 Subject: Grab focus on show. I am not sure why this is necessary, but key events now work in Jalv, Ingen, and Ardour 3, so whatever. git-svn-id: http://svn.drobilla.net/lad/trunk/suil@5065 a436a847-0d15-0410-975c-d299462d15a1 --- src/x11_in_gtk2.c | 92 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 54 insertions(+), 38 deletions(-) (limited to 'src') diff --git a/src/x11_in_gtk2.c b/src/x11_in_gtk2.c index 9d79541..2bafd0c 100644 --- a/src/x11_in_gtk2.c +++ b/src/x11_in_gtk2.c @@ -42,44 +42,6 @@ GType suil_x11_wrapper_get_type(void); // Accessor for SUIL_TYPE_X11_WRAPPER G_DEFINE_TYPE(SuilX11Wrapper, suil_x11_wrapper, GTK_TYPE_SOCKET) -static void -forward_key_event(SuilX11Wrapper* socket, - GdkEvent* gdk_event) -{ - GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(socket->plug)); - GdkScreen* screen = gdk_window_get_screen(window); - - XKeyEvent xev; - memset(&xev, 0, sizeof(xev)); - xev.type = (gdk_event->type == GDK_KEY_PRESS) ? KeyPress : KeyRelease; - xev.root = GDK_WINDOW_XID(gdk_screen_get_root_window(screen)); - xev.window = GDK_WINDOW_XID(window); - xev.subwindow = None; - xev.time = gdk_event->key.time; - xev.state = gdk_event->key.state; - xev.keycode = gdk_event->key.hardware_keycode; - - XSendEvent (GDK_WINDOW_XDISPLAY(window), - (Window)socket->instance->ui_widget, - False, - NoEventMask, - (XEvent*)&xev); -} - -static gboolean -suil_x11_wrapper_key_event(GtkWidget* widget, - GdkEventKey* event) -{ - SuilX11Wrapper* const self = SUIL_X11_WRAPPER(widget); - - if (self->plug) { - forward_key_event(self, (GdkEvent*)event); - return TRUE; - } - - return FALSE; -} - static gboolean on_plug_removed(GtkSocket* sock, gpointer data) { @@ -115,9 +77,62 @@ suil_x11_wrapper_realize(GtkWidget* w) } gtk_socket_add_id(socket, gtk_plug_get_id(wrap->plug)); + + gtk_widget_set_sensitive(GTK_WIDGET(wrap->plug), TRUE); + gtk_widget_set_can_focus(GTK_WIDGET(wrap->plug), TRUE); + gtk_widget_grab_focus(GTK_WIDGET(wrap->plug)); +} + +static void +suil_x11_wrapper_show(GtkWidget* w) +{ + SuilX11Wrapper* const wrap = SUIL_X11_WRAPPER(w); + + if (GTK_WIDGET_CLASS(suil_x11_wrapper_parent_class)->show) { + GTK_WIDGET_CLASS(suil_x11_wrapper_parent_class)->show(w); + } + gtk_widget_show(GTK_WIDGET(wrap->plug)); } +static void +forward_key_event(SuilX11Wrapper* socket, + GdkEvent* gdk_event) +{ + GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(socket->plug)); + GdkScreen* screen = gdk_window_get_screen(window); + + XKeyEvent xev; + memset(&xev, 0, sizeof(xev)); + xev.type = (gdk_event->type == GDK_KEY_PRESS) ? KeyPress : KeyRelease; + xev.root = GDK_WINDOW_XID(gdk_screen_get_root_window(screen)); + xev.window = GDK_WINDOW_XID(window); + xev.subwindow = None; + xev.time = gdk_event->key.time; + xev.state = gdk_event->key.state; + xev.keycode = gdk_event->key.hardware_keycode; + + XSendEvent (GDK_WINDOW_XDISPLAY(window), + (Window)socket->instance->ui_widget, + False, + NoEventMask, + (XEvent*)&xev); +} + +static gboolean +suil_x11_wrapper_key_event(GtkWidget* widget, + GdkEventKey* event) +{ + SuilX11Wrapper* const self = SUIL_X11_WRAPPER(widget); + + if (self->plug) { + forward_key_event(self, (GdkEvent*)event); + return TRUE; + } + + return FALSE; +} + static void suil_x11_wrapper_class_init(SuilX11WrapperClass* klass) { @@ -126,6 +141,7 @@ suil_x11_wrapper_class_init(SuilX11WrapperClass* klass) gobject_class->finalize = suil_x11_wrapper_finalize; widget_class->realize = suil_x11_wrapper_realize; + widget_class->show = suil_x11_wrapper_show; widget_class->key_press_event = suil_x11_wrapper_key_event; } -- cgit v1.2.1