This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch] Fix to add/removeExposeFilter in GtkComponentPeer


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 ();
 }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]