This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[patch] merge AWT Native Interface implementation to mainline
- From: Thomas Fitzsimmons <fitzsim at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Sun, 13 Feb 2005 18:48:12 -0500
- Subject: [patch] merge AWT Native Interface implementation to mainline
Hi,
This patch merges the AWT Native Interface implementation from the gui
branch to mainline. The patch fixes this PR:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16305. OK to commit?
Tom
2005-02-11 Thomas Fitzsimmons <fitzsim@redhat.com>
* jawt.c: New file.
* include/jawt.h: Likewise.
* include/jawt_md.h: Likewise.
* include/Makefile.am (tool_include__HEADERS): Add jawt.h and
jawt_md.h files.
* include/Makefile.in: Regenerate.
* jni/classpath/classpath_jawt.h: Likewise.
* jni/gtk-peer/gtk_jawt.c: Likewise.
* Makefile.am: Build libjawt.so.
* Makefile.in: Regenerate.
Index: Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.am,v
retrieving revision 1.442
diff -u -r1.442 Makefile.am
--- Makefile.am 7 Feb 2005 20:19:58 -0000 1.442
+++ Makefile.am 13 Feb 2005 23:39:53 -0000
@@ -102,12 +102,14 @@
if GTK_AWT
cond_gtk_ltlibrary = lib-gnu-java-awt-peer-gtk.la
+cond_gtk_jawt_ltlibrary = libjawt.la
else
cond_gtk_ltlibrary =
+cond_gtk_jawt_ltlibrary =
endif
toolexeclib_LTLIBRARIES = libgcj.la libgij.la \
- $(cond_gtk_ltlibrary) $(cond_xlib_ltlibrary)
+ $(cond_gtk_ltlibrary) $(cond_gtk_jawt_ltlibrary) $(cond_xlib_ltlibrary)
toolexecmainlib_DATA = libgcj.spec
pkgconfigdir = $(libdir)/pkgconfig
@@ -290,6 +292,7 @@
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c \
jni/gtk-peer/gthread-jni.c \
+jni/gtk-peer/gtk_jawt.c \
jni/classpath/jcl.c \
jni/classpath/jnilink.c \
jni/classpath/native_state.c \
@@ -460,6 +463,14 @@
-version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LIBGCJ_LD_SYMBOLIC)
lib_gnu_java_awt_peer_gtk_la_LINK = $(LIBLINK)
+libjawt_la_SOURCES = jawt.c
+libjawt_la_CFLAGS = -I$(srcdir)/jni/classpath $(PEDANTIC_CFLAGS) $(X_CFLAGS)
+libjawt_la_LIBADD = lib-gnu-java-awt-peer-gtk.la
+libjawt_la_LDFLAGS = \
+ -version-info `grep -v '^\#' $(srcdir)/libtool-version` \
+ $(LIBGCJ_LD_SYMBOLIC)
+libjawt_la_LINK = $(LIBLINK)
+
lib_gnu_awt_xlib_la_SOURCES = \
$(xlib_java_source_files) \
$(xlib_nat_source_files)
Index: jawt.c
===================================================================
RCS file: jawt.c
diff -N jawt.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ jawt.c 13 Feb 2005 23:40:01 -0000
@@ -0,0 +1,156 @@
+/* jawt.c -- X11 implementation of the AWT Native Interface
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+#include <jni.h>
+#include <jawt.h>
+#include <jawt_md.h>
+#include "classpath_jawt.h"
+
+static jint (JNICALL _Jv_Lock) (JAWT_DrawingSurface* surface);
+static void (JNICALL _Jv_Unlock) (JAWT_DrawingSurface* surface);
+static JAWT_DrawingSurfaceInfo* (JNICALL _Jv_GetDrawingSurfaceInfo)
+ (JAWT_DrawingSurface* surface);
+static void (JNICALL _Jv_FreeDrawingSurfaceInfo)
+ (JAWT_DrawingSurfaceInfo* surface_info);
+static JAWT_DrawingSurface* (JNICALL _Jv_GetDrawingSurface) (JNIEnv* env,
+ jobject canvas);
+static void (JNICALL _Jv_FreeDrawingSurface) (JAWT_DrawingSurface* surface);
+
+JNIEXPORT jboolean JNICALL
+JAWT_GetAWT (JNIEnv* env, JAWT* awt)
+{
+ jint retrieved_version;
+
+ retrieved_version = classpath_jawt_get_awt_version ();
+
+ if (awt->version > retrieved_version)
+ return JNI_FALSE;
+
+ awt->GetDrawingSurface = _Jv_GetDrawingSurface;
+ awt->FreeDrawingSurface = _Jv_FreeDrawingSurface;
+
+ return JNI_TRUE;
+}
+
+/* JAWT_DrawingSurface functions */
+
+static jint
+(JNICALL _Jv_Lock) (JAWT_DrawingSurface* surface)
+{
+ /* lock the drawing surface */
+ return classpath_jawt_lock ();
+}
+
+static void
+(JNICALL _Jv_Unlock) (JAWT_DrawingSurface* surface)
+{
+ classpath_jawt_unlock ();
+}
+
+static JAWT_DrawingSurfaceInfo*
+(JNICALL _Jv_GetDrawingSurfaceInfo) (JAWT_DrawingSurface* surface)
+{
+ if (surface == NULL)
+ return NULL;
+
+ return surface->surface_info;
+}
+
+static void
+(JNICALL _Jv_FreeDrawingSurfaceInfo) (JAWT_DrawingSurfaceInfo* surface_info)
+{
+ JAWT_X11DrawingSurfaceInfo* surface_info_x11;
+
+ if (surface_info == NULL)
+ return;
+
+ surface_info_x11 = (JAWT_X11DrawingSurfaceInfo*) surface_info->platformInfo;
+
+ surface_info_x11->display = NULL;
+ surface_info_x11->drawable = 0;
+
+ free (surface_info);
+ surface_info = NULL;
+}
+
+/* JAWT functions */
+
+static JAWT_DrawingSurface*
+(JNICALL _Jv_GetDrawingSurface) (JNIEnv* env, jobject canvas)
+{
+ JAWT_DrawingSurface* surface;
+ JAWT_X11DrawingSurfaceInfo* surface_info_x11;
+
+ surface = (JAWT_DrawingSurface*) malloc (sizeof (JAWT_DrawingSurface));
+
+ if (surface == NULL)
+ return NULL;
+
+ /* initialize function pointers */
+ surface->GetDrawingSurfaceInfo = _Jv_GetDrawingSurfaceInfo;
+ surface->FreeDrawingSurfaceInfo = _Jv_FreeDrawingSurfaceInfo;
+
+ surface->Lock = _Jv_Lock;
+ surface->Unlock = _Jv_Unlock;
+
+ surface->surface_info = (JAWT_DrawingSurfaceInfo*) malloc (sizeof (JAWT_DrawingSurfaceInfo));
+
+ if (surface->surface_info == NULL)
+ return NULL;
+
+ surface->surface_info->platformInfo = malloc (sizeof (JAWT_X11DrawingSurfaceInfo));
+
+ if (surface->surface_info->platformInfo == NULL)
+ return NULL;
+
+ surface_info_x11 = (JAWT_X11DrawingSurfaceInfo*) surface->surface_info->platformInfo;
+
+ surface_info_x11->display = classpath_jawt_get_default_display (env, canvas);
+ surface_info_x11->drawable = classpath_jawt_get_drawable (env, canvas);
+
+ /* FIXME: also include bounding rectangle of drawing surface */
+ /* FIXME: also include current clipping region */
+
+ return surface;
+}
+
+static void
+(JNICALL _Jv_FreeDrawingSurface) (JAWT_DrawingSurface* surface)
+{
+ free (surface);
+}
Index: include/Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libjava/include/Makefile.am,v
retrieving revision 1.6
diff -u -r1.6 Makefile.am
--- include/Makefile.am 3 Dec 2004 11:15:24 -0000 1.6
+++ include/Makefile.am 13 Feb 2005 23:40:03 -0000
@@ -5,4 +5,4 @@
# autoconf2.13's target_alias
target_noncanonical = @target_noncanonical@
-tool_include__HEADERS = jni.h jvmpi.h
+tool_include__HEADERS = jni.h jawt.h jawt_md.h jvmpi.h
Index: include/jawt.h
===================================================================
RCS file: include/jawt.h
diff -N include/jawt.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ include/jawt.h 13 Feb 2005 23:40:03 -0000
@@ -0,0 +1,92 @@
+/* jawt.h -- the machine-independent parts of the AWT Native Interface
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+/*
+ * The AWT Native Interface allows direct access to native screen
+ * resources from within a Canvas's paint method.
+ */
+
+#ifndef __jawt_h__
+#define __jawt_h__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define JAWT_VERSION_1_3 0x10003
+
+#define JAWT_LOCK_ERROR 0x1
+
+struct _JAWT_DrawingSurfaceInfo
+{
+ void* platformInfo;
+};
+
+struct _JAWT_DrawingSurface
+{
+ jint (JNICALL* Lock) (struct _JAWT_DrawingSurface*);
+ void (JNICALL* Unlock) (struct _JAWT_DrawingSurface*);
+
+ struct _JAWT_DrawingSurfaceInfo* (JNICALL* GetDrawingSurfaceInfo) (struct _JAWT_DrawingSurface*);
+ void (JNICALL* FreeDrawingSurfaceInfo) (struct _JAWT_DrawingSurfaceInfo*);
+
+ struct _JAWT_DrawingSurfaceInfo* surface_info;
+
+ /* FIXME: also include bounding rectangle of drawing surface. */
+ /* FIXME: also include current clipping region. */
+};
+
+struct _JAWT
+{
+ jint version;
+ struct _JAWT_DrawingSurface* (JNICALL* GetDrawingSurface) (JNIEnv*, jobject);
+ void (JNICALL* FreeDrawingSurface) (struct _JAWT_DrawingSurface*);
+};
+
+typedef struct _JAWT_DrawingSurfaceInfo JAWT_DrawingSurfaceInfo;
+typedef struct _JAWT_DrawingSurface JAWT_DrawingSurface;
+typedef struct _JAWT JAWT;
+
+JNIEXPORT jboolean JNICALL JAWT_GetAWT (JNIEnv* env, struct _JAWT* awt);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __jawt_h__ */
Index: include/jawt_md.h
===================================================================
RCS file: include/jawt_md.h
diff -N include/jawt_md.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ include/jawt_md.h 13 Feb 2005 23:40:03 -0000
@@ -0,0 +1,63 @@
+/* jawt_md.h -- the X11-dependent parts of the AWT Native Interface
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+#ifndef __jawt_md_h__
+#define __jawt_md_h__
+
+#include <jni.h>
+#include <jawt.h>
+#include <X11/Xlib.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+struct _JAWT_X11DrawingSurfaceInfo
+{
+ Display* display;
+ Drawable drawable;
+};
+
+typedef struct _JAWT_X11DrawingSurfaceInfo JAWT_X11DrawingSurfaceInfo;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __jawt_md_h__ */
Index: jni/classpath/classpath_jawt.h
===================================================================
RCS file: jni/classpath/classpath_jawt.h
diff -N jni/classpath/classpath_jawt.h
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ jni/classpath/classpath_jawt.h 13 Feb 2005 23:40:04 -0000
@@ -0,0 +1,59 @@
+/* classpath_awt.h -- libjawt's interface to the peer library
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+/*
+ * libjawt.so is linked directly to the peer library with -l. This
+ * header declares all the functions that libjawt.so needs -- X-based
+ * peer libraries wanting to support libjawt.so must implement these
+ * functions.
+ */
+
+#ifndef __classpath_jawt_h__
+#define __classpath_jawt_h__
+
+#include <jni.h>
+#include <X11/Xlib.h>
+
+#define CLASSPATH_JAWT_VERSION 0x10004
+
+jint classpath_jawt_get_awt_version ();
+Display* classpath_jawt_get_default_display (JNIEnv* env, jobject canvas);
+Drawable classpath_jawt_get_drawable (JNIEnv* env, jobject canvas);
+jint classpath_jawt_lock ();
+void classpath_jawt_unlock ();
+
+#endif /* __classpath_jawt_h__ */
Index: jni/gtk-peer/gtk_jawt.c
===================================================================
RCS file: jni/gtk-peer/gtk_jawt.c
diff -N jni/gtk-peer/gtk_jawt.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ jni/gtk-peer/gtk_jawt.c 13 Feb 2005 23:40:04 -0000
@@ -0,0 +1,132 @@
+/* gtk_jawt.c -- GTK implementation of classpath_jawt.h
+ Copyright (C) 2005 Free Software Foundation, Inc.
+
+ This file is part of GNU Classpath.
+
+ GNU Classpath is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GNU Classpath is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNU Classpath; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA.
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version. */
+
+
+#include "gtkpeer.h"
+#include <gtk/gtk.h>
+#include <gdk/gdkx.h>
+#include "classpath_jawt.h"
+
+jint
+classpath_jawt_get_awt_version ()
+{
+ return CLASSPATH_JAWT_VERSION;
+}
+
+Display*
+classpath_jawt_get_default_display (JNIEnv* env, jobject canvas)
+{
+ GdkDisplay *display;
+ Display *xdisplay;
+ GtkWidget *widget;
+ void *ptr;
+ jobject peer;
+ jclass class_id;
+ jmethodID method_id;
+
+ /* retrieve peer object */
+ class_id = (*env)->GetObjectClass (env, canvas);
+
+ method_id = (*env)->GetMethodID (env, class_id,
+ "getPeer",
+ "()Ljava/awt/peer/ComponentPeer;");
+
+ peer = (*env)->CallObjectMethod (env, canvas, method_id);
+
+ ptr = NSA_GET_PTR (env, peer);
+
+ gdk_threads_enter ();
+
+ widget = GTK_WIDGET (ptr);
+
+ /* widget should be realized before Canvas.paint is called. */
+ g_assert (GTK_WIDGET_REALIZED (widget));
+
+ display = gtk_widget_get_display (widget);
+
+ xdisplay = GDK_DISPLAY_XDISPLAY (display);
+
+ gdk_threads_leave ();
+
+ return xdisplay;
+}
+
+Drawable
+classpath_jawt_get_drawable (JNIEnv* env, jobject canvas)
+{
+ GtkWidget *widget;
+ int drawable;
+ void *ptr;
+ jobject peer;
+ jclass class_id;
+ jmethodID method_id;
+
+ class_id = (*env)->GetObjectClass (env, canvas);
+
+ method_id = (*env)->GetMethodID (env, class_id,
+ "getPeer",
+ "()Ljava/awt/peer/ComponentPeer;");
+
+ peer = (*env)->CallObjectMethod (env, canvas, method_id);
+
+ ptr = NSA_GET_PTR (env, peer);
+
+ gdk_threads_enter ();
+
+ widget = GTK_WIDGET (ptr);
+
+ g_assert (GTK_WIDGET_REALIZED (widget));
+
+ drawable = GDK_DRAWABLE_XID (widget->window);
+
+ gdk_threads_leave ();
+
+ return drawable;
+}
+
+jint
+classpath_jawt_lock ()
+{
+ gdk_threads_enter ();
+ return 0;
+}
+
+void
+classpath_jawt_unlock ()
+{
+ gdk_threads_leave ();
+}