Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c,v retrieving revision 1.2 diff -u -b -B -r1.2 gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c 7 Jan 2004 02:23:37 -0000 1.2 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c 19 Mar 2004 22:24:04 -0000 @@ -53,6 +53,7 @@ jintArray array; jint *metrics; struct peerfont *pf = NULL; + FT_Matrix mat; pf = NSA_GET_FONT_PTR(env, font); g_assert (pf != NULL); @@ -62,14 +63,21 @@ gdk_threads_enter (); -#define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 63.0)) -#define DOUBLE_FROM_26_6(t) (((double)((t) >> 6)) \ - + ((double)((t) & 0x3F) / 63.0)) +#define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 64.0)) +#define DOUBLE_FROM_26_6(t) ((double)(t) / 64.0) +#define DOUBLE_TO_16_16(d) ((FT_Fixed)((d) * 65536.0)) +#define DOUBLE_FROM_16_16(t) ((double)(t) / 65536.0) double pointsize = pango_font_description_get_size (pf->desc); pointsize /= (double) PANGO_SCALE; + mat.xx = DOUBLE_TO_16_16(1); + mat.xy = DOUBLE_TO_16_16(0); + mat.yx = DOUBLE_TO_16_16(0); + mat.yy = DOUBLE_TO_16_16(1); + FT_Face face = pango_ft2_font_get_face (pf->font); + FT_Set_Transform(face, &mat, NULL); FT_Set_Char_Size( face, DOUBLE_TO_26_6 (pointsize), DOUBLE_TO_26_6 (pointsize), Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c,v retrieving revision 1.1 diff -u -b -B -r1.1 gnu_java_awt_peer_gtk_GdkGlyphVector.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c 20 Nov 2003 22:27:37 -0000 1.1 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c 19 Mar 2004 22:24:05 -0000 @@ -47,9 +47,10 @@ double height; } rect_t; -#define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 63.0)) -#define DOUBLE_FROM_26_6(t) (((double)((t) >> 6)) \ - + ((double)((t) & 0x3F) / 63.0)) +#define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 64.0)) +#define DOUBLE_FROM_26_6(t) ((double)(t) / 64.0) +#define DOUBLE_TO_16_16(d) ((FT_Fixed)((d) * 65536.0)) +#define DOUBLE_FROM_16_16(t) ((double)(t) / 65536.0) JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_initStaticState (JNIEnv *env, jclass clazz) @@ -401,6 +402,21 @@ return idx; } +static void +assume_pointsize_and_identity_transform(double pointsize, + FT_Face face) +{ + FT_Matrix mat; + mat.xx = DOUBLE_TO_16_16(1); + mat.xy = DOUBLE_TO_16_16(0); + mat.yx = DOUBLE_TO_16_16(0); + mat.yy = DOUBLE_TO_16_16(1); + FT_Set_Transform(face, &mat, NULL); + FT_Set_Char_Size( face, + DOUBLE_TO_26_6 (pointsize), + DOUBLE_TO_26_6 (pointsize), + 0, 0); +} JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allInkExtents (JNIEnv *env, jobject self) @@ -432,10 +448,7 @@ g_assert (gi->glyphs != NULL); face = pango_ft2_font_get_face (gi->item->analysis.font); - FT_Set_Char_Size( face, - DOUBLE_TO_26_6 (pointsize), - DOUBLE_TO_26_6 (pointsize), - 0, 0); + assume_pointsize_and_identity_transform (pointsize, face); for (j = 0; j < gi->glyphs->num_glyphs; ++j) { @@ -487,10 +500,7 @@ g_assert (gi->glyphs != NULL); face = pango_ft2_font_get_face (gi->item->analysis.font); - FT_Set_Char_Size( face, - DOUBLE_TO_26_6 (pointsize), - DOUBLE_TO_26_6 (pointsize), - 0, 0); + assume_pointsize_and_identity_transform (pointsize, face); for (j = 0; j < gi->glyphs->num_glyphs; ++j) { @@ -541,10 +551,8 @@ pointsize = pango_font_description_get_size (vec->desc); pointsize /= (double) PANGO_SCALE; face = pango_ft2_font_get_face (font); - FT_Set_Char_Size( face, - DOUBLE_TO_26_6 (pointsize), - DOUBLE_TO_26_6 (pointsize), - 0, 0); + + assume_pointsize_and_identity_transform (pointsize, face); FT_Load_Glyph (face, gi->glyph, FT_LOAD_DEFAULT); @@ -588,10 +596,8 @@ pointsize = pango_font_description_get_size (vec->desc); pointsize /= (double) PANGO_SCALE; face = pango_ft2_font_get_face (font); - FT_Set_Char_Size( face, - DOUBLE_TO_26_6 (pointsize), - DOUBLE_TO_26_6 (pointsize), - 0, 0); + + assume_pointsize_and_identity_transform (pointsize, face); FT_Load_Glyph (face, gi->glyph, FT_LOAD_DEFAULT); /* FIXME: this needs to change for vertical layouts */ 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.6 diff -u -b -B -r1.6 gnu_java_awt_peer_gtk_GdkGraphics.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 8 Oct 2003 23:40:49 -0000 1.6 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 19 Mar 2004 22:24:05 -0000 @@ -188,7 +188,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawString (JNIEnv *env, jobject obj, jstring str, jint x, jint y, - jstring fname, jint size) + jstring fname, jint style, jint size) { struct graphics *g; const char *cstr; @@ -209,6 +209,12 @@ font_desc = pango_font_description_from_string (font_name); pango_font_description_set_size (font_desc, size * PANGO_SCALE); + if (style & AWT_STYLE_BOLD) + pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); + + if (style & AWT_STYLE_ITALIC) + pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE); + context = gdk_pango_context_get(); pango_context_set_font_description (context, font_desc); @@ -316,12 +322,24 @@ (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) { struct graphics *g; + GdkGCValues saved; 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); + } + else + { + gdk_gc_get_values (g->gc, &saved); + gdk_gc_set_foreground (g->gc, &(saved.background)); + gdk_draw_rectangle (g->drawable, g->gc, TRUE, + x + g->x_offset, y + g->y_offset, width, height); + gdk_gc_set_foreground (g->gc, &(saved.foreground)); + } gdk_threads_leave (); } Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c,v retrieving revision 1.3 diff -u -b -B -r1.3 gnu_java_awt_peer_gtk_GdkGraphics2D.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c 7 Jan 2004 02:23:37 -0000 1.3 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c 19 Mar 2004 22:24:05 -0000 @@ -114,6 +114,15 @@ java_awt_geom_path_iterator_WIND_NON_ZERO = 1 }; +enum java_awt_rendering_hints_filter + { + java_awt_rendering_hints_VALUE_INTERPOLATION_NEAREST_NEIGHBOR = 0, + java_awt_rendering_hints_VALUE_INTERPOLATION_BILINEAR = 1, + java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_SPEED = 2, + java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_QUALITY = 3, + java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_DEFAULT = 4 + + }; static void grab_current_drawable (GtkWidget *widget, GdkDrawable **draw, GdkWindow **win) @@ -683,21 +692,8 @@ native_matrix[2], native_matrix[3], native_matrix[4], native_matrix[5]); cairo_surface_set_matrix (surf, mat); - if (native_matrix[0] != 1. - || native_matrix[1] != 0. - || native_matrix[2] != 0. - || native_matrix[3] != 1.) - { - cairo_surface_set_filter (surf, CAIRO_FILTER_BILINEAR); - cairo_surface_set_filter (gr->surface, CAIRO_FILTER_BILINEAR); - } - else - { - cairo_surface_set_filter (surf, CAIRO_FILTER_FAST); - cairo_surface_set_filter (gr->surface, CAIRO_FILTER_FAST); - } + cairo_surface_set_filter (surf, cairo_surface_get_filter(gr->surface)); cairo_show_surface (gr->cr, surf, w, h); - cairo_surface_set_filter (gr->surface, CAIRO_FILTER_FAST); cairo_matrix_destroy (mat); cairo_surface_destroy (surf); } @@ -709,6 +705,71 @@ } +JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getImagePixels + (JNIEnv *env, jobject obj) +{ + struct graphics2d *gr = NULL; + jintArray java_pixels; + jint* native_pixels; + GdkPixbuf *buf = NULL; + gint width, height; + gint bits_per_sample = 8; + gboolean has_alpha = TRUE; + gint total_channels = 4; + jint i, px; + + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + + if (gr->debug) printf ("getImagePixels\n"); + + gdk_drawable_get_size (gr->drawable, &width, &height); + + buf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, has_alpha, + bits_per_sample, + width, height); + g_assert (buf != NULL); + g_assert (gdk_pixbuf_get_bits_per_sample (buf) == bits_per_sample); + g_assert (gdk_pixbuf_get_n_channels (buf) == total_channels); + + + /* copy pixels from drawable to pixbuf */ + + gdk_pixbuf_get_from_drawable (buf, gr->drawable, + NULL, + 0, 0, 0, 0, + width, height); + + native_pixels= gdk_pixbuf_get_pixels (buf); + + + /* NOTE: The pixels we got in the pixbuf are stored + in reversed order. i.e 0xBBGGRRAA. + We need to convert them to 0xAARRGGBB. */ + + for (i=0; i> 24) & 0xff) | ((px << 8) & 0xffffff00); + px = ((px >> 8) & 0x00ff00ff) | ((px << 8) & 0xff00ff00); + px = ((px >> 16) & 0x0000ffff) | ((px << 16) & 0xffff0000); + native_pixels[i] = px; + + } + + java_pixels = (*env) -> NewIntArray (env, width * height); + + (*env)->SetIntArrayRegion(env, java_pixels, + (jsize)0, (jsize) width*height, + (jint*) native_pixels); + + return java_pixels; + +} + /* passthrough methods to cairo */ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSave @@ -1157,3 +1218,30 @@ cairo_clip (gr->cr); } +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetFilter + (JNIEnv *env, jobject obj, jint filter) +{ + + struct graphics2d *gr = NULL; + gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); + g_assert (gr != NULL); + if (gr->debug) printf ("cairo_surface_set_filter %d\n", filter); + switch ((enum java_awt_rendering_hints_filter) filter) + { + case java_awt_rendering_hints_VALUE_INTERPOLATION_NEAREST_NEIGHBOR: + cairo_surface_set_filter (gr->surface, CAIRO_FILTER_NEAREST); + break; + case java_awt_rendering_hints_VALUE_INTERPOLATION_BILINEAR: + cairo_surface_set_filter (gr->surface, CAIRO_FILTER_BILINEAR); + break; + case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_SPEED: + cairo_surface_set_filter (gr->surface, CAIRO_FILTER_FAST); + break; + case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_DEFAULT: + cairo_surface_set_filter (gr->surface, CAIRO_FILTER_NEAREST); + break; + case java_awt_rendering_hints_VALUE_ALPHA_INTERPOLATION_QUALITY: + cairo_surface_set_filter (gr->surface, CAIRO_FILTER_BEST); + break; + } +} Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c,v retrieving revision 1.7 diff -u -b -B -r1.7 gnu_java_awt_peer_gtk_GtkCheckboxPeer.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 7 Jan 2004 02:23:37 -0000 1.7 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 19 Mar 2004 22:24:05 -0000 @@ -164,9 +164,73 @@ NSA_SET_PTR (env, group, native_group); } +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkSetFont + (JNIEnv *env, jobject obj, jstring name, jint style, jint size) +{ + const char *font_name; + void *ptr; + GtkWidget *button; + GtkWidget *label; + PangoFontDescription *font_desc; + + ptr = NSA_GET_PTR (env, obj); + + button = GTK_WIDGET (ptr); + label = gtk_bin_get_child (GTK_BIN(button)); + + if (!label) + return; + + font_name = (*env)->GetStringUTFChars (env, name, NULL); + + gdk_threads_enter(); + + font_desc = pango_font_description_from_string (font_name); + pango_font_description_set_size (font_desc, size * PANGO_SCALE); + + if (style & AWT_STYLE_BOLD) + pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); + + if (style & AWT_STYLE_ITALIC) + pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE); + + gtk_widget_modify_font (GTK_WIDGET(label), font_desc); + + pango_font_description_free (font_desc); + + gdk_threads_leave(); + + (*env)->ReleaseStringUTFChars (env, name, font_name); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkSetLabel + (JNIEnv *env, jobject obj, jstring label) +{ + const char *str; + void *ptr; + GtkWidget *label_widget; + + ptr = NSA_GET_PTR (env, obj); + + label_widget = gtk_bin_get_child (GTK_BIN(ptr)); + + str = (*env)->GetStringUTFChars (env, label, 0); + + gdk_threads_enter (); + + gtk_label_set_label (GTK_LABEL (label_widget), str); + + gdk_threads_leave (); + + (*env)->ReleaseStringUTFChars (env, label, str); +} + static void item_toggled (GtkToggleButton *item, jobject peer) { + //g_print ("toggled\n"); (*gdk_env)->CallVoidMethod (gdk_env, peer, postItemEventID, peer, Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c,v retrieving revision 1.19 diff -u -b -B -r1.19 gnu_java_awt_peer_gtk_GtkComponentPeer.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 27 Jan 2004 21:33:51 -0000 1.19 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 19 Mar 2004 22:24:05 -0000 @@ -260,11 +260,11 @@ widget = GTK_WIDGET (ptr); if (GTK_IS_VIEWPORT (widget->parent)) { - gtk_widget_set_usize (widget, width, height); + gtk_widget_set_size_request (widget, width, height); } else { - gtk_widget_set_usize (widget, width, height); + gtk_widget_set_size_request (widget, width, height); gtk_layout_move (GTK_LAYOUT (widget->parent), widget, x, y); } @@ -378,6 +378,39 @@ gtk_widget_modify_fg (widget, GTK_STATE_PRELIGHT, &color); gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkSetFont + (JNIEnv *env, jobject obj, jstring name, jint style, jint size) +{ + const char *font_name; + void *ptr; + GtkWidget *label; + PangoFontDescription *font_desc; + + ptr = NSA_GET_PTR (env, obj); + + font_name = (*env)->GetStringUTFChars (env, name, NULL); + + gdk_threads_enter(); + + font_desc = pango_font_description_from_string (font_name); + pango_font_description_set_size (font_desc, size * PANGO_SCALE); + + if (style & AWT_STYLE_BOLD) + pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); + + if (style & AWT_STYLE_ITALIC) + pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE); + + gtk_widget_modify_font (GTK_WIDGET(ptr), font_desc); + + pango_font_description_free (font_desc); + + gdk_threads_leave(); + + (*env)->ReleaseStringUTFChars (env, name, font_name); } void Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c,v retrieving revision 1.21 diff -u -b -B -r1.21 gnu_java_awt_peer_gtk_GtkEvents.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 27 Jan 2004 16:00:43 -0000 1.21 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 19 Mar 2004 22:24:06 -0000 @@ -83,6 +83,27 @@ return result; } +static jint +state_to_awt_mods_with_button_states (guint state) +{ + jint result = 0; + + if (state & GDK_SHIFT_MASK) + result |= AWT_SHIFT_MASK; + if (state & GDK_CONTROL_MASK) + result |= AWT_CTRL_MASK; + if (state & GDK_MOD1_MASK) + result |= AWT_ALT_MASK; + if (state & GDK_BUTTON1_MASK) + result |= AWT_BUTTON1_MASK; + if (state & GDK_BUTTON2_MASK) + result |= AWT_BUTTON2_MASK; + if (state & GDK_BUTTON3_MASK) + result |= AWT_BUTTON3_MASK; + + return result; +} + /* Modifier key events need special treatment. In Sun's peer implementation, when a modifier key is pressed, the KEY_PRESSED event has that modifier in its modifiers list. The corresponding @@ -830,6 +851,7 @@ static GdkWindow *button_window = NULL; static guint button_number = -1; static jint click_count = 1; + static int hasBeenDragged; /* If it is not a focus change event, the widget must be realized already. If not, ignore the event (Gtk+ will do the same). */ @@ -895,6 +917,7 @@ click_count, (event->button.button == 3) ? JNI_TRUE : JNI_FALSE); + hasBeenDragged = FALSE; break; case GDK_BUTTON_RELEASE: { @@ -911,10 +934,12 @@ click_count, JNI_FALSE); - /* check to see if the release occured in the window it was pressed - in, and if so, generate an AWT click event */ + // Generate an AWT click event only if the release occured in the + // window it was pressed in, and the mouse has not been dragged since + // the last time it was pressed. gdk_window_get_size (event->any.window, &width, &height); - if (event->button.x >= 0 + if (! hasBeenDragged + && event->button.x >= 0 && event->button.y >= 0 && event->button.x <= width && event->button.y <= height) @@ -933,15 +958,6 @@ } break; case GDK_MOTION_NOTIFY: - (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, - AWT_MOUSE_MOVED, - (jlong)event->motion.time, - state_to_awt_mods (event->motion.state), - (jint)event->motion.x, - (jint)event->motion.y, - 0, - JNI_FALSE); - if (event->motion.state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK @@ -952,12 +968,22 @@ postMouseEventID, AWT_MOUSE_DRAGGED, (jlong)event->motion.time, - state_to_awt_mods (event->motion.state), + state_to_awt_mods_with_button_states (event->motion.state), (jint)event->motion.x, (jint)event->motion.y, 0, JNI_FALSE); + hasBeenDragged = TRUE; } + else + (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, + AWT_MOUSE_MOVED, + (jlong)event->motion.time, + state_to_awt_mods (event->motion.state), + (jint)event->motion.x, + (jint)event->motion.y, + 0, + JNI_FALSE); break; case GDK_ENTER_NOTIFY: /* We are not interested in enter events that are due to @@ -966,7 +992,7 @@ (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID, AWT_MOUSE_ENTERED, (jlong)event->crossing.time, - state_to_awt_mods (event->crossing.state), + state_to_awt_mods_with_button_states (event->crossing.state), (jint)event->crossing.x, (jint)event->crossing.y, 0, @@ -980,7 +1006,7 @@ postMouseEventID, AWT_MOUSE_EXITED, (jlong)event->crossing.time, - state_to_awt_mods (event->crossing.state), + state_to_awt_mods_with_button_states (event->crossing.state), (jint)event->crossing.x, (jint)event->crossing.y, 0, Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c,v retrieving revision 1.7 diff -u -b -B -r1.7 gnu_java_awt_peer_gtk_GtkLabelPeer.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c 7 Jan 2004 02:23:37 -0000 1.7 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c 19 Mar 2004 22:24:06 -0000 @@ -70,6 +70,44 @@ } JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkLabelPeer_gtkSetFont + (JNIEnv *env, jobject obj, jstring name, jint style, jint size) +{ + const char *font_name; + void *ptr; + GtkWidget *label; + PangoFontDescription *font_desc; + + ptr = NSA_GET_PTR (env, obj); + + label = gtk_bin_get_child (GTK_BIN(ptr)); + + if (!label) + return; + + font_name = (*env)->GetStringUTFChars (env, name, NULL); + + gdk_threads_enter(); + + font_desc = pango_font_description_from_string (font_name); + pango_font_description_set_size (font_desc, size * PANGO_SCALE); + + if (style & AWT_STYLE_BOLD) + pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); + + if (style & AWT_STYLE_ITALIC) + pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE); + + gtk_widget_modify_font (GTK_WIDGET(label), font_desc); + + pango_font_description_free (font_desc); + + gdk_threads_leave(); + + (*env)->ReleaseStringUTFChars (env, name, font_name); +} + +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkLabelPeer_setText (JNIEnv *env, jobject obj, jstring text) { 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.23 diff -u -b -B -r1.23 gnu_java_awt_peer_gtk_GtkWindowPeer.c --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c 12 Mar 2004 21:41:00 -0000 1.23 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c 19 Mar 2004 22:24:06 -0000 @@ -44,6 +44,12 @@ #include #include +static int filter_added = 0; + +static GdkFilterReturn window_wm_protocols_filter (GdkXEvent *xev, + GdkEvent *event, + gpointer data); + static void window_get_frame_extents (GtkWidget *window, int *top, int *left, int *bottom, int *right); @@ -59,11 +65,8 @@ static void window_destroy_cb (GtkWidget *widget, GdkEvent *event, jobject peer); static void window_show_cb (GtkWidget *widget, jobject peer); -static gboolean window_focus_in_cb (GtkWidget * widget, - GdkEventFocus *event, - jobject peer); -static gboolean window_focus_out_cb (GtkWidget * widget, - GdkEventFocus *event, +static void window_focus_or_active_state_change_cb (GtkWidget *widget, + GParamSpec *pspec, jobject peer); static gboolean window_window_state_cb (GtkWidget *widget, GdkEvent *event, @@ -147,6 +150,20 @@ insets[2] = bottom; insets[3] = right; + /* We must filter out WM_TAKE_FOCUS messages. Otherwise we get two + focus in events when a window becomes active and two focus out + events when a window becomes inactive. */ + if (!filter_added) + { + GdkAtom wm_protocols_atom = + gdk_x11_xatom_to_atom (gdk_x11_get_xatom_by_name ("WM_PROTOCOLS")); + + gdk_add_client_message_filter (wm_protocols_atom, + window_wm_protocols_filter, + NULL); + filter_added = 1; + } + gdk_threads_leave (); (*env)->ReleaseIntArrayElements (env, jinsets, insets, 0); @@ -251,11 +268,8 @@ g_signal_connect (G_OBJECT (ptr), "show", G_CALLBACK (window_show_cb), *gref); - g_signal_connect (G_OBJECT (ptr), "focus-in-event", - G_CALLBACK (window_focus_in_cb), *gref); - - g_signal_connect (G_OBJECT (ptr), "focus-out-event", - G_CALLBACK (window_focus_out_cb), *gref); + g_signal_connect (G_OBJECT (ptr), "notify", + G_CALLBACK (window_focus_or_active_state_change_cb), *gref); g_signal_connect (G_OBJECT (ptr), "window-state-event", G_CALLBACK (window_window_state_cb), *gref); @@ -661,40 +675,37 @@ (jobject) NULL, (jint) 0); } -static gboolean -window_focus_in_cb (GtkWidget * widget __attribute__((unused)), - GdkEventFocus *event __attribute__((unused)), +static void +window_focus_or_active_state_change_cb (GtkWidget *widget, + GParamSpec *pspec, jobject peer) { - /* FIXME: when hiding then showing, we get two sets of - (LOST_FOCUS/DEACTIVATED, ACTIVATED/GAINED_FOCUS) events. */ + if (!strcmp (g_param_spec_get_name (pspec), "is-active")) + { + if (GTK_WINDOW (widget)->is_active) (*gdk_env)->CallVoidMethod (gdk_env, peer, postWindowEventID, - (jint) AWT_WINDOW_ACTIVATED, + (jint) AWT_WINDOW_GAINED_FOCUS, (jobject) NULL, (jint) 0); - + else (*gdk_env)->CallVoidMethod (gdk_env, peer, postWindowEventID, - (jint) AWT_WINDOW_GAINED_FOCUS, + (jint) AWT_WINDOW_DEACTIVATED, (jobject) NULL, (jint) 0); - return TRUE; -} - -static gboolean -window_focus_out_cb (GtkWidget * widget __attribute__((unused)), - GdkEventFocus *event __attribute__((unused)), - jobject peer) -{ + } + else if (!strcmp (g_param_spec_get_name (pspec), "has-toplevel-focus")) + { + if (GTK_WINDOW (widget)->has_toplevel_focus) (*gdk_env)->CallVoidMethod (gdk_env, peer, postWindowEventID, - (jint) AWT_WINDOW_LOST_FOCUS, + (jint) AWT_WINDOW_ACTIVATED, (jobject) NULL, (jint) 0); - + else (*gdk_env)->CallVoidMethod (gdk_env, peer, postWindowEventID, - (jint) AWT_WINDOW_DEACTIVATED, + (jint) AWT_WINDOW_LOST_FOCUS, (jobject) NULL, (jint) 0); - return TRUE; + } } static gboolean @@ -820,4 +831,17 @@ (jint) extents[1]); /* right */ return FALSE; +} + +static GdkFilterReturn +window_wm_protocols_filter (GdkXEvent *xev, + GdkEvent *event __attribute__((unused)), + gpointer data __attribute__((unused))) +{ + XEvent *xevent = (XEvent *)xev; + + if ((Atom) xevent->xclient.data.l[0] == gdk_x11_get_xatom_by_name ("WM_TAKE_FOCUS")) + return GDK_FILTER_REMOVE; + + return GDK_FILTER_CONTINUE; }