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]

[gui][PATCH] Button peer painting fixes


Hi,

I just committed this patch to java-gui-branch.  Button colours are set
properly now.  Also, buttons are only repainted when necessary.

Tom

2004-10-08  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* gnu/java/awt/peer/gtk/GtkButtonPeer.java,
	jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
	(gtkWidgetSetBackground): New method.
	(block_expose_events_cb): New function.
	(connectSignals): Block the AWT's expose event processing on
	button press and release.
	(gtkSetLabel): Set text on proper widget.
	(gtkWidgetModifyFont): Modify font on proper widget.
	(gtkWidgetSetBackground): Set normal, active and prelight
	colours.
	(gtkWidgetSetForeground): Set forground colour of proper widget.
	(gtkActivate): Activate the correct widget.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c (clearRect):
	Only clear rectangle if the backing component is not an event
	box.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
	(beginNativeRepaintID): New variable.
	(endNativeRepaintID): Likewise.
	(gtkInit): Initialize new fields with method IDs.
	* jni/gtk-peer/gtkpeer.h (beginNativeRepaintID): Declare extern.
	(endNativeRepaintID): Likewise.

Index: gnu/java/awt/peer/gtk/GtkButtonPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java,v
retrieving revision 1.8.2.8
diff -u -r1.8.2.8 GtkButtonPeer.java
--- gnu/java/awt/peer/gtk/GtkButtonPeer.java	7 Oct 2004 07:20:31 -0000	1.8.2.8
+++ gnu/java/awt/peer/gtk/GtkButtonPeer.java	8 Oct 2004 17:44:22 -0000
@@ -57,6 +57,7 @@
   native void gtkWidgetModifyFont (String name, int style, int size);
   native void gtkSetLabel (String label);
   native void gtkWidgetSetForeground (int red, int green, int blue);
+  native void gtkWidgetSetBackground (int red, int green, int blue);
   native void gtkActivate ();
   native void gtkWidgetRequestFocus ();
 
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c,v
retrieving revision 1.5.2.9
diff -u -r1.5.2.9 gnu_java_awt_peer_gtk_GdkGraphics.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c	7 Oct 2004 22:11:58 -0000	1.5.2.9
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c	8 Oct 2004 17:44:23 -0000
@@ -419,14 +419,18 @@
 {
   struct graphics *g;
   GdkGCValues saved;
+  GtkWidget *widget;
 
   g = (struct graphics *) NSA_GET_PTR (env, obj);
 
   gdk_threads_enter ();
   if (GDK_IS_WINDOW (g->drawable))
     {
-      gdk_window_clear_area ((GdkWindow *) g->drawable,
-                             x + g->x_offset, y + g->y_offset, width, height);
+      gdk_window_get_user_data (GDK_WINDOW (g->drawable), (void **) &widget);
+      if (widget == NULL || !GTK_IS_EVENT_BOX (widget))
+        gdk_window_clear_area ((GdkWindow *) g->drawable,
+                               x + g->x_offset, y + g->y_offset,
+                               width, height);
     }
   else
     {
@@ -436,7 +440,6 @@
 			  x + g->x_offset, y + g->y_offset, width, height);
       gdk_gc_set_foreground (g->gc, &(saved.foreground));
     }
-  /* gdk_flush (); */
   gdk_threads_leave ();
 }
 
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c,v
retrieving revision 1.8.2.6
diff -u -r1.8.2.6 gnu_java_awt_peer_gtk_GtkButtonPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c	7 Oct 2004 22:11:59 -0000	1.8.2.6
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c	8 Oct 2004 17:44:23 -0000
@@ -46,6 +46,9 @@
                               GdkEventFocus *event,
                               jobject peer);
 
+static void block_expose_events_cb (GtkWidget *widget,
+                                    jobject peer);
+
 JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create
   (JNIEnv *env, jobject obj, jstring label)
@@ -98,6 +101,12 @@
   g_signal_connect (G_OBJECT (button), "focus-out-event",
                     G_CALLBACK (focus_out_cb), *gref);
 
+  g_signal_connect_after (G_OBJECT (button), "pressed",
+                          G_CALLBACK (block_expose_events_cb), *gref);
+
+  g_signal_connect_after (G_OBJECT (button), "released",
+                          G_CALLBACK (block_expose_events_cb), *gref);
+
   gdk_threads_leave ();
 }
 
