classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] [patch] eliminate unnecessary panel expose events


From: Thomas Fitzsimmons
Subject: [cp-patches] [patch] eliminate unnecessary panel expose events
Date: Thu, 09 Jun 2005 18:54:46 -0400

Hi,

We set the GTK_CAN_FOCUS flag on the GtkFixed we use to implement
GtkPanelPeer.  By default, widgets with this flag set are repainted when
they receive the keyboard focus.  This allows them to draw their focus
indicator (e.g. the "marching ants" line around a button).  Since panels
have no focus indicator, we don't want them redrawn when they receive
focus.

This patch overrides GtkFixed's default signal handler:

static gboolean
gtk_widget_real_focus_out_event (GtkWidget     *widget,
                                 GdkEventFocus *event)
{
  gtk_widget_queue_shallow_draw (widget);

  return FALSE;
}


and simply returns TRUE.  This causes signal processing to stop, thus
preventing the repaint.  I committed this to mainline.

Tom

2005-06-09  Thomas Fitzsimmons  <address@hidden>

        * gnu/java/awt/peer/gtk/GtkPanelPeer.java,
        gnu_java_awt_peer_gtk_GtkPanelPeer.c (connectSignals): New method.
        * include/gnu_java_awt_peer_gtk_GtkPanelPeer.h: Regenerate.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
        (window_focus_in_cb, window_focus_out_cb): Remove FIXMEs.

Index: gnu/java/awt/peer/gtk/GtkPanelPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkPanelPeer.java,v
retrieving revision 1.17
diff -u -r1.17 GtkPanelPeer.java
--- gnu/java/awt/peer/gtk/GtkPanelPeer.java     8 Oct 2004 22:16:09 -0000       
1.17
+++ gnu/java/awt/peer/gtk/GtkPanelPeer.java     9 Jun 2005 22:46:58 -0000
@@ -65,4 +65,6 @@
       }
     super.handleEvent (event);
   }
+
+  native void connectSignals ();
 }
Index: include/gnu_java_awt_peer_gtk_GtkPanelPeer.h
===================================================================
RCS file: 
/cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkPanelPeer.h,v
retrieving revision 1.6
diff -u -r1.6 gnu_java_awt_peer_gtk_GtkPanelPeer.h
--- include/gnu_java_awt_peer_gtk_GtkPanelPeer.h        8 Oct 2004 22:16:09 
-0000       1.6
+++ include/gnu_java_awt_peer_gtk_GtkPanelPeer.h        9 Jun 2005 22:46:59 
-0000
@@ -11,6 +11,7 @@
 #endif
 
 JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkPanelPeer_create (JNIEnv 
*env, jobject);
+JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectSignals 
(JNIEnv *env, jobject);
 
 #ifdef __cplusplus
 }
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c,v
retrieving revision 1.12
diff -u -r1.12 gnu_java_awt_peer_gtk_GtkPanelPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c    8 Oct 2004 
22:16:09 -0000       1.12
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c    9 Jun 2005 
22:47:00 -0000
@@ -40,6 +40,13 @@
 #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
 #include "gnu_java_awt_peer_gtk_GtkPanelPeer.h"
 
+static gboolean panel_focus_in_cb (GtkWidget * widget,
+                                   GdkEventFocus *event,
+                                   jobject peer);
+static gboolean panel_focus_out_cb (GtkWidget * widget,
+                                    GdkEventFocus *event,
+                                    jobject peer);
+
 JNIEXPORT void JNICALL 
 Java_gnu_java_awt_peer_gtk_GtkPanelPeer_create
   (JNIEnv *env, jobject obj)
@@ -49,7 +56,7 @@
   NSA_SET_GLOBAL_REF (env, obj);
 
   gdk_threads_enter ();
-  
+
   widget = gtk_fixed_new ();
 
   gtk_fixed_set_has_window (GTK_FIXED (widget), TRUE);
@@ -60,3 +67,47 @@
 
   NSA_SET_PTR (env, obj, widget);
 }
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectSignals
+  (JNIEnv *env, jobject obj)
+{
+  void *ptr;
+  jobject *gref;
+
+  ptr = NSA_GET_PTR (env, obj);
+  gref = NSA_GET_GLOBAL_REF (env, obj);
+
+  gdk_threads_enter ();
+
+  g_signal_connect (GTK_OBJECT (ptr), "event",
+                    G_CALLBACK (pre_event_handler), *gref);
+
+  g_signal_connect (G_OBJECT (ptr), "focus-in-event",
+                    G_CALLBACK (panel_focus_in_cb), *gref);
+
+  g_signal_connect (G_OBJECT (ptr), "focus-out-event",
+                    G_CALLBACK (panel_focus_out_cb), *gref);
+
+  g_signal_connect_after (G_OBJECT (ptr), "realize",
+                          G_CALLBACK (connect_awt_hook_cb), *gref);
+
+  gdk_threads_leave ();
+}
+
+static gboolean
+panel_focus_in_cb (GtkWidget * widget  __attribute__((unused)),
+                   GdkEventFocus *event  __attribute__((unused)),
+                   jobject peer __attribute__((unused)))
+{
+  return TRUE;
+}
+
+static gboolean
+panel_focus_out_cb (GtkWidget * widget __attribute__((unused)),
+                    GdkEventFocus *event __attribute__((unused)),
+                    jobject peer __attribute__((unused)))
+{
+  return TRUE;
+}
+
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c,v
retrieving revision 1.47
diff -u -r1.47 gnu_java_awt_peer_gtk_GtkWindowPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c   1 May 2005 
13:53:30 -0000       1.47
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c   9 Jun 2005 
22:47:00 -0000
@@ -561,8 +561,6 @@
                               postWindowEventID,
                               (jint) AWT_WINDOW_GAINED_FOCUS,
                               (jobject) NULL, (jint) 0);
-  /* FIXME: somewhere after this is handled, the child window is
-     getting an expose event. */
   gdk_threads_enter ();
   return FALSE;
 }
@@ -577,8 +575,6 @@
                               postWindowEventID,
                               (jint) AWT_WINDOW_LOST_FOCUS,
                               (jobject) NULL, (jint) 0);
-  /* FIXME: somewhere after this is handled, the child window is
-     getting an expose event. */
   gdk_threads_enter ();
   return FALSE;
 }

reply via email to

[Prev in Thread] Current Thread [Next in Thread]