Index: gnu/java/awt/peer/gtk/GtkButtonPeer.java =================================================================== RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkButtonPeer.java,v retrieving revision 1.33 diff -u -r1.33 GtkButtonPeer.java --- gnu/java/awt/peer/gtk/GtkButtonPeer.java 2 Oct 2004 07:53:47 -0000 1.33 +++ gnu/java/awt/peer/gtk/GtkButtonPeer.java 8 Oct 2004 22:27:03 -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: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c,v retrieving revision 1.15 diff -u -r1.15 gnu_java_awt_peer_gtk_GdkGraphics.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 8 Oct 2004 22:16:09 -0000 1.15 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 8 Oct 2004 22:27:03 -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: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c,v retrieving revision 1.18 diff -u -r1.18 gnu_java_awt_peer_gtk_GtkButtonPeer.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c 8 Oct 2004 22:16:09 -0000 1.18 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c 8 Oct 2004 22:27:03 -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: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c,v retrieving revision 1.24 diff -u -r1.24 gnu_java_awt_peer_gtk_GtkMainThread.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c 8 Oct 2004 22:16:09 -0000 1.24 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c 8 Oct 2004 22:27:03 -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, "", "(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: native/jni/gtk-peer/gtkpeer.h =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gtkpeer.h,v retrieving revision 1.24 diff -u -r1.24 gtkpeer.h --- native/jni/gtk-peer/gtkpeer.h 8 Oct 2004 22:16:09 -0000 1.24 +++ native/jni/gtk-peer/gtkpeer.h 8 Oct 2004 22:27:03 -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: include/gnu_java_awt_peer_gtk_GtkButtonPeer.h =================================================================== RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkButtonPeer.h,v retrieving revision 1.10 diff -u -r1.10 gnu_java_awt_peer_gtk_GtkButtonPeer.h --- include/gnu_java_awt_peer_gtk_GtkButtonPeer.h 23 Sep 2004 22:57:12 -0000 1.10 +++ include/gnu_java_awt_peer_gtk_GtkButtonPeer.h 8 Oct 2004 22:27:03 -0000 @@ -15,6 +15,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetModifyFont (JNIEnv *env, jobject, jstring, jint, jint); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetLabel (JNIEnv *env, jobject, jstring); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetSetForeground (JNIEnv *env, jobject, jint, jint, jint); +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetSetBackground (JNIEnv *env, jobject, jint, jint, jint); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkActivate (JNIEnv *env, jobject); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetRequestFocus (JNIEnv *env, jobject);