@@ -106,6 +115,7 @@
   (JNIEnv *env, jobject obj, jstring jtext)
 {
   const char *text;
+  GtkWidget *button;
   GtkWidget *label;
   void *ptr;
 
@@ -115,7 +125,8 @@
 
   gdk_threads_enter ();
 
-  label = gtk_bin_get_child (GTK_BIN (ptr));
+  button = gtk_bin_get_child (GTK_BIN (ptr));
+  label = gtk_bin_get_child (GTK_BIN (button));
   gtk_label_set_text (GTK_LABEL (label), text);
 
   gdk_threads_leave ();
@@ -129,6 +140,7 @@
 {
   const char *font_name;
   void *ptr;
+  GtkWidget *button;
   GtkWidget *label;
   PangoFontDescription *font_desc;
 
@@ -138,7 +150,8 @@
 
   gdk_threads_enter();
 
-  label = gtk_bin_get_child (GTK_BIN (ptr));
+  button = gtk_bin_get_child (GTK_BIN (ptr));
+  label = gtk_bin_get_child (GTK_BIN (button));
 
   font_desc = pango_font_description_from_string (font_name);
   pango_font_description_set_size (font_desc, size * dpi_conversion_factor);
@@ -159,10 +172,56 @@
 }
 
 JNIEXPORT void JNICALL 
+Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetSetBackground
+  (JNIEnv *env, jobject obj, jint red, jint green, jint blue)
+{
+  GdkColor normal_color;
+  GdkColor prelight_color;
+  GdkColor active_color;
+  int prelight_red;
+  int prelight_blue;
+  int prelight_green;
+  GtkWidget *button;
+  void *ptr;
+
+  ptr = NSA_GET_PTR (env, obj);
+
+  normal_color.red = (red / 255.0) * 65535;
+  normal_color.green = (green / 255.0) * 65535;
+  normal_color.blue = (blue / 255.0) * 65535;
+
+  /* This calculation only approximate the active color produced by
+     Sun's AWT. */
+  active_color.red = 0.85 * (red / 255.0) * 65535;
+  active_color.green = 0.85 * (green / 255.0) * 65535;
+  active_color.blue = 0.85 * (blue / 255.0) * 65535;
+
+  /* There is no separate prelight color in Motif. */
+  prelight_red = 1.15 * (red / 255.0) * 65535;
+  prelight_green = 1.15 * (green / 255.0) * 65535;
+  prelight_blue = 1.15 * (blue / 255.0) * 65535;
+
+  prelight_color.red = prelight_red > 65535 ? 65535 : prelight_red;
+  prelight_color.green = prelight_green > 65535 ? 65535 : prelight_green;
+  prelight_color.blue = prelight_blue > 65535 ? 65535 : prelight_blue;
+
+  gdk_threads_enter ();
+
+  button = gtk_bin_get_child (GTK_BIN (ptr));
+
+  gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &normal_color);
+  gtk_widget_modify_bg (button, GTK_STATE_ACTIVE, &active_color);
+  gtk_widget_modify_bg (button, GTK_STATE_PRELIGHT, &prelight_color);
+
+  gdk_threads_leave ();
+}
+
+JNIEXPORT void JNICALL 
 Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetSetForeground
   (JNIEnv *env, jobject obj, jint red, jint green, jint blue)
 {
   GdkColor color;
+  GtkWidget *button;
   GtkWidget *label;
   void *ptr;
 
@@ -174,7 +233,8 @@
 
   gdk_threads_enter ();
 
-  label = gtk_bin_get_child (GTK_BIN(ptr));
+  button = gtk_bin_get_child (GTK_BIN (ptr));
+  label = gtk_bin_get_child (GTK_BIN (button));
 
   gtk_widget_modify_fg (label, GTK_STATE_NORMAL, &color);
   gtk_widget_modify_fg (label, GTK_STATE_ACTIVE, &color);
@@ -187,13 +247,15 @@
 Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkActivate
   (JNIEnv *env, jobject obj)
 {
+  GtkWidget *button;
   void *ptr;
 
   ptr = NSA_GET_PTR (env, obj);
 
   gdk_threads_enter ();
 
-  gtk_widget_activate (GTK_WIDGET (ptr));
+  button = gtk_bin_get_child (GTK_BIN (ptr));
+  gtk_widget_activate (GTK_WIDGET (button));
 
   gdk_threads_leave ();
 }
@@ -236,3 +298,15 @@
                               JNI_FALSE);
   return FALSE;
 }
