diff options
Diffstat (limited to 'libjava/classpath/native/jni/gtk-peer')
15 files changed, 825 insertions, 743 deletions
diff --git a/libjava/classpath/native/jni/gtk-peer/GtkDragSourceContextPeer.c b/libjava/classpath/native/jni/gtk-peer/GtkDragSourceContextPeer.c new file mode 100644 index 00000000000..6dfbfcce4a9 --- /dev/null +++ b/libjava/classpath/native/jni/gtk-peer/GtkDragSourceContextPeer.c @@ -0,0 +1,256 @@ +/* gtkdragsourcecontextpeer.c -- Native implementation of GtkDragSourceContextPeer + Copyright (C) 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 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 "GtkDragSourceContextPeer.h" + +#include <jni.h> +#include <gtk/gtk.h> + +static GtkWidget * get_widget (GtkWidget *widget); + +#define ACTION_COPY 1 +#define ACTION_MOVE 2 +#define ACTION_COPY_OR_MOVE 3 +#define ACTION_LINK 1073741824 + +#define AWT_DEFAULT_CURSOR 0 +#define AWT_CROSSHAIR_CURSOR 1 +#define AWT_TEXT_CURSOR 2 +#define AWT_WAIT_CURSOR 3 +#define AWT_SW_RESIZE_CURSOR 4 +#define AWT_SE_RESIZE_CURSOR 5 +#define AWT_NW_RESIZE_CURSOR 6 +#define AWT_NE_RESIZE_CURSOR 7 +#define AWT_N_RESIZE_CURSOR 8 +#define AWT_S_RESIZE_CURSOR 9 +#define AWT_W_RESIZE_CURSOR 10 +#define AWT_E_RESIZE_CURSOR 11 +#define AWT_HAND_CURSOR 12 +#define AWT_MOVE_CURSOR 13 + +GtkWidget *widget; + +JNIEXPORT void JNICALL +Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_create + (JNIEnv *env, jobject obj, jobject comp) +{ + void *ptr; + + gdk_threads_enter (); + + NSA_SET_GLOBAL_REF (env, obj); + NSA_SET_GLOBAL_REF (env, comp); + + ptr = NSA_GET_PTR (env, comp); + widget = get_widget (GTK_WIDGET (ptr)); + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_nativeSetCursor + (JNIEnv *env, jobject obj, jint type) +{ + void *ptr; + GdkWindow *win; + GdkCursorType gdk_cursor_type; + GdkCursor *gdk_cursor; + + gdk_threads_enter (); + + ptr = NSA_GET_GLOBAL_REF (env, obj); + + switch (type) + { + case AWT_CROSSHAIR_CURSOR: + gdk_cursor_type = GDK_CROSSHAIR; + break; + case AWT_TEXT_CURSOR: + gdk_cursor_type = GDK_XTERM; + break; + case AWT_WAIT_CURSOR: + gdk_cursor_type = GDK_WATCH; + break; + case AWT_SW_RESIZE_CURSOR: + gdk_cursor_type = GDK_BOTTOM_LEFT_CORNER; + break; + case AWT_SE_RESIZE_CURSOR: + gdk_cursor_type = GDK_BOTTOM_RIGHT_CORNER; + break; + case AWT_NW_RESIZE_CURSOR: + gdk_cursor_type = GDK_TOP_LEFT_CORNER; + break; + case AWT_NE_RESIZE_CURSOR: + gdk_cursor_type = GDK_TOP_RIGHT_CORNER; + break; + case AWT_N_RESIZE_CURSOR: + gdk_cursor_type = GDK_TOP_SIDE; + break; + case AWT_S_RESIZE_CURSOR: + gdk_cursor_type = GDK_BOTTOM_SIDE; + break; + case AWT_W_RESIZE_CURSOR: + gdk_cursor_type = GDK_LEFT_SIDE; + break; + case AWT_E_RESIZE_CURSOR: + gdk_cursor_type = GDK_RIGHT_SIDE; + break; + case AWT_HAND_CURSOR: + gdk_cursor_type = GDK_HAND2; + break; + case AWT_MOVE_CURSOR: + gdk_cursor_type = GDK_FLEUR; + break; + default: + gdk_cursor_type = GDK_LEFT_PTR; + } + + win = widget->window; + if ((widget->window) == NULL) + win = widget->window; + + gdk_cursor = gdk_cursor_new (gdk_cursor_type); + + gdk_window_set_cursor (win, gdk_cursor); + gdk_cursor_unref (gdk_cursor); + + gdk_flush(); + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_connectSignals + (JNIEnv *env, jobject obj, jobject comp) +{ + jobject *gref; + void *ptr; + + gdk_threads_enter (); + + ptr = NSA_GET_GLOBAL_REF (env, obj); + gref = NSA_GET_GLOBAL_REF (env, comp); + + /* Uncomment when needed: + g_signal_connect (G_OBJECT (widget), "drag_motion", + G_CALLBACK (drag_motion_cb), *gref); + g_signal_connect (G_OBJECT (widget), "drag_begin", + G_CALLBACK (drag_begin_cb), *gref); + g_signal_connect (G_OBJECT (widget), "drag_end", + G_CALLBACK (drag_end_cb), *gref); + g_signal_connect (G_OBJECT (widget), "drag_data_get", + G_CALLBACK (drag_data_get_cb), *gref); + g_signal_connect (G_OBJECT (widget), "drag_drop", + G_CALLBACK (drag_drop_cb), *gref); + g_signal_connect (G_OBJECT (widget), "drag_data_delete", + G_CALLBACK (drag_data_delete_cb), *gref); + g_signal_connect (G_OBJECT (widget), "drag_data_received", + G_CALLBACK (drag_data_received_cb), *gref); + */ + + gdk_threads_leave (); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_dnd_peer_gtk_GtkDragSourceContextPeer_nativeStartDrag + (JNIEnv *env, jobject obj, jobject img, jint x, jint y, jint act, + jstring target) +{ + void *ptr; + const gchar *data; + GtkTargetEntry tar[1]; + GdkEvent *event; + GdkPixbuf *image = NULL; + GdkDragContext *context = NULL; + GdkDragAction action = GDK_ACTION_DEFAULT; + + gdk_threads_enter (); + + ptr = NSA_GET_GLOBAL_REF (env, obj); + + data = (*env)->GetStringUTFChars (env, target, NULL); + tar[0].target = (gchar *) data; + event = gdk_event_new (GDK_ALL_EVENTS_MASK); + + switch (act) + { + case ACTION_COPY: + action = GDK_ACTION_COPY; + break; + case ACTION_MOVE: + action = GDK_ACTION_MOVE; + break; + case ACTION_COPY_OR_MOVE: + action = GDK_ACTION_COPY | GDK_ACTION_MOVE; + break; + case ACTION_LINK: + action = GDK_ACTION_LINK; + break; + default: + action = GDK_ACTION_DEFAULT; + } + + gtk_drag_highlight (widget); + context = gtk_drag_begin (widget, + gtk_target_list_new (tar, sizeof (tar) / sizeof (GtkTargetEntry)), + action, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK, event); + + if (img != NULL) + { + image = cp_gtk_image_get_pixbuf (env, img); + gtk_drag_set_icon_pixbuf (context, image, x, y); + } + + gdk_event_free (event); + (*env)->ReleaseStringUTFChars (env, target, data); + + gdk_threads_leave (); +} + +static GtkWidget * +get_widget (GtkWidget *widget) +{ + GtkWidget *w; + + if (GTK_IS_EVENT_BOX (widget) || GTK_IS_CONTAINER (widget)) + w = gtk_bin_get_child (GTK_BIN(widget)); + else + w = widget; + + return w; +} diff --git a/libjava/classpath/native/jni/gtk-peer/Makefile.am b/libjava/classpath/native/jni/gtk-peer/Makefile.am index eecd1536901..b7e84144e7d 100644 --- a/libjava/classpath/native/jni/gtk-peer/Makefile.am +++ b/libjava/classpath/native/jni/gtk-peer/Makefile.am @@ -12,10 +12,8 @@ libgtkpeer_la_SOURCES = gnu_java_awt_peer_gtk_CairoSurface.c \ gnu_java_awt_peer_gtk_GdkPixbufDecoder.c \ gnu_java_awt_peer_gtk_GdkRobotPeer.c \ gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice.c \ - gnu_java_awt_peer_gtk_GdkTextLayout.c \ gnu_java_awt_peer_gtk_GtkButtonPeer.c \ gnu_java_awt_peer_gtk_GtkCanvasPeer.c \ - gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c \ gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c \ gnu_java_awt_peer_gtk_GtkCheckboxPeer.c \ gnu_java_awt_peer_gtk_GtkChoicePeer.c \ @@ -42,6 +40,7 @@ libgtkpeer_la_SOURCES = gnu_java_awt_peer_gtk_CairoSurface.c \ gnu_java_awt_peer_gtk_GtkToolkit.c \ gnu_java_awt_peer_gtk_GtkWindowPeer.c \ gnu_java_awt_peer_gtk_GtkVolatileImage.c \ + GtkDragSourceContextPeer.c \ cairographics2d.h \ gthread-jni.c \ gdkdisplay.h \ diff --git a/libjava/classpath/native/jni/gtk-peer/Makefile.in b/libjava/classpath/native/jni/gtk-peer/Makefile.in index cd004a7df0e..11e9fc0ba0c 100644 --- a/libjava/classpath/native/jni/gtk-peer/Makefile.in +++ b/libjava/classpath/native/jni/gtk-peer/Makefile.in @@ -75,10 +75,8 @@ am_libgtkpeer_la_OBJECTS = gnu_java_awt_peer_gtk_CairoSurface.lo \ gnu_java_awt_peer_gtk_GdkPixbufDecoder.lo \ gnu_java_awt_peer_gtk_GdkRobotPeer.lo \ gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice.lo \ - gnu_java_awt_peer_gtk_GdkTextLayout.lo \ gnu_java_awt_peer_gtk_GtkButtonPeer.lo \ gnu_java_awt_peer_gtk_GtkCanvasPeer.lo \ - gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.lo \ gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.lo \ gnu_java_awt_peer_gtk_GtkCheckboxPeer.lo \ gnu_java_awt_peer_gtk_GtkChoicePeer.lo \ @@ -104,8 +102,8 @@ am_libgtkpeer_la_OBJECTS = gnu_java_awt_peer_gtk_CairoSurface.lo \ gnu_java_awt_peer_gtk_GtkTextFieldPeer.lo \ gnu_java_awt_peer_gtk_GtkToolkit.lo \ gnu_java_awt_peer_gtk_GtkWindowPeer.lo \ - gnu_java_awt_peer_gtk_GtkVolatileImage.lo gthread-jni.lo \ - gtk_jawt.lo + gnu_java_awt_peer_gtk_GtkVolatileImage.lo \ + GtkDragSourceContextPeer.lo gthread-jni.lo gtk_jawt.lo libgtkpeer_la_OBJECTS = $(am_libgtkpeer_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include depcomp = $(SHELL) $(top_srcdir)/depcomp @@ -153,6 +151,8 @@ CREATE_CORE_JNI_LIBRARIES_FALSE = @CREATE_CORE_JNI_LIBRARIES_FALSE@ CREATE_CORE_JNI_LIBRARIES_TRUE = @CREATE_CORE_JNI_LIBRARIES_TRUE@ CREATE_DSSI_LIBRARIES_FALSE = @CREATE_DSSI_LIBRARIES_FALSE@ CREATE_DSSI_LIBRARIES_TRUE = @CREATE_DSSI_LIBRARIES_TRUE@ +CREATE_GCONF_PEER_LIBRARIES_FALSE = @CREATE_GCONF_PEER_LIBRARIES_FALSE@ +CREATE_GCONF_PEER_LIBRARIES_TRUE = @CREATE_GCONF_PEER_LIBRARIES_TRUE@ CREATE_GTK_PEER_LIBRARIES_FALSE = @CREATE_GTK_PEER_LIBRARIES_FALSE@ CREATE_GTK_PEER_LIBRARIES_TRUE = @CREATE_GTK_PEER_LIBRARIES_TRUE@ CREATE_JNI_HEADERS_FALSE = @CREATE_JNI_HEADERS_FALSE@ @@ -173,6 +173,7 @@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATE = @DATE@ +DEFAULT_PREFS_PEER = @DEFAULT_PREFS_PEER@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ @@ -203,6 +204,10 @@ FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ FREETYPE2_LIBS = @FREETYPE2_LIBS@ GCJ = @GCJ@ GCJX = @GCJX@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GDK_CFLAGS = @GDK_CFLAGS@ +GDK_LIBS = @GDK_LIBS@ GJDOC = @GJDOC@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ @@ -253,6 +258,7 @@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGOFT2_CFLAGS = @PANGOFT2_CFLAGS@ PANGOFT2_LIBS = @PANGOFT2_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PATH_TO_ESCHER = @PATH_TO_ESCHER@ PATH_TO_GLIBJ_ZIP = @PATH_TO_GLIBJ_ZIP@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ @@ -273,6 +279,8 @@ USER_SPECIFIED_CLASSLIB_FALSE = @USER_SPECIFIED_CLASSLIB_FALSE@ USER_SPECIFIED_CLASSLIB_TRUE = @USER_SPECIFIED_CLASSLIB_TRUE@ USER_SPECIFIED_JAVAH_FALSE = @USER_SPECIFIED_JAVAH_FALSE@ USER_SPECIFIED_JAVAH_TRUE = @USER_SPECIFIED_JAVAH_TRUE@ +USE_ESCHER_FALSE = @USE_ESCHER_FALSE@ +USE_ESCHER_TRUE = @USE_ESCHER_TRUE@ USE_PREBUILT_GLIBJ_ZIP_FALSE = @USE_PREBUILT_GLIBJ_ZIP_FALSE@ USE_PREBUILT_GLIBJ_ZIP_TRUE = @USE_PREBUILT_GLIBJ_ZIP_TRUE@ VERSION = @VERSION@ @@ -351,10 +359,8 @@ libgtkpeer_la_SOURCES = gnu_java_awt_peer_gtk_CairoSurface.c \ gnu_java_awt_peer_gtk_GdkPixbufDecoder.c \ gnu_java_awt_peer_gtk_GdkRobotPeer.c \ gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice.c \ - gnu_java_awt_peer_gtk_GdkTextLayout.c \ gnu_java_awt_peer_gtk_GtkButtonPeer.c \ gnu_java_awt_peer_gtk_GtkCanvasPeer.c \ - gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c \ gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c \ gnu_java_awt_peer_gtk_GtkCheckboxPeer.c \ gnu_java_awt_peer_gtk_GtkChoicePeer.c \ @@ -381,6 +387,7 @@ libgtkpeer_la_SOURCES = gnu_java_awt_peer_gtk_CairoSurface.c \ gnu_java_awt_peer_gtk_GtkToolkit.c \ gnu_java_awt_peer_gtk_GtkWindowPeer.c \ gnu_java_awt_peer_gtk_GtkVolatileImage.c \ + GtkDragSourceContextPeer.c \ cairographics2d.h \ gthread-jni.c \ gdkdisplay.h \ @@ -473,6 +480,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/GtkDragSourceContextPeer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnu_java_awt_peer_gtk_CairoGraphics2D.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnu_java_awt_peer_gtk_CairoSurface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnu_java_awt_peer_gtk_ComponentGraphics.Plo@am__quote@ @@ -484,10 +492,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnu_java_awt_peer_gtk_GdkPixbufDecoder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnu_java_awt_peer_gtk_GdkRobotPeer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnu_java_awt_peer_gtk_GdkScreenGraphicsDevice.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnu_java_awt_peer_gtk_GdkTextLayout.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnu_java_awt_peer_gtk_GtkButtonPeer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnu_java_awt_peer_gtk_GtkCanvasPeer.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnu_java_awt_peer_gtk_GtkCheckboxPeer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnu_java_awt_peer_gtk_GtkChoicePeer.Plo@am__quote@ diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c index 5aa1ada4b61..45cf4fbdaca 100644 --- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c +++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c @@ -239,7 +239,6 @@ Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetMatrix { jdouble *native_matrix = NULL; struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer); - g_assert (obj != NULL); g_assert (gr != NULL); native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL); @@ -263,8 +262,19 @@ Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetMatrix } JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoScale +(JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)), + jlong pointer, jdouble x, jdouble y) +{ + struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer); + g_assert (gr != NULL); + + cairo_scale (gr->cr, x, y); +} + +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawGlyphVector -(JNIEnv *env, jobject obj, jlong pointer, +(JNIEnv *env, jobject obj __attribute__((unused)), jlong pointer, jobject font, jfloat x, jfloat y, jint n, jintArray java_codes, @@ -278,7 +288,6 @@ Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawGlyphVector float *native_positions; jint i = 0; - g_assert (obj != NULL); g_assert (java_codes != NULL); g_assert (java_positions != NULL); @@ -306,7 +315,9 @@ Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawGlyphVector (*env)->ReleaseFloatArrayElements (env, java_positions, native_positions, 0); (*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0); + pango_fc_font_lock_face( (PangoFcFont *)pfont->font ); cairo_show_glyphs (gr->cr, glyphs, n); + pango_fc_font_unlock_face( (PangoFcFont *)pfont->font ); g_free(glyphs); } @@ -473,6 +484,28 @@ Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetDash } JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSave +(JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)), + jlong pointer) +{ + struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer); + g_assert (gr != NULL); + + cairo_save (gr->cr); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRestore +(JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)), + jlong pointer) +{ + struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer); + g_assert (gr != NULL); + + cairo_restore (gr->cr); +} + +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoNewPath (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)), jlong pointer) @@ -561,6 +594,17 @@ Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRectangle } JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoArc +(JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)), + jlong pointer, jdouble x, jdouble y, jdouble radius, jdouble angle1, + jdouble angle2) +{ + struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer); + + cairo_arc (gr->cr, x, y, radius, angle1, angle2); +} + +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClosePath (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)), jlong pointer) @@ -665,6 +709,46 @@ Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSurfaceSetFilter } } +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawLine +(JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)), + jlong pointer, jdouble x1, jdouble y1, jdouble x2, jdouble y2) +{ + struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer); + g_assert (gr != NULL); + + cairo_new_path(gr->cr); + cairo_move_to(gr->cr, x1, y1); + cairo_line_to(gr->cr, x2, y2); + cairo_stroke(gr->cr); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawRect +(JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)), + jlong pointer, jdouble x, jdouble y, jdouble w, jdouble h) +{ + struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer); + g_assert (gr != NULL); + + cairo_new_path(gr->cr); + cairo_rectangle(gr->cr, x, y, w, h); + cairo_stroke(gr->cr); +} + +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFillRect +(JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)), + jlong pointer, jdouble x, jdouble y, jdouble w, jdouble h) +{ + struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer); + g_assert (gr != NULL); + + cairo_new_path(gr->cr); + cairo_rectangle(gr->cr, x, y, w, h); + cairo_fill(gr->cr); +} + /************************** FONT STUFF ****************************/ static void @@ -679,18 +763,19 @@ install_font_peer(cairo_t *cr, if (pfont->graphics_resource == NULL) { - face = pango_ft2_font_get_face (pfont->font); + face = pango_fc_font_lock_face( (PangoFcFont *)pfont->font ); g_assert (face != NULL); ft = cairo_ft_font_face_create_for_ft_face (face, 0); g_assert (ft != NULL); cairo_set_font_face (cr, ft); - cairo_font_face_destroy (ft); + /* cairo_font_face_destroy (ft);*/ cairo_set_font_size (cr, (pango_font_description_get_size (pfont->desc) / (double)PANGO_SCALE)); ft = cairo_get_font_face (cr); + pango_fc_font_unlock_face( (PangoFcFont *)pfont->font ); pfont->graphics_resource = ft; } else diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_ComponentGraphics.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_ComponentGraphics.c index d85ba326f00..25163cd9f3e 100644 --- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_ComponentGraphics.c +++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_ComponentGraphics.c @@ -276,15 +276,52 @@ Java_gnu_java_awt_peer_gtk_ComponentGraphics_copyAreaNative gdk_threads_leave(); } +JNIEXPORT jobject JNICALL +Java_gnu_java_awt_peer_gtk_ComponentGraphics_nativeGrab +(JNIEnv *env, jclass cls __attribute__((unused)), jobject peer ) +{ + GdkPixbuf *pixbuf; + GdkDrawable *drawable; + GdkWindow *win; + gint w,h; + GtkWidget *widget = NULL; + void *ptr = NULL; + + gdk_threads_enter(); + + ptr = NSA_GET_PTR (env, peer); + g_assert (ptr != NULL); + + widget = GTK_WIDGET (ptr); + g_assert (widget != NULL); + + cp_gtk_grab_current_drawable (widget, &drawable, &win); + g_assert (drawable != NULL); + + gdk_drawable_get_size ( drawable, &w, &h ); + + pixbuf = gdk_pixbuf_new( GDK_COLORSPACE_RGB, TRUE, 8, w, h ); + gdk_pixbuf_get_from_drawable( pixbuf, drawable, NULL, 0, 0, 0, 0, w, h ); + g_object_ref( pixbuf ); + gdk_draw_pixbuf (drawable, NULL, pixbuf, + 0, 0, 0, 0, + w, h, + GDK_RGB_DITHER_NORMAL, 0, 0); + gdk_threads_leave(); + + return JCL_NewRawDataObject (env, pixbuf); +} + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_ComponentGraphics_drawVolatile (JNIEnv *env, jobject obj __attribute__ ((unused)), jobject peer, - jlong img, jint x, jint y, jint w, jint h) + jlong img, jint x, jint y, jint w, jint h, jint cx, jint cy, jint cw, jint ch) { GdkPixmap *pixmap; GtkWidget *widget = NULL; void *ptr = NULL; GdkGC *gc; + GdkRectangle clip; gdk_threads_enter(); ptr = NSA_GET_PTR (env, peer); @@ -296,6 +333,13 @@ Java_gnu_java_awt_peer_gtk_ComponentGraphics_drawVolatile pixmap = JLONG_TO_PTR(GdkPixmap, img); gc = gdk_gc_new(widget->window); + + clip.x = cx; + clip.y = cy; + clip.width = cw; + clip.height = ch; + gdk_gc_set_clip_rectangle(gc, &clip); + gdk_draw_drawable(widget->window, gc, pixmap, diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c index 89adcd1e525..6528ad43a2e 100644 --- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c +++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c @@ -241,3 +241,35 @@ Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_nativeGetDefaultScreenDevice return defaultDevice; } + +JNIEXPORT jintArray JNICALL +Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_getMouseCoordinates +(JNIEnv *env, jobject obj) +{ + jintArray retArray; + jint *values; + GdkDisplay *display; + gint x, y, screenIndex; + GdkScreen *screen; + + display = (GdkDisplay *) NSA_GET_DISPLAY_PTR(env, obj); + g_assert (display != NULL); + + gdk_threads_enter (); + + gdk_display_get_pointer (display, &screen, &x, &y, NULL); + screenIndex = gdk_screen_get_number( screen ); + + gdk_threads_leave (); + + retArray = (*env)->NewIntArray (env, 3); + values = (*env)->GetIntArrayElements (env, retArray, NULL); + + values[0] = screenIndex; + values[1] = x; + values[2] = y; + + (*env)->ReleaseIntArrayElements (env, retArray, values, 0); + + return retArray; +} diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c deleted file mode 100644 index 84999879147..00000000000 --- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c +++ /dev/null @@ -1,547 +0,0 @@ -/* gnu_java_awt_GdkTextLayout.c - Copyright (C) 2004, 2005, 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301 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 <string.h> -#include <pango/pango.h> -#include <pango/pangoft2.h> -#include <pango/pangofc-font.h> -#include <freetype/ftglyph.h> -#include <freetype/ftoutln.h> -#include "jcl.h" -#include "native_state.h" -#include "gdkfont.h" -#include "gnu_java_awt_peer_gtk_GdkTextLayout.h" -#include "cairographics2d.h" - -struct state_table *cp_gtk_native_text_layout_state_table; - -typedef struct gp -{ - JNIEnv *env; - jobject obj; - double px; - double py; - double sx; - double sy; -} generalpath ; - -static void paint_glyph_run(cairo_t *cr, cairo_glyph_t **glyphs, - gint *n_glyphs, PangoLayoutRun *run); - -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; - - 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); - - gdk_threads_enter (); - - pango_layout_set_text (tl->pango_layout, str, len); - - (*env)->ReleaseStringUTFChars (env, text, str); - - gdk_threads_leave (); -} - -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GdkTextLayout_setFont (JNIEnv *env, jobject obj, jobject font) -{ - struct textlayout *tl; - struct peerfont *pf; - - g_assert(obj != NULL); - g_assert(font != NULL); - - tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, obj); - g_assert(tl != NULL); - g_assert(tl->pango_layout != NULL); - pf = (struct peerfont *)NSA_GET_FONT_PTR (env, font); - g_assert(pf != NULL); - - gdk_threads_enter (); - - pango_layout_set_font_description(tl->pango_layout, pf->desc); - - 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 (); -} - -/** - * Draw this textlayout on a cairo surface - * FIXME: Seems completely broken. - */ -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GdkTextLayout_cairoDrawGdkTextLayout - (JNIEnv *env, jobject obj, jlong cg2d, 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 cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, cg2d); - cairo_t *cr = gr->cr; - struct textlayout *tl = NULL; - PangoLayoutIter *i = NULL; - PangoLayoutRun *run = NULL; - cairo_glyph_t *glyphs = NULL; - gint n_glyphs = 0; - - tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, obj); - - g_assert (cr != NULL); - g_assert (tl != NULL); - g_assert (tl->pango_layout != NULL); - - gdk_threads_enter (); - - i = pango_layout_get_iter (tl->pango_layout); - g_assert (i != NULL); - - cairo_translate (cr, x, y); - - do - { - run = pango_layout_iter_get_run (i); - if (run != NULL) - paint_glyph_run (cr, &glyphs, &n_glyphs, run); - } - while (pango_layout_iter_next_run (i)); - - if (glyphs != NULL) - g_free (glyphs); - - cairo_translate (cr, -x, -y); - - pango_layout_iter_free (i); - - gdk_threads_leave (); -} - -static void -paint_glyph_run(cairo_t *cr, - cairo_glyph_t **glyphs, - gint *n_glyphs, - PangoLayoutRun *run) -{ - gint i = 0; - gint x = 0, y = 0; - - g_assert (cr != 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); - - 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); - - x += run->glyphs->glyphs[i].geometry.width; - } - cairo_show_glyphs (cr, *glyphs, run->glyphs->num_glyphs); - } -} - -/* GetOutline code follows ****************************/ -/********* Freetype callback functions *****************************/ - -static int _moveTo( const FT_Vector* to, - void *p) -{ - JNIEnv *env; - jobject obj; - jclass cls; - jmethodID method; - jvalue values[2]; - generalpath *path = (generalpath *) p; - - env = path->env; - obj = path->obj; - - values[0].f = (jfloat)(to->x * path->sx + path->px); - values[1].f = (jfloat)(to->y * path->sy + path->py); - - cls = (*env)->FindClass (env, "java/awt/geom/GeneralPath"); - method = (*env)->GetMethodID (env, cls, "moveTo", "(FF)V"); - (*env)->CallVoidMethodA(env, obj, method, values ); - - return 0; -} - -static int _lineTo( const FT_Vector* to, - void *p) -{ - JNIEnv *env; - jobject obj; - jclass cls; - jmethodID method; - jvalue values[2]; - generalpath *path = (generalpath *) p; - - env = path->env; - obj = path->obj; - values[0].f = (jfloat)(to->x * path->sx + path->px); - values[1].f = (jfloat)(to->y * path->sy + path->py); - - cls = (*env)->FindClass (env, "java/awt/geom/GeneralPath"); - method = (*env)->GetMethodID (env, cls, "lineTo", "(FF)V"); - (*env)->CallVoidMethodA(env, obj, method, values ); - - return 0; -} - -static int _quadTo( const FT_Vector* cp, - const FT_Vector* to, - void *p) -{ - JNIEnv *env; - jobject obj; - jclass cls; - jmethodID method; - jvalue values[4]; - generalpath *path = (generalpath *) p; - - env = path->env; - obj = path->obj; - values[0].f = (jfloat)(cp->x * path->sx + path->px); - values[1].f = (jfloat)(cp->y * path->sy + path->py); - values[2].f = (jfloat)(to->x * path->sx + path->px); - values[3].f = (jfloat)(to->y * path->sy + path->py); - - cls = (*env)->FindClass (env, "java/awt/geom/GeneralPath"); - method = (*env)->GetMethodID (env, cls, "quadTo", "(FFFF)V"); - (*env)->CallVoidMethodA(env, obj, method, values ); - - return 0; -} - -static int _curveTo( const FT_Vector* cp1, - const FT_Vector* cp2, - const FT_Vector* to, - void *p) -{ - JNIEnv *env; - jobject obj; - jclass cls; - jmethodID method; - jvalue values[6]; - generalpath *path = (generalpath *) p; - - env = path->env; - obj = path->obj; - values[0].f = (jfloat)(cp1->x * path->sx + path->px); - values[1].f = (jfloat)(cp1->y * path->sy + path->py); - values[2].f = (jfloat)(cp2->x * path->sx + path->px); - values[3].f = (jfloat)(cp2->y * path->sy + path->py); - values[4].f = (jfloat)(to->x * path->sx + path->px); - values[5].f = (jfloat)(to->y * path->sy + path->py); - - cls = (*env)->FindClass (env, "java/awt/geom/GeneralPath"); - method = (*env)->GetMethodID (env, cls, "curveTo", "(FFFFFF)V"); - (*env)->CallVoidMethodA(env, obj, method, values ); - - return 0; -} - - -JNIEXPORT jobject JNICALL -Java_gnu_java_awt_peer_gtk_GdkTextLayout_getOutline - (JNIEnv *env, jobject obj, jobject transform) -{ - struct textlayout *tl; - generalpath *path; - jobject gp; - GSList *current_run; - PangoLayoutLine *current_line; - FT_Outline_Funcs ftCallbacks = - { - (FT_Outline_MoveToFunc) _moveTo, - (FT_Outline_LineToFunc) _lineTo, - (FT_Outline_ConicToFunc) _quadTo, - (FT_Outline_CubicToFunc) _curveTo, - 0, - 0 - }; - PangoLayoutIter* layoutIterator; - - gdk_threads_enter (); - - tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, obj); - g_assert(tl != NULL); - g_assert(tl->pango_layout != NULL); - - path = g_malloc0 (sizeof (generalpath)); - g_assert(path != NULL); - path->env = env; - - /* Scaling factors */ - path->sx = PANGO_SCALE/65536.0; - path->sy = -PANGO_SCALE/65536.0; - - { /* create a GeneralPath instance */ - jclass cls; - jmethodID method; - - cls = (*env)->FindClass (env, "java/awt/geom/GeneralPath"); - method = (*env)->GetMethodID (env, cls, "<init>", "()V"); - gp = path->obj = (*env)->NewObject (env, cls, method); - } - - layoutIterator = pango_layout_get_iter (tl->pango_layout); - g_assert (layoutIterator != NULL); - - if (pango_layout_iter_get_line (layoutIterator)) - do - { - PangoRectangle line_logical_rect; - current_line = pango_layout_iter_get_line (layoutIterator); - pango_layout_iter_get_line_extents (layoutIterator, - NULL, - &line_logical_rect); - - path->px = line_logical_rect.x/(double)PANGO_SCALE; - path->py = line_logical_rect.y/(double)PANGO_SCALE; - - current_run = current_line->runs; - while (current_run) - { - FT_Face ft_face; - int index; - PangoGlyphItem *run = current_run->data; - PangoGlyphString *glyphs = run->glyphs; - - PangoAnalysis *analysis = &run->item->analysis; - g_assert (analysis != NULL); - g_assert (analysis->font != NULL); - - ft_face = pango_fc_font_lock_face ((PangoFcFont *)analysis->font); - g_assert (ft_face != NULL); - - for (index = 0; index < glyphs->num_glyphs; index++) - { - FT_Glyph glyph; - FT_Error fterror; - PangoGlyphGeometry pgg = glyphs->glyphs[index].geometry; - - fterror = FT_Load_Glyph(ft_face, - (FT_UInt)(glyphs->glyphs[index].glyph), - FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP); - g_assert(fterror == 0); - - FT_Get_Glyph (ft_face->glyph, &glyph); - FT_Outline_Decompose (&(((FT_OutlineGlyph)glyph)->outline), - &ftCallbacks, path); - FT_Done_Glyph (glyph); - - path->px += pgg.width/(double)PANGO_SCALE; - } - - pango_fc_font_unlock_face ((PangoFcFont *)analysis->font); - current_run = current_run->next; - } - } while (pango_layout_iter_next_line (layoutIterator)); - - g_free(path); - gdk_threads_leave (); - - if (transform != NULL) - { - jclass cls; - jmethodID method; - - cls = (*env)->FindClass (env, "java/awt/geom/GeneralPath"); - method = (*env)->GetMethodID (env, cls, "transform", - "(Ljava/awt/geom/AffineTransform;)V"); - (*env)->CallVoidMethod(env, gp, method, transform ); - } - - return gp; -} diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c deleted file mode 100644 index 16ef43c40ff..00000000000 --- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c +++ /dev/null @@ -1,87 +0,0 @@ -/* gtkcheckboxgrouppeer.c -- Native implementation of GtkCheckboxGroupPeer - 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., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 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_GtkCheckboxGroupPeer.h" - -static GtkWidget *comboboxgroup_get_widget (GtkWidget *widget); - -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 - we just clean up the hash table here. */ - NSA_DEL_PTR (env, obj); -} - -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer_remove - (JNIEnv *env, jobject obj, jobject checkbox) -{ - GtkRadioButton *button; - void *ptr; - GSList *list; - - gdk_threads_enter (); - - ptr = NSA_GET_PTR (env, checkbox); - button = GTK_RADIO_BUTTON (comboboxgroup_get_widget (GTK_WIDGET (ptr))); - - /* Update the group to point to some other widget in the group. We - have to do this because Gtk doesn't have a separate object to - represent a radio button's group. */ - for (list = gtk_radio_button_get_group (button); list != NULL; - list = list->next) - { - if (list->data != button) - break; - } - - NSA_SET_PTR (env, obj, list ? list->data : NULL); - - gdk_threads_leave (); -} - -static GtkWidget * -comboboxgroup_get_widget (GtkWidget *widget) -{ - if (GTK_IS_EVENT_BOX (widget)) - return gtk_bin_get_child (GTK_BIN(widget)); - return widget; -} diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c index 191cdda8fcc..9a6f713ba8a 100644 --- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c +++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c @@ -40,9 +40,12 @@ exception statement from your version. */ #include "gtkpeer.h" #include "gnu_java_awt_peer_gtk_GtkCheckboxPeer.h" #include "gnu_java_awt_peer_gtk_GtkComponentPeer.h" +#include "jcl.h" static jmethodID postItemEventID; -static GtkWidget *combobox_get_widget (GtkWidget *widget); +static jmethodID addToGroupMapID; +static GtkWidget *checkbox_get_widget (GtkWidget *widget); +static void item_toggled_cb (GtkToggleButton *item, jobject peer); void cp_gtk_checkbox_init_jni (void) @@ -55,61 +58,25 @@ cp_gtk_checkbox_init_jni (void) postItemEventID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcheckboxpeer, "postItemEvent", "(Ljava/lang/Object;Z)V"); -} - -static void item_toggled_cb (GtkToggleButton *item, jobject peer); - -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_create - (JNIEnv *env, jobject obj, jobject group) -{ - GtkWidget *button; - GtkWidget *eventbox; - - gdk_threads_enter (); - - NSA_SET_GLOBAL_REF (env, obj); - eventbox = gtk_event_box_new (); - if (group == NULL) - { - button = gtk_check_button_new_with_label (""); - gtk_container_add (GTK_CONTAINER (eventbox), button); - gtk_widget_show (button); - } - else - { - void *native_group = NSA_GET_PTR (env, group); - button = gtk_radio_button_new_with_label_from_widget (native_group, ""); - gtk_container_add (GTK_CONTAINER (eventbox), button); - gtk_widget_show (button); - - if (native_group == NULL) - { - /* Set the native group so we can use the correct value the - next time around. FIXME: this doesn't work! */ - NSA_SET_PTR (env, group, button); - } - } - - NSA_SET_PTR (env, obj, eventbox); - - gdk_threads_leave (); + addToGroupMapID = (*cp_gtk_gdk_env())->GetMethodID (cp_gtk_gdk_env(), gtkcheckboxpeer, + "addToGroupMap", + "(J)V"); } JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals (JNIEnv *env, jobject obj) { - void *ptr = NULL; - jobject *gref = NULL; + void *ptr; + jobject *gref; GtkWidget *bin; gdk_threads_enter (); ptr = NSA_GET_PTR (env, obj); gref = NSA_GET_GLOBAL_REF (env, obj); - bin = combobox_get_widget (GTK_WIDGET (ptr)); + bin = checkbox_get_widget (GTK_WIDGET (ptr)); /* Checkbox signals */ g_signal_connect (G_OBJECT (bin), "toggled", @@ -121,46 +88,6 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals gdk_threads_leave (); } -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeSetCheckboxGroup - (JNIEnv *env, jobject obj, jobject group) -{ - GtkRadioButton *button; - void *native_group, *ptr; - GtkWidget *bin; - - gdk_threads_enter (); - - ptr = NSA_GET_PTR (env, obj); - bin = combobox_get_widget (GTK_WIDGET (ptr)); - - /* FIXME: we can't yet switch between a checkbutton and a - radiobutton. However, AWT requires this. For now we just - crash. */ - - button = GTK_RADIO_BUTTON (bin); - - native_group = NSA_GET_PTR (env, group); - if (native_group == NULL) - gtk_radio_button_set_group (button, NULL); - else - gtk_radio_button_set_group (button, - gtk_radio_button_get_group - (GTK_RADIO_BUTTON (native_group))); - - /* If the native group wasn't set on the new CheckboxGroup, then set - it now so that the right thing will happen with the next - radiobutton. The native state for a CheckboxGroup is a pointer - to one of the widgets in the group. We are careful to keep this - always pointing at a live widget; whenever a widget is destroyed - (or otherwise removed from the group), the CheckboxGroup peer is - notified. */ - if (native_group == NULL) - NSA_SET_PTR (env, group, native_group); - - gdk_threads_leave (); -} - JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkToggleButtonSetActive (JNIEnv *env, jobject obj, jboolean is_active) @@ -171,7 +98,7 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkToggleButtonSetActive gdk_threads_enter (); ptr = NSA_GET_PTR (env, obj); - bin = combobox_get_widget (GTK_WIDGET (ptr)); + bin = checkbox_get_widget (GTK_WIDGET (ptr)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bin), is_active); @@ -192,7 +119,7 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkWidgetModifyFont ptr = NSA_GET_PTR (env, obj); - button = combobox_get_widget (GTK_WIDGET (ptr)); + button = checkbox_get_widget (GTK_WIDGET (ptr)); label = gtk_bin_get_child (GTK_BIN(button)); if (!label) @@ -233,7 +160,7 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkButtonSetLabel c_label = (*env)->GetStringUTFChars (env, label, NULL); - label_widget = gtk_bin_get_child (GTK_BIN (combobox_get_widget (GTK_WIDGET (ptr)))); + label_widget = gtk_bin_get_child (GTK_BIN (checkbox_get_widget (GTK_WIDGET (ptr)))); gtk_label_set_text (GTK_LABEL (label_widget), c_label); (*env)->ReleaseStringUTFChars (env, label, c_label); @@ -241,6 +168,223 @@ Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_gtkButtonSetLabel gdk_threads_leave (); } +/* A check button is created if we are not part of + a group. + This function is called when initially creating the + button, so an eventbox is created. + */ +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_createCheckButton + (JNIEnv *env, jobject obj) +{ + GtkWidget *button; + GtkWidget *eventbox; + + gdk_threads_enter (); + + NSA_SET_GLOBAL_REF (env, obj); + eventbox = gtk_event_box_new (); + + button = gtk_check_button_new_with_label (""); + gtk_container_add (GTK_CONTAINER (eventbox), button); + gtk_widget_show (button); + + NSA_SET_PTR (env, obj, eventbox); + + gdk_threads_leave (); +} + +/* A radio button is created if we are part of a group. + groupPointer points to the corresponding group. If 0, + a new group is created. + This function is called when initially creating the + button, so an eventbox is created. + */ +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_createRadioButton + (JNIEnv *env, jobject obj, jlong groupPointer) +{ + GtkWidget *button; + GtkWidget *eventbox; + GSList *native_group = NULL; + + gdk_threads_enter (); + + NSA_SET_GLOBAL_REF (env, obj); + eventbox = gtk_event_box_new (); + + if (groupPointer != 0) + { + native_group = JLONG_TO_PTR (GSList, groupPointer); + g_assert (GTK_IS_RADIO_BUTTON (native_group->data)); + } + button = gtk_radio_button_new_with_label (native_group, ""); + + if (native_group == NULL) + native_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)); + if (g_slist_index (native_group, GTK_RADIO_BUTTON (button)) == -1) + { + native_group = g_slist_prepend (native_group, GTK_RADIO_BUTTON (button)); + GTK_RADIO_BUTTON(button)->group = native_group; + } + + gtk_container_add (GTK_CONTAINER (eventbox), button); + gtk_widget_show (button); + + NSA_SET_PTR (env, obj, eventbox); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), obj, + addToGroupMapID, + PTR_TO_JLONG (native_group)); + + gdk_threads_leave (); +} + +/* Add the object to the group pointed to by groupPointer. + If groupPointer is 0, create a new group and create + a radio button. Otherwise, creating a radio button in an + existing group. + */ +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_addToGroup + (JNIEnv *env, jobject obj, jlong groupPointer) +{ + void *ptr; + GtkWidget *container; + GtkWidget *check_button; + GtkWidget *radio_button; + const gchar *label; + GSList *native_group = NULL; + + gdk_threads_enter (); + + ptr = NSA_GET_PTR (env, obj); + container = GTK_WIDGET (ptr); + check_button = checkbox_get_widget (container); + label = gtk_label_get_text (GTK_LABEL (gtk_bin_get_child + (GTK_BIN (check_button)))); + + /* Need to remove the check_button, and replace it with + a radio button in a group. + */ + if (groupPointer != 0) + { + native_group = JLONG_TO_PTR (GSList, groupPointer); + g_assert (GTK_IS_RADIO_BUTTON (native_group->data)); + } + + radio_button = gtk_radio_button_new_with_label (native_group, label); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button), + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_button))); + + if (native_group == NULL) + native_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button)); + if (g_slist_index (native_group, GTK_RADIO_BUTTON (radio_button)) == -1) + { + native_group = g_slist_prepend (native_group, GTK_RADIO_BUTTON (radio_button)); + GTK_RADIO_BUTTON(radio_button)->group = native_group; + } + + gtk_container_remove (GTK_CONTAINER (container), check_button); + gtk_container_add (GTK_CONTAINER (container), radio_button); + gtk_widget_show (radio_button); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), obj, + addToGroupMapID, + PTR_TO_JLONG (native_group)); + + gdk_threads_leave (); +} + +/* Remove the object from the group pointed to by groupPointer. + We are removing the radio button and creating a check button. + */ +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_removeFromGroup + (JNIEnv *env, jobject obj) +{ + void *ptr; + GtkWidget *container; + GtkWidget *check_button; + GtkWidget *radio_button; + GSList *native_group; + const gchar *label; + + gdk_threads_enter (); + + ptr = NSA_GET_PTR (env, obj); + container = GTK_WIDGET (ptr); + radio_button = checkbox_get_widget (container); + label = gtk_label_get_text (GTK_LABEL (gtk_bin_get_child + (GTK_BIN (radio_button)))); + + /* Need to remove the radio_button, and replace it with + a check button. + */ + check_button = gtk_check_button_new_with_label (label); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio_button))); + + native_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button)); + native_group = g_slist_remove (native_group, GTK_RADIO_BUTTON (radio_button)); + + if (native_group && ! GTK_IS_RADIO_BUTTON (native_group->data)) + native_group = NULL; + + GTK_RADIO_BUTTON(radio_button)->group = NULL; + + gtk_container_remove (GTK_CONTAINER (container), radio_button); + gtk_container_add (GTK_CONTAINER (container), check_button); + gtk_widget_show (check_button); + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), obj, + addToGroupMapID, + PTR_TO_JLONG (native_group)); + + gdk_threads_leave (); +} + +/* Move the radio button to a new group. If groupPointer is + 0, create a new group. + */ +JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_switchToGroup + (JNIEnv *env, jobject obj, jlong groupPointer) +{ + void *ptr; + GtkWidget *radio_button; + GSList *native_group = NULL; + + gdk_threads_enter (); + + ptr = NSA_GET_PTR (env, obj); + radio_button = checkbox_get_widget (GTK_WIDGET (ptr)); + + native_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button)); + native_group = g_slist_remove (native_group, GTK_RADIO_BUTTON (radio_button)); + GTK_RADIO_BUTTON(radio_button)->group = NULL; + + if (groupPointer != 0) + { + native_group = JLONG_TO_PTR (GSList, groupPointer); + g_assert (GTK_IS_RADIO_BUTTON (native_group->data)); + } + gtk_radio_button_set_group (GTK_RADIO_BUTTON (radio_button), native_group); + + native_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button)); + if (g_slist_index (native_group, GTK_RADIO_BUTTON (radio_button)) == -1) + { + native_group = g_slist_prepend (native_group, GTK_RADIO_BUTTON (radio_button)); + GTK_RADIO_BUTTON(radio_button)->group = native_group; + } + + (*cp_gtk_gdk_env())->CallVoidMethod (cp_gtk_gdk_env(), obj, + addToGroupMapID, + PTR_TO_JLONG (native_group)); + + gdk_threads_leave (); +} + static void item_toggled_cb (GtkToggleButton *item, jobject peer) { @@ -251,7 +395,7 @@ item_toggled_cb (GtkToggleButton *item, jobject peer) } static GtkWidget * -combobox_get_widget (GtkWidget *widget) +checkbox_get_widget (GtkWidget *widget) { GtkWidget *wid; diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c index 4cd80a73f1b..39524eea02c 100644 --- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c +++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c @@ -339,6 +339,42 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetSensitive gdk_threads_leave (); } +JNIEXPORT jboolean JNICALL +Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetHasFocus +(JNIEnv *env, jobject obj) +{ + void *ptr; + jboolean retval; + + gdk_threads_enter (); + + ptr = NSA_GET_PTR (env, obj); + + retval = GTK_WIDGET_HAS_FOCUS((GTK_WIDGET (ptr))); + + gdk_threads_leave (); + + return retval; +} + +JNIEXPORT jboolean JNICALL +Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetCanFocus +(JNIEnv *env, jobject obj) +{ + void *ptr; + jboolean retval; + + gdk_threads_enter (); + + ptr = NSA_GET_PTR (env, obj); + + retval = GTK_WIDGET_CAN_FOCUS((GTK_WIDGET (ptr))); + + gdk_threads_leave (); + + return retval; +} + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetRequestFocus (JNIEnv *env, jobject obj) diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c index ff3fbe896b9..8805ae7b35b 100644 --- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c +++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c @@ -166,6 +166,11 @@ Java_gnu_java_awt_peer_gtk_GtkImage_getPixels(JNIEnv *env, jobject obj) rowstride = gdk_pixbuf_get_rowstride (pixbuf); result_array = (*env)->NewIntArray (env, (width * height)); + if (result_array == NULL) + { + gdk_threads_leave (); + return NULL; + } dst = result_array_iter = (*env)->GetIntArrayElements (env, result_array, NULL); @@ -184,13 +189,27 @@ Java_gnu_java_awt_peer_gtk_GtkImage_getPixels(JNIEnv *env, jobject obj) pixeldata += rowstride; } } else { + + /* Add a default alpha value of 0xFF to the pixeldata without alpha + information and keep it in the same format as the pixeldata with alpha + information. On Little Endian systems: AABBGGRR and on Big Endian + systems: RRGGBBAA. */ + for(i = 0; i < height; i++) { for(j = 0; j < width; j++) - dst[j] = 0xFF000000 | - (pixeldata[j*3 + 2] & 0xFF) << 16 | - (pixeldata[j*3 + 1] & 0xFF) << 8 | - (pixeldata[j*3] & 0xFF); + +#ifndef WORDS_BIGENDIAN + dst[j] = 0xFF000000 + | (pixeldata[j*3 + 2] & 0xFF) << 16 + | (pixeldata[j*3 + 1] & 0xFF) << 8 + | (pixeldata[j*3] & 0xFF); +#else + dst[j] = (pixeldata[j*3] & 0xFF) << 24 + | (pixeldata[j*3 + 1] & 0xFF) << 16 + | (pixeldata[j*3 + 2] & 0xFF) << 8 + | 0xFF; +#endif dst += width; pixeldata += rowstride; } diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c index 74180a78447..77021ceec0a 100644 --- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c +++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c @@ -147,7 +147,7 @@ Java_gnu_java_awt_peer_gtk_GtkLabelPeer_gtkWidgetModifyFont } JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkLabelPeer_setText +Java_gnu_java_awt_peer_gtk_GtkLabelPeer_setNativeText (JNIEnv *env, jobject obj, jstring text) { const char *str; diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c index c966f6331a4..8949fa92762 100644 --- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c +++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c @@ -387,6 +387,37 @@ Java_gnu_java_awt_peer_gtk_GtkToolkit_getScreenResolution return res; } +/** + * Report the number of mouse buttons + * Returns the number of buttons of the first mouse found, or -1 if no mouse + * seems to be connected. + */ +JNIEXPORT jint JNICALL +Java_gnu_java_awt_peer_gtk_GtkToolkit_getMouseNumberOfButtons + (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused))) +{ + jint res = -1; + GList *devices; + GdkDevice *d; + + gdk_threads_enter (); + + /* FIXME: Why doesn't this return the correct number? */ + devices = gdk_devices_list(); + + while( res == -1 && devices != NULL ) + { + d = GDK_DEVICE( devices->data ); + if( d->source == GDK_SOURCE_MOUSE ) + res = d->num_keys; + devices = devices->next; + } + + gdk_threads_leave (); + + return res; +} + #define CONVERT(type, state) \ gdk_color_to_java_color (style->type[GTK_STATE_ ## state]) diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkVolatileImage.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkVolatileImage.c index d7ef474e002..e391d64ecdd 100644 --- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkVolatileImage.c +++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkVolatileImage.c @@ -73,7 +73,8 @@ Java_gnu_java_awt_peer_gtk_GtkVolatileImage_init (JNIEnv *env, pixmap = gdk_pixmap_new( widget->window, width, height, -1 ); } else - pixmap = gdk_pixmap_new( NULL, width, height, 16 ); + pixmap = gdk_pixmap_new( NULL, width, height, + gdk_rgb_get_visual()->depth ); gdk_threads_leave(); diff --git a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c index 1c858faf540..3f288af5ce1 100644 --- a/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c +++ b/libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c @@ -246,7 +246,11 @@ exception statement from your version. */ #define VK_COMPOSE 65312 #define VK_ALT_GRAPH 65406 #define VK_UNDEFINED 0 +#define VK_BEGIN 65368 +#define VK_CONTEXT_MENU 525 +#define VK_WINDOWS 524 + #define AWT_KEY_CHAR_UNDEFINED 0 #define AWT_FRAME_STATE_NORMAL 0 @@ -721,14 +725,28 @@ keysym_to_awt_keycode (GdkEventKey *event) return VK_CUT; return VK_COPY; return VK_PASTE; + */ + case GDK_Undo: return VK_UNDO; + case GDK_Redo: return VK_AGAIN; + /* return VK_FIND; return VK_PROPS; return VK_STOP; return VK_COMPOSE; + */ + case GDK_ISO_Level3_Shift: return VK_ALT_GRAPH; + /* + case VK_BEGIN: */ + case GDK_Menu: + return VK_CONTEXT_MENU; + case GDK_Super_L: + case GDK_Super_R: + return VK_WINDOWS; + default: return VK_UNDEFINED; } @@ -1227,6 +1245,38 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_gtkWindowSetModal } JNIEXPORT void JNICALL +Java_gnu_java_awt_peer_gtk_GtkWindowPeer_gtkWindowSetAlwaysOnTop + (JNIEnv *env, jobject obj, jboolean alwaysOnTop) +{ + void *ptr; + + gdk_threads_enter (); + + ptr = NSA_GET_PTR (env, obj); + + gtk_window_set_keep_above (GTK_WINDOW (ptr), alwaysOnTop); + + gdk_threads_leave (); +} + +JNIEXPORT jboolean JNICALL +Java_gnu_java_awt_peer_gtk_GtkWindowPeer_gtkWindowHasFocus +(JNIEnv *env, jobject obj) +{ + void *ptr; + jboolean retval; + + gdk_threads_enter (); + + ptr = NSA_GET_PTR (env, obj); + + retval = gtk_window_has_toplevel_focus (GTK_WINDOW (ptr)); + + gdk_threads_leave (); + return retval; +} + +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setVisibleNative (JNIEnv *env, jobject obj, jboolean visible) { @@ -2115,14 +2165,27 @@ cp_gtk_awt_keycode_to_keysym (jint keyCode, jint keyLocation) case VK_CUT: case VK_COPY: case VK_PASTE: + */ case VK_UNDO: + return GDK_Undo; case VK_AGAIN: + return GDK_Redo; + /* case VK_FIND: case VK_PROPS: case VK_STOP: case VK_COMPOSE: + */ case VK_ALT_GRAPH: + return GDK_ISO_Level3_Shift; + /* + case VK_BEGIN: */ + case VK_CONTEXT_MENU: + return GDK_Menu; + case VK_WINDOWS: + return GDK_Super_R; + default: return GDK_VoidSymbol; } |