diff options
Diffstat (limited to 'libjava/jni')
38 files changed, 1854 insertions, 1247 deletions
diff --git a/libjava/jni/gtk-peer/gdkfont.h b/libjava/jni/gtk-peer/gdkfont.h index f2ee86a2d69..792cee4f1cf 100644 --- a/libjava/jni/gtk-peer/gdkfont.h +++ b/libjava/jni/gtk-peer/gdkfont.h @@ -38,7 +38,7 @@ obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ -#include "gtkcairopeer.h" +#include "gtkpeer.h" #include <pango/pango.h> #include <pango/pango-context.h> @@ -47,6 +47,7 @@ extern struct state_table *native_font_state_table; extern struct state_table *native_glyphvector_state_table; +extern struct state_table *native_text_layout_state_table; #define NSA_FONT_INIT(env, clazz) \ native_font_state_table = init_state_table (env, clazz) @@ -73,11 +74,49 @@ extern struct state_table *native_glyphvector_state_table; #define NSA_DEL_GV_PTR(env, obj) \ remove_state_slot (env, obj, native_glyphvector_state_table) + +#define NSA_TEXT_LAYOUT_INIT(env, clazz) \ + native_text_layout_state_table = init_state_table (env, clazz) + +#define NSA_GET_TEXT_LAYOUT_PTR(env, obj) \ + get_state (env, obj, native_text_layout_state_table) + +#define NSA_SET_TEXT_LAYOUT_PTR(env, obj, ptr) \ + set_state (env, obj, native_text_layout_state_table, (void *)ptr) + +#define NSA_DEL_TEXT_LAYOUT_PTR(env, obj) \ + remove_state_slot (env, obj, native_text_layout_state_table) + +#define FONT_METRICS_ASCENT 0 +#define FONT_METRICS_MAX_ASCENT 1 +#define FONT_METRICS_DESCENT 2 +#define FONT_METRICS_MAX_DESCENT 3 +#define FONT_METRICS_MAX_ADVANCE 4 +#define NUM_FONT_METRICS 5 + +#define TEXT_METRICS_X_BEARING 0 +#define TEXT_METRICS_Y_BEARING 1 +#define TEXT_METRICS_WIDTH 2 +#define TEXT_METRICS_HEIGHT 3 +#define TEXT_METRICS_X_ADVANCE 4 +#define TEXT_METRICS_Y_ADVANCE 5 +#define NUM_TEXT_METRICS 6 + struct peerfont { PangoFont *font; PangoFontDescription *desc; PangoContext *ctx; + PangoLayout *layout; + /* + * The GdkGraphics2D (using cairo) may store a pointer to a + * cairo_font_t here; since we want to work equally well with + * the GdkGraphics class (using GDK) we do not explicitly mention + * cairo types here; it is up to the higher level driver routine + * in GdkClasspathFontPeer.java to decide which backend functions + * to invoke. + */ + void *graphics_resource; }; struct glyphvec @@ -90,4 +129,9 @@ struct glyphvec PangoContext *ctx; }; +struct textlayout +{ + PangoLayout *pango_layout; +}; + #endif /* __GDKFONT_H__ */ diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c index 44f2c399438..c94e6647850 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c @@ -45,19 +45,21 @@ exception statement from your version. */ * Signature: (J)V * * Purpose: Run the C function whose function pointer is - * + * */ -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GThreadNativeMethodRunner_nativeRun(JNIEnv *gdk_env, jobject lcl_obj, - jlong funcAddr, jlong funcArg) +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GThreadNativeMethodRunner_nativeRun + (JNIEnv *gdk_env __attribute__((unused)), + jobject lcl_obj __attribute__((unused)), + jlong funcAddr, jlong funcArg) { /* Convert the function's address back into a pointer to a C function. */ - void *(*funcPtr)(void *) = (void *(*)(void *)) funcAddr; - + void *(*funcPtr)(void *) = (void *(*)(void *)) (size_t)funcAddr; + /* We do not need to worry about the return value from funcPtr(); it's just thrown away. That is part of the g_threads spec, so no reason to worry about returning it. */ - (void) funcPtr((void *) funcArg); + (void) funcPtr((void *) (size_t)funcArg); /* Fall off the end and terminate the thread of control. */ } diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c deleted file mode 100644 index c10b945ab6b..00000000000 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c +++ /dev/null @@ -1,102 +0,0 @@ -/* gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c - Copyright (C) 1999, 2003 Free Software Foundation, Inc. - - This file is part of GNU Classpath. - - GNU Classpath is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GNU Classpath is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNU Classpath; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. - - Linking this library statically or dynamically with other modules is - making a combined work based on this library. Thus, the terms and - conditions of the GNU General Public License cover the whole - combination. - - As a special exception, the copyright holders of this library give you - permission to link this library with independent modules to produce an - executable, regardless of the license terms of these independent - modules, and to copy and distribute the resulting executable under - terms of your choice, provided that you also meet, for each linked - independent module, the terms and conditions of the license of that - module. An independent module is a module which is not derived from - or based on this library. If you modify this library, you may extend - this exception to your version of the library, but you are not - obligated to do so. If you do not wish to do so, delete this - exception statement from your version. */ - -#include <math.h> - -#include "gdkfont.h" -#include "gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.h" - -#define ASCENT 0 -#define MAX_ASCENT 1 -#define DESCENT 2 -#define MAX_DESCENT 3 -#define MAX_ADVANCE 4 -#define NUM_METRICS 5 - -JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics_initState - (JNIEnv *env, jobject self, jobject font) -{ - jintArray array; - jint *metrics; - struct peerfont *pf = NULL; - FT_Matrix mat; - double pointsize; - FT_Face face; - - pf = NSA_GET_FONT_PTR(env, font); - g_assert (pf != NULL); - - array = (*env)->NewIntArray (env, NUM_METRICS); - metrics = (*env)->GetIntArrayElements (env, array, NULL); - - gdk_threads_enter (); - -#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) - - 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); - - 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), - 0, 0); - - metrics[ASCENT] = ceil (DOUBLE_FROM_26_6(face->size->metrics.ascender)); - metrics[MAX_ASCENT] = metrics[ASCENT]; - metrics[DESCENT] = floor (DOUBLE_FROM_26_6(face->size->metrics.descender)); - if (metrics[DESCENT] < 0) - metrics[DESCENT] = - metrics[DESCENT]; - metrics[MAX_DESCENT] = metrics[DESCENT]; - metrics[MAX_ADVANCE] = ceil (DOUBLE_FROM_26_6(face->size->metrics.max_advance)); - - gdk_threads_leave (); - - (*env)->ReleaseIntArrayElements (env, array, metrics, 0); - - return array; -} - diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c index bb406c50c49..52489386839 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c @@ -1,5 +1,5 @@ /* gdkfontmetrics.c - Copyright (C) 1999, 2003 Free Software Foundation, Inc. + Copyright (C) 1999, 2003, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -36,110 +36,80 @@ obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #include "gtkpeer.h" +#include "gdkfont.h" + #include "gnu_java_awt_peer_gtk_GdkFontMetrics.h" #include <gdk/gdkx.h> -#define ASCENT 0 -#define MAX_ASCENT 1 -#define DESCENT 2 -#define MAX_DESCENT 3 -#define MAX_ADVANCE 4 -#define NUM_METRICS 5 - -JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkFontMetrics_initState - (JNIEnv *env, jobject obj __attribute__((unused)), - jstring fname, jint style, jint size) +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkFontMetrics_getPeerFontMetrics + (JNIEnv *env, jclass clazz __attribute__ ((unused)), jobject java_font, jdoubleArray java_metrics) { - jintArray array; - jint *metrics; - const char *font_name; - PangoFontDescription *font_desc; - PangoContext *context; + struct peerfont *pfont = NULL; + jdouble *native_metrics = NULL; PangoFontMetrics *pango_metrics; - array = (*env)->NewIntArray (env, NUM_METRICS); - - metrics = (*env)->GetIntArrayElements (env, array, NULL); - font_name = (*env)->GetStringUTFChars (env, fname, NULL); - - gdk_threads_enter (); - - font_desc = pango_font_description_from_string (font_name); - pango_font_description_set_size (font_desc, size * dpi_conversion_factor); + gdk_threads_enter(); - if (style & AWT_STYLE_BOLD) - pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); + pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, java_font); + g_assert (pfont != NULL); - 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); - - pango_metrics = pango_context_get_metrics (context, font_desc, + pango_metrics = pango_context_get_metrics (pfont->ctx, pfont->desc, gtk_get_default_language ()); - metrics[ASCENT] = - PANGO_PIXELS (pango_font_metrics_get_ascent (pango_metrics)); - metrics[MAX_ASCENT] = metrics[ASCENT]; - metrics[DESCENT] = - PANGO_PIXELS (pango_font_metrics_get_descent (pango_metrics)); - metrics[MAX_DESCENT] = metrics[DESCENT]; - metrics[MAX_ADVANCE] = - PANGO_PIXELS (pango_font_metrics_get_approximate_char_width (pango_metrics)); - - pango_font_metrics_unref (pango_metrics); - - pango_font_description_free (font_desc); + native_metrics = (*env)->GetDoubleArrayElements (env, java_metrics, NULL); + g_assert (native_metrics != NULL); - gdk_threads_leave (); + native_metrics[FONT_METRICS_ASCENT] = PANGO_PIXELS (pango_font_metrics_get_ascent (pango_metrics)); + native_metrics[FONT_METRICS_MAX_ASCENT] = native_metrics[FONT_METRICS_ASCENT]; + native_metrics[FONT_METRICS_DESCENT] = PANGO_PIXELS (pango_font_metrics_get_descent (pango_metrics)); + if (native_metrics[FONT_METRICS_DESCENT] < 0) + native_metrics[FONT_METRICS_DESCENT] = - native_metrics[FONT_METRICS_DESCENT]; + native_metrics[FONT_METRICS_MAX_DESCENT] = native_metrics[FONT_METRICS_DESCENT]; + native_metrics[FONT_METRICS_MAX_ADVANCE] = PANGO_PIXELS (pango_font_metrics_get_approximate_char_width (pango_metrics)); + + (*env)->ReleaseDoubleArrayElements (env, java_metrics, native_metrics, 0); - (*env)->ReleaseStringUTFChars (env, fname, font_name); - (*env)->ReleaseIntArrayElements (env, array, metrics, 0); + pango_font_metrics_unref (pango_metrics); - return array; + gdk_threads_leave(); } -JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GdkFontMetrics_stringWidth - (JNIEnv *env, jobject obj __attribute__((unused)), - jstring fname, jint style, jint size, jstring str) +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkFontMetrics_getPeerTextMetrics + (JNIEnv *env, jclass clazz __attribute__ ((unused)), jobject java_font, jstring str, jdoubleArray java_metrics) { - PangoFontDescription *font_desc; - PangoContext *context; - PangoLayout *layout; - int width = 0; - const char *cstr; - const char *font_name; - - cstr = (*env)->GetStringUTFChars (env, str, NULL); - font_name = (*env)->GetStringUTFChars (env, fname, NULL); - - gdk_threads_enter (); - - font_desc = pango_font_description_from_string (font_name); - pango_font_description_set_size (font_desc, size * dpi_conversion_factor); + struct peerfont *pfont = NULL; + const char *cstr = NULL; + jdouble *native_metrics = NULL; + PangoRectangle log; - if (style & AWT_STYLE_BOLD) - pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD); + gdk_threads_enter(); - if (style & AWT_STYLE_ITALIC) - pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE); + pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, java_font); + g_assert (pfont != NULL); - context = gdk_pango_context_get(); - pango_context_set_font_description (context, font_desc); - - layout = pango_layout_new (context); - - pango_layout_set_text (layout, cstr, -1); + cstr = (*env)->GetStringUTFChars (env, str, NULL); + g_assert(cstr != NULL); - pango_layout_get_pixel_size (layout, &width, NULL); + pango_layout_set_text (pfont->layout, cstr, -1); + pango_layout_get_extents (pfont->layout, NULL, &log); - pango_font_description_free (font_desc); + (*env)->ReleaseStringUTFChars (env, str, cstr); + pango_layout_set_text (pfont->layout, "", -1); - gdk_threads_leave (); + native_metrics = (*env)->GetDoubleArrayElements (env, java_metrics, NULL); + g_assert (native_metrics != NULL); - (*env)->ReleaseStringUTFChars (env, fname, font_name); - (*env)->ReleaseStringUTFChars (env, str, cstr); + native_metrics[TEXT_METRICS_X_BEARING] = PANGO_PIXELS(log.x); + native_metrics[TEXT_METRICS_Y_BEARING] = PANGO_PIXELS(log.y); + native_metrics[TEXT_METRICS_WIDTH] = PANGO_PIXELS(log.width); + native_metrics[TEXT_METRICS_HEIGHT] = PANGO_PIXELS(log.height); + native_metrics[TEXT_METRICS_X_ADVANCE] = PANGO_PIXELS(log.x + log.width); + native_metrics[TEXT_METRICS_Y_ADVANCE] = PANGO_PIXELS(log.y + log.height); + + (*env)->ReleaseDoubleArrayElements (env, java_metrics, native_metrics, 0); - return width; + gdk_threads_leave(); } + diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c index 34d557131ec..d9926532bfb 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c @@ -1,5 +1,5 @@ /* gnu_java_awt_GdkFont.c - Copyright (C) 2003 Free Software Foundation, Inc. + Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -36,7 +36,7 @@ exception statement from your version. */ #include "gdkfont.h" -#include "gnu_java_awt_peer_gtk_GdkClasspathFontPeer.h" +#include "gnu_java_awt_peer_gtk_GdkFontPeer.h" struct state_table *native_font_state_table; @@ -47,6 +47,7 @@ pango text objects: Font <-> - PangoFont - PangoFontDescription - PangoContext + - PangoLayout (for rendering and measuring) GlyphVector <-> - GList of PangoGlyphItem - PangoFontDescription @@ -68,17 +69,18 @@ enum java_awt_font_baseline { java_awt_font_HANGING_BASELINE = 2 }; -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkClasspathFontPeer_initStaticState +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkFontPeer_initStaticState (JNIEnv *env, jclass clazz) { NSA_FONT_INIT (env, clazz); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkClasspathFontPeer_initState +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkFontPeer_initState (JNIEnv *env, jobject self) { struct peerfont *pfont = NULL; - gdk_threads_enter (); g_assert (self != NULL); pfont = (struct peerfont *) g_malloc0 (sizeof (struct peerfont)); @@ -88,7 +90,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkClasspathFontPeer_initState } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkClasspathFontPeer_dispose +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkFontPeer_dispose (JNIEnv *env, jobject self) { struct peerfont *pfont = NULL; @@ -96,23 +99,26 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkClasspathFontPeer_dispose gdk_threads_enter (); pfont = (struct peerfont *)NSA_DEL_FONT_PTR (env, self); g_assert (pfont != NULL); - if (pfont->ctx != NULL) - g_object_unref (pfont->ctx); + if (pfont->layout != NULL) + g_object_unref (pfont->font); if (pfont->font != NULL) g_object_unref (pfont->font); + if (pfont->ctx != NULL) + g_object_unref (pfont->ctx); if (pfont->desc != NULL) pango_font_description_free (pfont->desc); g_free (pfont); gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkClasspathFontPeer_setFont - (JNIEnv *env, jobject self, jstring family_name_str, jint style_int, jint size) +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkFontPeer_setFont + (JNIEnv *env, jobject self, jstring family_name_str, jint style_int, jint size, jboolean useGraphics2D) { struct peerfont *pfont = NULL; - PangoFontMap *map = NULL; char const *family_name = NULL; enum java_awt_font_style style; + PangoFT2FontMap *ft2_map; gdk_threads_enter (); style = (enum java_awt_font_style) style_int; @@ -143,25 +149,38 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkClasspathFontPeer_setFont if (style & java_awt_font_ITALIC) pango_font_description_set_style (pfont->desc, PANGO_STYLE_ITALIC); - - /* - FIXME: these are possibly wrong, and should in any case - probably be cached between calls. - */ - map = pango_ft2_font_map_for_display (); - g_assert (map != NULL); - - if (pfont->ctx == NULL) - pfont->ctx = pango_ft2_font_map_create_context (PANGO_FT2_FONT_MAP (map)); - g_assert (pfont->ctx != NULL); + if (useGraphics2D) + { + if (pfont->ctx == NULL) + { + ft2_map = PANGO_FT2_FONT_MAP(pango_ft2_font_map_for_display ()); + pfont->ctx = pango_ft2_font_map_create_context (ft2_map); + } + } + else + { + if (pfont->ctx == NULL) + pfont->ctx = gdk_pango_context_get(); + } + g_assert (pfont->ctx != NULL); + if (pfont->font != NULL) - g_object_unref (pfont->font); - - pfont->font = pango_font_map_load_font (map, pfont->ctx, pfont->desc); + { + g_object_unref (pfont->font); + pfont->font = NULL; + } + + pango_context_set_font_description (pfont->ctx, pfont->desc); + pango_context_set_language (pfont->ctx, gtk_get_default_language()); + pfont->font = pango_context_load_font (pfont->ctx, pfont->desc); g_assert (pfont->font != NULL); + if (pfont->layout == NULL) + pfont->layout = pango_layout_new (pfont->ctx); + g_assert (pfont->layout != NULL); + gdk_threads_leave (); } diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c index 5e8562455a4..df720971957 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c @@ -1,5 +1,5 @@ /* gdkglyphvector.c - Copyright (C) 2003 Free Software Foundation, Inc. + Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -52,14 +52,16 @@ typedef struct { #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 +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGlyphVector_initStaticState (JNIEnv *env, jclass clazz) { NSA_GV_INIT (env, clazz); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_initState - (JNIEnv *env, jobject self, jobject font, jobject ctx) +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGlyphVector_initState + (JNIEnv *env, jobject self, jobject font, jobject ctx __attribute__ ((unused))) { struct glyphvec *vec = NULL; struct peerfont *pfont = NULL; @@ -114,12 +116,13 @@ static void seek_glyphstring_idx (GList *list, int idx, { GList *i = NULL; PangoGlyphItem *gi = NULL; + int begin = 0; g_assert (list != NULL); g_assert (gs != NULL); g_assert (nidx != NULL); - int begin = 0; + for (i = g_list_first (list); i != NULL; i = g_list_next (i)) { g_assert (i->data != NULL); @@ -217,7 +220,8 @@ static jdoubleArray rect_to_array (JNIEnv *env, const rect_t *r) } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_dispose +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGlyphVector_dispose (JNIEnv *env, jobject self) { struct glyphvec *vec = NULL; @@ -244,7 +248,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_dispose } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_setChars +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGlyphVector_setChars (JNIEnv *env, jobject self, jstring chars) { struct glyphvec *vec = NULL; @@ -273,56 +278,66 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_setChars pango_context_set_font_description (vec->ctx, vec->desc); - items = pango_itemize (vec->ctx, str, 0, len, attrs, NULL); - g_assert (items != NULL); - - /* - step 2: for each item: - - shape the item into a glyphstring - - store the (item, glyphstring) pair in the vec->glyphitems list - */ - if (vec->glyphitems != NULL) + items = pango_itemize (vec->ctx, str, 0, len, attrs, NULL); + if (items != NULL) { - free_glyphitems (vec->glyphitems); - vec->glyphitems = NULL; - } - - for (item = g_list_first (items); item != NULL; item = g_list_next (item)) - { - g_assert (item->data != NULL); - - gi = NULL; - gi = g_malloc0 (sizeof(PangoGlyphItem)); - g_assert (gi != NULL); - - gi->item = (PangoItem *)item->data; - gi->glyphs = pango_glyph_string_new (); - g_assert (gi->glyphs != NULL); - - pango_shape (str + gi->item->offset, - gi->item->length, - &(gi->item->analysis), - gi->glyphs); - - vec->glyphitems = g_list_append (vec->glyphitems, gi); + + /* + step 2: for each item: + - shape the item into a glyphstring + - store the (item, glyphstring) pair in the vec->glyphitems list + */ + + if (vec->glyphitems != NULL) + { + free_glyphitems (vec->glyphitems); + vec->glyphitems = NULL; + } + + for (item = g_list_first (items); + item != NULL; + item = g_list_next (item)) + { + g_assert (item->data != NULL); + + gi = NULL; + gi = g_malloc0 (sizeof(PangoGlyphItem)); + g_assert (gi != NULL); + + gi->item = (PangoItem *)item->data; + gi->glyphs = pango_glyph_string_new (); + g_assert (gi->glyphs != NULL); + + if (gi->glyphs->num_glyphs > 0) + { + pango_shape (str + gi->item->offset, + gi->item->length, + &(gi->item->analysis), + gi->glyphs); + + vec->glyphitems = g_list_append (vec->glyphitems, gi); + } + } + + /* + ownership of each item has been transferred to glyphitems, + but the list should be freed. + */ + + g_list_free (items); } - /* - ownership of each item has been transferred to glyphitems, - but the list should be freed. - */ - - g_list_free (items); pango_attr_list_unref (attrs); - + (*env)->ReleaseStringUTFChars (env, chars, str); gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_setGlyphCodes - (JNIEnv *env, jobject self, jintArray codes) +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGlyphVector_setGlyphCodes + (JNIEnv *env, jobject self, jintArray codes __attribute__ ((unused))) { struct glyphvec *vec = NULL; @@ -341,7 +356,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_setGlyphCodes } -JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphCode +JNIEXPORT jint JNICALL +Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphCode (JNIEnv *env, jobject self, jint idx) { struct glyphvec *vec = NULL; @@ -363,7 +379,8 @@ JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphCode } -JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_numGlyphs +JNIEXPORT jint JNICALL +Java_gnu_java_awt_peer_gtk_GdkGlyphVector_numGlyphs (JNIEnv *env, jobject self) { GList *i = NULL; @@ -389,8 +406,9 @@ JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_numGlyphs } -JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphCharIndex - (JNIEnv *env, jobject self, jint idx) +JNIEXPORT jint JNICALL +Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphCharIndex +(JNIEnv *env __attribute__ ((unused)), jobject self __attribute__ ((unused)), jint idx) { /* FIXME: this is not correct, rather it assumes a (broken) 1:1 @@ -418,7 +436,8 @@ assume_pointsize_and_identity_transform(double pointsize, 0, 0); } -JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allInkExtents +JNIEXPORT jdoubleArray JNICALL +Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allInkExtents (JNIEnv *env, jobject self) { struct glyphvec *vec = NULL; @@ -436,33 +455,36 @@ JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allInkE g_assert (self != NULL); vec = (struct glyphvec *)NSA_GET_GV_PTR (env, self); g_assert (vec != NULL); - g_assert (vec->glyphitems != NULL); - - pointsize = pango_font_description_get_size (vec->desc); - pointsize /= (double) PANGO_SCALE; - - for (i = g_list_first (vec->glyphitems); i != NULL; i = g_list_next (i)) + if (vec->glyphitems != NULL) { - g_assert (i->data != NULL); - gi = (PangoGlyphItem *)i->data; - g_assert (gi->glyphs != NULL); - - face = pango_ft2_font_get_face (gi->item->analysis.font); - assume_pointsize_and_identity_transform (pointsize, face); + pointsize = pango_font_description_get_size (vec->desc); + pointsize /= (double) PANGO_SCALE; - for (j = 0; j < gi->glyphs->num_glyphs; ++j) + for (i = g_list_first (vec->glyphitems); i != NULL; i = g_list_next (i)) { - FT_Load_Glyph (face, gi->glyphs->glyphs[j].glyph, FT_LOAD_DEFAULT); - /* FIXME: this needs to change for vertical layouts */ - tmp.x = x + DOUBLE_FROM_26_6 (face->glyph->metrics.horiBearingX); - tmp.y = y + DOUBLE_FROM_26_6 (face->glyph->metrics.horiBearingY); - tmp.width = DOUBLE_FROM_26_6 (face->glyph->metrics.width); - tmp.height = DOUBLE_FROM_26_6 (face->glyph->metrics.height); - union_rects (&rect, &tmp); - x += DOUBLE_FROM_26_6 (face->glyph->advance.x); - y += DOUBLE_FROM_26_6 (face->glyph->advance.y); - } - } + g_assert (i->data != NULL); + gi = (PangoGlyphItem *)i->data; + g_assert (gi->glyphs != NULL); + + face = pango_ft2_font_get_face (gi->item->analysis.font); + assume_pointsize_and_identity_transform (pointsize, face); + + for (j = 0; j < gi->glyphs->num_glyphs; ++j) + { + FT_Load_Glyph (face, + gi->glyphs->glyphs[j].glyph, + FT_LOAD_DEFAULT); + /* FIXME: this needs to change for vertical layouts */ + tmp.x = x + DOUBLE_FROM_26_6 (face->glyph->metrics.horiBearingX); + tmp.y = y + DOUBLE_FROM_26_6 (face->glyph->metrics.horiBearingY); + tmp.width = DOUBLE_FROM_26_6 (face->glyph->metrics.width); + tmp.height = DOUBLE_FROM_26_6 (face->glyph->metrics.height); + union_rects (&rect, &tmp); + x += DOUBLE_FROM_26_6 (face->glyph->advance.x); + y += DOUBLE_FROM_26_6 (face->glyph->advance.y); + } + } + } ret = rect_to_array (env, &rect); gdk_threads_leave (); @@ -470,7 +492,8 @@ JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allInkE } -JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allLogicalExtents +JNIEXPORT jdoubleArray JNICALL +Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allLogicalExtents (JNIEnv *env, jobject self) { struct glyphvec *vec = NULL; @@ -527,7 +550,8 @@ JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allLogi } -JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphLogicalExtents +JNIEXPORT jdoubleArray JNICALL +Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphLogicalExtents (JNIEnv *env, jobject self, jint idx) { struct glyphvec *vec = NULL; @@ -572,7 +596,8 @@ JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphLo } -JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphInkExtents +JNIEXPORT jdoubleArray JNICALL +Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphInkExtents (JNIEnv *env, jobject self, jint idx) { struct glyphvec *vec = NULL; @@ -612,8 +637,9 @@ JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphIn } -JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphIsHorizontal - (JNIEnv *env, jobject self, jint idx) +JNIEXPORT jboolean JNICALL +Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphIsHorizontal +(JNIEnv *env, jobject self, jint idx __attribute__ ((unused))) { struct glyphvec *vec = NULL; PangoDirection dir; @@ -645,7 +671,8 @@ JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphIsHori } -JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_isEqual +JNIEXPORT jboolean JNICALL +Java_gnu_java_awt_peer_gtk_GdkGlyphVector_isEqual (JNIEnv *env, jobject self, jobject other) { struct glyphvec *vec1 = NULL, *vec2 = NULL; diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c index a79ed5eb093..a91eea16c9f 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c @@ -36,6 +36,7 @@ obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ #include "gtkpeer.h" +#include "gdkfont.h" #include "gnu_java_awt_peer_gtk_GdkGraphics.h" #include <gdk/gdkprivate.h> #include <gdk/gdkx.h> @@ -45,8 +46,10 @@ exception statement from your version. */ GdkPoint * translate_points (JNIEnv *env, jintArray xpoints, jintArray ypoints, jint npoints, jint x_offset, jint y_offset); +static void realize_cb (GtkWidget *widget, jobject peer); -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_copyState +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_copyState (JNIEnv *env, jobject obj, jobject old) { struct graphics *g, *g_old; @@ -73,7 +76,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_copyState NSA_SET_PTR (env, obj, g); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__II +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__II (JNIEnv *env, jobject obj, jint width, jint height) { struct graphics *g; @@ -87,6 +91,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__II g->cm = gdk_rgb_get_cmap (); gdk_colormap_ref (g->cm); g->gc = gdk_gc_new (g->drawable); + gdk_threads_leave (); NSA_SET_PTR (env, obj, g); @@ -94,7 +99,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__II /* copy the native state of the peer (GtkWidget *) to the native state of the graphics object */ -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2 +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2 (JNIEnv *env, jobject obj, jobject peer) { struct graphics *g = (struct graphics *) malloc (sizeof (struct graphics)); @@ -108,19 +114,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__Lgnu_ja gdk_threads_enter (); widget = GTK_WIDGET (ptr); - - if (GTK_IS_WINDOW (widget)) - { - g->drawable = find_gtk_layout (widget)->bin_window; - } - else if (GTK_IS_LAYOUT (widget)) - { - g->drawable = (GdkDrawable *) GTK_LAYOUT (widget)->bin_window; - } - else - { - g->drawable = (GdkDrawable *) widget->window; - } + g->drawable = (GdkDrawable *) widget->window; gdk_window_ref (g->drawable); g->cm = gtk_widget_get_colormap (widget); @@ -134,11 +128,29 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_initState__Lgnu_ja NSA_SET_PTR (env, obj, g); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_dispose +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_connectSignals + (JNIEnv *env, jobject obj, jobject peer) +{ + void *ptr; + + ptr = NSA_GET_PTR (env, peer); + + gdk_threads_enter (); + + g_signal_connect_after (G_OBJECT (ptr), "realize", + G_CALLBACK (realize_cb), obj); + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_dispose (JNIEnv *env, jobject obj) { struct graphics *g; + g = (struct graphics *) NSA_DEL_PTR (env, obj); if (!g) return; /* dispose has been called more than once */ @@ -157,10 +169,12 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_dispose gdk_threads_leave (); + free (g); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_translateNative +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_translateNative (JNIEnv *env, jobject obj, jint x, jint y) { struct graphics *g; @@ -175,62 +189,48 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_translateNative gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawString - (JNIEnv *env, jobject obj, jstring str, jint x, jint y, - jstring fname, jint style, jint size) +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_drawString + (JNIEnv *env, jobject obj, jobject font, jstring str, jint x, jint y) { + struct peerfont *pfont = NULL; struct graphics *g; const char *cstr; - const char *font_name; int baseline_y; - PangoFontDescription *font_desc; - PangoContext *context; - PangoLayout *layout; PangoLayoutIter *iter; g = (struct graphics *) NSA_GET_PTR (env, obj); + g_assert (g != NULL); + + pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font); + g_assert (pfont != NULL); cstr = (*env)->GetStringUTFChars (env, str, NULL); - font_name = (*env)->GetStringUTFChars (env, fname, NULL); gdk_threads_enter (); - font_desc = pango_font_description_from_string (font_name); - - pango_font_description_set_size (font_desc, size * dpi_conversion_factor); - - 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); - - layout = pango_layout_new (context); - - pango_layout_set_text (layout, cstr, -1); - iter = pango_layout_get_iter (layout); + pango_layout_set_font_description (pfont->layout, pfont->desc); + pango_layout_set_text (pfont->layout, cstr, -1); + iter = pango_layout_get_iter (pfont->layout); baseline_y = pango_layout_iter_get_baseline (iter); gdk_draw_layout (g->drawable, g->gc, x + g->x_offset, y + g->y_offset - PANGO_PIXELS (baseline_y), - layout); + pfont->layout); - pango_font_description_free (font_desc); pango_layout_iter_free (iter); + pango_layout_set_text (pfont->layout, "", -1); gdk_flush (); gdk_threads_leave (); - (*env)->ReleaseStringUTFChars (env, fname, font_name); (*env)->ReleaseStringUTFChars (env, str, cstr); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawLine +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_drawLine (JNIEnv *env, jobject obj, jint x, jint y, jint x2, jint y2) { struct graphics *g; @@ -245,7 +245,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawLine gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_fillRect +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_fillRect (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) { struct graphics *g; @@ -260,7 +261,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_fillRect gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawRect +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_drawRect (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) { struct graphics *g; @@ -274,7 +276,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawRect gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_copyArea +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_copyArea (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height, jint dx, jint dy) { @@ -293,7 +296,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_copyArea gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_copyPixmap +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_copyPixmap (JNIEnv *env, jobject obj, jobject offscreen, jint x, jint y, jint width, jint height) { @@ -366,7 +370,8 @@ static void flip_pixbuf (GdkPixbuf *pixbuf, } } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_copyAndScalePixmap +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_copyAndScalePixmap (JNIEnv *env, jobject obj, jobject offscreen, jboolean flip_x, jboolean flip_y, jint src_x, jint src_y, jint src_width, jint src_height, jint dest_x, jint dest_y, jint dest_width, jint dest_height) @@ -421,19 +426,26 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_copyAndScalePixmap -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_clearRect +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_clearRect (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) { struct graphics *g; GdkGCValues saved; + GtkWidget *widget; + union widget_union w; 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); + w.widget = &widget; + gdk_window_get_user_data (GDK_WINDOW (g->drawable), w.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 { @@ -443,11 +455,11 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_clearRect x + g->x_offset, y + g->y_offset, width, height); gdk_gc_set_foreground (g->gc, &(saved.foreground)); } - gdk_flush (); gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_setFunction +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_setFunction (JNIEnv *env, jobject obj, jint func) { struct graphics *g; @@ -459,7 +471,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_setFunction } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_setFGColor +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_setFGColor (JNIEnv *env, jobject obj, jint red, jint green, jint blue) { GdkColor color; @@ -478,7 +491,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_setFGColor gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawArc +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_drawArc (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height, jint angle1, jint angle2) { @@ -521,7 +535,8 @@ translate_points (JNIEnv *env, jintArray xpoints, jintArray ypoints, return points; } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawPolyline +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_drawPolyline (JNIEnv *env, jobject obj, jintArray xpoints, jintArray ypoints, jint npoints) { @@ -540,7 +555,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawPolyline g_free (points); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawPolygon +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_drawPolygon (JNIEnv *env, jobject obj, jintArray xpoints, jintArray ypoints, jint npoints) { @@ -564,7 +580,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawPolygon g_free (points); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_fillPolygon +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_fillPolygon (JNIEnv *env, jobject obj, jintArray xpoints, jintArray ypoints, jint npoints) { @@ -582,7 +599,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_fillPolygon g_free (points); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_fillArc +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_fillArc (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height, jint angle1, jint angle2) { @@ -598,7 +616,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_fillArc gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawOval +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_drawOval (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) { struct graphics *g; @@ -613,7 +632,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_drawOval gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_fillOval +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_fillOval (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) { struct graphics *g; @@ -628,7 +648,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_fillOval gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_setClipRectangle +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics_setClipRectangle (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) { struct graphics *g; @@ -645,3 +666,13 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_setClipRectangle gdk_gc_set_clip_rectangle (g->gc, &rectangle); gdk_threads_leave (); } + +static void realize_cb (GtkWidget *widget __attribute__ ((unused)), + jobject peer) +{ + gdk_threads_leave (); + + (*gdk_env)->CallVoidMethod (gdk_env, peer, initComponentGraphicsID); + + gdk_threads_enter (); +} diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c index 3bed318826a..90b6aa14901 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c @@ -64,7 +64,8 @@ struct state_table *native_graphics2d_state_table; #define NSA_DEL_G2D_PTR(env, obj) \ remove_state_slot (env, obj, native_graphics2d_state_table) -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initStaticState +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initStaticState (JNIEnv *env, jclass clazz) { gdk_threads_enter(); @@ -159,18 +160,7 @@ grab_current_drawable (GtkWidget *widget, GdkDrawable **draw, GdkWindow **win) g_assert (draw != NULL); g_assert (win != NULL); - if (GTK_IS_WINDOW (widget)) - { - *win = find_gtk_layout (widget)->bin_window; - } - else if (GTK_IS_LAYOUT (widget)) - { - *win = GTK_LAYOUT (widget)->bin_window; - } - else - { - *win = widget->window; - } + *win = widget->window; *draw = *win; gdk_window_get_internal_paint_info (*win, draw, 0, 0); @@ -326,7 +316,18 @@ check_for_debug (struct graphics2d *gr) gr->debug = (gboolean)(getenv("DEBUGJ2D") != NULL); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState +static void +realize_cb (GtkWidget *widget, jobject peer) +{ + gdk_threads_leave (); + + (*gdk_env)->CallVoidMethod (gdk_env, peer, initComponentGraphics2DID); + + gdk_threads_enter (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState (JNIEnv *env, jobject obj, jobject old) { struct graphics2d *g = NULL, *g_old = NULL; @@ -361,7 +362,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__II +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__II (JNIEnv *env, jobject obj, jint width, jint height) { struct graphics2d *gr; @@ -394,7 +396,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__II gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable (JNIEnv *env, jobject self, jobject other, jint x, jint y) { struct graphics2d *src = NULL, *dst = NULL; @@ -413,7 +416,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable begin_drawing_operation(dst); - gdk_flush(); + /* gdk_flush(); */ gdk_drawable_get_size (src->drawable, &s_width, &s_height); gdk_drawable_get_size (dst->drawable, &d_width, &d_height); @@ -442,7 +445,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2 +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2 (JNIEnv *env, jobject obj, jobject peer) { struct graphics2d *gr = NULL; @@ -478,7 +482,24 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__Lgnu_ gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_dispose +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_connectSignals + (JNIEnv *env, jobject obj, jobject peer) +{ + void *ptr; + + ptr = NSA_GET_PTR (env, peer); + + gdk_threads_enter (); + + g_signal_connect_after (G_OBJECT (ptr), "realize", + G_CALLBACK (realize_cb), obj); + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_dispose (JNIEnv *env, jobject obj) { struct graphics2d *gr = NULL; @@ -517,7 +538,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_dispose } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradient +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradient (JNIEnv *env, jobject obj, jdouble x1, jdouble y1, jdouble x2, jdouble y2, @@ -641,7 +663,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradient gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels (JNIEnv *env, jobject obj, jintArray jarr, jint w, jint h, jint stride) { struct graphics2d *gr = NULL; @@ -687,7 +710,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels (JNIEnv *env, jobject obj, jintArray java_pixels, jint w, jint h, jint stride, jdoubleArray java_matrix) { @@ -724,6 +748,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels native_matrix[4], native_matrix[5]); cairo_surface_set_matrix (surf, mat); cairo_surface_set_filter (surf, cairo_surface_get_filter(gr->surface)); + cairo_show_surface (gr->cr, surf, w, h); cairo_matrix_destroy (mat); cairo_surface_destroy (surf); @@ -737,7 +762,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels gdk_threads_leave(); } -JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getImagePixels +JNIEXPORT jintArray JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getImagePixels (JNIEnv *env, jobject obj) { struct graphics2d *gr = NULL; @@ -776,12 +802,12 @@ JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getImagePix width, height); native_pixels= gdk_pixbuf_get_pixels (buf); - + #ifndef WORDS_BIGENDIAN /* convert pixels from 0xBBGGRRAA to 0xAARRGGBB */ - for (i=0; i<width * height; i++) - { - native_pixels[i] = SWAPU32 ((unsigned)native_pixels[i]); + for (i=0; i<width * height; i++) + { + native_pixels[i] = SWAPU32 ((unsigned)native_pixels[i]); } #endif @@ -797,7 +823,8 @@ JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getImagePix /* passthrough methods to cairo */ -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSave +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSave (JNIEnv *env, jobject obj) { struct graphics2d *gr = NULL; @@ -812,7 +839,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSave gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRestore +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRestore (JNIEnv *env, jobject obj) { struct graphics2d *gr = NULL; @@ -828,7 +856,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRestore gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix (JNIEnv *env, jobject obj, jdoubleArray java_matrix) { struct graphics2d *gr = NULL; @@ -838,7 +867,9 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); - g_assert (gr != NULL); + /* cairoSetMatrix was called before this graphics object's component + was realized. */ + if (gr == NULL) { gdk_threads_leave (); return; } native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL); g_assert (native_matrix != NULL); @@ -864,92 +895,385 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFont - (JNIEnv *env, jobject obj, jobject font) +static void +install_font_peer(cairo_t *cr, + struct peerfont *pfont, + int debug) { - struct graphics2d *gr = NULL; - struct peerfont *pfont = NULL; - cairo_font_t *ft = NULL; + cairo_font_t *ft; FT_Face face = NULL; + g_assert(cr != NULL); + g_assert(pfont != NULL); + + if (pfont->graphics_resource == NULL) + { + face = pango_ft2_font_get_face (pfont->font); + g_assert (face != NULL); + + ft = cairo_ft_font_create_for_ft_face (face); + g_assert (ft != NULL); + + if (debug) printf ("install_font_peer made new cairo font for '%s' at %f\n", + face->family_name, + (pango_font_description_get_size (pfont->desc) / + (double)PANGO_SCALE) * (96.0 / 72.0)); + + cairo_set_font (cr, ft); + cairo_font_destroy (ft); + cairo_scale_font (cr, + (pango_font_description_get_size (pfont->desc) / + (double)PANGO_SCALE) * (96.0 / 72.0)); + ft = cairo_current_font (cr); + pfont->graphics_resource = ft; + } + else + { + if (debug) printf ("install_font_peer reused existing font resource\n"); + ft = (cairo_font_t *) pfont->graphics_resource; + cairo_set_font (cr, ft); + } +} + +static cairo_t *metrics_cairo = NULL; +static cairo_surface_t *metrics_surface = NULL; + +static void +ensure_metrics_cairo() +{ + if (metrics_cairo == NULL) + { + metrics_cairo = cairo_create (); + metrics_surface = cairo_image_surface_create (CAIRO_FORMAT_A8, 1, 1); + cairo_set_target_surface (metrics_cairo, metrics_surface); + } +} + + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_releasePeerGraphicsResource + (JNIEnv *env, jclass clazz, jobject java_font) +{ + struct peerfont *pfont = NULL; + + g_assert(java_font != NULL); + gdk_threads_enter(); - if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } + pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, java_font); + g_assert (pfont != NULL); + if (pfont->graphics_resource != NULL) + { + cairo_font_destroy ((cairo_font_t *) pfont->graphics_resource); + pfont->graphics_resource = NULL; + } + gdk_threads_leave(); +} - gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); - g_assert (gr != NULL); +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerTextMetrics + (JNIEnv *env, jclass clazz, jobject java_font, jstring str, jdoubleArray java_metrics) +{ + struct peerfont *pfont = NULL; + const char *cstr = NULL; + jdouble *native_metrics = NULL; + cairo_text_extents_t extents; - pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font); + g_assert(java_font != NULL); + gdk_threads_enter(); + + pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, java_font); g_assert (pfont != NULL); - face = pango_ft2_font_get_face (pfont->font); - g_assert (face != NULL); + ensure_metrics_cairo(); + install_font_peer (metrics_cairo, pfont, 0); + + cstr = (*env)->GetStringUTFChars (env, str, NULL); + g_assert(cstr != NULL); + cairo_text_extents (metrics_cairo, cstr, &extents); + + native_metrics = (*env)->GetDoubleArrayElements (env, java_metrics, NULL); + g_assert (native_metrics != NULL); + + native_metrics[TEXT_METRICS_X_BEARING] = extents.x_bearing; + native_metrics[TEXT_METRICS_Y_BEARING] = extents.y_bearing; + native_metrics[TEXT_METRICS_WIDTH] = extents.width; + native_metrics[TEXT_METRICS_HEIGHT] = extents.height; + native_metrics[TEXT_METRICS_X_ADVANCE] = extents.x_advance; + native_metrics[TEXT_METRICS_Y_ADVANCE] = extents.y_advance; + + (*env)->ReleaseStringUTFChars (env, str, cstr); + (*env)->ReleaseDoubleArrayElements (env, java_metrics, native_metrics, 0); + gdk_threads_leave(); +} - ft = cairo_ft_font_create_for_ft_face (face); - g_assert (ft != NULL); +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerFontMetrics + (JNIEnv *env, jclass clazz, jobject java_font, jdoubleArray java_metrics) +{ + struct peerfont *pfont = NULL; + jdouble *native_metrics = NULL; + cairo_font_extents_t extents; - if (gr->debug) printf ("cairo_set_font '%s'\n", face->family_name); - - cairo_set_font (gr->cr, ft); + g_assert(java_font != NULL); + + gdk_threads_enter(); + + pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, java_font); + g_assert (pfont != NULL); + + ensure_metrics_cairo(); + install_font_peer (metrics_cairo, pfont, 0); + + cairo_current_font_extents (metrics_cairo, &extents); + + native_metrics = (*env)->GetDoubleArrayElements (env, java_metrics, NULL); + g_assert (native_metrics != NULL); - cairo_scale_font (gr->cr, - pango_font_description_get_size (pfont->desc) / - (double)PANGO_SCALE); + native_metrics[FONT_METRICS_ASCENT] = extents.ascent; + native_metrics[FONT_METRICS_MAX_ASCENT] = extents.ascent; + native_metrics[FONT_METRICS_DESCENT] = extents.descent; + if (native_metrics[FONT_METRICS_DESCENT] < 0) + native_metrics[FONT_METRICS_DESCENT] = - native_metrics[FONT_METRICS_DESCENT]; + native_metrics[FONT_METRICS_MAX_DESCENT] = native_metrics[FONT_METRICS_DESCENT]; + native_metrics[FONT_METRICS_MAX_ADVANCE] = extents.max_x_advance; - cairo_font_destroy (ft); + (*env)->ReleaseDoubleArrayElements (env, java_metrics, native_metrics, 0); gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoShowGlyphs - (JNIEnv *env, jobject obj, jintArray java_codes, jfloatArray java_posns) +static void +paint_glyph_run(struct graphics2d *gr, + cairo_glyph_t **glyphs, + gint *n_glyphs, + PangoLayoutRun *run) +{ + gint i = 0; + gint x = 0, y = 0; + + g_assert (gr != NULL); + g_assert (glyphs != NULL); + g_assert (n_glyphs != NULL); + g_assert (run != NULL); + + if (run->glyphs != NULL && run->glyphs->num_glyphs > 0) + { + if (*n_glyphs < run->glyphs->num_glyphs) + { + *glyphs = g_realloc(*glyphs, + (sizeof(cairo_glyph_t) + * run->glyphs->num_glyphs)); + *n_glyphs = run->glyphs->num_glyphs; + } + + g_assert (*glyphs != NULL); + + if (gr->debug) printf ("painting %d glyphs: ", run->glyphs->num_glyphs); + + for (i = 0; i < run->glyphs->num_glyphs; ++i) + { + (*glyphs)[i].index = run->glyphs->glyphs[i].glyph; + + (*glyphs)[i].x = + ((double) (x + run->glyphs->glyphs[i].geometry.x_offset)) + / ((double) PANGO_SCALE); + + (*glyphs)[i].y = + ((double) (y + run->glyphs->glyphs[i].geometry.y_offset)) + / ((double) PANGO_SCALE); + + if (gr->debug) printf(" (%ld @ %f,%f)", + (*glyphs)[i].index, + (*glyphs)[i].x, + (*glyphs)[i].y); + + x += run->glyphs->glyphs[i].geometry.width; + } + + if (gr->debug) printf("\n"); + begin_drawing_operation (gr); + cairo_show_glyphs (gr->cr, *glyphs, run->glyphs->num_glyphs); + end_drawing_operation (gr); + } +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawString + (JNIEnv *env, jobject obj, jobject font, jstring str, float x, float y) { struct graphics2d *gr = NULL; + const char *cstr = NULL; + struct peerfont *pfont = NULL; + + /* cairo_glyph_t *glyphs = NULL; - jfloat *native_posns = NULL; - jint *native_codes = NULL; - jint i; - jint ncodes, nposns; + gint n_glyphs = 0; + PangoLayoutRun *run = NULL; + PangoLayoutIter *iter = NULL; + */ - gdk_threads_enter(); + g_assert(obj != NULL); + g_assert(font != NULL); + g_assert(str != NULL); + + gdk_threads_enter (); if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); - g_assert (gr != NULL); + g_assert(gr != NULL); - native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL); - native_posns = (*env)->GetFloatArrayElements (env, java_posns, NULL); - g_assert (native_codes != NULL); - g_assert (native_posns != NULL); + pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, font); + g_assert (pfont != NULL); - ncodes = (*env)->GetArrayLength (env, java_codes); - nposns = (*env)->GetArrayLength (env, java_posns); - g_assert (2 * ncodes == nposns); + cstr = (*env)->GetStringUTFChars (env, str, NULL); + g_assert(cstr != NULL); - if (gr->debug) printf ("cairo_show_glyphs (%d glyphs)\n", ncodes); + if (gr->debug) printf ("painting string '%s' at (%f,%f)\n", cstr, x, y); - glyphs = malloc (sizeof(cairo_glyph_t) * ncodes); - g_assert (glyphs); + /* For now we let cairo do the glyph conversion; eventually this + * ought to be unified with pango, but it is impossible to get + * pango and cairo to agree on metrics at the moment, so we either + * have to use "all cairo" metrics (the string-based APIs) or + * "all pango" metrics (the glyph-vector based APIs). + */ - for (i = 0; i < ncodes; ++i) + install_font_peer (gr->cr, pfont, gr->debug); + cairo_move_to (gr->cr, x, y); + cairo_show_text (gr->cr, cstr); + + /* + + pango_layout_set_text (gr->pango_layout, cstr, -1); + + iter = pango_layout_get_iter (gr->pango_layout); + g_assert(iter != NULL); + + cairo_translate (gr->cr, x, y); + + do { - glyphs[i].index = native_codes[i]; - glyphs[i].x = (double) native_posns[2*i]; - glyphs[i].y = (double) native_posns[2*i + 1]; - if (gr->debug) printf ("cairo_show_glyphs (glyph %d (code %d) : %f,%f)\n", - i, glyphs[i].index, glyphs[i].x, glyphs[i].y); - } + run = pango_layout_iter_get_run (iter); + if (run != NULL) + paint_glyph_run (gr, &glyphs, &n_glyphs, run); + } + while (pango_layout_iter_next_run (iter)); + + if (glyphs != NULL) + g_free (glyphs); - (*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0); - (*env)->ReleaseFloatArrayElements (env, java_posns, native_posns, 0); + cairo_translate (gr->cr, -x, -y); + + pango_layout_iter_free (iter); - begin_drawing_operation (gr); - cairo_show_glyphs (gr->cr, glyphs, ncodes); - end_drawing_operation (gr); + */ - free(glyphs); - gdk_threads_leave(); + gdk_threads_leave (); + + (*env)->ReleaseStringUTFChars (env, str, cstr); +} + + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkGlyphVector + (JNIEnv *env, jobject self, jobject font, jobject java_vec, jfloat x, jfloat y) +{ + + struct graphics2d *gr = NULL; + struct peerfont *pfont = NULL; + struct glyphvec *gv = NULL; + PangoLayoutRun *run = NULL; + cairo_glyph_t *glyphs = NULL; + gint n_glyphs = 0; + + g_assert (self != NULL); + g_assert (java_vec != NULL); + + gdk_threads_enter (); + if (peer_is_disposed(env, self)) { gdk_threads_leave(); return; } + + gr = (struct graphics2d *)NSA_GET_G2D_PTR (env, self); + gv = (struct glyphvec *)NSA_GET_GV_PTR (env, java_vec); + pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, font); + + g_assert (gr != NULL); + g_assert (gv != NULL); + g_assert (pfont != NULL); + + if (gr->debug) printf ("painting pango glyph vector\n"); + + install_font_peer (gr->cr, pfont, gr->debug); + cairo_translate (gr->cr, x, y); + + /* nb. PangoLayoutRun is a typedef for PangoGlyphItem. */ + run = (PangoLayoutRun *) gv->glyphitems; + if (run != NULL) + paint_glyph_run (gr, &glyphs, &n_glyphs, run); + + if (glyphs != NULL) + g_free (glyphs); + + cairo_translate (gr->cr, -x, -y); + gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetOperator +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkTextLayout + (JNIEnv *env, jobject self, jobject font, jobject java_layout, jfloat x, jfloat y) +{ + /* + * FIXME: Some day we expect either cairo or pango will know how to make + * a pango layout paint to a cairo surface. that day is not yet here. + */ + + struct graphics2d *gr = NULL; + struct peerfont *pfont = NULL; + struct textlayout *tl = NULL; + PangoLayoutIter *i = NULL; + PangoLayoutRun *run = NULL; + cairo_glyph_t *glyphs = NULL; + gint n_glyphs = 0; + + g_assert (self != NULL); + g_assert (java_layout != NULL); + + gr = (struct graphics2d *)NSA_GET_G2D_PTR (env, self); + tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, java_layout); + pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, font); + + g_assert (gr != NULL); + g_assert (tl != NULL); + g_assert (tl->pango_layout != NULL); + g_assert (pfont != NULL); + + if (gr->debug) printf ("painting pango layout\n"); + + gdk_threads_enter (); + if (peer_is_disposed(env, self)) { gdk_threads_leave(); return; } + + i = pango_layout_get_iter (tl->pango_layout); + g_assert (i != NULL); + + install_font_peer (gr->cr, pfont, gr->debug); + cairo_translate (gr->cr, x, y); + + do + { + run = pango_layout_iter_get_run (i); + if (run != NULL) + paint_glyph_run (gr, &glyphs, &n_glyphs, run); + } + while (pango_layout_iter_next_run (i)); + + if (glyphs != NULL) + g_free (glyphs); + + cairo_translate (gr->cr, -x, -y); + + pango_layout_iter_free (i); + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetOperator (JNIEnv *env, jobject obj, jint op) { struct graphics2d *gr = NULL; @@ -1013,7 +1337,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetOperator gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBColor +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBColor (JNIEnv *env, jobject obj, jdouble r, jdouble g, jdouble b) { struct graphics2d *gr = NULL; @@ -1039,7 +1364,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBColor gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetAlpha +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetAlpha (JNIEnv *env, jobject obj, jdouble a) { struct graphics2d *gr = NULL; @@ -1049,12 +1375,13 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetAlpha gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); g_assert (gr != NULL); - if (gr->debug) printf ("cairo_set_alpha %f\n", a); + if (gr->debug) printf ("cairo_set_alpha %f\n", a); cairo_set_alpha (gr->cr, a); gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFillRule +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFillRule (JNIEnv *env, jobject obj, jint rule) { struct graphics2d *gr = NULL; @@ -1077,7 +1404,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFillRule gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineWidth +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineWidth (JNIEnv *env, jobject obj, jdouble width) { struct graphics2d *gr = NULL; @@ -1092,7 +1420,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineWidt gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCap +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCap (JNIEnv *env, jobject obj, jint cap) { struct graphics2d *gr = NULL; @@ -1120,7 +1449,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCap gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoin +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoin (JNIEnv *env, jobject obj, jint join) { struct graphics2d *gr = NULL; @@ -1148,7 +1478,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoin gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDash +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDash (JNIEnv *env, jobject obj, jdoubleArray dashes, jint ndash, jdouble offset) { struct graphics2d *gr = NULL; @@ -1167,7 +1498,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDash gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLimit +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLimit (JNIEnv *env, jobject obj, jdouble miter) { struct graphics2d *gr = NULL; @@ -1183,7 +1515,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLim } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoNewPath +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoNewPath (JNIEnv *env, jobject obj) { struct graphics2d *gr = NULL; @@ -1192,13 +1525,14 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoNewPath if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); - g_assert (gr != NULL); + if (gr == NULL) { gdk_threads_leave (); return; } if (gr->debug) printf ("cairo_new_path\n"); cairo_new_path (gr->cr); gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoMoveTo +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoMoveTo (JNIEnv *env, jobject obj, jdouble x, jdouble y) { struct graphics2d *gr = NULL; @@ -1213,7 +1547,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoMoveTo gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoLineTo +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoLineTo (JNIEnv *env, jobject obj, jdouble x, jdouble y) { struct graphics2d *gr = NULL; @@ -1228,7 +1563,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoLineTo gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoCurveTo +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoCurveTo (JNIEnv *env, jobject obj, jdouble x1, jdouble y1, jdouble x2, jdouble y2, jdouble x3, jdouble y3) { struct graphics2d *gr = NULL; @@ -1243,7 +1579,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoCurveTo gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelMoveTo +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelMoveTo (JNIEnv *env, jobject obj, jdouble dx, jdouble dy) { struct graphics2d *gr = NULL; @@ -1258,7 +1595,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelMoveTo gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelLineTo +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelLineTo (JNIEnv *env, jobject obj, jdouble dx, jdouble dy) { struct graphics2d *gr = NULL; @@ -1273,7 +1611,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelLineTo gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelCurveTo +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelCurveTo (JNIEnv *env, jobject obj, jdouble dx1, jdouble dy1, jdouble dx2, jdouble dy2, jdouble dx3, jdouble dy3) { struct graphics2d *gr = NULL; @@ -1288,7 +1627,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelCurveTo gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRectangle +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRectangle (JNIEnv *env, jobject obj, jdouble x, jdouble y, jdouble width, jdouble height) { struct graphics2d *gr = NULL; @@ -1297,13 +1637,14 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRectangle if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); - g_assert (gr != NULL); + if (gr == NULL) { gdk_threads_leave (); return; } if (gr->debug) printf ("cairo_rectangle (%f, %f) (%f, %f)\n", x, y, width, height); cairo_rectangle (gr->cr, x, y, width, height); gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClosePath +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClosePath (JNIEnv *env, jobject obj) { struct graphics2d *gr = NULL; @@ -1318,7 +1659,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClosePath gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoStroke +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoStroke (JNIEnv *env, jobject obj) { struct graphics2d *gr = NULL; @@ -1335,7 +1677,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoStroke gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoFill +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoFill (JNIEnv *env, jobject obj) { struct graphics2d *gr = NULL; @@ -1352,7 +1695,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoFill gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClip +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClip (JNIEnv *env, jobject obj) { struct graphics2d *gr = NULL; @@ -1361,7 +1705,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClip if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); - g_assert (gr != NULL); + if (gr == NULL) { gdk_threads_leave (); return; } if (gr->debug) printf ("cairo_clip\n"); begin_drawing_operation (gr); cairo_init_clip (gr->cr); @@ -1370,7 +1714,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClip gdk_threads_leave(); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetFilter +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetFilter (JNIEnv *env, jobject obj, jint filter) { struct graphics2d *gr = NULL; diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c new file mode 100644 index 00000000000..578acf60195 --- /dev/null +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c @@ -0,0 +1,99 @@ +/* gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c + Copyright (C) 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +#include "gdkfont.h" +#include "gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.h" + + +static gint +cmp_families (const void *a, const void *b) +{ + const char *a_name = pango_font_family_get_name (*(PangoFontFamily **)a); + const char *b_name = pango_font_family_get_name (*(PangoFontFamily **)b); + + return g_utf8_collate (a_name, b_name); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_nativeGetFontFamilies +(JNIEnv *env, jobject self __attribute__((unused)), jobjectArray family_name) +{ + PangoContext *context; + PangoFontFamily **families; + int n_families, idx; + + gdk_threads_enter (); + + context = gdk_pango_context_get(); + g_assert (context != NULL); + + pango_context_list_families (context, &families, &n_families); + + qsort (families, n_families, sizeof (PangoFontFamily *), cmp_families); + + for (idx = 0; idx < n_families; idx++) + { + const char *name_tmp = pango_font_family_get_name (families[idx]); + jstring name = (*env)->NewStringUTF (env, name_tmp); + (*env)->SetObjectArrayElement (env, family_name, idx, name); + } + g_free (families); + gdk_threads_leave (); +} + +JNIEXPORT jint JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_nativeGetNumFontFamilies +(JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused))) +{ + PangoContext *context; + PangoFontFamily **families; + gint n_families; + jint num; + + gdk_threads_enter (); + + context = gdk_pango_context_get(); + g_assert (context != NULL); + + pango_context_list_families (context, &families, &n_families); + + num = n_families; + g_free (families); + gdk_threads_leave (); + + return num; +} diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c index 7fdda317d78..3cb3bd25b56 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c @@ -99,14 +99,17 @@ area_updated (GdkPixbufLoader *loader, JNIEnv *env; union env_union e; jint stride_bytes, stride_pixels, n_channels, n_pixels; - int i; jintArray jpixels; jint *java_pixels; guchar *gdk_pixels; GdkPixbuf *pixbuf_no_alpha = NULL; GdkPixbuf *pixbuf = NULL; - + +#ifndef WORDS_BIGENDIAN + int i; +#endif + pixbuf_no_alpha = gdk_pixbuf_loader_get_pixbuf (loader); if (pixbuf_no_alpha == NULL) return; @@ -168,7 +171,8 @@ closed (GdkPixbufLoader *loader __attribute__((unused)), jobject *decoder) -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initState +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initState (JNIEnv *env, jobject obj) { GdkPixbufLoader *loader = NULL; @@ -189,7 +193,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initState NSA_SET_PB_PTR (env, obj, loader); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initStaticState +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initStaticState (JNIEnv *env, jclass clazz) { (*env)->GetJavaVM(env, &vm); @@ -205,7 +210,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initStaticSta } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_finish +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_finish (JNIEnv *env, jobject obj) { GdkPixbufLoader *loader = NULL; @@ -221,7 +227,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_finish } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_pumpBytes +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_pumpBytes (JNIEnv *env, jobject obj, jbyteArray jarr, jint len) { GdkPixbufLoader *loader = NULL; diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c new file mode 100644 index 00000000000..d09d155b42e --- /dev/null +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c @@ -0,0 +1,183 @@ +/* gnu_java_awt_GdkTextLayout.c + Copyright (C) 2004 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + + +#include <jni.h> +#include <gtk/gtk.h> +#include "native_state.h" +#include "gdkfont.h" +#include "gnu_java_awt_peer_gtk_GdkTextLayout.h" + +struct state_table *native_text_layout_state_table; + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkTextLayout_initStaticState + (JNIEnv *env, jclass clazz) +{ + NSA_TEXT_LAYOUT_INIT (env, clazz); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkTextLayout_initState + (JNIEnv *env, jobject self) +{ + struct textlayout *tl; + + gdk_threads_enter (); + g_assert(self != NULL); + tl = g_malloc0 (sizeof (struct textlayout)); + g_assert(tl != NULL); + tl->pango_layout = pango_layout_new(gdk_pango_context_get()); + g_assert(tl->pango_layout != NULL); + NSA_SET_TEXT_LAYOUT_PTR (env, self, tl); + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkTextLayout_setText + (JNIEnv *env, jobject self, jstring text) +{ + struct textlayout *tl; + gchar *str = NULL; + gint len = 0; + + gdk_threads_enter (); + g_assert(self != NULL); + g_assert(text != NULL); + + tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, self); + g_assert(tl != NULL); + g_assert(tl->pango_layout != NULL); + + len = (*env)->GetStringUTFLength (env, text); + str = (gchar *)(*env)->GetStringUTFChars (env, text, NULL); + g_assert (str != NULL); + + pango_layout_set_text (tl->pango_layout, text, len); + + (*env)->ReleaseStringUTFChars (env, text, str); + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkTextLayout_indexToPos + (JNIEnv *env, jobject self, jint idx, jdoubleArray javaPos) +{ + struct textlayout *tl; + PangoRectangle pangoPos; + jdouble *nativePos; + + gdk_threads_enter (); + g_assert(self != NULL); + g_assert(javaPos != NULL); + + tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, self); + g_assert(tl != NULL); + g_assert(tl->pango_layout != NULL); + + g_assert((*env)->GetArrayLength (env, javaPos) == 4); + + nativePos = (*env)->GetDoubleArrayElements (env, javaPos, NULL); + + pango_layout_index_to_pos (tl->pango_layout, idx, &pangoPos); + + nativePos[0] = (jdouble) pangoPos.x; + nativePos[1] = (jdouble) pangoPos.y; + nativePos[2] = (jdouble) pangoPos.width; + nativePos[3] = (jdouble) pangoPos.height; + + (*env)->ReleaseDoubleArrayElements (env, javaPos, nativePos, 0); + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkTextLayout_getExtents + (JNIEnv *env, jobject self, jdoubleArray javaInkExtents, jdoubleArray javaLogExtents) +{ + struct textlayout *tl; + PangoRectangle pangoInkExtents, pangoLogExtents; + jdouble *nativeInkExtents, *nativeLogExtents; + + gdk_threads_enter (); + g_assert(self != NULL); + g_assert(javaInkExtents != NULL); + g_assert(javaLogExtents != NULL); + + tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, self); + g_assert(tl != NULL); + g_assert(tl->pango_layout != NULL); + + g_assert((*env)->GetArrayLength (env, javaInkExtents) == 4); + g_assert((*env)->GetArrayLength (env, javaLogExtents) == 4); + + nativeInkExtents = (*env)->GetDoubleArrayElements (env, javaInkExtents, NULL); + nativeLogExtents = (*env)->GetDoubleArrayElements (env, javaLogExtents, NULL); + + pango_layout_get_extents (tl->pango_layout, + &pangoInkExtents, &pangoLogExtents); + + nativeInkExtents[0] = (jdouble) pangoInkExtents.x; + nativeInkExtents[1] = (jdouble) pangoInkExtents.y; + nativeInkExtents[2] = (jdouble) pangoInkExtents.width; + nativeInkExtents[3] = (jdouble) pangoInkExtents.height; + + nativeLogExtents[0] = (jdouble) pangoLogExtents.x; + nativeLogExtents[1] = (jdouble) pangoLogExtents.y; + nativeLogExtents[2] = (jdouble) pangoLogExtents.width; + nativeLogExtents[3] = (jdouble) pangoLogExtents.height; + + (*env)->ReleaseDoubleArrayElements (env, javaInkExtents, nativeInkExtents, 0); + (*env)->ReleaseDoubleArrayElements (env, javaLogExtents, nativeLogExtents, 0); + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GdkTextLayout_dispose + (JNIEnv *env, jobject self) +{ + struct textlayout *tl; + + gdk_threads_enter (); + g_assert(self != NULL); + tl = (struct textlayout *) NSA_DEL_TEXT_LAYOUT_PTR (env, self); + g_assert(tl != NULL); + if (tl->pango_layout != NULL) + g_object_unref (tl->pango_layout); + g_free(tl); + gdk_threads_leave (); +} diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c index 08d38b5871d..1cb43349536 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c @@ -37,14 +37,24 @@ exception statement from your version. */ #include "gtkpeer.h" -#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" #include "gnu_java_awt_peer_gtk_GtkButtonPeer.h" +static gboolean focus_in_cb (GtkWidget *widget, + GdkEventFocus *event, + jobject peer); +static gboolean focus_out_cb (GtkWidget *widget, + 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) { const char *c_label; + GtkWidget *eventbox; GtkWidget *button; NSA_SET_GLOBAL_REF (env, obj); @@ -53,41 +63,51 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create gdk_threads_enter (); + eventbox = gtk_event_box_new (); button = gtk_button_new_with_label (c_label); + gtk_container_add (GTK_CONTAINER (eventbox), button); gtk_widget_show (button); gdk_threads_leave (); (*env)->ReleaseStringUTFChars (env, label, c_label); - NSA_SET_PTR (env, obj, button); + NSA_SET_PTR (env, obj, eventbox); } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectJObject +Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectSignals (JNIEnv *env, jobject obj) { void *ptr; + jobject *gref; + GtkWidget *button; ptr = NSA_GET_PTR (env, obj); + gref = NSA_GET_GLOBAL_REF (env, obj); gdk_threads_enter (); - gtk_widget_realize (GTK_WIDGET (ptr)); + button = gtk_bin_get_child (GTK_BIN (ptr)); - connect_awt_hook (env, obj, 1, GTK_BUTTON(ptr)->event_window); + g_signal_connect (G_OBJECT (ptr), "event", + G_CALLBACK (pre_event_handler), *gref); - gdk_threads_leave (); -} + g_signal_connect (G_OBJECT (button), "event", + G_CALLBACK (pre_event_handler), *gref); -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectSignals - (JNIEnv *env, jobject obj) -{ - /* FIXME: Do we need to connect any signals here? Otherwise just do not - override parent method. */ + g_signal_connect (G_OBJECT (button), "focus-in-event", + G_CALLBACK (focus_in_cb), *gref); + + 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); - /* Connect the superclass signals. */ - Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj); + g_signal_connect_after (G_OBJECT (button), "released", + G_CALLBACK (block_expose_events_cb), *gref); + + gdk_threads_leave (); } JNIEXPORT void JNICALL @@ -95,6 +115,7 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetLabel (JNIEnv *env, jobject obj, jstring jtext) { const char *text; + GtkWidget *button; GtkWidget *label; void *ptr; @@ -104,7 +125,8 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetLabel 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 (); @@ -113,11 +135,12 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetLabel } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetFont +Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetModifyFont (JNIEnv *env, jobject obj, jstring name, jint style, jint size) { const char *font_name; void *ptr; + GtkWidget *button; GtkWidget *label; PangoFontDescription *font_desc; @@ -127,7 +150,8 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetFont 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); @@ -148,10 +172,56 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetFont } 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; @@ -163,7 +233,8 @@ Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetSetForeground 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); @@ -176,13 +247,101 @@ JNIEXPORT void JNICALL 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 (); + + button = gtk_bin_get_child (GTK_BIN (ptr)); + gtk_widget_activate (GTK_WIDGET (button)); + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetRequestFocus + (JNIEnv *env, jobject obj) +{ + void *ptr; + GtkWidget *button; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); + button = gtk_bin_get_child (GTK_BIN (ptr)); + gtk_widget_grab_focus (button); + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkButtonPeer_setNativeBounds + (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) +{ + GtkWidget *widget, *child; void *ptr; ptr = NSA_GET_PTR (env, obj); gdk_threads_enter (); - gtk_widget_activate (GTK_WIDGET (ptr)); + widget = GTK_WIDGET (ptr); + + /* We assume that -1 is a width or height and not a request for the + widget's natural size. */ + width = width < 0 ? 0 : width; + height = height < 0 ? 0 : height; + child = gtk_bin_get_child (GTK_BIN (widget)); + + if (!(width == 0 && height == 0)) + { + /* Set the event box's size request... */ + gtk_widget_set_size_request (widget, width, height); + /* ...and the button's size request... */ + gtk_widget_set_size_request (child, width, height); + /* ...and the label's size request. */ + gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (child)), width, + height); + if (widget->parent != NULL) + gtk_fixed_move (GTK_FIXED (widget->parent), widget, x, y); + } gdk_threads_leave (); } + +static gboolean +focus_in_cb (GtkWidget *widget __attribute((unused)), + GdkEventFocus *event __attribute((unused)), + jobject peer) +{ + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postFocusEventID, + AWT_FOCUS_GAINED, + JNI_FALSE); + return FALSE; +} + +static gboolean +focus_out_cb (GtkWidget *widget __attribute((unused)), + GdkEventFocus *event __attribute((unused)), + jobject peer) +{ + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postFocusEventID, + AWT_FOCUS_LOST, + 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); +} diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c index 6a1a90ce170..63dd9441640 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c @@ -39,7 +39,8 @@ exception statement from your version. */ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkCanvasPeer.h" -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCanvasPeer_create +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkCanvasPeer_create (JNIEnv *env, jobject obj) { gpointer widget; diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c index f88e2e8bcc3..90923fe3bad 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c @@ -39,7 +39,8 @@ exception statement from your version. */ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.h" -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_dispose +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_dispose (JNIEnv *env, jobject obj) { /* The actual underlying widget is owned by a different class. So @@ -47,7 +48,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_dispose NSA_DEL_PTR (env, obj); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_remove +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_remove (JNIEnv *env, jobject obj, jobject checkbox) { GtkRadioButton *button; diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c index 153b17fe333..ade743023d7 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c @@ -46,7 +46,6 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer_create GtkWidget *widget; const char *str; - /* Create global reference and save it for future use */ NSA_SET_GLOBAL_REF (env, obj); str = (*env)->GetStringUTFChars (env, label, NULL); @@ -54,7 +53,6 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer_create gdk_threads_enter (); widget = gtk_check_menu_item_new_with_label (str); - gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (widget), 1); gtk_widget_show (widget); gdk_threads_leave (); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c index 4d5c8114cd7..3b58c05d7ea 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c @@ -144,7 +144,7 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkToggleButtonSetActive } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkSetFont +Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkWidgetModifyFont (JNIEnv *env, jobject obj, jstring name, jint style, jint size) { const char *font_name; diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c index 128443121b2..94c9c3d0c2d 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c @@ -45,8 +45,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create (JNIEnv *env, jobject obj) { - GtkWidget *menu; - GtkComboBox *combobox; + GtkWidget *combobox; NSA_SET_GLOBAL_REF (env, obj); @@ -181,7 +180,6 @@ void selection_changed (GtkComboBox *combobox, jobject peer) jstring label; GtkTreeModel *model; GtkTreeIter iter; - GValue value; gchar *selected; gint index; diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c index a1327400335..986244ee2f0 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c @@ -148,8 +148,8 @@ selection_get (GtkWidget *widget __attribute__((unused)), utflen = (*gdk_env)->GetStringUTFLength (gdk_env, jstr); utf = (*gdk_env)->GetStringUTFChars (gdk_env, jstr, NULL); - gtk_selection_data_set (selection_data, GDK_TARGET_STRING, 8, - (char *)utf, utflen); + gtk_selection_data_set (selection_data, GDK_TARGET_STRING, 8, + (const unsigned char*)utf, utflen); (*gdk_env)->ReleaseStringUTFChars (gdk_env, jstr, utf); } diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c index 8aaf0d26282..3aebe77755d 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c @@ -49,6 +49,7 @@ static gboolean focus_in_cb (GtkWidget *widget, static gboolean focus_out_cb (GtkWidget *widget, GdkEventFocus *event, jobject peer); + /* * This method returns a GDK keyval that corresponds to one of the * keysyms in the X keymap table. The return value is only used to @@ -489,27 +490,33 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetParent widget = GTK_WIDGET (ptr); parent_widget = GTK_WIDGET (parent_ptr); - if (GTK_IS_WINDOW (parent_widget)) + if (widget->parent == NULL) { - GList *children = gtk_container_children - (GTK_CONTAINER (GTK_BIN (parent_widget)->child)); - - if (GTK_IS_MENU_BAR (children->data)) - gtk_layout_put (GTK_LAYOUT (children->next->data), widget, 0, 0); + if (GTK_IS_WINDOW (parent_widget)) + { + GList *children = gtk_container_children + (GTK_CONTAINER (parent_widget)); + + if (GTK_IS_MENU_BAR (children->data)) + gtk_fixed_put (GTK_FIXED (children->next->data), widget, 0, 0); + else + gtk_fixed_put (GTK_FIXED (children->data), widget, 0, 0); + } else - gtk_layout_put (GTK_LAYOUT (children->data), widget, 0, 0); + if (GTK_IS_SCROLLED_WINDOW (parent_widget)) + { + gtk_scrolled_window_add_with_viewport + (GTK_SCROLLED_WINDOW (parent_widget), widget); + gtk_viewport_set_shadow_type (GTK_VIEWPORT (widget->parent), + GTK_SHADOW_NONE); + + } + else + { + if (widget->parent == NULL) + gtk_fixed_put (GTK_FIXED (parent_widget), widget, 0, 0); + } } - else - if (GTK_IS_SCROLLED_WINDOW (parent_widget)) - { - gtk_scrolled_window_add_with_viewport - (GTK_SCROLLED_WINDOW (parent_widget), widget); - gtk_viewport_set_shadow_type (GTK_VIEWPORT (widget->parent), - GTK_SHADOW_NONE); - - } - else - gtk_layout_put (GTK_LAYOUT (parent_widget), widget, 0, 0); gdk_threads_leave (); } @@ -770,7 +777,8 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetPreferredDimensions (*env)->ReleaseIntArrayElements (env, jdims, dims, 0); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setNativeBounds +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setNativeBounds (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) { GtkWidget *widget; @@ -791,8 +799,12 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setNativeBoun gtk_widget_set_size_request (widget, width, height); else { - gtk_widget_set_size_request (widget, width, height); - gtk_layout_move (GTK_LAYOUT (widget->parent), widget, x, y); + if (!(width == 0 && height == 0)) + { + gtk_widget_set_size_request (widget, width, height); + if (widget->parent != NULL) + gtk_fixed_move (GTK_FIXED (widget->parent), widget, x, y); + } } gdk_threads_leave (); @@ -908,38 +920,6 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetForeground } 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; - 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 * dpi_conversion_factor); - - 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); -} - -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_show (JNIEnv *env, jobject obj) { @@ -965,34 +945,36 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_hide gdk_threads_leave(); } -GtkLayout * -find_gtk_layout (GtkWidget *parent) +JNIEXPORT jboolean JNICALL +Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isEnabled + (JNIEnv *env, jobject obj) { - if (GTK_IS_WINDOW (parent)) - { - GList *children = gtk_container_children - (GTK_CONTAINER (GTK_BIN (parent)->child)); + void *ptr; + jboolean ret_val; + + ptr = NSA_GET_PTR (env, obj); - if (GTK_IS_MENU_BAR (children->data)) - return GTK_LAYOUT (children->next->data); - else /* GTK_IS_LAYOUT (children->data) */ - return GTK_LAYOUT (children->data); - } + gdk_threads_enter (); + ret_val = GTK_WIDGET_IS_SENSITIVE (GTK_WIDGET (ptr)); + gdk_threads_leave (); - return NULL; + return ret_val; } JNIEXPORT jboolean JNICALL -Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isEnabled +Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isRealized (JNIEnv *env, jobject obj) { void *ptr; jboolean ret_val; - + ptr = NSA_GET_PTR (env, obj); + if (ptr == NULL) + return FALSE; + gdk_threads_enter (); - ret_val = GTK_WIDGET_IS_SENSITIVE (GTK_WIDGET (ptr)); + ret_val = GTK_WIDGET_REALIZED (GTK_WIDGET (ptr)); gdk_threads_leave (); return ret_val; @@ -1013,197 +995,21 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_modalHasGrab return retval; } -static gboolean -filter_expose_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) -{ - /* - * Prevent the default event handler from getting this signal if applicable - * FIXME: I came up with these filters by looking for patterns in the unwanted - * expose events that are fed back to us from gtk/X. Perhaps there is - * a way to prevent them from occuring in the first place. - */ - if (event->type == GDK_EXPOSE && (!GTK_IS_LAYOUT(widget) - || event->any.window != widget->window)) - { - g_signal_stop_emission_by_name(GTK_OBJECT(widget), "event"); - return FALSE; - } - else - { - /* There may be non-expose events that are triggered while we're - painting a heavyweight peer. */ - return pre_event_handler(widget, event, peer); - } -} - -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_addExposeFilter - (JNIEnv *env, jobject obj) -{ - GtkObject *filterobj; - GtkWidget *vbox, *layout; - GList *children; - void *ptr = NSA_GET_PTR (env, obj); - jobject *gref = NSA_GET_GLOBAL_REF (env, obj); - gulong hid; - - g_assert (gref); - - gdk_threads_enter (); - - /* GtkFramePeer is built as a GtkLayout inside a GtkVBox inside a GtkWindow. - Events go to the GtkLayout layer, so we filter them there. */ - if (GTK_IS_WINDOW(ptr)) - { - children = gtk_container_get_children(GTK_CONTAINER(ptr)); - vbox = children->data; - g_assert (GTK_IS_VBOX(vbox)); - - children = gtk_container_get_children(GTK_CONTAINER(vbox)); - do - { - layout = children->data; - children = children->next; - } - while (!GTK_IS_LAYOUT (layout) && children != NULL); - g_assert (GTK_IS_LAYOUT(layout)); - - filterobj = GTK_OBJECT(layout); - } - else if (GTK_IS_SCROLLED_WINDOW(ptr)) - { - /* The event will go to the parent GtkLayout. */ - filterobj = GTK_OBJECT(GTK_WIDGET(ptr)->parent); - } - else - { - filterobj = GTK_OBJECT(ptr); - } - hid = g_signal_handler_find(filterobj, - G_SIGNAL_MATCH_FUNC, - 0, 0, NULL, *pre_event_handler, NULL); - if (hid > 0) - { - g_signal_handler_block(filterobj, hid); - } - g_signal_connect( filterobj, "event", - G_CALLBACK(filter_expose_event_handler), *gref); - - gdk_threads_leave (); -} - -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_removeExposeFilter - (JNIEnv *env, jobject obj) -{ - GtkObject *filterobj; - GtkWidget *vbox, *layout; - GList *children; - void *ptr = NSA_GET_PTR (env, obj); - jobject *gref = NSA_GET_GLOBAL_REF (env, obj); - gulong hid; - - g_assert (gref); - - gdk_threads_enter (); - - /* GtkFramePeer is built as a GtkLayout inside a GtkVBox inside a GtkWindow. - Events go to the GtkLayout layer, so we filter them there. */ - if (GTK_IS_WINDOW(ptr)) - { - children = gtk_container_get_children(GTK_CONTAINER(ptr)); - vbox = children->data; - g_assert (GTK_IS_VBOX(vbox)); - - children = gtk_container_get_children(GTK_CONTAINER(vbox)); - do - { - layout = children->data; - children = children->next; - } - while (!GTK_IS_LAYOUT (layout) && children != NULL); - g_assert (GTK_IS_LAYOUT(layout)); - - filterobj = GTK_OBJECT(layout); - } - else if (GTK_IS_SCROLLED_WINDOW(ptr)) - { - /* The event will go to the parent GtkLayout. */ - filterobj = GTK_OBJECT(GTK_WIDGET(ptr)->parent); - } - else - { - filterobj = GTK_OBJECT(ptr); - } - - g_signal_handlers_disconnect_by_func (filterobj, - *filter_expose_event_handler, *gref); - hid = g_signal_handler_find(filterobj, - G_SIGNAL_MATCH_FUNC, - 0, 0, NULL, *pre_event_handler, NULL); - if (hid > 0) - { - g_signal_handler_unblock(filterobj, hid); - } - - gdk_threads_leave (); -} - -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetQueueDrawArea - (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) -{ - GdkRectangle rect; - void *ptr; - - ptr = NSA_GET_PTR (env, obj); - - rect.x = x + GTK_WIDGET(ptr)->allocation.x; - rect.y = y + GTK_WIDGET(ptr)->allocation.y; - rect.width = width; - rect.height = height; - - gdk_threads_enter (); - - gdk_window_invalidate_rect (GTK_WIDGET (ptr)->window, &rect, 0); - gdk_window_process_all_updates(); - - gdk_threads_leave (); -} - -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkComponentPeer_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 (); - gtk_widget_realize (GTK_WIDGET (ptr)); - - connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); - - gdk_threads_leave (); -} - -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals - (JNIEnv *env, jobject obj) -{ - void *ptr = NSA_GET_PTR (env, obj); - jobject *gref = NSA_GET_GLOBAL_REF (env, obj); - g_assert (gref); - - gdk_threads_enter (); - - gtk_widget_realize (GTK_WIDGET (ptr)); - - /* FIXME: We could check here if this is a scrolled window with a - single child that does not have an associated jobject. This - means that it is one of our wrapped widgets like List or TextArea - and thus we could connect the signal to the child without having - to specialize this method. */ - /* Connect EVENT signal, which happens _before_ any specific signal. */ - g_signal_connect (GTK_OBJECT (ptr), "event", + g_signal_connect (GTK_OBJECT (ptr), "event", G_CALLBACK (pre_event_handler), *gref); g_signal_connect (G_OBJECT (ptr), "focus-in-event", @@ -1212,6 +1018,9 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignal g_signal_connect (G_OBJECT (ptr), "focus-out-event", G_CALLBACK (focus_out_cb), *gref); + g_signal_connect_after (G_OBJECT (ptr), "realize", + G_CALLBACK (connect_awt_hook_cb), *gref); + gdk_threads_leave (); } @@ -1235,19 +1044,7 @@ find_bg_color_widget (GtkWidget *widget) { GtkWidget *bg_color_widget; - if (GTK_IS_WINDOW (widget)) - { - GtkWidget *vbox; - GList* children; - - children = gtk_container_get_children(GTK_CONTAINER(widget)); - vbox = children->data; - - children = gtk_container_get_children(GTK_CONTAINER(vbox)); - bg_color_widget = children->data; - } - else - bg_color_widget = widget; + bg_color_widget = widget; return bg_color_widget; } diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c index c98473f549b..61e1af10105 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer.c @@ -45,22 +45,18 @@ Java_gnu_java_awt_peer_gtk_GtkEmbeddedWindowPeer_create (JNIEnv *env, jobject obj, jlong socket_id) { GtkWidget *window; - GtkWidget *vbox, *layout; + GtkWidget *fixed; - /* Create global reference and save it for future use */ NSA_SET_GLOBAL_REF (env, obj); gdk_threads_enter (); window = gtk_plug_new ((GdkNativeWindow) socket_id); - vbox = gtk_vbox_new (0, 0); - layout = gtk_layout_new (NULL, NULL); - gtk_box_pack_end (GTK_BOX (vbox), layout, 1, 1, 0); - gtk_container_add (GTK_CONTAINER (window), vbox); + fixed = gtk_fixed_new (); + gtk_container_add (GTK_CONTAINER (window), fixed); - gtk_widget_show (layout); - gtk_widget_show (vbox); + gtk_widget_show (fixed); gdk_threads_leave (); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c index 7cf405df902..65f64e04eea 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c @@ -827,14 +827,16 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) static guint button_number = -1; static jint click_count = 1; static int hasBeenDragged; + union widget_union w; /* If it is not a focus change event, the widget must be realized already. If not, ignore the event (Gtk+ will do the same). */ if (!(event->type == GDK_FOCUS_CHANGE || GTK_WIDGET_REALIZED(widget))) return FALSE; - + /* Do not handle propagated events. AWT has its own propagation rules */ - gdk_window_get_user_data (event->any.window, (void **) &event_widget); + w.widget = &event_widget; + gdk_window_get_user_data (event->any.window, w.void_widget); if (event_widget != widget) return FALSE; @@ -1010,23 +1012,12 @@ pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer) } break; case GDK_EXPOSE: - { - /* This filters out unwanted feedback expose events from gtk/X - when we explictly invalidate and update heavyweight components, - thus avoiding an infinite loop. - FIXME: I'm not quite sure why we're getting these expose events. - Maybe there is a way to avoid them? */ - if((event->any.window == widget->window && event->any.send_event) - || GTK_IS_LAYOUT(widget)) - { - (*gdk_env)->CallVoidMethod (gdk_env, peer, - postExposeEventID, - (jint)event->expose.area.x, - (jint)event->expose.area.y, - (jint)event->expose.area.width, - (jint)event->expose.area.height); - } - } + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postExposeEventID, + (jint)event->expose.area.x, + (jint)event->expose.area.y, + (jint)event->expose.area.width, + (jint)event->expose.area.height); break; case GDK_FOCUS_CHANGE: @@ -1133,3 +1124,24 @@ connect_awt_hook (JNIEnv *env, jobject peer_obj, int nwindows, ...) va_end (ap); } +/* + * Attach a Java object that is backed by widget. This callback is + * called after the widget's window has been realized. That way, we + * can be sure that widget->window is non-NULL, and so can have data + * connected to it. + */ +void connect_awt_hook_cb (GtkWidget *widget __attribute__((unused)), + jobject peer) +{ + void *ptr; + + ptr = NSA_GET_PTR (gdk_env, peer); + + connect_awt_hook (gdk_env, peer, 1, GTK_WIDGET (ptr)->window); + + gdk_threads_leave (); + + (*gdk_env)->CallVoidMethod (gdk_env, peer, setCursorID); + + gdk_threads_enter (); +} diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c index 594fcce4165..3a2e41f21a7 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c @@ -84,21 +84,6 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create NSA_SET_PTR (env, obj, widget); } -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectJObject - (JNIEnv *env, jobject obj) -{ - void *ptr = NSA_GET_PTR (env, obj); - - gdk_threads_enter (); - - gtk_widget_realize (GTK_WIDGET (ptr)); - - connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); - - gdk_threads_leave (); -} - JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectSignals (JNIEnv *env, jobject obj) @@ -109,8 +94,6 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectSignals gdk_threads_enter (); - gtk_widget_realize (GTK_WIDGET (ptr)); - g_signal_connect (G_OBJECT (GTK_DIALOG (ptr)), "response", GTK_SIGNAL_FUNC (handle_response), *gref); @@ -144,10 +127,9 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeGetDirectory This function extracts the filename from the GtkFileFilterInfo object, and passes it to the Java method. The Java method will call the filter's accept() method and will give back the return value. */ -gboolean filenameFilterCallback (const GtkFileFilterInfo *filter_info, - gpointer obj) +static gboolean filenameFilterCallback (const GtkFileFilterInfo *filter_info, + gpointer obj) { - gchar* dirname; jclass cx; jmethodID id; jstring *filename; @@ -168,8 +150,8 @@ gboolean filenameFilterCallback (const GtkFileFilterInfo *filter_info, JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetFilenameFilter - (JNIEnv *env, jobject obj, jobject filter_obj) - { + (JNIEnv *env, jobject obj, jobject filter_obj __attribute__((unused))) +{ void *ptr; GtkFileFilter *filter; @@ -178,11 +160,8 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetFilenameFilter gdk_threads_enter (); filter = gtk_file_filter_new(); - gtk_file_filter_add_custom(filter, - GTK_FILE_FILTER_FILENAME, - G_CALLBACK(filenameFilterCallback), - obj, - NULL); + gtk_file_filter_add_custom(filter, GTK_FILE_FILTER_FILENAME, + filenameFilterCallback, obj, NULL); gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(ptr), filter); @@ -237,7 +216,7 @@ handle_response (GtkDialog *dialog __attribute__((unused)), static jmethodID disposeID; void *ptr; G_CONST_RETURN gchar *fileName; - jstring str_fileName; + jstring str_fileName = NULL; /* We only need this for the case when the user closed the window, or clicked ok or cancel. */ @@ -269,8 +248,6 @@ handle_response (GtkDialog *dialog __attribute__((unused)), if (responseId == GTK_RESPONSE_OK) { fileName = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (GTK_WIDGET (ptr))); str_fileName = (*gdk_env)->NewStringUTF (gdk_env, fileName); - } else if (responseId == GTK_RESPONSE_CANCEL) { - str_fileName = NULL; } if (!isIDSet) diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c new file mode 100644 index 00000000000..5c48832f9be --- /dev/null +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFramePeer.c @@ -0,0 +1,179 @@ +/* gtkframepeer.c -- Native implementation of GtkFramePeer + Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + + GNU Classpath is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Classpath is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNU Classpath; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +#include "gtkpeer.h" +#include "gnu_java_awt_peer_gtk_GtkFramePeer.h" + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkFramePeer_removeMenuBarPeer + (JNIEnv *env, jobject obj) +{ + void *ptr; + void *mptr; + void *fixed; + GList* children; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); + + fixed = gtk_container_get_children (GTK_CONTAINER (ptr))->data; + children = gtk_container_get_children (GTK_CONTAINER (fixed)); + + while (children != NULL && !GTK_IS_MENU_SHELL (children->data)) + { + children = children->next; + } + + /* If there's a menu bar, remove it. */ + if (children != NULL) + { + mptr = children->data; + + /* This will actually destroy the MenuBar. By removing it from + its parent, the reference count for the MenuBar widget will + decrement to 0. The widget will be automatically destroyed by + GTK. */ + gtk_container_remove (GTK_CONTAINER (fixed), GTK_WIDGET (mptr)); + } + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarPeer + (JNIEnv *env, jobject obj, jobject menubar) +{ + void *ptr; + void *mptr; + void *fixed; + + ptr = NSA_GET_PTR (env, obj); + mptr = NSA_GET_PTR (env, menubar); + + gdk_threads_enter (); + + fixed = gtk_container_get_children (GTK_CONTAINER (ptr))->data; + gtk_fixed_put (GTK_FIXED (fixed), mptr, 0, 0); + gtk_widget_show (mptr); + + gdk_threads_leave (); +} + +JNIEXPORT jint JNICALL +Java_gnu_java_awt_peer_gtk_GtkFramePeer_getMenuBarHeight + (JNIEnv *env, jobject obj __attribute__((unused)), jobject menubar) +{ + GtkWidget *ptr; + GtkRequisition requisition; + + ptr = NSA_GET_PTR (env, menubar); + + gdk_threads_enter (); + + gtk_widget_size_request (ptr, &requisition); + + gdk_threads_leave (); + + return requisition.height; +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarWidth + (JNIEnv *env, jobject obj __attribute__((unused)), jobject menubar, jint width) +{ + GtkWidget *ptr; + GtkRequisition natural_req; + + ptr = NSA_GET_PTR (env, menubar); + + gdk_threads_enter (); + + /* Get the menubar's natural size request. */ + gtk_widget_set_size_request (GTK_WIDGET (ptr), -1, -1); + gtk_widget_size_request (GTK_WIDGET (ptr), &natural_req); + + /* Set the menubar's size request to width by natural_req.height. */ + gtk_widget_set_size_request (GTK_WIDGET (ptr), + width, natural_req.height); + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkFramePeer_gtkFixedSetVisible + (JNIEnv *env, jobject obj, jboolean visible) +{ + void *ptr; + void *fixed; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); + + fixed = gtk_container_get_children (GTK_CONTAINER (ptr))->data; + + if (visible) + gtk_widget_show (GTK_WIDGET (fixed)); + else + gtk_widget_hide (GTK_WIDGET (fixed)); + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImageFromDecoder + (JNIEnv *env, jobject obj, jobject decoder) +{ + void *ptr; + GdkPixbufLoader *loader = NULL; + GdkPixbuf *pixbuf = NULL; + + ptr = NSA_GET_PTR (env, obj); + + loader = NSA_GET_PB_PTR (env, decoder); + g_assert (loader != NULL); + + gdk_threads_enter (); + + pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); + g_assert (pixbuf != NULL); + + gtk_window_set_icon (GTK_WINDOW (ptr), pixbuf); + + gdk_threads_leave (); +} diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c index 7b8babeb839..8eebce98082 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkGenericPeer.c @@ -39,7 +39,8 @@ exception statement from your version. */ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkGenericPeer.h" -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkGenericPeer_dispose +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkGenericPeer_dispose (JNIEnv *env, jobject obj) { void *ptr; @@ -57,3 +58,34 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkGenericPeer_dispose gdk_threads_leave (); } +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkGenericPeer_gtkWidgetModifyFont + (JNIEnv *env, jobject obj, jstring name, jint style, jint size) +{ + const char *font_name; + void *ptr; + 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 * dpi_conversion_factor); + + 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); +} diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c index 362f7a93c8f..4686fed59c0 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c @@ -41,11 +41,12 @@ exception statement from your version. */ #include <libart_lgpl/art_rgb_affine.h> -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkImagePainter_drawPixels -(JNIEnv *env, jobject obj __attribute__((unused)), jobject gc_obj, - jint bg_red, jint bg_green, jint bg_blue, jint x, jint y, jint width, - jint height, jintArray jpixels, jint offset, jint scansize, - jdoubleArray jaffine) +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkImagePainter_drawPixels + (JNIEnv *env, jobject obj __attribute__((unused)), jobject gc_obj, + jint bg_red, jint bg_green, jint bg_blue, jint x, jint y, jint width, + jint height, jintArray jpixels, jint offset, jint scansize, + jdoubleArray jaffine) { struct graphics *g; jint *pixels, *elems; @@ -147,6 +148,12 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkImagePainter_drawPixels gdk_threads_enter (); + if (!g || !GDK_IS_DRAWABLE (g->drawable)) + { + gdk_threads_leave (); + return; + } + gdk_draw_rgb_image (g->drawable, g->gc, x + g->x_offset, diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c index 93d30cb6976..25c89554622 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c @@ -44,33 +44,30 @@ Java_gnu_java_awt_peer_gtk_GtkLabelPeer_create (JNIEnv *env, jobject obj, jstring text, jfloat xalign) { GtkWidget *label; - GtkWidget *ebox; - GtkContainer *ebox_container; + GtkWidget *eventbox; const char *str; - /* Create global reference and save it for future use */ NSA_SET_GLOBAL_REF (env, obj); str = (*env)->GetStringUTFChars (env, text, 0); gdk_threads_enter (); - ebox = gtk_event_box_new (); - ebox_container = GTK_CONTAINER (ebox); + eventbox = gtk_event_box_new (); label = gtk_label_new (str); gtk_misc_set_alignment (GTK_MISC (label), xalign, 0.5); - gtk_container_add (ebox_container, label); + gtk_container_add (GTK_CONTAINER (eventbox), label); gtk_widget_show (label); gdk_threads_leave (); (*env)->ReleaseStringUTFChars (env, text, str); - NSA_SET_PTR (env, obj, ebox); + NSA_SET_PTR (env, obj, eventbox); } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkLabelPeer_gtkSetFont +Java_gnu_java_awt_peer_gtk_GtkLabelPeer_gtkWidgetModifyFont (JNIEnv *env, jobject obj, jstring name, jint style, jint size) { const char *font_name; @@ -121,7 +118,7 @@ Java_gnu_java_awt_peer_gtk_GtkLabelPeer_setText gdk_threads_enter (); - label = gtk_bin_get_child (GTK_BIN(ptr)); + label = gtk_bin_get_child (GTK_BIN (ptr)); gtk_label_set_label (GTK_LABEL (label), str); @@ -147,3 +144,36 @@ Java_gnu_java_awt_peer_gtk_GtkLabelPeer_nativeSetAlignment gdk_threads_leave (); } + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkLabelPeer_setNativeBounds + (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) +{ + GtkWidget *widget; + void *ptr; + + ptr = NSA_GET_PTR (env, obj); + + gdk_threads_enter (); + + widget = GTK_WIDGET (ptr); + + /* We assume that -1 is a width or height and not a request for the + widget's natural size. */ + width = width < 0 ? 0 : width; + height = height < 0 ? 0 : height; + + if (!(width == 0 && height == 0)) + { + /* Set the event box's size request... */ + gtk_widget_set_size_request (widget, width, height); + /* ...and the label's size request. */ + gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (widget)), + width, height); + + if (widget->parent != NULL) + gtk_fixed_move (GTK_FIXED (widget->parent), widget, x, y); + } + + gdk_threads_leave (); +} diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c index 7cefd8dad07..575f3c9a596 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c @@ -117,22 +117,6 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_create } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkListPeer_connectJObject - (JNIEnv *env, jobject obj) -{ - void *ptr; - - ptr = NSA_GET_PTR (env, obj); - - gdk_threads_enter (); - - gtk_widget_realize (GTK_WIDGET (ptr)); - connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); - - gdk_threads_leave (); -} - -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals (JNIEnv *env, jobject obj) { @@ -148,8 +132,6 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals g_assert (gref); - gtk_widget_realize (GTK_WIDGET (ptr)); - list = TREE_VIEW_FROM_SW (ptr); g_signal_connect (G_OBJECT (list), "event", @@ -163,7 +145,7 @@ Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkListPeer_gtkSetFont +Java_gnu_java_awt_peer_gtk_GtkListPeer_gtkWidgetModifyFont (JNIEnv *env, jobject obj, jstring name, jint style, jint size) { const char *font_name; diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c index 99107a1282c..8a2a8105d0a 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c @@ -61,6 +61,13 @@ jmethodID postListItemEventID; jmethodID postTextEventID; jmethodID postWindowEventID; +jmethodID beginNativeRepaintID; +jmethodID endNativeRepaintID; + +jmethodID initComponentGraphicsID; +jmethodID initComponentGraphics2DID; +jmethodID setCursorID; + JNIEnv *gdk_env; GtkWindowGroup *global_gtk_window_group; @@ -69,7 +76,7 @@ static void init_glib_threads(JNIEnv *, jint); double dpi_conversion_factor; -static void init_dpi_conversion_factor (); +static void init_dpi_conversion_factor (void); static void dpi_changed_cb (GtkSettings *settings, GParamSpec *pspec); @@ -91,9 +98,8 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz, int argc = 1; char **argv; char *homedir, *rcpath = NULL; -/* jclass gtkgenericpeer; */ jclass gtkcomponentpeer, gtkchoicepeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer, - gtkmenuitempeer, gtktextcomponentpeer, window; + gtkmenuitempeer, gtktextcomponentpeer, window, gdkgraphics, gdkgraphics2d; NSA_INIT (env, clazz); gdk_env = env; @@ -141,8 +147,6 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz, 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"); @@ -159,13 +163,10 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz, "gnu/java/awt/peer/gtk/GtkMenuItemPeer"); gtktextcomponentpeer = (*env)->FindClass (env, "gnu/java/awt/peer/gtk/GtkTextComponentPeer"); -/* 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"); */ - + gdkgraphics = (*env)->FindClass (env, + "gnu/java/awt/peer/gtk/GdkGraphics"); + gdkgraphics2d = (*env)->FindClass (env, + "gnu/java/awt/peer/gtk/GdkGraphics2D"); setBoundsCallbackID = (*env)->GetMethodID (env, window, "setBoundsCallback", "(IIII)V"); @@ -175,6 +176,14 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz, "()V"); postMouseEventID = (*env)->GetMethodID (env, gtkcomponentpeer, "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, @@ -201,6 +210,12 @@ Java_gnu_java_awt_peer_gtk_GtkMainThread_gtkInit (JNIEnv *env, jclass clazz, postTextEventID = (*env)->GetMethodID (env, gtktextcomponentpeer, "postTextEvent", "()V"); + initComponentGraphicsID = (*env)->GetMethodID (env, gdkgraphics, + "initComponentGraphics", + "()V"); + initComponentGraphics2DID = (*env)->GetMethodID (env, gdkgraphics2d, + "initComponentGraphics2D", + "()V"); global_gtk_window_group = gtk_window_group_new (); init_dpi_conversion_factor (); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c index 53c7351e6ec..563bf48105b 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c @@ -39,12 +39,12 @@ exception statement from your version. */ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkMenuBarPeer.h" -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_create +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_create (JNIEnv *env, jobject obj) { GtkWidget *widget; - /* Create global reference and save it for future use */ NSA_SET_GLOBAL_REF (env, obj); gdk_threads_enter (); @@ -57,7 +57,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_create NSA_SET_PTR (env, obj, widget); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_addMenu +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_addMenu (JNIEnv *env, jobject obj, jobject menupeer) { void *mbar, *menu; @@ -70,7 +71,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_addMenu gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_nativeSetHelpMenu +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_nativeSetHelpMenu (JNIEnv *env, jobject obj, jobject menupeer) { static void *helpmenu; @@ -93,7 +95,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_nativeSetHelpMe gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_delMenu +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkMenuBarPeer_delMenu (JNIEnv *env, jobject obj, jint index) { void *ptr; diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c index 5d5de6780a0..4d68fce7053 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c @@ -43,20 +43,21 @@ exception statement from your version. */ static void item_activate (GtkMenuItem *item __attribute__((unused)), jobject peer_obj); -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_create +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_create (JNIEnv *env, jobject obj, jstring label) { GtkWidget *widget; const char *str; - /* Create global reference and save it for future use */ NSA_SET_GLOBAL_REF (env, obj); str = (*env)->GetStringUTFChars (env, label, NULL); gdk_threads_enter (); - - if (strcmp (str, "-") == 0) /* "-" signals that we need a separator */ + + /* "-" signals that we need a separator. */ + if (strcmp (str, "-") == 0) widget = gtk_menu_item_new (); else widget = gtk_menu_item_new_with_label (str); @@ -86,7 +87,46 @@ Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_connectSignals gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_setEnabled +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_gtkWidgetModifyFont + (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(); + + label = gtk_bin_get_child (GTK_BIN (ptr)); + + if (label) + { + font_desc = pango_font_description_from_string (font_name); + pango_font_description_set_size (font_desc, size * dpi_conversion_factor); + + 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_GtkMenuItemPeer_setEnabled (JNIEnv *env, jobject obj, jboolean enabled) { void *ptr; @@ -98,11 +138,13 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_setEnabled gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_setLabel +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_setLabel (JNIEnv *env, jobject obj, jstring label) { void *ptr; const char *str; + GtkAccelLabel *accel_label; ptr = NSA_GET_PTR (env, obj); @@ -110,15 +152,10 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_setLabel gdk_threads_enter (); - if (strcmp (str, "-") == 0) /* "-" signals that we need a separator */ - gtk_container_remove (GTK_CONTAINER (ptr), GTK_BIN (ptr)->child); - else - { - GtkAccelLabel *accel_label = GTK_ACCEL_LABEL (GTK_BIN (ptr)->child); + accel_label = GTK_ACCEL_LABEL (GTK_BIN (ptr)->child); - gtk_label_set_text (GTK_LABEL (accel_label), str); - gtk_accel_label_refetch (accel_label); - } + gtk_label_set_text (GTK_LABEL (accel_label), str); + gtk_accel_label_refetch (accel_label); gdk_threads_leave (); @@ -131,4 +168,3 @@ item_activate (GtkMenuItem *item __attribute__((unused)), jobject peer_obj) (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, postMenuActionEventID); } - diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c index 1ffe61b0c52..dd5511cf679 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c @@ -39,7 +39,8 @@ exception statement from your version. */ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkMenuPeer.h" -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_setupAccelGroup +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkMenuPeer_setupAccelGroup (JNIEnv *env, jobject obj, jobject parent) { void *ptr1, *ptr2; @@ -67,13 +68,13 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_setupAccelGroup } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_create +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkMenuPeer_create (JNIEnv *env, jobject obj, jstring label) { GtkWidget *menu_title, *menu, *toplevel; const char *str; - /* Create global reference and save it for future use */ NSA_SET_GLOBAL_REF (env, obj); str = (*env)->GetStringUTFChars (env, label, NULL); @@ -106,7 +107,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_create (*env)->ReleaseStringUTFChars (env, label, str); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_addTearOff +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkMenuPeer_addTearOff (JNIEnv *env, jobject obj) { void *ptr1; @@ -124,7 +126,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_addTearOff gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_addItem +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkMenuPeer_addItem (JNIEnv *env, jobject obj, jobject menuitempeer, jint key, jboolean shift) { void *ptr1, *ptr2; @@ -150,7 +153,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_addItem gdk_threads_leave (); } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuPeer_delItem +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkMenuPeer_delItem (JNIEnv *env, jobject obj, jint index) { void *ptr; diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c index 835c2348d39..f432baf0ca6 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c @@ -44,14 +44,15 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkPanelPeer_create (JNIEnv *env, jobject obj) { - gpointer widget; + GtkWidget *widget; - /* Create global reference and save it for future use */ NSA_SET_GLOBAL_REF (env, obj); gdk_threads_enter (); - widget = gtk_layout_new (NULL, NULL); + widget = gtk_fixed_new (); + + gtk_fixed_set_has_window (GTK_FIXED (widget), TRUE); GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS); @@ -59,18 +60,3 @@ Java_gnu_java_awt_peer_gtk_GtkPanelPeer_create NSA_SET_PTR (env, obj, widget); } - -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectJObject - (JNIEnv *env, jobject obj) -{ - void *ptr; - - ptr = NSA_GET_PTR (env, obj); - - gdk_threads_enter (); - gtk_widget_realize (GTK_WIDGET (ptr)); - connect_awt_hook (env, obj, 1, GTK_LAYOUT (ptr)->bin_window); - - gdk_threads_leave (); -} diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c index c5fffdc343f..6cfe2549705 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPopupMenuPeer.c @@ -58,7 +58,8 @@ menu_pos (GtkMenu *menu __attribute__((unused)), *push_in = TRUE; } -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkPopupMenuPeer_show +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkPopupMenuPeer_show (JNIEnv *env, jobject obj, jint x, jint y, jlong time) { void *ptr; diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c index c916b3fe128..4f834460f95 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c @@ -78,23 +78,6 @@ Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_create } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectJObject - (JNIEnv *env, jobject obj) -{ - void *ptr; - - ptr = NSA_GET_PTR (env, obj); - - gdk_threads_enter (); - - gtk_widget_realize (GTK_WIDGET (ptr)); - - connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); - - gdk_threads_leave (); -} - -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals (JNIEnv *env, jobject obj) { diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c index c9427d49dff..4b7f5dcca49 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c @@ -54,7 +54,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_create text = gtk_text_view_new (); gtk_widget_set_size_request (text, textview_width, textview_height); - gtk_text_view_set_cursor_visible(text, TRUE); + gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW (text), TRUE); gtk_widget_show (text); @@ -141,7 +141,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_replaceRange } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkSetFont +Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkWidgetModifyFont (JNIEnv *env, jobject obj, jstring name, jint style, jint size) { const char *font_name; diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c index 2a6666a0d83..a7b0a477885 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c @@ -175,7 +175,7 @@ Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setEchoChar } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkSetFont +Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkWidgetModifyFont (JNIEnv *env, jobject obj, jstring name, jint style, jint size) { const char *font_name; diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c index 508893168b1..a8e745ec0f4 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c @@ -1,5 +1,5 @@ /* gtkwindowpeer.c -- Native implementation of GtkWindowPeer - Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -37,9 +37,7 @@ exception statement from your version. */ #include "gtkpeer.h" -#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" #include "gnu_java_awt_peer_gtk_GtkWindowPeer.h" -#include "gnu_java_awt_peer_gtk_GtkFramePeer.h" #include <gdk/gdkprivate.h> #include <gdk/gdkx.h> #include <X11/Xatom.h> @@ -58,8 +56,6 @@ static Bool property_notify_predicate (Display *display, XEvent *xevent, XPointer arg); -static GtkLayout *find_layout (GtkWindow *window); - static void window_delete_cb (GtkWidget *widget, GdkEvent *event, jobject peer); static void window_destroy_cb (GtkWidget *widget, GdkEvent *event, @@ -85,6 +81,19 @@ static gboolean window_property_changed_cb (GtkWidget *widget, GdkEventProperty *event, jobject peer); +/* Union used for type punning. */ +union extents_union +{ + guchar **gu_extents; + unsigned long **extents; +}; + +union atom_list_union +{ + guchar **gu_extents; + Atom **atom_list; +}; + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create (JNIEnv *env, jobject obj, jint type, jboolean decorated, @@ -93,8 +102,7 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create GtkWidget *window_widget; GtkWindow *window; void *window_parent; - GtkWidget *vbox; - GtkWidget *layout; + GtkWidget *fixed; int top = 0; int left = 0; int bottom = 0; @@ -124,14 +132,10 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create gtk_window_group_add_window (global_gtk_window_group, window); - vbox = gtk_vbox_new (0, 0); - layout = gtk_layout_new (NULL, NULL); - gtk_box_pack_end (GTK_BOX (vbox), layout, 1, 1, 0); - gtk_container_add (GTK_CONTAINER (window_widget), vbox); + fixed = gtk_fixed_new (); + gtk_container_add (GTK_CONTAINER (window_widget), fixed); - gtk_widget_show (layout); - gtk_widget_show (vbox); - gtk_widget_realize (window_widget); + gtk_widget_show (fixed); if (decorated) window_get_frame_extents (window_widget, &top, &left, &bottom, &right); @@ -232,52 +236,20 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectJObject - (JNIEnv *env, jobject obj) -{ - void *ptr; - GtkLayout *layout; - - ptr = NSA_GET_PTR (env, obj); - - gdk_threads_enter (); - - layout = find_layout (GTK_WINDOW (ptr)); - - gtk_widget_realize (GTK_WIDGET (layout)); - - connect_awt_hook (env, obj, 1, layout->bin_window); - - gtk_widget_realize (ptr); - - connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window); - - gdk_threads_leave (); -} - -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals (JNIEnv *env, jobject obj) { void *ptr; jobject *gref; - GtkLayout *layout; ptr = NSA_GET_PTR (env, obj); - gref = NSA_GET_GLOBAL_REF (env, obj); gdk_threads_enter (); - gtk_widget_realize (ptr); + g_signal_connect (G_OBJECT (ptr), "event", + G_CALLBACK (pre_event_handler), *gref); - /* Receive events from the GtkLayout too */ - layout = find_layout (GTK_WINDOW (ptr)); - - g_signal_connect (G_OBJECT (layout), "event", - G_CALLBACK (pre_event_handler), *gref); - - /* Connect signals for window event support. */ g_signal_connect (G_OBJECT (ptr), "delete-event", G_CALLBACK (window_delete_cb), *gref); @@ -305,16 +277,12 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals g_signal_connect (G_OBJECT (ptr), "property-notify-event", G_CALLBACK (window_property_changed_cb), *gref); - gdk_threads_leave (); + g_signal_connect_after (G_OBJECT (ptr), "realize", + G_CALLBACK (connect_awt_hook_cb), *gref); - /* Connect the superclass signals. */ - Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj); + gdk_threads_leave (); } -/* - * Lower the z-level of a window. - */ - JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toBack (JNIEnv *env, jobject obj) @@ -323,16 +291,13 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toBack (JNIEnv *env, ptr = NSA_GET_PTR (env, obj); gdk_threads_enter (); + gdk_window_lower (GTK_WIDGET (ptr)->window); + gdk_flush (); - XFlush (GDK_DISPLAY ()); gdk_threads_leave (); } -/* - * Raise the z-level of a window. - */ - JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toFront (JNIEnv *env, jobject obj) @@ -341,9 +306,10 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toFront (JNIEnv *env, ptr = NSA_GET_PTR (env, obj); gdk_threads_enter (); + gdk_window_raise (GTK_WIDGET (ptr)->window); + gdk_flush (); - XFlush (GDK_DISPLAY ()); gdk_threads_leave (); } @@ -369,7 +335,9 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setSize height = (height < 1) ? 1 : height; gdk_threads_enter (); + gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height); + gdk_threads_leave (); } @@ -384,6 +352,7 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBounds height = (height < 1) ? 1 : height; gdk_threads_enter (); + gtk_window_move (GTK_WINDOW(ptr), x, y); /* The call to gdk_window_move is needed in addition to the call to gtk_window_move. If gdk_window_move isn't called, then the @@ -397,7 +366,8 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBounds Instead of being at the position set by setLocation, the window is reshown at the position to which it was moved manually. */ - gdk_window_move (GTK_WIDGET (ptr)->window, x, y); + if (GTK_WIDGET (ptr)->window != NULL) + gdk_window_move (GTK_WIDGET (ptr)->window, x, y); /* Need to change the widget's request size. */ gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height); @@ -408,204 +378,12 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBounds gdk_threads_leave (); } -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkFramePeer_removeMenuBarPeer - (JNIEnv *env, jobject obj) -{ - void *wptr; - GtkWidget *box; - GtkWidget *mptr; - GList* children; - - wptr = NSA_GET_PTR (env, obj); - - gdk_threads_enter (); - - box = GTK_BIN (wptr)->child; - - children = gtk_container_get_children (GTK_CONTAINER (box)); - - while (children != NULL && !GTK_IS_MENU_SHELL (children->data)) - { - children = children->next; - } - - /* If there isn't a MenuBar in this Frame's list of children - then we can just return. */ - if (!GTK_IS_MENU_SHELL (children->data)) - return; - else - mptr = children->data; - - /* This will actually destroy the MenuBar. By removing it from - its parent, the reference count for the MenuBar widget will - decrement to 0. The widget will be automatically destroyed - by Gtk. */ - gtk_container_remove (GTK_CONTAINER (box), GTK_WIDGET (mptr)); - - gdk_threads_leave(); -} - -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarPeer - (JNIEnv *env, jobject obj, jobject menubar) -{ - void *wptr; - GtkWidget *mptr; - GtkWidget *box; - - wptr = NSA_GET_PTR (env, obj); - mptr = NSA_GET_PTR (env, menubar); - - gdk_threads_enter (); - - box = GTK_BIN (wptr)->child; - gtk_box_pack_start (GTK_BOX (box), mptr, 0, 0, 0); - - gtk_widget_show (mptr); - - - gdk_threads_leave (); -} - -JNIEXPORT jint JNICALL -Java_gnu_java_awt_peer_gtk_GtkFramePeer_getMenuBarHeight - (JNIEnv *env, jobject obj __attribute__((unused)), jobject menubar) -{ - GtkWidget *ptr; - jint height; - GtkRequisition gtkreq; - - ptr = NSA_GET_PTR (env, menubar); - - gdk_threads_enter (); - gtk_widget_size_request (ptr, >kreq); - - height = gtkreq.height; - gdk_threads_leave (); - return height; -} - -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkFramePeer_moveLayout - (JNIEnv *env, jobject obj, jint offset) -{ - void* ptr; - GList* children; - GtkLayout* layout; - GtkWidget* widget; - - ptr = NSA_GET_PTR (env, obj); - - gdk_threads_enter (); - - layout = find_layout (GTK_WINDOW (ptr)); - - children = gtk_container_get_children (GTK_CONTAINER (layout)); - - while (children != NULL) - { - widget = children->data; - gtk_layout_move (layout, widget, widget->allocation.x, - widget->allocation.y+offset); - children = children->next; - } - - gdk_threads_leave (); -} - -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkFramePeer_gtkLayoutSetVisible - (JNIEnv *env, jobject obj, jboolean visible) -{ - void* ptr; - GtkLayout* layout; - - ptr = NSA_GET_PTR (env, obj); - - gdk_threads_enter (); - - layout = find_layout (GTK_WINDOW (ptr)); - - if (visible) - gtk_widget_show (GTK_WIDGET (layout)); - else - gtk_widget_hide (GTK_WIDGET (layout)); - - gdk_threads_leave (); -} - -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImageFromDecoder - (JNIEnv *env, jobject obj, jobject decoder) -{ - void *ptr; - GdkPixbufLoader *loader = NULL; - GdkPixbuf *pixbuf = NULL; - - ptr = NSA_GET_PTR (env, obj); - - loader = NSA_GET_PB_PTR (env, decoder); - g_assert (loader != NULL); - - gdk_threads_enter (); - - pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); - g_assert (pixbuf != NULL); - - gtk_window_set_icon (GTK_WINDOW (ptr), pixbuf); - - gdk_threads_leave (); -} - -void free_pixbuf_data (guchar *pixels, gpointer data __attribute__((unused))) -{ - free(pixels); -} - -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImageFromData - (JNIEnv *env, jobject obj, jintArray pixelArray, jint width, jint height) -{ - void *ptr; - GdkPixbuf *pixbuf; - jint *pixels; - int pixels_length, i; - guchar *data; - - ptr = NSA_GET_PTR (env, obj); - - pixels = (*env)->GetIntArrayElements (env, pixelArray, 0); - pixels_length = (*env)->GetArrayLength (env, pixelArray); - - data = malloc (sizeof (guchar) * pixels_length); - for (i = 0; i < pixels_length; i++) - data[i] = (guchar) pixels[i]; - - gdk_threads_enter (); - - pixbuf = gdk_pixbuf_new_from_data (data, - GDK_COLORSPACE_RGB, - TRUE, - 8, - width, - height, - width*4, - free_pixbuf_data, - NULL); - - gtk_window_set_icon (GTK_WINDOW (ptr), pixbuf); - - gdk_threads_leave (); - - (*env)->ReleaseIntArrayElements(env, pixelArray, pixels, 0); -} - static void window_get_frame_extents (GtkWidget *window, int *top, int *left, int *bottom, int *right) { unsigned long *extents = NULL; + union extents_union gu_ex; /* Guess frame extents in case _NET_FRAME_EXTENTS is not supported. */ @@ -619,6 +397,7 @@ window_get_frame_extents (GtkWidget *window, request_frame_extents (window); /* Attempt to retrieve window's frame extents. */ + gu_ex.extents = &extents; if (gdk_property_get (window->window, gdk_atom_intern ("_NET_FRAME_EXTENTS", FALSE), gdk_atom_intern ("CARDINAL", FALSE), @@ -628,7 +407,7 @@ window_get_frame_extents (GtkWidget *window, NULL, NULL, NULL, - (guchar **)&extents)) + gu_ex.gu_extents)) { *left = extents [0]; *right = extents [1]; @@ -649,7 +428,9 @@ request_frame_extents (GtkWidget *window) /* Check if the current window manager supports _NET_REQUEST_FRAME_EXTENTS. */ - if (gdk_net_wm_supports (request_extents)) + /* FIXME: The window->window != NULL check is a workaround for bug + http://bugzilla.gnome.org/show_bug.cgi?id=17952. */ + if (gdk_net_wm_supports (request_extents) && window->window != NULL) { GdkDisplay *display = gtk_widget_get_display (window); Display *xdisplay = GDK_DISPLAY_XDISPLAY (display); @@ -740,11 +521,12 @@ window_show_cb (GtkWidget *widget __attribute__((unused)), } static void -window_active_state_change_cb (GtkWidget *widget, - GParamSpec *pspec, - jobject peer) +window_active_state_change_cb (GtkWidget *widget __attribute__((unused)), + GParamSpec *pspec __attribute__((unused)), + jobject peer __attribute__((unused))) { /* FIXME: not sure if this is needed or not. */ + /* Remove the unused attributes if you fix the below. */ #if 0 if (GTK_WINDOW (widget)->is_active) (*gdk_env)->CallVoidMethod (gdk_env, peer, @@ -761,42 +543,46 @@ window_active_state_change_cb (GtkWidget *widget, static void window_focus_state_change_cb (GtkWidget *widget, - GParamSpec *pspec, - jobject peer) - { - if (GTK_WINDOW (widget)->has_toplevel_focus) - (*gdk_env)->CallVoidMethod (gdk_env, peer, - postWindowEventID, - (jint) AWT_WINDOW_ACTIVATED, - (jobject) NULL, (jint) 0); - else - (*gdk_env)->CallVoidMethod (gdk_env, peer, - postWindowEventID, + GParamSpec *pspec __attribute__((unused)), + jobject peer) +{ + if (GTK_WINDOW (widget)->has_toplevel_focus) + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postWindowEventID, + (jint) AWT_WINDOW_ACTIVATED, + (jobject) NULL, (jint) 0); + else + (*gdk_env)->CallVoidMethod (gdk_env, peer, + postWindowEventID, (jint) AWT_WINDOW_DEACTIVATED, (jobject) NULL, (jint) 0); } static gboolean -window_focus_in_cb (GtkWidget * widget, - GdkEventFocus *event, - jobject peer) +window_focus_in_cb (GtkWidget * widget __attribute__((unused)), + GdkEventFocus *event __attribute__((unused)), + jobject peer) { (*gdk_env)->CallVoidMethod (gdk_env, peer, postWindowEventID, (jint) AWT_WINDOW_GAINED_FOCUS, (jobject) NULL, (jint) 0); + /* FIXME: somewhere after this is handled, the child window is + getting an expose event. */ return FALSE; } static gboolean -window_focus_out_cb (GtkWidget * widget, - GdkEventFocus *event, - jobject peer) +window_focus_out_cb (GtkWidget * widget __attribute__((unused)), + GdkEventFocus *event __attribute__((unused)), + jobject peer) { (*gdk_env)->CallVoidMethod (gdk_env, peer, postWindowEventID, (jint) AWT_WINDOW_LOST_FOCUS, (jobject) NULL, (jint) 0); + /* FIXME: somewhere after this is handled, the child window is + getting an expose event. */ return FALSE; } @@ -855,12 +641,15 @@ window_get_new_state (GtkWidget *widget) gulong atom_count; gulong bytes_after; Atom *atom_list = NULL; + union atom_list_union alu; gulong i; - XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (widget->window), + alu.atom_list = &atom_list; + XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), + GDK_WINDOW_XID (widget->window), gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE"), 0, G_MAXLONG, False, XA_ATOM, &type, &format, &atom_count, - &bytes_after, (guchar **)&atom_list); + &bytes_after, alu.gu_extents); if (type != None) { @@ -889,6 +678,7 @@ window_property_changed_cb (GtkWidget *widget __attribute__((unused)), jobject peer) { unsigned long *extents; + union extents_union gu_ex; static int id_set = 0; static jmethodID postInsetsChangedEventID; @@ -903,7 +693,7 @@ window_property_changed_cb (GtkWidget *widget __attribute__((unused)), "(IIII)V"); id_set = 1; } - + gu_ex.extents = &extents; if (gdk_atom_intern ("_NET_FRAME_EXTENTS", FALSE) == event->atom && gdk_property_get (event->window, gdk_atom_intern ("_NET_FRAME_EXTENTS", FALSE), @@ -914,7 +704,7 @@ window_property_changed_cb (GtkWidget *widget __attribute__((unused)), NULL, NULL, NULL, - (guchar **)&extents)) + gu_ex.gu_extents)) (*gdk_env)->CallVoidMethod (gdk_env, peer, postInsetsChangedEventID, (jint) extents[2], /* top */ @@ -924,26 +714,3 @@ window_property_changed_cb (GtkWidget *widget __attribute__((unused)), return FALSE; } - -static GtkLayout * -find_layout (GtkWindow *window) -{ - GList* children; - GtkBox* vbox; - GtkLayout* layout; - - children = gtk_container_get_children (GTK_CONTAINER (window)); - vbox = children->data; - g_assert (GTK_IS_VBOX (vbox)); - - children = gtk_container_get_children (GTK_CONTAINER (vbox)); - do - { - layout = children->data; - children = children->next; - } - while (!GTK_IS_LAYOUT (layout) && children != NULL); - g_assert (GTK_IS_LAYOUT (layout)); - - return layout; -} diff --git a/libjava/jni/gtk-peer/gtkpeer.h b/libjava/jni/gtk-peer/gtkpeer.h index d29b27b2aa3..e982551288c 100644 --- a/libjava/jni/gtk-peer/gtkpeer.h +++ b/libjava/jni/gtk-peer/gtkpeer.h @@ -115,6 +115,9 @@ struct graphics GdkDrawable *drawable; GdkGC *gc; GdkColormap *cm; + PangoFontDescription *pango_font; + PangoContext *pango_context; + PangoLayout *pango_layout; jint x_offset, y_offset; }; @@ -447,6 +450,13 @@ extern jmethodID postListItemEventID; extern jmethodID postTextEventID; extern jmethodID postWindowEventID; +extern jmethodID beginNativeRepaintID; +extern jmethodID endNativeRepaintID; + +extern jmethodID initComponentGraphicsID; +extern jmethodID initComponentGraphics2DID; +extern jmethodID setCursorID; + extern jmethodID syncAttrsID; extern jclass gdkColor; extern jmethodID gdkColorID; @@ -463,10 +473,10 @@ gboolean pre_event_handler (GtkWidget *widget, jobject peer); void connect_awt_hook (JNIEnv *env, jobject peer_obj, int nwindows, ...); +void connect_awt_hook_cb (GtkWidget *widget, jobject peer); void set_visible (GtkWidget *widget, jboolean visible); void set_parent (GtkWidget *widget, GtkContainer *parent); -GtkLayout *find_gtk_layout (GtkWidget *parent); jint keyevent_state_to_awt_mods (GdkEvent *event); @@ -476,6 +486,13 @@ struct item_event_hook_info const char *label; }; +/* Union used for type punning. */ +union widget_union +{ + void **void_widget; + GtkWidget **widget; +}; + #define DEBUG_LOCKING 0 #if DEBUG_LOCKING |