This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[gui][PATCH] Button peer painting fixes
- From: Thomas Fitzsimmons <fitzsim at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Fri, 08 Oct 2004 13:49:20 -0400
- Subject: [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;