diff options
author | djee <djee@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-01-27 21:28:39 +0000 |
---|---|---|
committer | djee <djee@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-01-27 21:28:39 +0000 |
commit | 48cc3b65c2e9aa0220748ad2a83d6a5e4b8067ac (patch) | |
tree | 663615af36bdf3eb00d658269a176fca0d3de9a1 /libjava/jni/gtk-peer | |
parent | ebd6ee23f08035b224608f6dc35ad0327fb90040 (diff) | |
download | gcc-48cc3b65c2e9aa0220748ad2a83d6a5e4b8067ac.tar.gz |
2004-01-27 David Jee <djee@redhat.com>
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
(addExposeFilter): Handle GtkFramePeer separately.
(removeExposeFilter): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@76751 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/jni/gtk-peer')
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c | 62 |
1 files changed, 58 insertions, 4 deletions
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 725c89ebd7d..62a97e255d0 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 (); } |