This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[Patch] Fix to add/removeExposeFilter in GtkComponentPeer
- From: David Jee <djee at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: 27 Jan 2004 15:27:58 -0500
- Subject: [Patch] Fix to add/removeExposeFilter in GtkComponentPeer
- Organization:
Hello,
This patch fixes a bug in the add/removeExposeFilter() methods in
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c. They were not
handling the special case of GtkFramePeer, and were letting through
unwanted expose events as a result.
Ok to commit?
-David Jee
2004-01-27 David Jee <djee@redhat.com>
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
(addExposeFilter): Handle GtkFramePeer separately.
(removeExposeFilter): Likewise.
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c,v
retrieving revision 1.14
diff -u -r1.14 gnu_java_awt_peer_gtk_GtkComponentPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 26 Jan 2004 21:55:42 -0000 1.14
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 27 Jan 2004 20:13:17 -0000
@@ -602,11 +602,38 @@
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 @@
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 ();
}