From f2919ef38aef3ddfde42e8858fa1b7098a1bba5e Mon Sep 17 00:00:00 2001 From: David Jee Date: Tue, 27 Jan 2004 21:28:39 +0000 Subject: [PATCH] 2004-01-27 David Jee * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c (addExposeFilter): Handle GtkFramePeer separately. (removeExposeFilter): Likewise. From-SVN: r76751 --- libjava/ChangeLog | 6 ++ .../gnu_java_awt_peer_gtk_GtkComponentPeer.c | 62 +++++++++++++++++-- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 2a021ba8d2c4..70fead24cfe1 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,9 @@ +2004-01-27 David Jee + + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c + (addExposeFilter): Handle GtkFramePeer separately. + (removeExposeFilter): Likewise. + 2004-01-27 Michael Koch * gnu/java/net/protocol/http/Connection.java diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c index 725c89ebd7d5..62a97e255d06 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c @@ -602,11 +602,38 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_addExposeFilt void *ptr = NSA_GET_PTR (env, obj); jobject *gref = NSA_GET_GLOBAL_REF (env, obj); g_assert (gref); + GtkObject *filterobj; + GtkWidget *vbox, *layout; + GList *children; gdk_threads_enter (); - g_signal_handlers_block_by_func (GTK_OBJECT(ptr), *pre_event_handler, *gref); - g_signal_connect( GTK_OBJECT(ptr), "event", + // GtkFramePeer is built as a GtkLayout inside a GtkVBox inside a GtkWindow. + // Events go to the GtkLayout layer, so we filter them there. + if (GTK_IS_WINDOW(ptr)) + { + children = gtk_container_get_children(GTK_CONTAINER(ptr)); + vbox = children->data; + g_assert (GTK_IS_VBOX(vbox)); + + children = gtk_container_get_children(GTK_CONTAINER(vbox)); + do + { + layout = children->data; + children = children->next; + } + while (!GTK_IS_LAYOUT (layout) && children != NULL); + g_assert (GTK_IS_LAYOUT(layout)); + + filterobj = GTK_OBJECT(layout); + } + else + { + filterobj = GTK_OBJECT(ptr); + } + + g_signal_handlers_block_by_func (filterobj, *pre_event_handler, *gref); + g_signal_connect( filterobj, "event", G_CALLBACK(filter_expose_event_handler), *gref); gdk_threads_leave (); @@ -618,12 +645,39 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_removeExposeF void *ptr = NSA_GET_PTR (env, obj); jobject *gref = NSA_GET_GLOBAL_REF (env, obj); g_assert (gref); + GtkObject *filterobj; + GtkWidget *vbox, *layout; + GList *children; gdk_threads_enter (); - g_signal_handlers_disconnect_by_func (GTK_OBJECT(ptr), + // GtkFramePeer is built as a GtkLayout inside a GtkVBox inside a GtkWindow. + // Events go to the GtkLayout layer, so we filter them there. + if (GTK_IS_WINDOW(ptr)) + { + children = gtk_container_get_children(GTK_CONTAINER(ptr)); + vbox = children->data; + g_assert (GTK_IS_VBOX(vbox)); + + children = gtk_container_get_children(GTK_CONTAINER(vbox)); + do + { + layout = children->data; + children = children->next; + } + while (!GTK_IS_LAYOUT (layout) && children != NULL); + g_assert (GTK_IS_LAYOUT(layout)); + + filterobj = GTK_OBJECT(layout); + } + else + { + filterobj = GTK_OBJECT(ptr); + } + + g_signal_handlers_disconnect_by_func (filterobj, *filter_expose_event_handler, *gref); - g_signal_handlers_unblock_by_func (GTK_OBJECT(ptr), *pre_event_handler, *gref); + g_signal_handlers_unblock_by_func (filterobj, *pre_event_handler, *gref); gdk_threads_leave (); } -- 2.43.5