FYI: Patch: GTK 2.0 peers
Thomas Fitzsimmons
fitzsim@redhat.com
Tue Jul 1 00:00:00 GMT 2003
On Mon, 2003-06-30 at 11:13, Tom Tromey wrote:
> >>>>> "Tom" == Thomas Fitzsimmons <fitzsim@redhat.com> writes:
>
> Tom> This patch merges the classpath GTK 2.0 peers into libgcj.
> Tom> Except for the change in GtkToolkit.java, I just copied
> Tom> classpath's peers directly into libgcj, and updated the configury
> Tom> accordingly.
>
> The GtkToolkit change shouldn't be necessary, since
> Configuration.INIT_LOAD_LIBRARY should always be false in libgcj.
> Please back out this part.
>
> Also, FYI, customarily we don't include Makefile.in or configure diffs
> in the patch email.
>
> Tom> Sorry about the large size of the patch, but I think it's best if
> Tom> it's all done at once.
>
> I agree. Other than the one thing mentioned above, I think this patch
> is ready to go in.
>
Patch checked in with requested change.
Tom
2003-06-30 Thomas Fitzsimmons <fitzsim@redhat.com>
* glib-2.0.m4: New file.
* gtk-2.0.m4: New file.
* glib.m4: Remove.
* gtk.m4: Remove.
* configure.in: Update AM_PATH_GTK macro call to
AM_PATH_GTK_2_0. Likewise for AM_PATH_GLIB.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c,
jni/gtk-peer/gthread-jni.c,
jni/gtk-peer/gthread-jni.h:
New versions from classpath.
* aclocal.m4: Regenerate.
* configure: Regenerate.
* Makefile.in: Regenerate.
* gcj/Makefile.in: Regenerate.
* include/Makefile.in: Regenerate.
* testsuite/Makefile.in: Regenerate.
-------------- next part --------------
? glib-2.0.m4
? gtk-2.0.m4
Index: aclocal.m4
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/aclocal.m4,v
retrieving revision 1.32
diff -u -b -B -r1.32 aclocal.m4
--- aclocal.m4 31 Jan 2003 17:59:00 -0000 1.32
+++ aclocal.m4 30 Jun 2003 17:36:31 -0000
@@ -435,58 +435,70 @@
changequote([,]))])
# Configure paths for GTK+
-# Owen Taylor 97-11-3
+# Owen Taylor 1997-2001
-dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
-dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS
+dnl AM_PATH_GTK_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GTK+, and define GTK_CFLAGS and GTK_LIBS, if gthread is specified in MODULES,
+dnl pass to pkg-config
dnl
-AC_DEFUN(AM_PATH_GTK,
+AC_DEFUN(AM_PATH_GTK_2_0,
[dnl
-dnl Get the cflags and libraries from the gtk-config script
+dnl Get the cflags and libraries from pkg-config
dnl
-AC_ARG_WITH(gtk-prefix,[ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)],
- gtk_config_prefix="$withval", gtk_config_prefix="")
-AC_ARG_WITH(gtk-exec-prefix,[ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)],
- gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="")
-AC_ARG_ENABLE(gtktest, [ --disable-gtktest Do not try to compile and run a test GTK program],
+AC_ARG_ENABLE(gtktest, [ --disable-gtktest do not try to compile and run a test GTK+ program],
, enable_gtktest=yes)
+ pkg_config_args=gtk+-2.0
for module in . $4
do
case "$module" in
gthread)
- gtk_config_args="$gtk_config_args gthread"
+ pkg_config_args="$pkg_config_args gthread-2.0"
;;
esac
done
- if test x$gtk_config_exec_prefix != x ; then
- gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix"
- if test x${GTK_CONFIG+set} != xset ; then
- GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config
- fi
+ no_gtk=""
+
+ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+
+ if test x$PKG_CONFIG != xno ; then
+ if pkg-config --atleast-pkgconfig-version 0.7 ; then
+ :
+ else
+ echo *** pkg-config too old; version 0.7 or better required.
+ no_gtk=yes
+ PKG_CONFIG=no
fi
- if test x$gtk_config_prefix != x ; then
- gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix"
- if test x${GTK_CONFIG+set} != xset ; then
- GTK_CONFIG=$gtk_config_prefix/bin/gtk-config
+ else
+ no_gtk=yes
fi
+
+ min_gtk_version=ifelse([$1], ,2.0.0,$1)
+ AC_MSG_CHECKING(for GTK+ - version >= $min_gtk_version)
+
+ if test x$PKG_CONFIG != xno ; then
+ ## don't try to run the test against uninstalled libtool libs
+ if $PKG_CONFIG --uninstalled $pkg_config_args; then
+ echo "Will use uninstalled version of GTK+ found in PKG_CONFIG_PATH"
+ enable_gtktest=no
fi
- AC_PATH_PROG(GTK_CONFIG, gtk-config, no)
- min_gtk_version=ifelse([$1], ,0.99.7,$1)
- AC_MSG_CHECKING(for GTK - version >= $min_gtk_version)
- no_gtk=""
- if test "$GTK_CONFIG" = "no" ; then
- no_gtk=yes
+ if $PKG_CONFIG --atleast-version $min_gtk_version $pkg_config_args; then
+ :
else
- GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
- GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
- gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \
+ no_gtk=yes
+ fi
+ fi
+
+ if test x"$no_gtk" = x ; then
+ GTK_CFLAGS=`$PKG_CONFIG $pkg_config_args --cflags`
+ GTK_LIBS=`$PKG_CONFIG $pkg_config_args --libs`
+ gtk_config_major_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
- gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
+ gtk_config_minor_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
- gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
+ gtk_config_micro_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
if test "x$enable_gtktest" = "xyes" ; then
ac_save_CFLAGS="$CFLAGS"
@@ -494,8 +506,8 @@
CFLAGS="$CFLAGS $GTK_CFLAGS"
LIBS="$GTK_LIBS $LIBS"
dnl
-dnl Now check if the installed GTK is sufficiently new. (Also sanity
-dnl checks the results of gtk-config to some extent
+dnl Now check if the installed GTK+ is sufficiently new. (Also sanity
+dnl checks the results of pkg-config to some extent)
dnl
rm -f conf.gtktest
AC_TRY_RUN([
@@ -522,19 +534,17 @@
(gtk_minor_version != $gtk_config_minor_version) ||
(gtk_micro_version != $gtk_config_micro_version))
{
- printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n",
+ printf("\n*** 'pkg-config --modversion gtk+-2.0' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n",
$gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
gtk_major_version, gtk_minor_version, gtk_micro_version);
- printf ("*** was found! If gtk-config was correct, then it is best\n");
+ printf ("*** was found! If pkg-config was correct, then it is best\n");
printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
printf("*** required on your system.\n");
- printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n");
- printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n");
- printf("*** before re-running configure\n");
+ printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+ printf("*** to point to the correct configuration files\n");
}
-#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION)
else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
(gtk_minor_version != GTK_MINOR_VERSION) ||
(gtk_micro_version != GTK_MICRO_VERSION))
@@ -544,7 +554,6 @@
printf("*** library (version %d.%d.%d)\n",
gtk_major_version, gtk_minor_version, gtk_micro_version);
}
-#endif /* defined (GTK_MAJOR_VERSION) ... */
else
{
if ((gtk_major_version > major) ||
@@ -562,10 +571,10 @@
printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
printf("***\n");
printf("*** If you have already installed a sufficiently new version, this error\n");
- printf("*** probably means that the wrong copy of the gtk-config shell script is\n");
+ printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
printf("*** being found. The easiest way to fix this is to remove the old version\n");
- printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n");
- printf("*** correct copy of gtk-config. (In this case, you will have to\n");
+ printf("*** of GTK+, but you can also set the PKG_CONFIG environment to point to the\n");
+ printf("*** correct copy of pkg-config. (In this case, you will have to\n");
printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
printf("*** so that the correct libraries are found at run-time))\n");
}
@@ -578,20 +587,20 @@
fi
fi
if test "x$no_gtk" = x ; then
- AC_MSG_RESULT(yes)
+ AC_MSG_RESULT(yes (version $gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version))
ifelse([$2], , :, [$2])
else
AC_MSG_RESULT(no)
- if test "$GTK_CONFIG" = "no" ; then
- echo "*** The gtk-config script installed by GTK could not be found"
- echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in"
- echo "*** your path, or set the GTK_CONFIG environment variable to the"
- echo "*** full path to gtk-config."
+ if test "$PKG_CONFIG" = "no" ; then
+ echo "*** A new enough version of pkg-config was not found."
+ echo "*** See http://pkgconfig.sourceforge.net"
else
if test -f conf.gtktest ; then
:
else
- echo "*** Could not run GTK test program, checking why..."
+ echo "*** Could not run GTK+ test program, checking why..."
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $GTK_CFLAGS"
LIBS="$LIBS $GTK_LIBS"
AC_TRY_LINK([
@@ -599,23 +608,16 @@
#include <stdio.h>
], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ],
[ echo "*** The test program compiled, but did not run. This usually means"
- echo "*** that the run-time linker is not finding GTK or finding the wrong"
- echo "*** version of GTK. If it is not finding GTK, you'll need to set your"
+ echo "*** that the run-time linker is not finding GTK+ or finding the wrong"
+ echo "*** version of GTK+. If it is not finding GTK+, you'll need to set your"
echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
echo "*** to the installed location Also, make sure you have run ldconfig if that"
echo "*** is required on your system"
echo "***"
echo "*** If you have an old version installed, it is best to remove it, although"
- echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
- echo "***"
- echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
- echo "*** came with the system with the command"
- echo "***"
- echo "*** rpm --erase --nodeps gtk gtk-devel" ],
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ],
[ echo "*** The test program failed to compile or link. See the file config.log for the"
- echo "*** exact error that occured. This usually means GTK was incorrectly installed"
- echo "*** or that you have moved GTK since it was installed. In the latter case, you"
- echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ])
+ echo "*** exact error that occured. This usually means GTK+ is incorrectly installed."])
CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS"
fi
@@ -630,62 +632,80 @@
])
# Configure paths for GLIB
-# Owen Taylor 97-11-3
+# Owen Taylor 1997-2001
-dnl AM_PATH_GLIB([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
-dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if "gmodule" or
-dnl gthread is specified in MODULES, pass to glib-config
+dnl AM_PATH_GLIB_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if gmodule, gobject or
+dnl gthread is specified in MODULES, pass to pkg-config
dnl
-AC_DEFUN(AM_PATH_GLIB,
+AC_DEFUN(AM_PATH_GLIB_2_0,
[dnl
-dnl Get the cflags and libraries from the glib-config script
+dnl Get the cflags and libraries from pkg-config
dnl
-AC_ARG_WITH(glib-prefix,[ --with-glib-prefix=PFX Prefix where GLIB is installed (optional)],
- glib_config_prefix="$withval", glib_config_prefix="")
-AC_ARG_WITH(glib-exec-prefix,[ --with-glib-exec-prefix=PFX Exec prefix where GLIB is installed (optional)],
- glib_config_exec_prefix="$withval", glib_config_exec_prefix="")
-AC_ARG_ENABLE(glibtest, [ --disable-glibtest Do not try to compile and run a test GLIB program],
+AC_ARG_ENABLE(glibtest, [ --disable-glibtest do not try to compile and run a test GLIB program],
, enable_glibtest=yes)
- if test x$glib_config_exec_prefix != x ; then
- glib_config_args="$glib_config_args --exec-prefix=$glib_config_exec_prefix"
- if test x${GLIB_CONFIG+set} != xset ; then
- GLIB_CONFIG=$glib_config_exec_prefix/bin/glib-config
- fi
- fi
- if test x$glib_config_prefix != x ; then
- glib_config_args="$glib_config_args --prefix=$glib_config_prefix"
- if test x${GLIB_CONFIG+set} != xset ; then
- GLIB_CONFIG=$glib_config_prefix/bin/glib-config
- fi
- fi
-
+ pkg_config_args=glib-2.0
for module in . $4
do
case "$module" in
gmodule)
- glib_config_args="$glib_config_args gmodule"
+ pkg_config_args="$pkg_config_args gmodule-2.0"
+ ;;
+ gobject)
+ pkg_config_args="$pkg_config_args gobject-2.0"
;;
gthread)
- glib_config_args="$glib_config_args gthread"
+ pkg_config_args="$pkg_config_args gthread-2.0"
;;
esac
done
- AC_PATH_PROG(GLIB_CONFIG, glib-config, no)
- min_glib_version=ifelse([$1], ,0.99.7,$1)
- AC_MSG_CHECKING(for GLIB - version >= $min_glib_version)
+ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+
no_glib=""
- if test "$GLIB_CONFIG" = "no" ; then
+
+ if test x$PKG_CONFIG != xno ; then
+ if $PKG_CONFIG --atleast-pkgconfig-version 0.7 ; then
+ :
+ else
+ echo *** pkg-config too old; version 0.7 or better required.
no_glib=yes
+ PKG_CONFIG=no
+ fi
else
- GLIB_CFLAGS=`$GLIB_CONFIG $glib_config_args --cflags`
- GLIB_LIBS=`$GLIB_CONFIG $glib_config_args --libs`
- glib_config_major_version=`$GLIB_CONFIG $glib_config_args --version | \
+ no_glib=yes
+ fi
+
+ min_glib_version=ifelse([$1], ,2.0.0,$1)
+ AC_MSG_CHECKING(for GLIB - version >= $min_glib_version)
+
+ if test x$PKG_CONFIG != xno ; then
+ ## don't try to run the test against uninstalled libtool libs
+ if $PKG_CONFIG --uninstalled $pkg_config_args; then
+ echo "Will use uninstalled version of GLib found in PKG_CONFIG_PATH"
+ enable_glibtest=no
+ fi
+
+ if $PKG_CONFIG --atleast-version $min_glib_version $pkg_config_args; then
+ :
+ else
+ no_glib=yes
+ fi
+ fi
+
+ if test x"$no_glib" = x ; then
+ GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0`
+ GOBJECT_QUERY=`$PKG_CONFIG --variable=gobject_query glib-2.0`
+ GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
+
+ GLIB_CFLAGS=`$PKG_CONFIG --cflags $pkg_config_args`
+ GLIB_LIBS=`$PKG_CONFIG --libs $pkg_config_args`
+ glib_config_major_version=`$PKG_CONFIG --modversion glib-2.0 | \
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
- glib_config_minor_version=`$GLIB_CONFIG $glib_config_args --version | \
+ glib_config_minor_version=`$PKG_CONFIG --modversion glib-2.0 | \
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
- glib_config_micro_version=`$GLIB_CONFIG $glib_config_args --version | \
+ glib_config_micro_version=`$PKG_CONFIG --modversion glib-2.0 | \
sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
if test "x$enable_glibtest" = "xyes" ; then
ac_save_CFLAGS="$CFLAGS"
@@ -694,7 +714,7 @@
LIBS="$GLIB_LIBS $LIBS"
dnl
dnl Now check if the installed GLIB is sufficiently new. (Also sanity
-dnl checks the results of glib-config to some extent
+dnl checks the results of pkg-config to some extent)
dnl
rm -f conf.glibtest
AC_TRY_RUN([
@@ -721,17 +741,16 @@
(glib_minor_version != $glib_config_minor_version) ||
(glib_micro_version != $glib_config_micro_version))
{
- printf("\n*** 'glib-config --version' returned %d.%d.%d, but GLIB (%d.%d.%d)\n",
+ printf("\n*** 'pkg-config --modversion glib-2.0' returned %d.%d.%d, but GLIB (%d.%d.%d)\n",
$glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
glib_major_version, glib_minor_version, glib_micro_version);
- printf ("*** was found! If glib-config was correct, then it is best\n");
- printf ("*** to remove the old version of GLIB. You may also be able to fix the error\n");
+ printf ("*** was found! If pkg-config was correct, then it is best\n");
+ printf ("*** to remove the old version of GLib. You may also be able to fix the error\n");
printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
printf("*** required on your system.\n");
- printf("*** If glib-config was wrong, set the environment variable GLIB_CONFIG\n");
- printf("*** to point to the correct copy of glib-config, and remove the file config.cache\n");
- printf("*** before re-running configure\n");
+ printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+ printf("*** to point to the correct configuration files\n");
}
else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
(glib_minor_version != GLIB_MINOR_VERSION) ||
@@ -759,10 +778,10 @@
printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
printf("***\n");
printf("*** If you have already installed a sufficiently new version, this error\n");
- printf("*** probably means that the wrong copy of the glib-config shell script is\n");
+ printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
printf("*** being found. The easiest way to fix this is to remove the old version\n");
- printf("*** of GLIB, but you can also set the GLIB_CONFIG environment to point to the\n");
- printf("*** correct copy of glib-config. (In this case, you will have to\n");
+ printf("*** of GLIB, but you can also set the PKG_CONFIG environment to point to the\n");
+ printf("*** correct copy of pkg-config. (In this case, you will have to\n");
printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
printf("*** so that the correct libraries are found at run-time))\n");
}
@@ -775,20 +794,20 @@
fi
fi
if test "x$no_glib" = x ; then
- AC_MSG_RESULT(yes)
+ AC_MSG_RESULT(yes (version $glib_config_major_version.$glib_config_minor_version.$glib_config_micro_version))
ifelse([$2], , :, [$2])
else
AC_MSG_RESULT(no)
- if test "$GLIB_CONFIG" = "no" ; then
- echo "*** The glib-config script installed by GLIB could not be found"
- echo "*** If GLIB was installed in PREFIX, make sure PREFIX/bin is in"
- echo "*** your path, or set the GLIB_CONFIG environment variable to the"
- echo "*** full path to glib-config."
+ if test "$PKG_CONFIG" = "no" ; then
+ echo "*** A new enough version of pkg-config was not found."
+ echo "*** See http://www.freedesktop.org/software/pkgconfig/"
else
if test -f conf.glibtest ; then
:
else
echo "*** Could not run GLIB test program, checking why..."
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $GLIB_CFLAGS"
LIBS="$LIBS $GLIB_LIBS"
AC_TRY_LINK([
@@ -803,26 +822,25 @@
echo "*** is required on your system"
echo "***"
echo "*** If you have an old version installed, it is best to remove it, although"
- echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
- echo "***"
- echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
- echo "*** came with the system with the command"
- echo "***"
- echo "*** rpm --erase --nodeps gtk gtk-devel" ],
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ],
[ echo "*** The test program failed to compile or link. See the file config.log for the"
- echo "*** exact error that occured. This usually means GLIB was incorrectly installed"
- echo "*** or that you have moved GLIB since it was installed. In the latter case, you"
- echo "*** may want to edit the glib-config script: $GLIB_CONFIG" ])
+ echo "*** exact error that occured. This usually means GLIB is incorrectly installed."])
CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS"
fi
fi
GLIB_CFLAGS=""
GLIB_LIBS=""
+ GLIB_GENMARSHAL=""
+ GOBJECT_QUERY=""
+ GLIB_MKENUMS=""
ifelse([$3], , :, [$3])
fi
AC_SUBST(GLIB_CFLAGS)
AC_SUBST(GLIB_LIBS)
+ AC_SUBST(GLIB_GENMARSHAL)
+ AC_SUBST(GOBJECT_QUERY)
+ AC_SUBST(GLIB_MKENUMS)
rm -f conf.glibtest
])
Index: configure.in
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/configure.in,v
retrieving revision 1.157
diff -u -b -B -r1.157 configure.in
--- configure.in 17 Jun 2003 15:56:07 -0000 1.157
+++ configure.in 30 Jun 2003 17:36:38 -0000
@@ -785,8 +785,8 @@
# Test for Gtk stuff, if asked for.
if test "$use_gtk_awt" = yes; then
- AM_PATH_GTK(1.2.4,,exit 1)
- AM_PATH_GLIB(1.2.4,,exit 1,gthread)
+ AM_PATH_GTK_2_0(2.0.0,,exit 1)
+ AM_PATH_GLIB_2_0(2.0.0,,exit 1,gthread)
dnl XXX Fix me when libart.m4 has the compile test fixed!
enable_libarttest=no
AM_PATH_LIBART(2.1.0,,exit 1)
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c,v
retrieving revision 1.1
diff -u -b -B -r1.1 gnu_java_awt_peer_gtk_GdkGraphics.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 31 Jan 2003 17:54:14 -0000 1.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 30 Jun 2003 17:36:42 -0000
@@ -1,5 +1,5 @@
/* gdkgraphics.c
- Copyright (C) 1999, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1999 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -40,7 +40,7 @@
#include <gdk/gdkprivate.h>
#include <gdk/gdkx.h>
-#define GDK_STABLE_IS_PIXMAP(d) (((GdkWindowPrivate *)d)->window_type == GDK_WINDOW_PIXMAP)
+#define GDK_STABLE_IS_PIXMAP(d) (GDK_IS_PIXMAP(d))
GdkPoint *
translate_points (JNIEnv *env, jintArray xpoints, jintArray ypoints,
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c,v
retrieving revision 1.2
diff -u -b -B -r1.2 gnu_java_awt_peer_gtk_GtkButtonPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c 19 Feb 2003 00:35:35 -0000 1.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c 30 Jun 2003 17:36:42 -0000
@@ -42,47 +42,43 @@
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create
(JNIEnv *env, jobject obj)
{
- gpointer widget;
+ GtkButton *button;
gdk_threads_enter ();
- widget = gtk_type_new (gtk_button_get_type ());
+ button = gtk_button_new();
+ gtk_widget_show (GTK_WIDGET(button));
gdk_threads_leave ();
-
- NSA_SET_PTR (env, obj, widget);
+ NSA_SET_PTR (env, obj, button);
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetFont
(JNIEnv *env, jobject obj, jstring jname, jint size)
{
- const char *xlfd;
-# define FBUFSZ 200
- char buf[FBUFSZ];
+ const char *font_name;
void *ptr;
- GdkFont * new_font;
- GtkStyle * style;
- GtkWidget * button;
- GtkWidget * label;
+ GtkWidget *button;
+ GtkWidget *label;
+ PangoFontDescription *font_desc;
ptr = NSA_GET_PTR (env, obj);
+
button = GTK_WIDGET (ptr);
- label = GTK_BIN(button)->child;
+ label = gtk_bin_get_child (GTK_BIN(button));
- if (label == NULL) return;
- xlfd = (*env)->GetStringUTFChars (env, jname, NULL);
- snprintf(buf, FBUFSZ, xlfd, size);
- (*env)->ReleaseStringUTFChars (env, jname, xlfd);
- gdk_threads_enter();
- new_font = gdk_font_load (buf); /* FIXME: deprecated. Replacement? */
- if (new_font == NULL)
- {
- /* Fail quietly for now. */
- gdk_threads_leave();
+ if (!label)
return;
- }
- style = gtk_style_copy (gtk_widget_get_style (label));
- style -> font = new_font;
- gtk_widget_set_style (label, style);
- /* FIXME: Documentation varies as to whether we should unref style. */
+
+ font_name = (*env)->GetStringUTFChars (env, jname, NULL);
+
+ gdk_threads_enter();
+
+ font_desc = pango_font_description_from_string (font_name);
+ pango_font_description_set_size (font_desc, size);
+ gtk_widget_modify_font (GTK_WIDGET(label), font_desc);
+ pango_font_description_free (font_desc);
+
gdk_threads_leave();
+
+ (*env)->ReleaseStringUTFChars (env, jname, font_name);
}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c,v
retrieving revision 1.1
diff -u -b -B -r1.1 gnu_java_awt_peer_gtk_GtkComponentPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 31 Jan 2003 17:54:14 -0000 1.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 30 Jun 2003 17:36:43 -0000
@@ -40,22 +40,6 @@
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include <gtk/gtkprivate.h>
-#define GTK_OBJECT_SETV(ptr, arg) \
- gdk_threads_enter (); \
- { \
- GtkArgInfo *info = NULL; \
- char *error; \
- \
- error = gtk_object_arg_get_info (GTK_OBJECT_TYPE (ptr), arg.name, &info); \
- if (error) \
- { \
- /* assume the argument is destined for the container's only child */ \
- ptr = gtk_container_children (GTK_CONTAINER (ptr))->data; \
- } \
- gtk_object_setv (GTK_OBJECT (ptr), 1, &arg); \
- } \
- gdk_threads_leave (); \
-
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkGenericPeer_dispose
(JNIEnv *env, jobject obj)
{
@@ -519,8 +503,9 @@
arg.type = GTK_TYPE_STRING;
arg.name = (char *) name;
GTK_VALUE_STRING (arg) = (char *) value;
-
- GTK_OBJECT_SETV (ptr, arg);
+ gdk_threads_enter();
+ g_object_set(ptr, name, value, NULL);
+ gdk_threads_leave();
(*env)->ReleaseStringUTFChars (env, jname, name);
(*env)->ReleaseStringUTFChars (env, jvalue, value);
@@ -540,7 +525,9 @@
arg.name = (char *) name;
GTK_VALUE_BOOL (arg) = value;
- GTK_OBJECT_SETV (ptr, arg);
+ gdk_threads_enter();
+ g_object_set(ptr, name, value, NULL);
+ gdk_threads_leave();
(*env)->ReleaseStringUTFChars (env, jname, name);
}
@@ -559,7 +546,9 @@
arg.name = (char *) name;
GTK_VALUE_INT (arg) = value;
- GTK_OBJECT_SETV (ptr, arg);
+ gdk_threads_enter();
+ g_object_set(ptr, name, value, NULL);
+ gdk_threads_leave();
(*env)->ReleaseStringUTFChars (env, jname, name);
}
@@ -578,7 +567,9 @@
arg.name = (char *) name;
GTK_VALUE_FLOAT (arg) = value;
- GTK_OBJECT_SETV (ptr, arg);
+ gdk_threads_enter();
+ g_object_set(ptr, name, value, NULL);
+ gdk_threads_leave();
(*env)->ReleaseStringUTFChars (env, jname, name);
}
@@ -611,7 +602,9 @@
arg.name = (char *) name;
GTK_VALUE_OBJECT (arg) = GTK_OBJECT (ptr2);
- GTK_OBJECT_SETV (ptr1, arg);
+ gdk_threads_enter();
+ g_object_set(ptr1, name, ptr2, NULL);
+ gdk_threads_leave();
(*env)->ReleaseStringUTFChars (env, jname, name);
}
@@ -644,6 +637,15 @@
gdk_threads_enter ();
gtk_widget_realize (GTK_WIDGET (ptr));
+ if(GTK_IS_BUTTON(ptr))
+ {
+ g_print("-- connecting a button --\n");
+ connect_awt_hook (env, obj, 1, GTK_BUTTON(ptr)->event_window);
+ }
+ else
+ {
connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
+ g_print("Connection object %p with window %p (but ptr is %p)\n", obj, GTK_WIDGET(ptr)->window, ptr);
+ }
gdk_threads_leave ();
}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c,v
retrieving revision 1.1
diff -u -b -B -r1.1 gnu_java_awt_peer_gtk_GtkEvents.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 31 Jan 2003 17:54:14 -0000 1.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 30 Jun 2003 17:36:43 -0000
@@ -526,6 +526,7 @@
| GDK_KEY_PRESS_MASK
| GDK_FOCUS_CHANGE_MASK);
+ // g_print("storing obj %p property on window %p\n", obj, window);
gdk_property_change (window,
addr_atom,
type_atom,
@@ -538,15 +539,22 @@
void
connect_awt_hook (JNIEnv *env, jobject peer_obj, int nwindows, ...)
{
- int i;
va_list ap;
jobject *obj;
obj = (jobject *) malloc (sizeof (jobject));
*obj = (*env)->NewGlobalRef (env, peer_obj);
+ //g_print("Connection obj %p\n", peer_obj);
va_start (ap, nwindows);
+ {
+ int i;
for (i = 0; i < nwindows; i++)
- attach_jobject (va_arg (ap, GdkWindow *), obj);
+ {
+ GdkWindow* attach = (va_arg (ap, GdkWindow *));
+ //g_print("attach peer obj %p and %p\n", peer_obj, attach);
+ attach_jobject(attach, obj);
+ }
+ }
va_end (ap);
}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c,v
retrieving revision 1.1
diff -u -b -B -r1.1 gnu_java_awt_peer_gtk_GtkListPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c 31 Jan 2003 17:54:14 -0000 1.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c 30 Jun 2003 17:36:43 -0000
@@ -251,33 +251,9 @@
list = GTK_WIDGET (CLIST_FROM_SW (ptr));
sw = GTK_SCROLLED_WINDOW (ptr);
- /*
- gtk_widget_size_request(GTK_WIDGET (GTK_SCROLLED_WINDOW(sw)->hscrollbar),
- &myreq);
- dims[1]=myreq.height+GTK_SCROLLED_WINDOW_CLASS
- (GTK_OBJECT (sw)->klass)->scrollbar_spacing;
- */
-
- gtk_signal_emit_by_name (GTK_OBJECT (GTK_SCROLLED_WINDOW(sw)->vscrollbar),
- "size_request", &myreq);
- /*
-
- gtk_widget_size_request(GTK_WIDGET (GTK_SCROLLED_WINDOW(sw)->vscrollbar),
- &myreq);
- */
-
- dims[0]=myreq.width+GTK_SCROLLED_WINDOW_CLASS
- (GTK_OBJECT (sw)->klass)->scrollbar_spacing;
-
- gtk_signal_emit_by_name (GTK_OBJECT (list), "size_request", &myreq);
-
- // gtk_widget_size_request(GTK_WIDGET (list), &myreq);
-
- dims[0] += myreq.width + gdk_char_width (list->style->font, 'W');
-
- dims[1] += ((rows * (gdk_char_height (list->style->font, 'W')+7))
- + (2 * (list->style->klass->ythickness)));
-
+ gtk_widget_size_request(list, &myreq);
+ dims[1]=myreq.height;
+ dims[0]=myreq.width;
gdk_threads_leave ();
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c,v
retrieving revision 1.1
diff -u -b -B -r1.1 gnu_java_awt_peer_gtk_GtkMainThread.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c 31 Jan 2003 17:54:14 -0000 1.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c 30 Jun 2003 17:36:43 -0000
@@ -56,6 +56,10 @@
jmethodID postListItemEventID;
JNIEnv *gdk_env;
+#ifdef PORTABLE_NATIVE_SYNC
+JavaVM *gdk_vm;
+#endif
+
/*
* Call gtk_init. It is very important that this happen before any other
* gtk calls.
@@ -81,7 +85,16 @@
/* until we have JDK 1.2 JNI, assume we have a VM with threads that
match what GLIB was compiled for */
- g_thread_init (NULL);
+#ifdef PORTABLE_NATIVE_SYNC
+ (*env)->GetJavaVM( env, &gdk_vm );
+ g_thread_init ( &g_thread_jni_functions );
+ printf("called gthread init\n");
+#else
+ g_thread_init ( NULL );
+#endif
+
+ /* From GDK 2.0 onwards we have to explicitly call gdk_threads_init */
+ gdk_threads_init();
gtk_init (&argc, &argv);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c,v
retrieving revision 1.2
diff -u -b -B -r1.2 gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c 19 Feb 2003 00:35:35 -0000 1.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c 30 Jun 2003 17:36:44 -0000
@@ -46,11 +46,15 @@
};
static void
-post_adjustment_event (GtkAdjustment *adj, struct range_scrollbar *rs)
+post_adjustment_event (GtkRange *range, GtkScrollType scroll,
+ struct range_scrollbar *rs)
{
jint type;
+ GtkAdjustment *adj;
- switch (rs->range->scroll_type)
+ adj = gtk_range_get_adjustment (range);
+
+ switch (scroll)
{
case GTK_SCROLL_STEP_FORWARD:
type = AWT_ADJUSTMENT_UNIT_INCREMENT;
@@ -113,15 +117,11 @@
rs->range = GTK_RANGE (ptr);
rs->scrollbar = (jobject *) malloc (sizeof (jobject));
*(rs->scrollbar) = (*env)->NewGlobalRef (env, obj);
- gtk_signal_connect (GTK_OBJECT (GTK_RANGE (ptr)->adjustment),
- "value_changed",
+ gtk_signal_connect (GTK_OBJECT (GTK_RANGE (ptr)),
+ "move_slider",
GTK_SIGNAL_FUNC (post_adjustment_event), rs);
- connect_awt_hook (env, obj, 4,
- GTK_RANGE (ptr)->trough,
- GTK_RANGE (ptr)->slider,
- GTK_RANGE (ptr)->step_forw,
- GTK_RANGE (ptr)->step_back);
+ connect_awt_hook (env, obj, 1, GTK_SCROLLBAR (ptr)->range);
gdk_threads_leave ();
}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c,v
retrieving revision 1.2
diff -u -b -B -r1.2 gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c 19 Feb 2003 00:35:35 -0000 1.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c 30 Jun 2003 17:36:44 -0000
@@ -39,7 +39,7 @@
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkTextAreaPeer.h"
-#define TEXT_FROM_SW(obj) (GTK_TEXT(GTK_SCROLLED_WINDOW (obj)->container.child))
+#define TEXT_FROM_SW(obj) (GTK_TEXT_VIEW(GTK_SCROLLED_WINDOW (obj)->container.child))
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_create
(JNIEnv *env, jobject obj, jint scroll)
@@ -47,7 +47,7 @@
GtkWidget *text, *sw;
gdk_threads_enter ();
- text = gtk_text_new (NULL, NULL);
+ text = gtk_text_view_new ();
gtk_widget_show (text);
sw = gtk_scrolled_window_new (NULL, NULL);
@@ -64,54 +64,9 @@
(scroll == AWT_TEXTAREA_SCROLLBARS_BOTH
|| scroll == AWT_TEXTAREA_SCROLLBARS_VERTICAL_ONLY) ?
GTK_POLICY_ALWAYS : GTK_POLICY_NEVER);
- gdk_threads_leave ();
-
- NSA_SET_PTR (env, obj, sw);
-}
-
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_old_create
- (JNIEnv *env, jobject obj, jobject parent_obj,
- jstring contents, jint scroll)
-{
- GtkWidget *text, *sw;
- const char *str;
- int pos=0;
- void *parent;
-
- parent = NSA_GET_PTR (env, parent_obj);
- str = (*env)->GetStringUTFChars (env, contents, NULL);
-
- gdk_threads_enter ();
-
- text = gtk_text_new (NULL, NULL);
- gtk_text_set_editable (GTK_TEXT (text), TRUE);
-
- gtk_editable_insert_text (GTK_EDITABLE (text), str,
- strlen (str), &pos);
-
- sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_container_add (GTK_CONTAINER (sw), text);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
-
- /* horizontal scrollbar */
- (scroll == AWT_TEXTAREA_SCROLLBARS_BOTH
- || scroll == AWT_TEXTAREA_SCROLLBARS_HORIZONTAL_ONLY) ?
- GTK_POLICY_ALWAYS : GTK_POLICY_NEVER,
-
- /* vertical scrollbar */
- (scroll == AWT_TEXTAREA_SCROLLBARS_BOTH
- || scroll == AWT_TEXTAREA_SCROLLBARS_VERTICAL_ONLY) ?
- GTK_POLICY_ALWAYS : GTK_POLICY_NEVER);
-
- set_visible (text, TRUE);
- set_parent (sw, GTK_CONTAINER (parent));
gdk_threads_leave ();
- (*env)->ReleaseStringUTFChars (env, contents, str);
-
NSA_SET_PTR (env, obj, sw);
}
@@ -122,8 +77,8 @@
void *ptr;
jint *dims;
GtkWidget *text;
- GtkScrolledWindow *sw;
- GtkRequisition myreq;
+/* GtkScrolledWindow *sw; */
+ GtkRequisition requisition;
ptr = NSA_GET_PTR (env, obj);
@@ -133,35 +88,11 @@
gdk_threads_enter ();
text = GTK_WIDGET (TEXT_FROM_SW (ptr));
- sw = GTK_SCROLLED_WINDOW (ptr);
+ /* sw = GTK_SCROLLED_WINDOW (ptr); */
- gtk_signal_emit_by_name (GTK_OBJECT (GTK_SCROLLED_WINDOW(sw)->vscrollbar),
- "size_request", &myreq);
- //gtk_widget_size_request(GTK_WIDGET (GTK_SCROLLED_WINDOW(sw)->hscrollbar),
- // &myreq);
- dims[0]=myreq.width+GTK_SCROLLED_WINDOW_CLASS
- (GTK_OBJECT (sw)->klass)->scrollbar_spacing;
-
- gtk_signal_emit_by_name (GTK_OBJECT (GTK_SCROLLED_WINDOW(sw)->hscrollbar),
- "size_request", &myreq);
- //gtk_widget_size_request(GTK_WIDGET (GTK_SCROLLED_WINDOW(sw)->vscrollbar),
- // &myreq);
- dims[1]=myreq.height+GTK_SCROLLED_WINDOW_CLASS
- (GTK_OBJECT (sw)->klass)->scrollbar_spacing;
-
- /* The '1' in the following assignments is from
- #define TEXT_BORDER_ROOM 1
- in gtktext.c */
-
- /* Gtk text seems to wrap slightly prematurely. Compensate. */
- ++cols;
- ++dims[0];
-
- dims[0] += ((cols * gdk_char_width (text->style->font, 'W'))
- + (2 * (text->style->klass->xthickness + 1)));
- /* Guess at the height. Is there a better way? */
- dims[1] += ((rows * gdk_string_height (text->style->font, "Wg"))
- + (2 * (text->style->klass->ythickness + 1)));
+ gtk_widget_size_request(GTK_WIDGET (text), &requisition);
+ dims[0] = requisition.width;
+ dims[1] = requisition.height;
gdk_threads_leave ();
@@ -173,6 +104,9 @@
Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_insert
(JNIEnv *env, jobject obj, jstring contents, jint position)
{
+ GtkTextBuffer *buf;
+ GtkTextIter iter;
+ GtkWidget *text;
void *ptr;
const char *str;
int pos=position;
@@ -181,8 +115,13 @@
str = (*env)->GetStringUTFChars (env, contents, NULL);
gdk_threads_enter ();
- gtk_editable_insert_text (GTK_EDITABLE (TEXT_FROM_SW (ptr)),
- str, strlen (str), &pos);
+
+ text = GTK_WIDGET (TEXT_FROM_SW (ptr));
+
+ buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+ gtk_text_buffer_get_iter_at_offset (buf, &iter, pos);
+ gtk_text_buffer_insert (buf, &iter, str, strlen (str));
+
gdk_threads_leave ();
(*env)->ReleaseStringUTFChars (env, contents, str);
@@ -192,21 +131,29 @@
Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_replaceRange
(JNIEnv *env, jobject obj, jstring contents, jint start, jint end)
{
+ GtkWidget *text;
+ GtkTextBuffer *buf;
+ GtkTextIter iter, startIter, endIter;
void *ptr;
- GtkEditable *text;
const char *str;
- int pos = start;
+ int mystart = start;
+ int myend = end;
ptr = NSA_GET_PTR (env, obj);
str = (*env)->GetStringUTFChars (env, contents, NULL);
gdk_threads_enter ();
- text = GTK_EDITABLE (TEXT_FROM_SW (ptr));
- gtk_text_freeze (GTK_TEXT (text));
- gtk_editable_delete_text (text, start, end);
- gtk_editable_insert_text (text, str, strlen (str), &pos);
- gtk_text_thaw (GTK_TEXT (text));
+ text = GTK_WIDGET (TEXT_FROM_SW (ptr));
+
+ buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+
+ gtk_text_buffer_get_iter_at_offset (buf, &startIter, mystart);
+ gtk_text_buffer_get_iter_at_offset (buf, &endIter, myend);
+ gtk_text_buffer_delete (buf, &startIter, &endIter);
+
+ gtk_text_buffer_get_iter_at_offset (buf, &iter, mystart);
+ gtk_text_buffer_insert(buf, &iter, str, strlen (str));
gdk_threads_leave ();
(*env)->ReleaseStringUTFChars (env, contents, str);
@@ -216,31 +163,25 @@
Java_gnu_java_awt_peer_gtk_GtkTextAreaPeer_gtkSetFont
(JNIEnv *env, jobject obj, jstring jname, jint size)
{
- const char *xlfd;
-# define FBUFSZ 200
- char buf[FBUFSZ];
+ const char *font_name;
void *ptr;
- GdkFont * new_font;
- GtkStyle * style;
- GtkWidget * text;
+ GtkWidget *text;
+ PangoFontDescription *font_desc;
ptr = NSA_GET_PTR (env, obj);
text = GTK_WIDGET (TEXT_FROM_SW (ptr));
- xlfd = (*env)->GetStringUTFChars (env, jname, NULL);
- snprintf(buf, FBUFSZ, xlfd, size);
- (*env)->ReleaseStringUTFChars (env, jname, xlfd);
+ font_name = (*env)->GetStringUTFChars (env, jname, NULL);
+
gdk_threads_enter();
- new_font = gdk_font_load (buf); /* FIXME: deprecated. Replacement? */
- if (new_font == NULL)
- {
- /* Fail quietly for now. */
- gdk_threads_leave();
- return;
- }
- style = gtk_style_copy (gtk_widget_get_style (text));
- style -> font = new_font;
- gtk_widget_set_style (text , style);
- /* FIXME: Documentation varies as to whether we should unref style. */
+
+ font_desc = pango_font_description_from_string (font_name);
+ pango_font_description_set_size (font_desc, size);
+ gtk_widget_modify_font (GTK_WIDGET(text), font_desc);
+ pango_font_description_free (font_desc);
+
gdk_threads_leave();
+
+ (*env)->ReleaseStringUTFChars (env, jname, font_name);
+
}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c,v
retrieving revision 1.1
diff -u -b -B -r1.1 gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c 31 Jan 2003 17:54:14 -0000 1.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c 30 Jun 2003 17:36:44 -0000
@@ -39,20 +39,47 @@
#include "gtkpeer.h"
#include "gnu_java_awt_peer_gtk_GtkTextComponentPeer.h"
-#define GET_EDITABLE(obj) (GTK_IS_EDITABLE (obj) ? GTK_EDITABLE (obj) : \
- GTK_EDITABLE (GTK_SCROLLED_WINDOW (obj)->container.child))
-
JNIEXPORT jint JNICALL
Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getCaretPosition
(JNIEnv *env, jobject obj)
{
void *ptr;
int pos;
+ GtkEditable *editable; // type of GtkEntry (TextField)
+ GtkWidget *text = NULL; // type of GtkTextView (TextArea)
+ GtkTextBuffer *buf;
+ GtkTextMark *mark;
+ GtkTextIter iter;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
- pos = gtk_editable_get_position (GET_EDITABLE (ptr));
+
+ if (GTK_IS_EDITABLE (ptr))
+ {
+ editable = GTK_EDITABLE (ptr);
+ pos = gtk_editable_get_position (editable);
+ }
+ else
+ {
+ if (GTK_IS_SCROLLED_WINDOW (ptr))
+ {
+ text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
+ }
+ else if (GTK_IS_TEXT_VIEW (ptr))
+ {
+ text = GTK_WIDGET (ptr);
+ }
+
+ if (text)
+ {
+ buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+ mark = gtk_text_buffer_get_insert (buf);
+ gtk_text_buffer_get_iter_at_mark (buf, &iter, mark);
+ pos = gtk_text_iter_get_offset (&iter);
+ }
+ }
+
gdk_threads_leave ();
return pos;
@@ -63,11 +90,40 @@
(JNIEnv *env, jobject obj, jint pos)
{
void *ptr;
+ GtkEditable *editable; // type of GtkEntry (TextField)
+ GtkWidget *text = NULL; // type of GtkTextView (TextArea)
+ GtkTextBuffer *buf;
+ GtkTextMark *mark;
+ GtkTextIter iter;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
- gtk_editable_set_position (GET_EDITABLE (ptr), pos);
+ if (GTK_IS_EDITABLE (ptr))
+ {
+ editable = GTK_EDITABLE (ptr);
+ gtk_editable_set_position (editable, pos);
+ }
+ else
+ {
+ if (GTK_IS_SCROLLED_WINDOW (ptr))
+ {
+ text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
+ }
+ else if (GTK_IS_TEXT_VIEW (ptr))
+ {
+ text = GTK_WIDGET (ptr);
+ }
+
+ if (text)
+ {
+ buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+ mark = gtk_text_buffer_get_insert (buf);
+ gtk_text_buffer_get_iter_at_mark (buf, &iter, mark);
+ gtk_text_iter_set_offset (&iter, pos);
+ }
+ }
+
gdk_threads_leave ();
}
@@ -77,11 +133,42 @@
{
void *ptr;
int pos;
+ GtkEditable *editable; // type of GtkEntry (TextField)
+ GtkWidget *text = NULL; // type of GtkTextView (TextArea)
+ GtkTextBuffer *buf;
+ GtkTextIter start;
+ GtkTextIter end;
+ int starti, endi;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
- pos = GET_EDITABLE (ptr)->selection_start_pos;
+
+ if (GTK_IS_EDITABLE (ptr))
+ {
+ editable = GTK_EDITABLE (ptr);
+ if (gtk_editable_get_selection_bounds (editable, &starti, &endi))
+ pos = starti;
+ }
+ else
+ {
+ if (GTK_IS_SCROLLED_WINDOW (ptr))
+ {
+ text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
+ }
+ else if (GTK_IS_TEXT_VIEW (ptr))
+ {
+ text = GTK_WIDGET (ptr);
+ }
+
+ if (text)
+ {
+ buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+ if (gtk_text_buffer_get_selection_bounds(buf, &start, &end))
+ pos = gtk_text_iter_get_offset (&start);
+ }
+ }
+
gdk_threads_leave ();
return pos;
@@ -93,11 +180,42 @@
{
void *ptr;
int pos;
+ GtkEditable *editable; // type of GtkEntry (TextField)
+ GtkWidget *text = NULL; // type of GtkTextView (TextArea)
+ GtkTextBuffer *buf;
+ GtkTextIter start;
+ GtkTextIter end;
+ int starti, endi;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
- pos = GET_EDITABLE (ptr)->selection_end_pos;
+
+ if (GTK_IS_EDITABLE (ptr))
+ {
+ editable = GTK_EDITABLE (ptr);
+ if (gtk_editable_get_selection_bounds (editable, &starti, &endi))
+ pos = endi;
+ }
+ else
+ {
+ if (GTK_IS_SCROLLED_WINDOW (ptr))
+ {
+ text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
+ }
+ else if (GTK_IS_TEXT_VIEW (ptr))
+ {
+ text = GTK_WIDGET (ptr);
+ }
+
+ if (text)
+ {
+ buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+ if (gtk_text_buffer_get_selection_bounds(buf, &start, &end))
+ pos = gtk_text_iter_get_offset (&end);
+ }
+ }
+
gdk_threads_leave ();
return pos;
@@ -108,11 +226,44 @@
(JNIEnv *env, jobject obj, jint start, jint end)
{
void *ptr;
+ GtkEditable *editable; // type of GtkEntry (TextField)
+ GtkWidget *text = NULL; // type of GtkTextView (TextArea)
+ GtkTextBuffer *buf;
+ GtkTextIter iter;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
- gtk_editable_select_region (GET_EDITABLE (ptr), start, end);
+
+
+ if (GTK_IS_EDITABLE (ptr))
+ {
+ editable = GTK_EDITABLE (ptr);
+ gtk_editable_select_region (editable, start, end);
+ }
+ else
+ {
+ if (GTK_IS_SCROLLED_WINDOW (ptr))
+ {
+ text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
+ }
+ else if (GTK_IS_TEXT_VIEW (ptr))
+ {
+ text = GTK_WIDGET (ptr);
+ }
+
+ if (text)
+ {
+ buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+ gtk_text_buffer_get_iter_at_offset (buf, &iter, start);
+ /* quickly move both 'insert' and 'selection_bound' to the
+ same position */
+ gtk_text_buffer_place_cursor (buf, &iter);
+ gtk_text_buffer_get_iter_at_offset (buf, &iter, end);
+ gtk_text_buffer_move_mark_by_name (buf, "selection_bound", &iter);
+ }
+ }
+
gdk_threads_leave ();
}
@@ -121,11 +272,35 @@
(JNIEnv *env, jobject obj, jboolean state)
{
void *ptr;
+ GtkEditable *editable; // type of GtkEntry (TextField)
+ GtkWidget *text = NULL; // type of GtkTextView (TextArea)
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
- gtk_editable_set_editable (GET_EDITABLE (ptr), state);
+
+ if (GTK_IS_EDITABLE (ptr))
+ {
+ editable = GTK_EDITABLE (ptr);
+ gtk_editable_set_editable (editable, state);
+ }
+ else
+ {
+ if (GTK_IS_SCROLLED_WINDOW (ptr))
+ {
+ text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
+ }
+ else if (GTK_IS_TEXT_VIEW (ptr))
+ {
+ text = GTK_WIDGET (ptr);
+ }
+
+ if (text)
+ {
+ gtk_text_view_set_editable (GTK_TEXT_VIEW (text), state);
+ }
+ }
+
gdk_threads_leave ();
}
@@ -136,11 +311,40 @@
void *ptr;
char *contents;
jstring jcontents;
+ GtkEditable *editable; // type of GtkEntry (TextField)
+ GtkWidget *text = NULL; // type of GtkTextView (TextArea)
+ GtkTextBuffer *buf;
+ GtkTextIter start, end;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
- contents = gtk_editable_get_chars (GET_EDITABLE (ptr), 0, -1);
+
+ if (GTK_IS_EDITABLE (ptr))
+ {
+ editable = GTK_EDITABLE (ptr);
+ contents = gtk_editable_get_chars (editable, 0, -1);
+ }
+ else
+ {
+ if (GTK_IS_SCROLLED_WINDOW (ptr))
+ {
+ text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
+ }
+ else if (GTK_IS_TEXT_VIEW (ptr))
+ {
+ text = GTK_WIDGET (ptr);
+ }
+
+ if (text)
+ {
+ buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+ gtk_text_buffer_get_start_iter (buf, &start);
+ gtk_text_buffer_get_end_iter (buf, &end);
+ contents = gtk_text_buffer_get_text (buf, &start, &end, FALSE);
+ }
+ }
+
gdk_threads_leave ();
jcontents = (*env)->NewStringUTF (env, contents);
@@ -154,25 +358,36 @@
(JNIEnv *env, jobject obj, jstring contents)
{
void *ptr;
- GtkEditable *text;
const char *str;
- int pos = 0;
+ GtkWidget *text = NULL; // type of GtkTextView (TextArea)
+ GtkTextBuffer *buf;
ptr = NSA_GET_PTR (env, obj);
str = (*env)->GetStringUTFChars (env, contents, NULL);
gdk_threads_enter ();
- text = GET_EDITABLE (ptr);
-
- if (GTK_IS_TEXT (text))
- gtk_text_freeze (GTK_TEXT (text));
-
- gtk_editable_delete_text (text, 0, -1);
- gtk_editable_insert_text (text, str, strlen (str), &pos);
-
- if (GTK_IS_TEXT (text))
- gtk_text_thaw (GTK_TEXT (text));
+ if (GTK_IS_EDITABLE (ptr))
+ {
+ gtk_entry_set_text (GTK_ENTRY (ptr), str);
+ }
+ else
+ {
+ if (GTK_IS_SCROLLED_WINDOW (ptr))
+ {
+ text = GTK_WIDGET (GTK_TEXT_VIEW (GTK_SCROLLED_WINDOW (ptr)->container.child));
+ }
+ else if (GTK_IS_TEXT_VIEW (ptr))
+ {
+ text = GTK_WIDGET (ptr);
+ }
+
+ if (text)
+ {
+ buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
+ gtk_text_buffer_set_text (buf, str, strlen (str));
+ }
+ }
gdk_threads_leave ();
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c,v
retrieving revision 1.2
diff -u -b -B -r1.2 gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c 19 Feb 2003 00:35:35 -0000 1.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c 30 Jun 2003 17:36:44 -0000
@@ -43,10 +43,10 @@
Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_create
(JNIEnv *env, jobject obj)
{
- gpointer widget;
+ GtkWidget *widget;
gdk_threads_enter ();
- widget = gtk_type_new (gtk_entry_get_type ());
+ widget = gtk_entry_new ();
gdk_threads_leave ();
NSA_SET_PTR (env, obj, widget);
@@ -68,36 +68,6 @@
gdk_threads_leave ();
}
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_old_create
- (JNIEnv *env, jobject obj, jobject parent_obj, jstring text)
-{
- GtkWidget *entry;
- const char *str;
- void *parent;
-
- parent = NSA_GET_PTR (env, parent_obj);
-
- str = (*env)->GetStringUTFChars (env, text, NULL);
- gdk_threads_enter ();
-
- entry = gtk_entry_new ();
- gtk_entry_set_text (GTK_ENTRY (entry), str);
-
- set_parent (entry, GTK_CONTAINER (parent));
-
- gtk_widget_realize (entry);
- connect_awt_hook (env, obj, 2,
- entry->window, GTK_ENTRY (entry)->text_area);
-
- NSA_SET_PTR (env, obj, entry);
-
- gdk_threads_leave ();
- (*env)->ReleaseStringUTFChars (env, text, str);
-}
-
-
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkEntryGetSize
(JNIEnv *env, jobject obj, jint cols, jintArray jdims)
@@ -105,19 +75,16 @@
void *ptr;
jint *dims;
GtkRequisition myreq;
- GtkEntry *entry;
+ GtkWidget *entry;
ptr = NSA_GET_PTR (env, obj);
dims = (*env)->GetIntArrayElements (env, jdims, 0);
gdk_threads_enter ();
- entry = GTK_ENTRY (ptr);
-
- gtk_signal_emit_by_name (GTK_OBJECT (entry), "size_request", &myreq);
- dims[0]=myreq.width-150 + (cols *
- gdk_char_width (GTK_WIDGET (entry)->style->font,
- 'W'));
+ entry = GTK_WIDGET (ptr);
+ gtk_widget_size_request(entry, &myreq);
+ dims[0]=myreq.width;
dims[1]=myreq.height;
gdk_threads_leave ();
@@ -153,31 +120,24 @@
Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkSetFont
(JNIEnv *env, jobject obj, jstring jname, jint size)
{
- const char *xlfd;
-# define FBUFSZ 200
- char buf[FBUFSZ];
+ const char *font_name;
void *ptr;
- GdkFont * new_font;
- GtkStyle * style;
- GtkWidget * text;
+ GtkWidget *entry;
+ PangoFontDescription *font_desc;
ptr = NSA_GET_PTR (env, obj);
- text = GTK_WIDGET (ptr);
- xlfd = (*env)->GetStringUTFChars (env, jname, NULL);
- snprintf(buf, FBUFSZ, xlfd, size);
- (*env)->ReleaseStringUTFChars (env, jname, xlfd);
+ entry = GTK_WIDGET (ptr);
+ font_name = (*env)->GetStringUTFChars (env, jname, NULL);
+
gdk_threads_enter();
- new_font = gdk_font_load(buf); /* FIXME: deprecated. Replacement? */
- if (new_font == NULL)
- {
- /* Fail quietly for now. */
- gdk_threads_leave();
- return;
- }
- style = gtk_style_copy (gtk_widget_get_style (text));
- style -> font = new_font;
- gtk_widget_set_style (text , style);
- /* FIXME: Documentation varies as to whether we should unref style. */
+
+ font_desc = pango_font_description_from_string (font_name);
+ pango_font_description_set_size (font_desc, size);
+ gtk_widget_modify_font (GTK_WIDGET(entry), font_desc);
+ pango_font_description_free (font_desc);
+
gdk_threads_leave();
+
+ (*env)->ReleaseStringUTFChars (env, jname, font_name);
}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c,v
retrieving revision 1.1
diff -u -b -B -r1.1 gnu_java_awt_peer_gtk_GtkWindowPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c 31 Jan 2003 17:54:14 -0000 1.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c 30 Jun 2003 17:36:44 -0000
@@ -93,17 +93,37 @@
(JNIEnv *env, jobject obj)
{
void *ptr;
+ GtkVBox* vbox;
GtkWidget *layout;
-
+ GList* children;
+ char* name;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
- layout = GTK_WIDGET (gtk_container_children (GTK_CONTAINER (GTK_BIN (ptr)->child))->data);
+
+ children = gtk_container_get_children(GTK_CONTAINER(ptr));
+ vbox = children->data;
+ name = GTK_OBJECT_TYPE_NAME(vbox);
+ if(!GTK_IS_VBOX(vbox))
+ {
+ printf("*** this is not a vbox\n");
+ }
+ children = gtk_container_get_children(GTK_CONTAINER(vbox));
+ layout = children->data;
+ name = GTK_OBJECT_TYPE_NAME(layout);
+ if(!GTK_IS_LAYOUT(layout))
+ {
+ printf("*** widget is not a layout ***");
+ }
+
gtk_widget_realize (layout);
+
connect_awt_hook (env, obj, 1, GTK_LAYOUT (layout)->bin_window);
- gtk_widget_realize (GTK_WIDGET (ptr));
+ gtk_widget_realize (ptr);
+
connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
+
gdk_threads_leave ();
}
@@ -112,8 +132,8 @@
jint height, jboolean visible)
{
GtkWidget *layout, *vbox;
- gint x, y;
+ gdk_threads_enter();
gtk_window_set_policy (GTK_WINDOW (window), 1, 1, 0);
gtk_widget_set_usize (window, width, height);
@@ -131,6 +151,7 @@
connect_awt_hook (env, obj, 1, window->window);
set_visible (window, visible);
+ gdk_threads_leave ();
}
/*
@@ -212,9 +233,6 @@
static void
setBounds (GtkWidget *widget, jint x, jint y, jint width, jint height)
{
- gint current_x, current_y;
- gint origin_x, origin_y;
-
/* gdk_window_get_root_origin (widget->window, ¤t_x, ¤t_y); */
/* if (current_x != x || current_y != y) */
@@ -295,16 +313,12 @@
gint *border,
gint *depth)
{
- GdkWindowPrivate *private;
- Window xwindow;
- Window xparent;
- Window root;
- Window *children;
+ GdkWindow *private;
unsigned int nchildren;
g_return_if_fail (window != NULL);
- private = (GdkWindowPrivate*) window;
+ private = (GdkWindow*) window;
if (x)
*x = 0;
if (y)
@@ -318,48 +332,14 @@
if (depth)
*depth = 0;
- if (private->destroyed)
+ if (GDK_WINDOW_DESTROYED (private))
return;
- while (private->parent && ((GdkWindowPrivate*) private->parent)->parent)
- private = (GdkWindowPrivate*) private->parent;
- if (private->destroyed)
+ private = gdk_window_get_toplevel (private);
+ if (GDK_WINDOW_DESTROYED(private))
return;
- xparent = private->xwindow;
- do
- {
- xwindow = xparent;
- if (!XQueryTree (private->xdisplay, xwindow,
- &root, &xparent,
- &children, &nchildren))
- return;
+ gdk_window_get_geometry (private, x, y, width, height, depth);
- if (children)
- XFree (children);
- }
- while (xparent != root);
-
- if (xparent == root)
- {
- unsigned int ww, wh, wb, wd;
- int wx, wy;
-
- if (XGetGeometry (private->xdisplay, xwindow, &root, &wx, &wy, &ww, &wh, &wb, &wd))
- {
- if (x)
- *x = wx;
- if (y)
- *y = wy;
- if (width)
- *width = ww;
- if (height)
- *height = wh;
- if (border)
- *border = wb;
- if (depth)
- *depth = wd;
- }
- }
}
Index: jni/gtk-peer/gthread-jni.c
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/jni/gtk-peer/gthread-jni.c,v
retrieving revision 1.1
diff -u -b -B -r1.1 gthread-jni.c
--- jni/gtk-peer/gthread-jni.c 31 Jan 2003 17:54:14 -0000 1.1
+++ jni/gtk-peer/gthread-jni.c 30 Jun 2003 17:36:45 -0000
@@ -35,116 +35,430 @@
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
+/************************************************************************/
+/* Header */
+/************************************************************************/
+
+/*
+ * Julian Dolby (dolby@us.ibm.com)
+ * February 7, 2003
+ *
+ * This code implements the GThreadFunctions interface for GLIB using
+ * Java threading primitives. All of the locking and conditional variable
+ * functionality required by GThreadFunctions is implemented using the
+ * monitor and wait/notify functionality of Java objects. The thread-
+ * local fucntionality uses the java.lang.ThreadLocal class.
+ *
+ * This code is designed to be portable in that it makes no assumptions
+ * about the underlying VM beyond that it implements the JNI functionality
+ * that this code uses.
+ *
+ * The one piece that does not really work is trylock for mutexes. The
+ * Java locking model does not include such functionality, and I do not
+ * see how to implement it without knowing something about how the VM
+ * implements locking.
+ *
+ * NOTES:
+ *
+ * I have tested it only on JikesRVM---the CVS head as of early February
+ * 2003.
+ *
+ * Currently, use of this code is governed by the configuration option
+ * --enable-portable-native-sync
+ *
+ */
+
+
+/************************************************************************/
+/* Global data */
+/************************************************************************/
#include "gthread-jni.h"
-/*
- * This code has been written specifically to be used with GTK+ 1.2.
- * `Real' GLIB threading is not supported. We fake things where necessary.
- * Once we know we're running on a 1.2 VM, we can write a real implementation.
+/* The VM handle. This is set in GtkToolkitMain.gtkInit */
+JavaVM *gdk_vm;
+
+
+/************************************************************************/
+/* Utilities to reflect exceptions back to the VM */
+/************************************************************************/
+
+/* This function checks for a pending exception, and rethrows it with
+ * a wrapper RuntimeException to deal with possible type problems (in
+ * case some calling piece of code does not expect the exception being
+ * thrown) and to include the given extra message.
*/
+static void maybe_rethrow(JNIEnv *gdk_env, char *message, char *file, int line) {
+ jthrowable cause;
-static GMutex *
-g_mutex_new_jni_impl (void)
-{
+ /* rethrow if an exception happened */
+ if ((cause = (*gdk_env)->ExceptionOccurred(gdk_env)) != NULL) {
+ jstring jmessage;
jclass obj_class;
- jobject *mutex;
+ jobject obj;
+ jmethodID ctor;
- obj_class = (*gdk_env)->FindClass (gdk_env, "java/lang/Object");
- if (obj_class == NULL)
- return NULL;
+ /* allocate local message in Java */
+ int len = strlen(message) + strlen(file) + 25;
+ char buf[ len ];
+ bzero(buf, len);
+ sprintf(buf, "%s (at %s:%d)", message, file, line);
+ jmessage = (*gdk_env)->NewStringUTF(gdk_env, buf);
+
+ /* create RuntimeException wrapper object */
+ obj_class = (*gdk_env)->FindClass (gdk_env, "java/lang/RuntimeException");
+ ctor = (*gdk_env)->GetMethodID(gdk_env, obj_class, "<init>", "(Ljava/langString;Ljava/lang/Throwable)V");
+ obj = (*gdk_env)->NewObject (gdk_env, obj_class, ctor, jmessage, cause);
- mutex = (jobject *) g_malloc (sizeof (jobject));
- *mutex = (*gdk_env)->AllocObject (gdk_env, obj_class);
- if (*mutex == NULL)
- {
- g_free (mutex);
- return NULL;
+ /* throw it */
+ (*gdk_env)->Throw(gdk_env, (jthrowable)obj);
}
- *mutex = (*gdk_env)->NewGlobalRef (gdk_env, *mutex);
+}
+
+/* This macro is used to include a source location in the exception message */
+#define MAYBE_RETHROW(_class, _message) \
+maybe_rethrow(_class, _message, __FILE__, __LINE__)
+
+
+/************************************************************************/
+/* Utilities to allocate and free java.lang.Objects */
+/************************************************************************/
+
+/* Both the mutexes and the condition variables are java.lang.Object objects,
+ * which this method allocates and returns a global ref. Note that global
+ * refs must be explicitly freed (isn't C fun?).
+ */
+static jobject *allocatePlainObject() {
+ jclass obj_class;
+ jobject *obj;
+ JNIEnv *gdk_env;
+ jmethodID ctor;
- return (GMutex *) mutex;
+ (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1);
+
+ obj_class = (*gdk_env)->FindClass (gdk_env, "java/lang/Object");
+ MAYBE_RETHROW(gdk_env, "cannot find Object");
+
+ ctor = (*gdk_env)->GetMethodID(gdk_env, obj_class, "<init>", "()V");
+ MAYBE_RETHROW(gdk_env, "cannot find constructor");
+
+ obj = (jobject *) g_malloc (sizeof (jobject));
+ *obj = (*gdk_env)->NewObject (gdk_env, obj_class, ctor);
+ MAYBE_RETHROW(gdk_env, "cannot allocate object");
+
+ *obj = (*gdk_env)->NewGlobalRef (gdk_env, *obj);
+ MAYBE_RETHROW(gdk_env, "cannot make global ref");
+
+ return obj;
}
-static void
-g_mutex_lock_jni_impl (GMutex *mutex)
-{
- if (mutex && mutex == gdk_threads_mutex)
- (*gdk_env)->MonitorEnter (gdk_env, *((jobject *)mutex));
+/* Frees a Java object given a global ref (isn't C fun?) */
+static void freePlainObject(jobject *obj) {
+ JNIEnv *gdk_env;
+
+ if (obj) {
+ (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1);
+
+ (*gdk_env)->DeleteGlobalRef (gdk_env, *obj);
+ MAYBE_RETHROW(gdk_env, "cannot delete global ref");
+
+ g_free (obj);
+ }
}
-static gboolean
-g_mutex_trylock_jni_impl (GMutex *mutex)
-{
- return FALSE;
+
+/************************************************************************/
+/* Locking code */
+/************************************************************************/
+
+/* Lock a Java object */
+static void takeLock(JNIEnv *gdk_env, void *mutex) {
+ (*gdk_env)->MonitorEnter (gdk_env, *((jobject *)mutex));
+ MAYBE_RETHROW(gdk_env, "cannot get lock");
}
-static void
-g_mutex_unlock_jni_impl (GMutex *mutex)
-{
- if (mutex && mutex == gdk_threads_mutex)
+/* Unlock a Java object */
+static void releaseLock(JNIEnv *gdk_env, void *mutex) {
(*gdk_env)->MonitorExit (gdk_env, *((jobject *)mutex));
+ MAYBE_RETHROW(gdk_env, "cannot release lock");
}
-static void
-g_mutex_free_jni_impl (GMutex *mutex)
-{
- if (mutex && mutex == gdk_threads_mutex)
- {
- (*gdk_env)->DeleteGlobalRef (gdk_env, *((jobject *)mutex));
- g_free (mutex);
- }
+/* Create a mutex, which is a java.lang.Object for us */
+static GMutex *g_mutex_new_jni_impl (void) {
+ return (GMutex*) allocatePlainObject();
}
-static GPrivate *
-g_private_new_jni_impl (GDestroyNotify notify)
-{
- return NULL;
+/* Lock a mutex. */
+static void g_mutex_lock_jni_impl (GMutex *mutex) {
+ JNIEnv *gdk_env;
+
+ (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1);
+
+ takeLock(gdk_env, mutex);
}
-static gpointer
-g_private_get_jni_impl (GPrivate *private)
-{
- return NULL;
+/* Try to lock a mutex. Actually, do not try because Java objects
+ * do not provide such an interface. To be at least minimally correct,
+ * pretend we tried and failed.
+ */
+static gboolean g_mutex_trylock_jni_impl (GMutex *mutex) {
+ // Shall we implement this in a JikesRVM-specific way under a flag?
+ return FALSE;
}
-static void
-g_private_set_jni_impl (GPrivate *private, gpointer data)
-{
+/* Unlock a mutex. */
+static void g_mutex_unlock_jni_impl (GMutex *mutex) {
+ JNIEnv *gdk_env;
+
+ (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1);
+
+ releaseLock(gdk_env, mutex);
}
-static GCond *
-g_cond_new_jni_impl ()
+/* Free a mutex (isn't C fun?) */
+static void g_mutex_free_jni_impl (GMutex *mutex)
{
- return NULL;
+ freePlainObject( (jobject*)mutex );
}
-static void
-g_cond_signal_jni_impl (GCond *cond)
-{
+
+/************************************************************************/
+/* Condition variable code */
+/************************************************************************/
+
+/* Create a new condition variable. This is a java.lang.Object for us. */
+static GCond *g_cond_new_jni_impl () {
+ return (GCond*)allocatePlainObject();
}
-static void
-g_cond_broadcast_jni_impl (GCond *cond)
-{
+/* Signal on a condition variable. This is simply calling Object.notify
+ * for us.
+ */
+static void g_cond_signal_jni_impl (GCond *cond) {
+ jclass lcl_class;
+ jmethodID signal_mth;
+ JNIEnv *gdk_env;
+
+ (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1);
+
+ lcl_class = (*gdk_env)->FindClass (gdk_env, "java.lang.Object");
+ MAYBE_RETHROW(gdk_env, "cannot find Object");
+
+ signal_mth = (*gdk_env)->GetMethodID(gdk_env, lcl_class, "notify", "()V");
+ MAYBE_RETHROW(gdk_env, "cannot find Object.<notify>");
+
+ /* Must have locked an object to call notify */
+ takeLock(gdk_env, cond);
+
+ (*gdk_env)->CallVoidMethod(gdk_env, *(jobject*)cond, signal_mth);
+ MAYBE_RETHROW(gdk_env, "cannot signal mutex");
+
+ releaseLock(gdk_env, cond);
}
-static void
-g_cond_wait_jni_impl (GCond *cond, GMutex *mutex)
-{
+/* Broadcast to all waiting on a condition variable. This is simply
+ * calling Object.notifyAll for us.
+ */
+static void g_cond_broadcast_jni_impl (GCond *cond) {
+ jclass lcl_class;
+ jmethodID bcast_mth;
+ JNIEnv *gdk_env;
+
+ (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1);
+
+ lcl_class = (*gdk_env)->FindClass (gdk_env, "java.lang.Object");
+ MAYBE_RETHROW(gdk_env, "cannot find Object");
+
+ bcast_mth = (*gdk_env)->GetMethodID(gdk_env, lcl_class, "notifyAll", "()V");
+ MAYBE_RETHROW(gdk_env, "cannot find Object.<notifyAll>");
+
+ /* Must have locked an object to call notifyAll */
+ takeLock(gdk_env, cond);
+
+ (*gdk_env)->CallVoidMethod(gdk_env, *(jobject*)cond, bcast_mth);
+ MAYBE_RETHROW(gdk_env, "cannot broadcast to mutex");
+
+ releaseLock(gdk_env, cond);
+}
+
+
+/* Wait on a condition variable. For us, this simply means call
+ * Object.wait.
+ */
+static void g_cond_wait_jni_impl (GCond *cond, GMutex *mutex) {
+ jclass lcl_class;
+ jmethodID wait_mth;
+ JNIEnv *gdk_env;
+
+ (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1);
+
+ lcl_class = (*gdk_env)->FindClass (gdk_env, "java.lang.Object");
+ MAYBE_RETHROW(gdk_env, "cannot find Object");
+
+ wait_mth = (*gdk_env)->GetMethodID(gdk_env, lcl_class, "wait", "()V");
+ MAYBE_RETHROW(gdk_env, "cannot find Object.<wait>");
+
+ /* Must have locked an object to call wait */
+ takeLock(gdk_env, cond);
+
+ (*gdk_env)->CallVoidMethod(gdk_env, *(jobject*)cond, wait_mth);
+ MAYBE_RETHROW(gdk_env, "cannot wait on mutex");
+
+ releaseLock(gdk_env, cond);
}
+/* Wait on a condition vairable until a timeout. This is a little tricky
+ * for us. We first call Object.wait(J) giving it the appropriate timeout
+ * value. On return, we check whether an InterruptedException happened. If
+ * so, that is Java-speak for wait timing out.
+ */
static gboolean
-g_cond_timed_wait_jni_impl (GCond *cond, GMutex *mutex)
-{
+g_cond_timed_wait_jni_impl (GCond *cond, GMutex *mutex, GTimeVal *end_time) {
+ jclass lcl_class;
+ jmethodID wait_mth;
+ JNIEnv *gdk_env;
+ jlong time;
+ jthrowable cause;
+
+ (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1);
+
+ lcl_class = (*gdk_env)->FindClass (gdk_env, "java.lang.Object");
+ MAYBE_RETHROW(gdk_env, "cannot find Object");
+
+ wait_mth = (*gdk_env)->GetMethodID(gdk_env, lcl_class, "wait", "(J)V");
+ MAYBE_RETHROW(gdk_env, "cannot find Object.<wait(J)>");
+
+ time = end_time->tv_sec*1000;
+ time += end_time->tv_usec/1000;
+
+ /* Must have locked an object to call wait */
+ takeLock(gdk_env, cond);
+
+ (*gdk_env)->CallVoidMethod(gdk_env, *(jobject*)cond, wait_mth, time);
+
+ if ((cause = (*gdk_env)->ExceptionOccurred(gdk_env)) != NULL) {
+ jclass intr = (*gdk_env)->FindClass (gdk_env, "java.lang.InterruptedException");
+ if ( (*gdk_env)->IsInstanceOf(gdk_env, cause, intr) ) {
+ releaseLock(gdk_env, cond);
return FALSE;
+ } else {
+ MAYBE_RETHROW(gdk_env, "error in timed wait");
+ }
+ }
+
+ releaseLock(gdk_env, cond);
+
+ return TRUE;
}
-static void
-g_cond_free_jni_impl (GCond *cond)
-{
+/* Free a condition variable. (isn't C fun?) */
+static void g_cond_free_jni_impl (GCond *cond) {
+ freePlainObject( (jobject*)cond );
+}
+
+
+/************************************************************************/
+/* Thread-local data code */
+/************************************************************************/
+
+/* Create a new thread-local key. We use java.lang.ThreadLocal objects
+ * for this.
+ */
+static GPrivate *g_private_new_jni_impl (GDestroyNotify notify) {
+ jclass lcl_class;
+ jobject *local;
+ JNIEnv *gdk_env;
+ jmethodID ctor;
+
+ (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1);
+
+ lcl_class = (*gdk_env)->FindClass (gdk_env, "java.lang.ThreadLocal");
+ MAYBE_RETHROW(gdk_env, "cannot find ThreadLocal");
+
+ ctor = (*gdk_env)->GetMethodID(gdk_env, lcl_class, "<init>", "()V");
+ MAYBE_RETHROW(gdk_env, "cannot find ThreadLocal.<init>");
+
+ local = (jobject *) g_malloc (sizeof (jobject));
+ *local = (*gdk_env)->NewObject(gdk_env, lcl_class, ctor);
+ MAYBE_RETHROW(gdk_env, "cannot allocate a ThreadLocal");
+
+ *local = ((*gdk_env)->NewGlobalRef (gdk_env, *local));
+ MAYBE_RETHROW(gdk_env, "cannot create a GlobalRef");
+
+ return (GPrivate*) local;
}
+/* Get this thread's value for a thread-local key. This is simply
+ * ThreadLocal.get for us.
+ */
+static gpointer g_private_get_jni_impl (GPrivate *private) {
+ jclass lcl_class;
+ jobject lcl_obj;
+ JNIEnv *gdk_env;
+ jmethodID get_mth;
+ jclass int_class;
+ jmethodID val_mth;
+ jint int_val;
+
+ (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1);
+
+ lcl_class = (*gdk_env)->FindClass (gdk_env, "java.lang.ThreadLocal");
+ MAYBE_RETHROW(gdk_env, "cannot find ThreadLocal");
+
+ get_mth = (*gdk_env)->GetMethodID(gdk_env, lcl_class, "get", "()Ljava/lang/Object;");
+ MAYBE_RETHROW(gdk_env, "cannot find ThreadLocal.<get>");
+
+ lcl_obj = (*gdk_env)->CallObjectMethod(gdk_env, *(jobject*)private, get_mth);
+ MAYBE_RETHROW(gdk_env, "cannot find thread-local object");
+
+ int_class = (*gdk_env)->FindClass (gdk_env, "java.lang.Integer");
+ MAYBE_RETHROW(gdk_env, "cannot find Integer");
+
+ val_mth = (*gdk_env)->GetMethodID(gdk_env, int_class, "intValue", "()I");
+ MAYBE_RETHROW(gdk_env, "cannot find Integer.<intValue>");
+
+ int_val = (*gdk_env)->CallIntMethod(gdk_env, lcl_obj, val_mth);
+ MAYBE_RETHROW(gdk_env, "cannot get thread local value");
+
+ return (gpointer) int_val;
+}
+
+/* Set this thread's value for a thread-local key. This is simply
+ * ThreadLocal.set for us.
+ */
+static void g_private_set_jni_impl (GPrivate *private, gpointer data) {
+ jclass lcl_class, int_class;
+ jobject lcl_obj;
+ JNIEnv *gdk_env;
+ jmethodID new_int, set_mth;
+
+ (*gdk_vm)->GetEnv(gdk_vm, (void **)&gdk_env, JNI_VERSION_1_1);
+
+ int_class = (*gdk_env)->FindClass (gdk_env, "java.lang.Integer");
+ MAYBE_RETHROW(gdk_env, "cannot find Integer");
+
+ new_int = (*gdk_env)->GetMethodID(gdk_env, int_class, "<init>", "(I)V");
+ MAYBE_RETHROW(gdk_env, "cannot find Integer.<init>");
+
+ lcl_obj = (*gdk_env)->NewObject(gdk_env, int_class, new_int, (jint)data);
+ MAYBE_RETHROW(gdk_env, "cannot create an Integer");
+
+ lcl_class = (*gdk_env)->FindClass (gdk_env, "java.lang.ThreadLocal");
+ MAYBE_RETHROW(gdk_env, "cannot find ThreadLocal");
+
+ set_mth = (*gdk_env)->GetMethodID(gdk_env, lcl_class, "set", "(Ljava/lang/Object;)V");
+ MAYBE_RETHROW(gdk_env, "cannot find ThreadLocal.<set>");
+
+ (*gdk_env)->CallVoidMethod(gdk_env, *(jobject*)private, set_mth, lcl_obj);
+ MAYBE_RETHROW(gdk_env, "cannot set thread local value");
+}
+
+
+/************************************************************************/
+/* GLIB interface */
+/************************************************************************/
+
+/* set of function pointers to give to glib. */
GThreadFunctions g_thread_jni_functions =
{
g_mutex_new_jni_impl, /* mutex_new */
@@ -163,7 +477,7 @@
g_private_set_jni_impl /* private_set */
};
-void
-gdk_threads_wake ()
-{
+/* ??? */
+void gdk_threads_wake () {
+
}
Index: jni/gtk-peer/gthread-jni.h
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/jni/gtk-peer/gthread-jni.h,v
retrieving revision 1.1
diff -u -b -B -r1.1 gthread-jni.h
--- jni/gtk-peer/gthread-jni.h 31 Jan 2003 17:54:14 -0000 1.1
+++ jni/gtk-peer/gthread-jni.h 30 Jun 2003 17:36:45 -0000
@@ -43,5 +43,6 @@
#include "gtkpeer.h"
extern GThreadFunctions g_thread_jni_functions;
+extern JavaVM *gdk_vm;
#endif /* __GTHREADJNI_H__ */
More information about the Java-patches
mailing list