+
+static void
+block_expose_events_cb (GtkWidget *widget, jobject peer)
+{
+  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+                              beginNativeRepaintID);
+
+  gdk_window_process_updates (widget->window, TRUE);
+
+  (*gdk_env)->CallVoidMethod (gdk_env, peer,
+                              endNativeRepaintID);
+}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c,v
retrieving revision 1.12.8.5
diff -u -r1.12.8.5 gnu_java_awt_peer_gtk_GtkMainThread.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c	7 Oct 2004 22:11:59 -0000	1.12.8.5
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c	8 Oct 2004 17:44:23 -0000
@@ -61,6 +61,9 @@
 jmethodID postTextEventID;
 jmethodID postWindowEventID;
 
+jmethodID beginNativeRepaintID;
+jmethodID endNativeRepaintID;
+
 jmethodID initComponentGraphicsID;
 jmethodID initComponentGraphics2DID;
 jmethodID setCursorID;
@@ -95,7 +98,6 @@
   int argc = 1;
   char **argv;
   char *homedir, *rcpath = NULL;
-/*    jclass gtkgenericpeer; */
   jclass gtkcomponentpeer, gtkchoicepeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer,
     gtkmenuitempeer, gtktextcomponentpeer, window, gdkgraphics, gdkgraphics2d;
 
@@ -145,8 +147,6 @@
   g_free (argv);
 
   /* setup cached IDs for posting GTK events to Java */
-/*    gtkgenericpeer = (*env)->FindClass (env,  */
-/*  				      "gnu/java/awt/peer/gtk/GtkGenericPeer"); */
 
   window = (*env)->FindClass (env, "java/awt/Window");
 
@@ -167,13 +167,6 @@
                                    "gnu/java/awt/peer/gtk/GdkGraphics");
   gdkgraphics2d = (*env)->FindClass (env,
                                      "gnu/java/awt/peer/gtk/GdkGraphics2D");
-/*    gdkColor = (*env)->FindClass (env, */
-/*  				"gnu/java/awt/peer/gtk/GdkColor"); */
-/*    gdkColorID = (*env)->GetMethodID (env, gdkColor, "<init>", "(III)V"); */
-/*    postActionEventID = (*env)->GetMethodID (env, gtkgenericpeer,  */
-/*  					   "postActionEvent",  */
-/*  					   "(Ljava/lang/String;I)V"); */
-
   setBoundsCallbackID = (*env)->GetMethodID (env, window,
 					     "setBoundsCallback",
 					     "(IIII)V");
@@ -185,6 +178,12 @@
                                           "postMouseEvent", "(IJIIIIZ)V");
   setCursorID = (*env)->GetMethodID (env, gtkcomponentpeer,
                                      "setCursor", "()V");
+  beginNativeRepaintID = (*env)->GetMethodID (env, gtkcomponentpeer, 
+                                              "beginNativeRepaint", "()V");
+
+  endNativeRepaintID = (*env)->GetMethodID (env, gtkcomponentpeer, 
+                                            "endNativeRepaint", "()V");
+
   postConfigureEventID = (*env)->GetMethodID (env, gtkwindowpeer, 
 					      "postConfigureEvent", "(IIII)V");
   postWindowEventID = (*env)->GetMethodID (env, gtkwindowpeer,
Index: jni/gtk-peer/gtkpeer.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gtkpeer.h,v
retrieving revision 1.12.8.11
diff -u -r1.12.8.11 gtkpeer.h
--- jni/gtk-peer/gtkpeer.h	7 Oct 2004 22:11:59 -0000	1.12.8.11
+++ jni/gtk-peer/gtkpeer.h	8 Oct 2004 17:44:23 -0000
@@ -450,6 +450,9 @@
 extern jmethodID postTextEventID;
 extern jmethodID postWindowEventID;
 
+extern jmethodID beginNativeRepaintID;
+extern jmethodID endNativeRepaintID;
+
 extern jmethodID initComponentGraphicsID;
 extern jmethodID initComponentGraphics2DID;
 extern jmethodID setCursorID;

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