]> gcc.gnu.org Git - gcc.git/commitdiff
2004-01-27 David Jee <djee@redhat.com>
authorDavid Jee <djee@redhat.com>
Tue, 27 Jan 2004 21:28:39 +0000 (21:28 +0000)
committerDavid Jee <djee@gcc.gnu.org>
Tue, 27 Jan 2004 21:28:39 +0000 (21:28 +0000)
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
(addExposeFilter): Handle GtkFramePeer separately.
(removeExposeFilter): Likewise.

From-SVN: r76751

libjava/ChangeLog
libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c

index 2a021ba8d2c468799707bfc10c5d487ce64eaf57..70fead24cfe1a49bd2bf978da6cd4368e4bcd6e4 100644 (file)
@@ -1,3 +1,9 @@
+2004-01-27  David Jee  <djee@redhat.com>
+
+       * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
+       (addExposeFilter): Handle GtkFramePeer separately.
+       (removeExposeFilter): Likewise.
+
 2004-01-27  Michael Koch  <konqueror@gmx.de>
 
        * gnu/java/net/protocol/http/Connection.java
index 725c89ebd7d55d5331ce48faeaeaf8a81e1394d4..62a97e255d061a938013aa70c0582fd9ee1ca7b1 100644 (file)
@@ -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 ();
 }
This page took 0.071458 seconds and 5 git commands to generate.