summaryrefslogtreecommitdiff
path: root/libjava/classpath/native/jni/gtk-peer
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/native/jni/gtk-peer')
-rw-r--r--libjava/classpath/native/jni/gtk-peer/GtkDragSourceContextPeer.c256
-rw-r--r--libjava/classpath/native/jni/gtk-peer/Makefile.am3
-rw-r--r--libjava/classpath/native/jni/gtk-peer/Makefile.in22
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c95
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_ComponentGraphics.c46
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c32
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c547
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxGroupPeer.c87
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c318
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c36
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c27
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c2
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkToolkit.c31
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkVolatileImage.c3
-rw-r--r--libjava/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c63
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;
}