goocanvas-1.0.0/ 0000755 0000764 0000764 00000000000 11512612761 010503 5 0000000 0000000 goocanvas-1.0.0/configure.in 0000644 0000764 0000764 00000004222 11512612534 012732 0000000 0000000 dnl Process this file with autoconf to produce a configure script.
AC_INIT(goocanvas, 1.0.0)
AC_PREREQ(2.50)
AC_CONFIG_SRCDIR(src/goocanvas.c)
AC_CONFIG_HEADERS(config.h)
AM_INIT_AUTOMAKE
# Libtool versioning - only update before a public release.
# If the code has changed at all: REVISION++.
# If any interfaces have changed at all: CURRENT++, REVISION=0.
# If interfaces changed but it is backwards compatible: AGE++, else AGE=0.
# i.e. the library supports interfaces CURRENT - AGE up to CURRENT.
# if two libraries have identical CURRENT and AGE, then newest REVISION used.
CURRENT=8
AGE=5
REVISION=0
LT_VERSION_INFO="$CURRENT:$REVISION:$AGE"
AC_SUBST(LT_VERSION_INFO)
AM_MAINTAINER_MODE
AC_ISC_POSIX
AC_PROG_CC
AC_HEADER_STDC
AM_PROG_LIBTOOL
pkg_modules="gtk+-2.0 >= 2.12.0 glib-2.0 >= 2.10.0 cairo >= 1.4.0"
PKG_CHECK_MODULES(PACKAGE, [$pkg_modules])
AC_SUBST(PACKAGE_CFLAGS)
AC_SUBST(PACKAGE_LIBS)
GETTEXT_PACKAGE=goocanvas
AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package.])
dnl i18n
ALL_LINGUAS="`grep -v '^#' "$srcdir/po/LINGUAS" | tr '\n' ' '`"
AM_GLIB_GNU_GETTEXT
GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0`
AC_SUBST(GLIB_GENMARSHAL)
GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
AC_SUBST(GLIB_MKENUMS)
AC_ARG_ENABLE(rebuilds,
[AC_HELP_STRING([--disable-rebuilds],
[disable all source autogeneration rules])],,
[enable_rebuilds=yes])
# define a MAINT-like variable REBUILD which is set if Perl
# and awk are found, so autogenerated sources can be rebuilt
AC_PATH_PROGS(PERL, perl5 perl)
REBUILD=\#
if test "x$enable_rebuilds" = "xyes" && \
test -n "$PERL" && \
$PERL -e 'exit !($] >= 5.002)' > /dev/null 2>&1 ; then
REBUILD=
fi
AC_SUBST(REBUILD)
AC_MSG_CHECKING([for some Win32 platform])
case "$host" in
*-*-mingw*|*-*-cygwin*)
platform_win32=yes
;;
*)
platform_win32=no
;;
esac
AC_MSG_RESULT([$platform_win32])
AM_CONDITIONAL(PLATFORM_WIN32, test "$platform_win32" = "yes")
GTK_DOC_CHECK(1.8)
AC_OUTPUT([
Makefile
src/Makefile
demo/Makefile
docs/Makefile
po/Makefile.in
goocanvas.pc
])
goocanvas-1.0.0/autogen.sh 0000755 0000764 0000764 00000010660 11412723611 012423 0000000 0000000 #!/bin/sh
# Run this to generate all the initial makefiles, etc.
srcdir=`dirname $0`
test -z "$srcdir" && srcdir=.
DIE=0
if [ -n "$GNOME2_DIR" ]; then
ACLOCAL_FLAGS="-I $GNOME2_DIR/share/aclocal $ACLOCAL_FLAGS"
LD_LIBRARY_PATH="$GNOME2_DIR/lib:$LD_LIBRARY_PATH"
PATH="$GNOME2_DIR/bin:$PATH"
export PATH
export LD_LIBRARY_PATH
fi
(test -f $srcdir/configure.in) || {
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
echo " top-level package directory"
exit 1
}
gtkdocize || exit 1
(autoconf --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`autoconf' installed."
echo "Download the appropriate package for your distribution,"
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
DIE=1
}
(grep "^AC_PROG_INTLTOOL" $srcdir/configure.in >/dev/null) && {
(intltoolize --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`intltool' installed."
echo "You can get it from:"
echo " ftp://ftp.gnome.org/pub/GNOME/"
DIE=1
}
}
(grep "^AM_PROG_XML_I18N_TOOLS" $srcdir/configure.in >/dev/null) && {
(xml-i18n-toolize --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`xml-i18n-toolize' installed."
echo "You can get it from:"
echo " ftp://ftp.gnome.org/pub/GNOME/"
DIE=1
}
}
(grep "^AM_PROG_LIBTOOL" $srcdir/configure.in >/dev/null) && {
(libtool --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`libtool' installed."
echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/"
DIE=1
}
}
(grep "^AM_GLIB_GNU_GETTEXT" $srcdir/configure.in >/dev/null) && {
(grep "sed.*POTFILES" $srcdir/configure.in) > /dev/null || \
(glib-gettextize --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`glib' installed."
echo "You can get it from: ftp://ftp.gtk.org/pub/gtk"
DIE=1
}
}
(automake --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: You must have \`automake' installed."
echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/"
DIE=1
NO_AUTOMAKE=yes
}
# if no automake, don't bother testing for aclocal
test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "**Error**: Missing \`aclocal'. The version of \`automake'"
echo "installed doesn't appear recent enough."
echo "You can get automake from ftp://ftp.gnu.org/pub/gnu/"
DIE=1
}
if test "$DIE" -eq 1; then
exit 1
fi
if test -z "$*"; then
echo "**Warning**: I am going to run \`configure' with no arguments."
echo "If you wish to pass any to it, please specify them on the"
echo \`$0\'" command line."
echo
fi
case $CC in
xlc )
am_opt=--include-deps;;
esac
for coin in `find $srcdir -path $srcdir/CVS -prune -o -name configure.in -print`
do
dr=`dirname $coin`
if test -f $dr/NO-AUTO-GEN; then
echo skipping $dr -- flagged as no auto-gen
else
echo processing $dr
( cd $dr
aclocalinclude="$ACLOCAL_FLAGS"
if grep "^AM_GLIB_GNU_GETTEXT" configure.in >/dev/null; then
echo "Creating $dr/aclocal.m4 ..."
test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
echo "Running glib-gettextize... Ignore non-fatal messages."
echo "no" | glib-gettextize --force --copy
echo "Making $dr/aclocal.m4 writable ..."
test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
fi
if grep "^AC_PROG_INTLTOOL" configure.in >/dev/null; then
echo "Running intltoolize..."
intltoolize --copy --force --automake
fi
if grep "^AM_PROG_XML_I18N_TOOLS" configure.in >/dev/null; then
echo "Running xml-i18n-toolize..."
xml-i18n-toolize --copy --force --automake
fi
if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
if test -z "$NO_LIBTOOLIZE" ; then
echo "Running libtoolize..."
libtoolize --force --copy
fi
fi
echo "Running aclocal $aclocalinclude ..."
aclocal $aclocalinclude
if grep "^A[CM]_CONFIG_HEADER" configure.in >/dev/null; then
echo "Running autoheader..."
autoheader
fi
echo "Running automake --gnu $am_opt ..."
automake --add-missing --gnu $am_opt
echo "Running autoconf ..."
autoconf
)
fi
done
conf_flags="--enable-maintainer-mode"
if test x$NOCONFIGURE = x; then
echo Running $srcdir/configure $conf_flags "$@" ...
$srcdir/configure $conf_flags "$@" \
&& echo Now type \`make\' to compile. || exit 1
else
echo Skipping configure process.
fi
goocanvas-1.0.0/depcomp 0000755 0000764 0000764 00000044267 11310245766 012020 0000000 0000000 #! /bin/sh
# depcomp - compile a program generating dependencies as side-effects
scriptversion=2009-04-28.21; # UTC
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
# Software Foundation, Inc.
# This program 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.
# This program 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 this program. If not, see .
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# Originally written by Alexandre Oliva .
case $1 in
'')
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
exit 1;
;;
-h | --h*)
cat <<\EOF
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
Run PROGRAMS ARGS to compile a file, generating dependencies
as side-effects.
Environment variables:
depmode Dependency tracking mode.
source Source file read by `PROGRAMS ARGS'.
object Object file output by `PROGRAMS ARGS'.
DEPDIR directory where to store dependencies.
depfile Dependency file to output.
tmpdepfile Temporary file to use when outputing dependencies.
libtool Whether libtool is used (yes/no).
Report bugs to .
EOF
exit $?
;;
-v | --v*)
echo "depcomp $scriptversion"
exit $?
;;
esac
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
echo "depcomp: Variables source, object and depmode must be set" 1>&2
exit 1
fi
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
depfile=${depfile-`echo "$object" |
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
rm -f "$tmpdepfile"
# Some modes work just like other modes, but use different flags. We
# parameterize here, but still list the modes in the big case below,
# to make depend.m4 easier to write. Note that we *cannot* use a case
# here, because this file can only contain one case statement.
if test "$depmode" = hp; then
# HP compiler uses -M and no extra arg.
gccflag=-M
depmode=gcc
fi
if test "$depmode" = dashXmstdout; then
# This is just like dashmstdout with a different argument.
dashmflag=-xM
depmode=dashmstdout
fi
cygpath_u="cygpath -u -f -"
if test "$depmode" = msvcmsys; then
# This is just like msvisualcpp but w/o cygpath translation.
# Just convert the backslash-escaped backslashes to single forward
# slashes to satisfy depend.m4
cygpath_u="sed s,\\\\\\\\,/,g"
depmode=msvisualcpp
fi
case "$depmode" in
gcc3)
## gcc 3 implements dependency tracking that does exactly what
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
## it if -MD -MP comes after the -MF stuff. Hmm.
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
## the command line argument order; so add the flags where they
## appear in depend2.am. Note that the slowdown incurred here
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
for arg
do
case $arg in
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
*) set fnord "$@" "$arg" ;;
esac
shift # fnord
shift # $arg
done
"$@"
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
mv "$tmpdepfile" "$depfile"
;;
gcc)
## There are various ways to get dependency output from gcc. Here's
## why we pick this rather obscure method:
## - Don't want to use -MD because we'd like the dependencies to end
## up in a subdir. Having to rename by hand is ugly.
## (We might end up doing this anyway to support other compilers.)
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
## -MM, not -M (despite what the docs say).
## - Using -M directly means running the compiler twice (even worse
## than renaming).
if test -z "$gccflag"; then
gccflag=-MD,
fi
"$@" -Wp,"$gccflag$tmpdepfile"
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
echo "$object : \\" > "$depfile"
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
## The second -e expression handles DOS-style file names with drive letters.
sed -e 's/^[^:]*: / /' \
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
## This next piece of magic avoids the `deleted header file' problem.
## The problem is that when a header file which appears in a .P file
## is deleted, the dependency causes make to die (because there is
## typically no way to rebuild the header). We avoid this by adding
## dummy dependencies for each header file. Too bad gcc doesn't do
## this for us directly.
tr ' ' '
' < "$tmpdepfile" |
## Some versions of gcc put a space before the `:'. On the theory
## that the space means something, we add a space to the output as
## well.
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
hp)
# This case exists only to let depend.m4 do its work. It works by
# looking at the text of this script. This case will never be run,
# since it is checked for above.
exit 1
;;
sgi)
if test "$libtool" = yes; then
"$@" "-Wp,-MDupdate,$tmpdepfile"
else
"$@" -MDupdate "$tmpdepfile"
fi
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
echo "$object : \\" > "$depfile"
# Clip off the initial element (the dependent). Don't try to be
# clever and replace this with sed code, as IRIX sed won't handle
# lines with more than a fixed number of characters (4096 in
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
# the IRIX cc adds comments like `#:fec' to the end of the
# dependency line.
tr ' ' '
' < "$tmpdepfile" \
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
tr '
' ' ' >> "$depfile"
echo >> "$depfile"
# The second pass generates a dummy entry for each header file.
tr ' ' '
' < "$tmpdepfile" \
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
>> "$depfile"
else
# The sourcefile does not contain any dependencies, so just
# store a dummy comment line, to avoid errors with the Makefile
# "include basename.Plo" scheme.
echo "#dummy" > "$depfile"
fi
rm -f "$tmpdepfile"
;;
aix)
# The C for AIX Compiler uses -M and outputs the dependencies
# in a .u file. In older versions, this file always lives in the
# current directory. Also, the AIX compiler puts `$object:' at the
# start of each line; $object doesn't have directory information.
# Version 6 uses the directory in both cases.
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
test "x$dir" = "x$object" && dir=
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
if test "$libtool" = yes; then
tmpdepfile1=$dir$base.u
tmpdepfile2=$base.u
tmpdepfile3=$dir.libs/$base.u
"$@" -Wc,-M
else
tmpdepfile1=$dir$base.u
tmpdepfile2=$dir$base.u
tmpdepfile3=$dir$base.u
"$@" -M
fi
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
exit $stat
fi
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
do
test -f "$tmpdepfile" && break
done
if test -f "$tmpdepfile"; then
# Each line is of the form `foo.o: dependent.h'.
# Do two passes, one to just change these to
# `$object: dependent.h' and one to simply `dependent.h:'.
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
# That's a tab and a space in the [].
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
else
# The sourcefile does not contain any dependencies, so just
# store a dummy comment line, to avoid errors with the Makefile
# "include basename.Plo" scheme.
echo "#dummy" > "$depfile"
fi
rm -f "$tmpdepfile"
;;
icc)
# Intel's C compiler understands `-MD -MF file'. However on
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
# ICC 7.0 will fill foo.d with something like
# foo.o: sub/foo.c
# foo.o: sub/foo.h
# which is wrong. We want:
# sub/foo.o: sub/foo.c
# sub/foo.o: sub/foo.h
# sub/foo.c:
# sub/foo.h:
# ICC 7.1 will output
# foo.o: sub/foo.c sub/foo.h
# and will wrap long lines using \ :
# foo.o: sub/foo.c ... \
# sub/foo.h ... \
# ...
"$@" -MD -MF "$tmpdepfile"
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
# Each line is of the form `foo.o: dependent.h',
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
# Do two passes, one to just change these to
# `$object: dependent.h' and one to simply `dependent.h:'.
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
# Some versions of the HPUX 10.20 sed can't process this invocation
# correctly. Breaking it into two sed invocations is a workaround.
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
hp2)
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
# compilers, which have integrated preprocessors. The correct option
# to use with these is +Maked; it writes dependencies to a file named
# 'foo.d', which lands next to the object file, wherever that
# happens to be.
# Much of this is similar to the tru64 case; see comments there.
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
test "x$dir" = "x$object" && dir=
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
if test "$libtool" = yes; then
tmpdepfile1=$dir$base.d
tmpdepfile2=$dir.libs/$base.d
"$@" -Wc,+Maked
else
tmpdepfile1=$dir$base.d
tmpdepfile2=$dir$base.d
"$@" +Maked
fi
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile1" "$tmpdepfile2"
exit $stat
fi
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
do
test -f "$tmpdepfile" && break
done
if test -f "$tmpdepfile"; then
sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
# Add `dependent.h:' lines.
sed -ne '2,${
s/^ *//
s/ \\*$//
s/$/:/
p
}' "$tmpdepfile" >> "$depfile"
else
echo "#dummy" > "$depfile"
fi
rm -f "$tmpdepfile" "$tmpdepfile2"
;;
tru64)
# The Tru64 compiler uses -MD to generate dependencies as a side
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
# dependencies in `foo.d' instead, so we check for that too.
# Subdirectories are respected.
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
test "x$dir" = "x$object" && dir=
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
if test "$libtool" = yes; then
# With Tru64 cc, shared objects can also be used to make a
# static library. This mechanism is used in libtool 1.4 series to
# handle both shared and static libraries in a single compilation.
# With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
#
# With libtool 1.5 this exception was removed, and libtool now
# generates 2 separate objects for the 2 libraries. These two
# compilations output dependencies in $dir.libs/$base.o.d and
# in $dir$base.o.d. We have to check for both files, because
# one of the two compilations can be disabled. We should prefer
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
# automatically cleaned when .libs/ is deleted, while ignoring
# the former would cause a distcleancheck panic.
tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
tmpdepfile2=$dir$base.o.d # libtool 1.5
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
"$@" -Wc,-MD
else
tmpdepfile1=$dir$base.o.d
tmpdepfile2=$dir$base.d
tmpdepfile3=$dir$base.d
tmpdepfile4=$dir$base.d
"$@" -MD
fi
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
exit $stat
fi
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
do
test -f "$tmpdepfile" && break
done
if test -f "$tmpdepfile"; then
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
# That's a tab and a space in the [].
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
else
echo "#dummy" > "$depfile"
fi
rm -f "$tmpdepfile"
;;
#nosideeffect)
# This comment above is used by automake to tell side-effect
# dependency tracking mechanisms from slower ones.
dashmstdout)
# Important note: in order to support this mode, a compiler *must*
# always write the preprocessed file to stdout, regardless of -o.
"$@" || exit $?
# Remove the call to Libtool.
if test "$libtool" = yes; then
while test "X$1" != 'X--mode=compile'; do
shift
done
shift
fi
# Remove `-o $object'.
IFS=" "
for arg
do
case $arg in
-o)
shift
;;
$object)
shift
;;
*)
set fnord "$@" "$arg"
shift # fnord
shift # $arg
;;
esac
done
test -z "$dashmflag" && dashmflag=-M
# Require at least two characters before searching for `:'
# in the target name. This is to cope with DOS-style filenames:
# a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
"$@" $dashmflag |
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
rm -f "$depfile"
cat < "$tmpdepfile" > "$depfile"
tr ' ' '
' < "$tmpdepfile" | \
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
dashXmstdout)
# This case only exists to satisfy depend.m4. It is never actually
# run, as this mode is specially recognized in the preamble.
exit 1
;;
makedepend)
"$@" || exit $?
# Remove any Libtool call
if test "$libtool" = yes; then
while test "X$1" != 'X--mode=compile'; do
shift
done
shift
fi
# X makedepend
shift
cleared=no eat=no
for arg
do
case $cleared in
no)
set ""; shift
cleared=yes ;;
esac
if test $eat = yes; then
eat=no
continue
fi
case "$arg" in
-D*|-I*)
set fnord "$@" "$arg"; shift ;;
# Strip any option that makedepend may not understand. Remove
# the object too, otherwise makedepend will parse it as a source file.
-arch)
eat=yes ;;
-*|$object)
;;
*)
set fnord "$@" "$arg"; shift ;;
esac
done
obj_suffix=`echo "$object" | sed 's/^.*\././'`
touch "$tmpdepfile"
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
rm -f "$depfile"
cat < "$tmpdepfile" > "$depfile"
sed '1,2d' "$tmpdepfile" | tr ' ' '
' | \
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile" "$tmpdepfile".bak
;;
cpp)
# Important note: in order to support this mode, a compiler *must*
# always write the preprocessed file to stdout.
"$@" || exit $?
# Remove the call to Libtool.
if test "$libtool" = yes; then
while test "X$1" != 'X--mode=compile'; do
shift
done
shift
fi
# Remove `-o $object'.
IFS=" "
for arg
do
case $arg in
-o)
shift
;;
$object)
shift
;;
*)
set fnord "$@" "$arg"
shift # fnord
shift # $arg
;;
esac
done
"$@" -E |
sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
sed '$ s: \\$::' > "$tmpdepfile"
rm -f "$depfile"
echo "$object : \\" > "$depfile"
cat < "$tmpdepfile" >> "$depfile"
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
msvisualcpp)
# Important note: in order to support this mode, a compiler *must*
# always write the preprocessed file to stdout.
"$@" || exit $?
# Remove the call to Libtool.
if test "$libtool" = yes; then
while test "X$1" != 'X--mode=compile'; do
shift
done
shift
fi
IFS=" "
for arg
do
case "$arg" in
-o)
shift
;;
$object)
shift
;;
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
set fnord "$@"
shift
shift
;;
*)
set fnord "$@" "$arg"
shift
shift
;;
esac
done
"$@" -E 2>/dev/null |
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
rm -f "$depfile"
echo "$object : \\" > "$depfile"
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
echo " " >> "$depfile"
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
rm -f "$tmpdepfile"
;;
msvcmsys)
# This case exists only to let depend.m4 do its work. It works by
# looking at the text of this script. This case will never be run,
# since it is checked for above.
exit 1
;;
none)
exec "$@"
;;
*)
echo "Unknown depmode $depmode" 1>&2
exit 1
;;
esac
exit 0
# Local Variables:
# mode: shell-script
# sh-indentation: 2
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-time-zone: "UTC"
# time-stamp-end: "; # UTC"
# End:
goocanvas-1.0.0/goocanvas.pc.in 0000644 0000764 0000764 00000000403 11412723611 013325 0000000 0000000 prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: GooCanvas
Description: A GTK+ canvas widget using cairo
Version: @VERSION@
Requires: gtk+-2.0 cairo
Libs: -L${libdir} -lgoocanvas
Cflags: -I${includedir}/goocanvas-1.0
goocanvas-1.0.0/AUTHORS 0000644 0000764 0000764 00000000040 11412723611 011461 0000000 0000000 Damon Chaplin
goocanvas-1.0.0/ltmain.sh 0000755 0000764 0000764 00000733060 11512612651 012255 0000000 0000000 # Generated from ltmain.m4sh.
# ltmain.sh (GNU libtool) 2.2.6b
# Written by Gordon Matzigkeit , 1996
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions. There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# GNU Libtool 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 of the License, or
# (at your option) any later version.
#
# As a special exception to the GNU General Public License,
# if you distribute this file as part of a program or library that
# is built using GNU Libtool, you may include this file under the
# same distribution terms that you use for the rest of that program.
#
# GNU Libtool 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 Libtool; see the file COPYING. If not, a copy
# can be downloaded from http://www.gnu.org/licenses/gpl.html,
# or obtained by writing to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# Usage: $progname [OPTION]... [MODE-ARG]...
#
# Provide generalized library-building support services.
#
# --config show all configuration variables
# --debug enable verbose shell tracing
# -n, --dry-run display commands without modifying any files
# --features display basic configuration information and exit
# --mode=MODE use operation mode MODE
# --preserve-dup-deps don't remove duplicate dependency libraries
# --quiet, --silent don't print informational messages
# --tag=TAG use configuration variables from tag TAG
# -v, --verbose print informational messages (default)
# --version print version information
# -h, --help print short or long help message
#
# MODE must be one of the following:
#
# clean remove files from the build directory
# compile compile a source file into a libtool object
# execute automatically set library path, then run a program
# finish complete the installation of libtool libraries
# install install libraries or executables
# link create a library or an executable
# uninstall remove libraries from an installed directory
#
# MODE-ARGS vary depending on the MODE.
# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
#
# When reporting a bug, please describe a test case to reproduce it and
# include the following information:
#
# host-triplet: $host
# shell: $SHELL
# compiler: $LTCC
# compiler flags: $LTCFLAGS
# linker: $LD (gnu? $with_gnu_ld)
# $progname: (GNU libtool) 2.2.6b
# automake: $automake_version
# autoconf: $autoconf_version
#
# Report bugs to .
PROGRAM=ltmain.sh
PACKAGE=libtool
VERSION=2.2.6b
TIMESTAMP=""
package_revision=1.3017
# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
emulate sh
NULLCMD=:
# Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
else
case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh
# NLS nuisances: We save the old values to restore during execute mode.
# Only set LANG and LC_ALL to C if already set.
# These must not be set unconditionally because not all systems understand
# e.g. LANG=C (notably SCO).
lt_user_locale=
lt_safe_locale=
for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
do
eval "if test \"\${$lt_var+set}\" = set; then
save_$lt_var=\$$lt_var
$lt_var=C
export $lt_var
lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
fi"
done
$lt_unset CDPATH
: ${CP="cp -f"}
: ${ECHO="echo"}
: ${EGREP="/bin/grep -E"}
: ${FGREP="/bin/grep -F"}
: ${GREP="/bin/grep"}
: ${LN_S="ln -s"}
: ${MAKE="make"}
: ${MKDIR="mkdir"}
: ${MV="mv -f"}
: ${RM="rm -f"}
: ${SED="/bin/sed"}
: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
: ${Xsed="$SED -e 1s/^X//"}
# Global variables:
EXIT_SUCCESS=0
EXIT_FAILURE=1
EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing.
EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake.
exit_status=$EXIT_SUCCESS
# Make sure IFS has a sensible default
lt_nl='
'
IFS=" $lt_nl"
dirname="s,/[^/]*$,,"
basename="s,^.*/,,"
# func_dirname_and_basename file append nondir_replacement
# perform func_basename and func_dirname in a single function
# call:
# dirname: Compute the dirname of FILE. If nonempty,
# add APPEND to the result, otherwise set result
# to NONDIR_REPLACEMENT.
# value returned in "$func_dirname_result"
# basename: Compute filename of FILE.
# value retuned in "$func_basename_result"
# Implementation must be kept synchronized with func_dirname
# and func_basename. For efficiency, we do not delegate to
# those functions but instead duplicate the functionality here.
func_dirname_and_basename ()
{
# Extract subdirectory from the argument.
func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"`
if test "X$func_dirname_result" = "X${1}"; then
func_dirname_result="${3}"
else
func_dirname_result="$func_dirname_result${2}"
fi
func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"`
}
# Generated shell functions inserted here.
# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
# is ksh but when the shell is invoked as "sh" and the current value of
# the _XPG environment variable is not equal to 1 (one), the special
# positional parameter $0, within a function call, is the name of the
# function.
progpath="$0"
# The name of this program:
# In the unlikely event $progname began with a '-', it would play havoc with
# func_echo (imagine progname=-n), so we prepend ./ in that case:
func_dirname_and_basename "$progpath"
progname=$func_basename_result
case $progname in
-*) progname=./$progname ;;
esac
# Make sure we have an absolute path for reexecution:
case $progpath in
[\\/]*|[A-Za-z]:\\*) ;;
*[\\/]*)
progdir=$func_dirname_result
progdir=`cd "$progdir" && pwd`
progpath="$progdir/$progname"
;;
*)
save_IFS="$IFS"
IFS=:
for progdir in $PATH; do
IFS="$save_IFS"
test -x "$progdir/$progname" && break
done
IFS="$save_IFS"
test -n "$progdir" || progdir=`pwd`
progpath="$progdir/$progname"
;;
esac
# Sed substitution that helps us do robust quoting. It backslashifies
# metacharacters that are still active within double-quoted strings.
Xsed="${SED}"' -e 1s/^X//'
sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
# Same as above, but do not quote variable references.
double_quote_subst='s/\(["`\\]\)/\\\1/g'
# Re-`\' parameter expansions in output of double_quote_subst that were
# `\'-ed in input to the same. If an odd number of `\' preceded a '$'
# in input to double_quote_subst, that '$' was protected from expansion.
# Since each input `\' is now two `\'s, look for any number of runs of
# four `\'s followed by two `\'s and then a '$'. `\' that '$'.
bs='\\'
bs2='\\\\'
bs4='\\\\\\\\'
dollar='\$'
sed_double_backslash="\
s/$bs4/&\\
/g
s/^$bs2$dollar/$bs&/
s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
s/\n//g"
# Standard options:
opt_dry_run=false
opt_help=false
opt_quiet=false
opt_verbose=false
opt_warning=:
# func_echo arg...
# Echo program name prefixed message, along with the current mode
# name if it has been set yet.
func_echo ()
{
$ECHO "$progname${mode+: }$mode: $*"
}
# func_verbose arg...
# Echo program name prefixed message in verbose mode only.
func_verbose ()
{
$opt_verbose && func_echo ${1+"$@"}
# A bug in bash halts the script if the last line of a function
# fails when set -e is in force, so we need another command to
# work around that:
:
}
# func_error arg...
# Echo program name prefixed message to standard error.
func_error ()
{
$ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2
}
# func_warning arg...
# Echo program name prefixed warning message to standard error.
func_warning ()
{
$opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2
# bash bug again:
:
}
# func_fatal_error arg...
# Echo program name prefixed message to standard error, and exit.
func_fatal_error ()
{
func_error ${1+"$@"}
exit $EXIT_FAILURE
}
# func_fatal_help arg...
# Echo program name prefixed message to standard error, followed by
# a help hint, and exit.
func_fatal_help ()
{
func_error ${1+"$@"}
func_fatal_error "$help"
}
help="Try \`$progname --help' for more information." ## default
# func_grep expression filename
# Check whether EXPRESSION matches any line of FILENAME, without output.
func_grep ()
{
$GREP "$1" "$2" >/dev/null 2>&1
}
# func_mkdir_p directory-path
# Make sure the entire path to DIRECTORY-PATH is available.
func_mkdir_p ()
{
my_directory_path="$1"
my_dir_list=
if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
# Protect directory names starting with `-'
case $my_directory_path in
-*) my_directory_path="./$my_directory_path" ;;
esac
# While some portion of DIR does not yet exist...
while test ! -d "$my_directory_path"; do
# ...make a list in topmost first order. Use a colon delimited
# list incase some portion of path contains whitespace.
my_dir_list="$my_directory_path:$my_dir_list"
# If the last portion added has no slash in it, the list is done
case $my_directory_path in */*) ;; *) break ;; esac
# ...otherwise throw away the child directory and loop
my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"`
done
my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'`
save_mkdir_p_IFS="$IFS"; IFS=':'
for my_dir in $my_dir_list; do
IFS="$save_mkdir_p_IFS"
# mkdir can fail with a `File exist' error if two processes
# try to create one of the directories concurrently. Don't
# stop in that case!
$MKDIR "$my_dir" 2>/dev/null || :
done
IFS="$save_mkdir_p_IFS"
# Bail out if we (or some other process) failed to create a directory.
test -d "$my_directory_path" || \
func_fatal_error "Failed to create \`$1'"
fi
}
# func_mktempdir [string]
# Make a temporary directory that won't clash with other running
# libtool processes, and avoids race conditions if possible. If
# given, STRING is the basename for that directory.
func_mktempdir ()
{
my_template="${TMPDIR-/tmp}/${1-$progname}"
if test "$opt_dry_run" = ":"; then
# Return a directory name, but don't create it in dry-run mode
my_tmpdir="${my_template}-$$"
else
# If mktemp works, use that first and foremost
my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
if test ! -d "$my_tmpdir"; then
# Failing that, at least try and use $RANDOM to avoid a race
my_tmpdir="${my_template}-${RANDOM-0}$$"
save_mktempdir_umask=`umask`
umask 0077
$MKDIR "$my_tmpdir"
umask $save_mktempdir_umask
fi
# If we're not in dry-run mode, bomb out on failure
test -d "$my_tmpdir" || \
func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
fi
$ECHO "X$my_tmpdir" | $Xsed
}
# func_quote_for_eval arg
# Aesthetically quote ARG to be evaled later.
# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
# is double-quoted, suitable for a subsequent eval, whereas
# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
# which are still active within double quotes backslashified.
func_quote_for_eval ()
{
case $1 in
*[\\\`\"\$]*)
func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;;
*)
func_quote_for_eval_unquoted_result="$1" ;;
esac
case $func_quote_for_eval_unquoted_result in
# Double-quote args containing shell metacharacters to delay
# word splitting, command substitution and and variable
# expansion for a subsequent eval.
# Many Bourne shells cannot handle close brackets correctly
# in scan sets, so we specify it separately.
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
;;
*)
func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
esac
}
# func_quote_for_expand arg
# Aesthetically quote ARG to be evaled later; same as above,
# but do not quote variable references.
func_quote_for_expand ()
{
case $1 in
*[\\\`\"]*)
my_arg=`$ECHO "X$1" | $Xsed \
-e "$double_quote_subst" -e "$sed_double_backslash"` ;;
*)
my_arg="$1" ;;
esac
case $my_arg in
# Double-quote args containing shell metacharacters to delay
# word splitting and command substitution for a subsequent eval.
# Many Bourne shells cannot handle close brackets correctly
# in scan sets, so we specify it separately.
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
my_arg="\"$my_arg\""
;;
esac
func_quote_for_expand_result="$my_arg"
}
# func_show_eval cmd [fail_exp]
# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is
# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP
# is given, then evaluate it.
func_show_eval ()
{
my_cmd="$1"
my_fail_exp="${2-:}"
${opt_silent-false} || {
func_quote_for_expand "$my_cmd"
eval "func_echo $func_quote_for_expand_result"
}
if ${opt_dry_run-false}; then :; else
eval "$my_cmd"
my_status=$?
if test "$my_status" -eq 0; then :; else
eval "(exit $my_status); $my_fail_exp"
fi
fi
}
# func_show_eval_locale cmd [fail_exp]
# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is
# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP
# is given, then evaluate it. Use the saved locale for evaluation.
func_show_eval_locale ()
{
my_cmd="$1"
my_fail_exp="${2-:}"
${opt_silent-false} || {
func_quote_for_expand "$my_cmd"
eval "func_echo $func_quote_for_expand_result"
}
if ${opt_dry_run-false}; then :; else
eval "$lt_user_locale
$my_cmd"
my_status=$?
eval "$lt_safe_locale"
if test "$my_status" -eq 0; then :; else
eval "(exit $my_status); $my_fail_exp"
fi
fi
}
# func_version
# Echo version message to standard output and exit.
func_version ()
{
$SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / {
s/^# //
s/^# *$//
s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
p
}' < "$progpath"
exit $?
}
# func_usage
# Echo short help message to standard output and exit.
func_usage ()
{
$SED -n '/^# Usage:/,/# -h/ {
s/^# //
s/^# *$//
s/\$progname/'$progname'/
p
}' < "$progpath"
$ECHO
$ECHO "run \`$progname --help | more' for full usage"
exit $?
}
# func_help
# Echo long help message to standard output and exit.
func_help ()
{
$SED -n '/^# Usage:/,/# Report bugs to/ {
s/^# //
s/^# *$//
s*\$progname*'$progname'*
s*\$host*'"$host"'*
s*\$SHELL*'"$SHELL"'*
s*\$LTCC*'"$LTCC"'*
s*\$LTCFLAGS*'"$LTCFLAGS"'*
s*\$LD*'"$LD"'*
s/\$with_gnu_ld/'"$with_gnu_ld"'/
s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
p
}' < "$progpath"
exit $?
}
# func_missing_arg argname
# Echo program name prefixed message to standard error and set global
# exit_cmd.
func_missing_arg ()
{
func_error "missing argument for $1"
exit_cmd=exit
}
exit_cmd=:
# Check that we have a working $ECHO.
if test "X$1" = X--no-reexec; then
# Discard the --no-reexec flag, and continue.
shift
elif test "X$1" = X--fallback-echo; then
# Avoid inline document here, it may be left over
:
elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then
# Yippee, $ECHO works!
:
else
# Restart under the correct shell, and then maybe $ECHO will work.
exec $SHELL "$progpath" --no-reexec ${1+"$@"}
fi
if test "X$1" = X--fallback-echo; then
# used as fallback echo
shift
cat </dev/null 2>&1; then
taglist="$taglist $tagname"
# Evaluate the configuration. Be careful to quote the path
# and the sed script, to avoid splitting on whitespace, but
# also don't use non-portable quotes within backquotes within
# quotes we have to do it in 2 steps:
extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
eval "$extractedcf"
else
func_error "ignoring unknown tag $tagname"
fi
;;
esac
}
# Parse options once, thoroughly. This comes as soon as possible in
# the script to make things like `libtool --version' happen quickly.
{
# Shorthand for --mode=foo, only valid as the first argument
case $1 in
clean|clea|cle|cl)
shift; set dummy --mode clean ${1+"$@"}; shift
;;
compile|compil|compi|comp|com|co|c)
shift; set dummy --mode compile ${1+"$@"}; shift
;;
execute|execut|execu|exec|exe|ex|e)
shift; set dummy --mode execute ${1+"$@"}; shift
;;
finish|finis|fini|fin|fi|f)
shift; set dummy --mode finish ${1+"$@"}; shift
;;
install|instal|insta|inst|ins|in|i)
shift; set dummy --mode install ${1+"$@"}; shift
;;
link|lin|li|l)
shift; set dummy --mode link ${1+"$@"}; shift
;;
uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
shift; set dummy --mode uninstall ${1+"$@"}; shift
;;
esac
# Parse non-mode specific arguments:
while test "$#" -gt 0; do
opt="$1"
shift
case $opt in
--config) func_config ;;
--debug) preserve_args="$preserve_args $opt"
func_echo "enabling shell trace mode"
opt_debug='set -x'
$opt_debug
;;
-dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break
execute_dlfiles="$execute_dlfiles $1"
shift
;;
--dry-run | -n) opt_dry_run=: ;;
--features) func_features ;;
--finish) mode="finish" ;;
--mode) test "$#" -eq 0 && func_missing_arg "$opt" && break
case $1 in
# Valid mode arguments:
clean) ;;
compile) ;;
execute) ;;
finish) ;;
install) ;;
link) ;;
relink) ;;
uninstall) ;;
# Catch anything else as an error
*) func_error "invalid argument for $opt"
exit_cmd=exit
break
;;
esac
mode="$1"
shift
;;
--preserve-dup-deps)
opt_duplicate_deps=: ;;
--quiet|--silent) preserve_args="$preserve_args $opt"
opt_silent=:
;;
--verbose| -v) preserve_args="$preserve_args $opt"
opt_silent=false
;;
--tag) test "$#" -eq 0 && func_missing_arg "$opt" && break
preserve_args="$preserve_args $opt $1"
func_enable_tag "$1" # tagname is set here
shift
;;
# Separate optargs to long options:
-dlopen=*|--mode=*|--tag=*)
func_opt_split "$opt"
set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"}
shift
;;
-\?|-h) func_usage ;;
--help) opt_help=: ;;
--version) func_version ;;
-*) func_fatal_help "unrecognized option \`$opt'" ;;
*) nonopt="$opt"
break
;;
esac
done
case $host in
*cygwin* | *mingw* | *pw32* | *cegcc*)
# don't eliminate duplications in $postdeps and $predeps
opt_duplicate_compiler_generated_deps=:
;;
*)
opt_duplicate_compiler_generated_deps=$opt_duplicate_deps
;;
esac
# Having warned about all mis-specified options, bail out if
# anything was wrong.
$exit_cmd $EXIT_FAILURE
}
# func_check_version_match
# Ensure that we are using m4 macros, and libtool script from the same
# release of libtool.
func_check_version_match ()
{
if test "$package_revision" != "$macro_revision"; then
if test "$VERSION" != "$macro_version"; then
if test -z "$macro_version"; then
cat >&2 <<_LT_EOF
$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
$progname: definition of this LT_INIT comes from an older release.
$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
$progname: and run autoconf again.
_LT_EOF
else
cat >&2 <<_LT_EOF
$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
$progname: and run autoconf again.
_LT_EOF
fi
else
cat >&2 <<_LT_EOF
$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision,
$progname: but the definition of this LT_INIT comes from revision $macro_revision.
$progname: You should recreate aclocal.m4 with macros from revision $package_revision
$progname: of $PACKAGE $VERSION and run autoconf again.
_LT_EOF
fi
exit $EXIT_MISMATCH
fi
}
## ----------- ##
## Main. ##
## ----------- ##
$opt_help || {
# Sanity checks first:
func_check_version_match
if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
func_fatal_configuration "not configured to build any kind of library"
fi
test -z "$mode" && func_fatal_error "error: you must specify a MODE."
# Darwin sucks
eval std_shrext=\"$shrext_cmds\"
# Only execute mode is allowed to have -dlopen flags.
if test -n "$execute_dlfiles" && test "$mode" != execute; then
func_error "unrecognized option \`-dlopen'"
$ECHO "$help" 1>&2
exit $EXIT_FAILURE
fi
# Change the help message to a mode-specific one.
generic_help="$help"
help="Try \`$progname --help --mode=$mode' for more information."
}
# func_lalib_p file
# True iff FILE is a libtool `.la' library or `.lo' object file.
# This function is only a basic sanity check; it will hardly flush out
# determined imposters.
func_lalib_p ()
{
test -f "$1" &&
$SED -e 4q "$1" 2>/dev/null \
| $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
}
# func_lalib_unsafe_p file
# True iff FILE is a libtool `.la' library or `.lo' object file.
# This function implements the same check as func_lalib_p without
# resorting to external programs. To this end, it redirects stdin and
# closes it afterwards, without saving the original file descriptor.
# As a safety measure, use it only where a negative result would be
# fatal anyway. Works if `file' does not exist.
func_lalib_unsafe_p ()
{
lalib_p=no
if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
for lalib_p_l in 1 2 3 4
do
read lalib_p_line
case "$lalib_p_line" in
\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
esac
done
exec 0<&5 5<&-
fi
test "$lalib_p" = yes
}
# func_ltwrapper_script_p file
# True iff FILE is a libtool wrapper script
# This function is only a basic sanity check; it will hardly flush out
# determined imposters.
func_ltwrapper_script_p ()
{
func_lalib_p "$1"
}
# func_ltwrapper_executable_p file
# True iff FILE is a libtool wrapper executable
# This function is only a basic sanity check; it will hardly flush out
# determined imposters.
func_ltwrapper_executable_p ()
{
func_ltwrapper_exec_suffix=
case $1 in
*.exe) ;;
*) func_ltwrapper_exec_suffix=.exe ;;
esac
$GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
}
# func_ltwrapper_scriptname file
# Assumes file is an ltwrapper_executable
# uses $file to determine the appropriate filename for a
# temporary ltwrapper_script.
func_ltwrapper_scriptname ()
{
func_ltwrapper_scriptname_result=""
if func_ltwrapper_executable_p "$1"; then
func_dirname_and_basename "$1" "" "."
func_stripname '' '.exe' "$func_basename_result"
func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
fi
}
# func_ltwrapper_p file
# True iff FILE is a libtool wrapper script or wrapper executable
# This function is only a basic sanity check; it will hardly flush out
# determined imposters.
func_ltwrapper_p ()
{
func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
}
# func_execute_cmds commands fail_cmd
# Execute tilde-delimited COMMANDS.
# If FAIL_CMD is given, eval that upon failure.
# FAIL_CMD may read-access the current command in variable CMD!
func_execute_cmds ()
{
$opt_debug
save_ifs=$IFS; IFS='~'
for cmd in $1; do
IFS=$save_ifs
eval cmd=\"$cmd\"
func_show_eval "$cmd" "${2-:}"
done
IFS=$save_ifs
}
# func_source file
# Source FILE, adding directory component if necessary.
# Note that it is not necessary on cygwin/mingw to append a dot to
# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
# behavior happens only for exec(3), not for open(2)! Also, sourcing
# `FILE.' does not work on cygwin managed mounts.
func_source ()
{
$opt_debug
case $1 in
*/* | *\\*) . "$1" ;;
*) . "./$1" ;;
esac
}
# func_infer_tag arg
# Infer tagged configuration to use if any are available and
# if one wasn't chosen via the "--tag" command line option.
# Only attempt this if the compiler in the base compile
# command doesn't match the default compiler.
# arg is usually of the form 'gcc ...'
func_infer_tag ()
{
$opt_debug
if test -n "$available_tags" && test -z "$tagname"; then
CC_quoted=
for arg in $CC; do
func_quote_for_eval "$arg"
CC_quoted="$CC_quoted $func_quote_for_eval_result"
done
case $@ in
# Blanks in the command may have been stripped by the calling shell,
# but not from the CC environment variable when configure was run.
" $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;;
# Blanks at the start of $base_compile will cause this to fail
# if we don't check for them as well.
*)
for z in $available_tags; do
if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
# Evaluate the configuration.
eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
CC_quoted=
for arg in $CC; do
# Double-quote args containing other shell metacharacters.
func_quote_for_eval "$arg"
CC_quoted="$CC_quoted $func_quote_for_eval_result"
done
case "$@ " in
" $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*)
# The compiler in the base compile command matches
# the one in the tagged configuration.
# Assume this is the tagged configuration we want.
tagname=$z
break
;;
esac
fi
done
# If $tagname still isn't set, then no tagged configuration
# was found and let the user know that the "--tag" command
# line option must be used.
if test -z "$tagname"; then
func_echo "unable to infer tagged configuration"
func_fatal_error "specify a tag with \`--tag'"
# else
# func_verbose "using $tagname tagged configuration"
fi
;;
esac
fi
}
# func_write_libtool_object output_name pic_name nonpic_name
# Create a libtool object file (analogous to a ".la" file),
# but don't create it if we're doing a dry run.
func_write_libtool_object ()
{
write_libobj=${1}
if test "$build_libtool_libs" = yes; then
write_lobj=\'${2}\'
else
write_lobj=none
fi
if test "$build_old_libs" = yes; then
write_oldobj=\'${3}\'
else
write_oldobj=none
fi
$opt_dry_run || {
cat >${write_libobj}T <?"'"'"' &()|`$[]' \
&& func_warning "libobj name \`$libobj' may not contain shell special characters."
func_dirname_and_basename "$obj" "/" ""
objname="$func_basename_result"
xdir="$func_dirname_result"
lobj=${xdir}$objdir/$objname
test -z "$base_compile" && \
func_fatal_help "you must specify a compilation command"
# Delete any leftover library objects.
if test "$build_old_libs" = yes; then
removelist="$obj $lobj $libobj ${libobj}T"
else
removelist="$lobj $libobj ${libobj}T"
fi
# On Cygwin there's no "real" PIC flag so we must build both object types
case $host_os in
cygwin* | mingw* | pw32* | os2* | cegcc*)
pic_mode=default
;;
esac
if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
# non-PIC code in shared libraries is not supported
pic_mode=default
fi
# Calculate the filename of the output object if compiler does
# not support -o with -c
if test "$compiler_c_o" = no; then
output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
lockfile="$output_obj.lock"
else
output_obj=
need_locks=no
lockfile=
fi
# Lock this critical section if it is needed
# We use this script file to make the link, it avoids creating a new file
if test "$need_locks" = yes; then
until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
func_echo "Waiting for $lockfile to be removed"
sleep 2
done
elif test "$need_locks" = warn; then
if test -f "$lockfile"; then
$ECHO "\
*** ERROR, $lockfile exists and contains:
`cat $lockfile 2>/dev/null`
This indicates that another process is trying to use the same
temporary object file, and libtool could not work around it because
your compiler does not support \`-c' and \`-o' together. If you
repeat this compilation, it may succeed, by chance, but you had better
avoid parallel builds (make -j) in this platform, or get a better
compiler."
$opt_dry_run || $RM $removelist
exit $EXIT_FAILURE
fi
removelist="$removelist $output_obj"
$ECHO "$srcfile" > "$lockfile"
fi
$opt_dry_run || $RM $removelist
removelist="$removelist $lockfile"
trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
if test -n "$fix_srcfile_path"; then
eval srcfile=\"$fix_srcfile_path\"
fi
func_quote_for_eval "$srcfile"
qsrcfile=$func_quote_for_eval_result
# Only build a PIC object if we are building libtool libraries.
if test "$build_libtool_libs" = yes; then
# Without this assignment, base_compile gets emptied.
fbsd_hideous_sh_bug=$base_compile
if test "$pic_mode" != no; then
command="$base_compile $qsrcfile $pic_flag"
else
# Don't build PIC code
command="$base_compile $qsrcfile"
fi
func_mkdir_p "$xdir$objdir"
if test -z "$output_obj"; then
# Place PIC objects in $objdir
command="$command -o $lobj"
fi
func_show_eval_locale "$command" \
'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
if test "$need_locks" = warn &&
test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
$ECHO "\
*** ERROR, $lockfile contains:
`cat $lockfile 2>/dev/null`
but it should contain:
$srcfile
This indicates that another process is trying to use the same
temporary object file, and libtool could not work around it because
your compiler does not support \`-c' and \`-o' together. If you
repeat this compilation, it may succeed, by chance, but you had better
avoid parallel builds (make -j) in this platform, or get a better
compiler."
$opt_dry_run || $RM $removelist
exit $EXIT_FAILURE
fi
# Just move the object if needed, then go on to compile the next one
if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
func_show_eval '$MV "$output_obj" "$lobj"' \
'error=$?; $opt_dry_run || $RM $removelist; exit $error'
fi
# Allow error messages only from the first compilation.
if test "$suppress_opt" = yes; then
suppress_output=' >/dev/null 2>&1'
fi
fi
# Only build a position-dependent object if we build old libraries.
if test "$build_old_libs" = yes; then
if test "$pic_mode" != yes; then
# Don't build PIC code
command="$base_compile $qsrcfile$pie_flag"
else
command="$base_compile $qsrcfile $pic_flag"
fi
if test "$compiler_c_o" = yes; then
command="$command -o $obj"
fi
# Suppress compiler output if we already did a PIC compilation.
command="$command$suppress_output"
func_show_eval_locale "$command" \
'$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
if test "$need_locks" = warn &&
test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
$ECHO "\
*** ERROR, $lockfile contains:
`cat $lockfile 2>/dev/null`
but it should contain:
$srcfile
This indicates that another process is trying to use the same
temporary object file, and libtool could not work around it because
your compiler does not support \`-c' and \`-o' together. If you
repeat this compilation, it may succeed, by chance, but you had better
avoid parallel builds (make -j) in this platform, or get a better
compiler."
$opt_dry_run || $RM $removelist
exit $EXIT_FAILURE
fi
# Just move the object if needed
if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
func_show_eval '$MV "$output_obj" "$obj"' \
'error=$?; $opt_dry_run || $RM $removelist; exit $error'
fi
fi
$opt_dry_run || {
func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
# Unlock the critical section if it was locked
if test "$need_locks" != no; then
removelist=$lockfile
$RM "$lockfile"
fi
}
exit $EXIT_SUCCESS
}
$opt_help || {
test "$mode" = compile && func_mode_compile ${1+"$@"}
}
func_mode_help ()
{
# We need to display help for each of the modes.
case $mode in
"")
# Generic help is extracted from the usage comments
# at the start of this file.
func_help
;;
clean)
$ECHO \
"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
Remove files from the build directory.
RM is the name of the program to use to delete files associated with each FILE
(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
to RM.
If FILE is a libtool library, object or program, all the files associated
with it are deleted. Otherwise, only FILE itself is deleted using RM."
;;
compile)
$ECHO \
"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
Compile a source file into a libtool library object.
This mode accepts the following additional options:
-o OUTPUT-FILE set the output file name to OUTPUT-FILE
-no-suppress do not suppress compiler output for multiple passes
-prefer-pic try to building PIC objects only
-prefer-non-pic try to building non-PIC objects only
-shared do not build a \`.o' file suitable for static linking
-static only build a \`.o' file suitable for static linking
COMPILE-COMMAND is a command to be used in creating a \`standard' object file
from the given SOURCEFILE.
The output file name is determined by removing the directory component from
SOURCEFILE, then substituting the C source code suffix \`.c' with the
library object suffix, \`.lo'."
;;
execute)
$ECHO \
"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
Automatically set library path, then run a program.
This mode accepts the following additional options:
-dlopen FILE add the directory containing FILE to the library path
This mode sets the library path environment variable according to \`-dlopen'
flags.
If any of the ARGS are libtool executable wrappers, then they are translated
into their corresponding uninstalled binary, and any of their required library
directories are added to the library path.
Then, COMMAND is executed, with ARGS as arguments."
;;
finish)
$ECHO \
"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
Complete the installation of libtool libraries.
Each LIBDIR is a directory that contains libtool libraries.
The commands that this mode executes may require superuser privileges. Use
the \`--dry-run' option if you just want to see what would be executed."
;;
install)
$ECHO \
"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
Install executables or libraries.
INSTALL-COMMAND is the installation command. The first component should be
either the \`install' or \`cp' program.
The following components of INSTALL-COMMAND are treated specially:
-inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation
The rest of the components are interpreted as arguments to that command (only
BSD-compatible install options are recognized)."
;;
link)
$ECHO \
"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
Link object files or libraries together to form another library, or to
create an executable program.
LINK-COMMAND is a command using the C compiler that you would use to create
a program from several object files.
The following components of LINK-COMMAND are treated specially:
-all-static do not do any dynamic linking at all
-avoid-version do not add a version suffix if possible
-dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
-dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
-export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-export-symbols SYMFILE
try to export only the symbols listed in SYMFILE
-export-symbols-regex REGEX
try to export only the symbols matching REGEX
-LLIBDIR search LIBDIR for required installed libraries
-lNAME OUTPUT-FILE requires the installed library libNAME
-module build a library that can dlopened
-no-fast-install disable the fast-install mode
-no-install link a not-installable executable
-no-undefined declare that a library does not refer to external symbols
-o OUTPUT-FILE create OUTPUT-FILE from the specified objects
-objectlist FILE Use a list of object files found in FILE to specify objects
-precious-files-regex REGEX
don't remove output files matching REGEX
-release RELEASE specify package release information
-rpath LIBDIR the created library will eventually be installed in LIBDIR
-R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries
-shared only do dynamic linking of libtool libraries
-shrext SUFFIX override the standard shared library file extension
-static do not do any dynamic linking of uninstalled libtool libraries
-static-libtool-libs
do not do any dynamic linking of libtool libraries
-version-info CURRENT[:REVISION[:AGE]]
specify library version info [each variable defaults to 0]
-weak LIBNAME declare that the target provides the LIBNAME interface
All other options (arguments beginning with \`-') are ignored.
Every other argument is treated as a filename. Files ending in \`.la' are
treated as uninstalled libtool libraries, other files are standard or library
object files.
If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
only library objects (\`.lo' files) may be specified, and \`-rpath' is
required, except when creating a convenience library.
If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
using \`ar' and \`ranlib', or on Windows using \`lib'.
If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
is created, otherwise an executable program is created."
;;
uninstall)
$ECHO \
"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
Remove libraries from an installation directory.
RM is the name of the program to use to delete files associated with each FILE
(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
to RM.
If FILE is a libtool library, all the files associated with it are deleted.
Otherwise, only FILE itself is deleted using RM."
;;
*)
func_fatal_help "invalid operation mode \`$mode'"
;;
esac
$ECHO
$ECHO "Try \`$progname --help' for more information about other modes."
exit $?
}
# Now that we've collected a possible --mode arg, show help if necessary
$opt_help && func_mode_help
# func_mode_execute arg...
func_mode_execute ()
{
$opt_debug
# The first argument is the command name.
cmd="$nonopt"
test -z "$cmd" && \
func_fatal_help "you must specify a COMMAND"
# Handle -dlopen flags immediately.
for file in $execute_dlfiles; do
test -f "$file" \
|| func_fatal_help "\`$file' is not a file"
dir=
case $file in
*.la)
# Check to see that this really is a libtool archive.
func_lalib_unsafe_p "$file" \
|| func_fatal_help "\`$lib' is not a valid libtool archive"
# Read the libtool library.
dlname=
library_names=
func_source "$file"
# Skip this library if it cannot be dlopened.
if test -z "$dlname"; then
# Warn if it was a shared library.
test -n "$library_names" && \
func_warning "\`$file' was not linked with \`-export-dynamic'"
continue
fi
func_dirname "$file" "" "."
dir="$func_dirname_result"
if test -f "$dir/$objdir/$dlname"; then
dir="$dir/$objdir"
else
if test ! -f "$dir/$dlname"; then
func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
fi
fi
;;
*.lo)
# Just add the directory containing the .lo file.
func_dirname "$file" "" "."
dir="$func_dirname_result"
;;
*)
func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
continue
;;
esac
# Get the absolute pathname.
absdir=`cd "$dir" && pwd`
test -n "$absdir" && dir="$absdir"
# Now add the directory to shlibpath_var.
if eval "test -z \"\$$shlibpath_var\""; then
eval "$shlibpath_var=\"\$dir\""
else
eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
fi
done
# This variable tells wrapper scripts just to set shlibpath_var
# rather than running their programs.
libtool_execute_magic="$magic"
# Check if any of the arguments is a wrapper script.
args=
for file
do
case $file in
-*) ;;
*)
# Do a test to see if this is really a libtool program.
if func_ltwrapper_script_p "$file"; then
func_source "$file"
# Transform arg to wrapped name.
file="$progdir/$program"
elif func_ltwrapper_executable_p "$file"; then
func_ltwrapper_scriptname "$file"
func_source "$func_ltwrapper_scriptname_result"
# Transform arg to wrapped name.
file="$progdir/$program"
fi
;;
esac
# Quote arguments (to preserve shell metacharacters).
func_quote_for_eval "$file"
args="$args $func_quote_for_eval_result"
done
if test "X$opt_dry_run" = Xfalse; then
if test -n "$shlibpath_var"; then
# Export the shlibpath_var.
eval "export $shlibpath_var"
fi
# Restore saved environment variables
for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
do
eval "if test \"\${save_$lt_var+set}\" = set; then
$lt_var=\$save_$lt_var; export $lt_var
else
$lt_unset $lt_var
fi"
done
# Now prepare to actually exec the command.
exec_cmd="\$cmd$args"
else
# Display what would be done.
if test -n "$shlibpath_var"; then
eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
$ECHO "export $shlibpath_var"
fi
$ECHO "$cmd$args"
exit $EXIT_SUCCESS
fi
}
test "$mode" = execute && func_mode_execute ${1+"$@"}
# func_mode_finish arg...
func_mode_finish ()
{
$opt_debug
libdirs="$nonopt"
admincmds=
if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
for dir
do
libdirs="$libdirs $dir"
done
for libdir in $libdirs; do
if test -n "$finish_cmds"; then
# Do each command in the finish commands.
func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
'"$cmd"'"'
fi
if test -n "$finish_eval"; then
# Do the single finish_eval.
eval cmds=\"$finish_eval\"
$opt_dry_run || eval "$cmds" || admincmds="$admincmds
$cmds"
fi
done
fi
# Exit here if they wanted silent mode.
$opt_silent && exit $EXIT_SUCCESS
$ECHO "X----------------------------------------------------------------------" | $Xsed
$ECHO "Libraries have been installed in:"
for libdir in $libdirs; do
$ECHO " $libdir"
done
$ECHO
$ECHO "If you ever happen to want to link against installed libraries"
$ECHO "in a given directory, LIBDIR, you must either use libtool, and"
$ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'"
$ECHO "flag during linking and do at least one of the following:"
if test -n "$shlibpath_var"; then
$ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable"
$ECHO " during execution"
fi
if test -n "$runpath_var"; then
$ECHO " - add LIBDIR to the \`$runpath_var' environment variable"
$ECHO " during linking"
fi
if test -n "$hardcode_libdir_flag_spec"; then
libdir=LIBDIR
eval flag=\"$hardcode_libdir_flag_spec\"
$ECHO " - use the \`$flag' linker flag"
fi
if test -n "$admincmds"; then
$ECHO " - have your system administrator run these commands:$admincmds"
fi
if test -f /etc/ld.so.conf; then
$ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
fi
$ECHO
$ECHO "See any operating system documentation about shared libraries for"
case $host in
solaris2.[6789]|solaris2.1[0-9])
$ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual"
$ECHO "pages."
;;
*)
$ECHO "more information, such as the ld(1) and ld.so(8) manual pages."
;;
esac
$ECHO "X----------------------------------------------------------------------" | $Xsed
exit $EXIT_SUCCESS
}
test "$mode" = finish && func_mode_finish ${1+"$@"}
# func_mode_install arg...
func_mode_install ()
{
$opt_debug
# There may be an optional sh(1) argument at the beginning of
# install_prog (especially on Windows NT).
if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
# Allow the use of GNU shtool's install command.
$ECHO "X$nonopt" | $GREP shtool >/dev/null; then
# Aesthetically quote it.
func_quote_for_eval "$nonopt"
install_prog="$func_quote_for_eval_result "
arg=$1
shift
else
install_prog=
arg=$nonopt
fi
# The real first argument should be the name of the installation program.
# Aesthetically quote it.
func_quote_for_eval "$arg"
install_prog="$install_prog$func_quote_for_eval_result"
# We need to accept at least all the BSD install flags.
dest=
files=
opts=
prev=
install_type=
isdir=no
stripme=
for arg
do
if test -n "$dest"; then
files="$files $dest"
dest=$arg
continue
fi
case $arg in
-d) isdir=yes ;;
-f)
case " $install_prog " in
*[\\\ /]cp\ *) ;;
*) prev=$arg ;;
esac
;;
-g | -m | -o)
prev=$arg
;;
-s)
stripme=" -s"
continue
;;
-*)
;;
*)
# If the previous option needed an argument, then skip it.
if test -n "$prev"; then
prev=
else
dest=$arg
continue
fi
;;
esac
# Aesthetically quote the argument.
func_quote_for_eval "$arg"
install_prog="$install_prog $func_quote_for_eval_result"
done
test -z "$install_prog" && \
func_fatal_help "you must specify an install program"
test -n "$prev" && \
func_fatal_help "the \`$prev' option requires an argument"
if test -z "$files"; then
if test -z "$dest"; then
func_fatal_help "no file or destination specified"
else
func_fatal_help "you must specify a destination"
fi
fi
# Strip any trailing slash from the destination.
func_stripname '' '/' "$dest"
dest=$func_stripname_result
# Check to see that the destination is a directory.
test -d "$dest" && isdir=yes
if test "$isdir" = yes; then
destdir="$dest"
destname=
else
func_dirname_and_basename "$dest" "" "."
destdir="$func_dirname_result"
destname="$func_basename_result"
# Not a directory, so check to see that there is only one file specified.
set dummy $files; shift
test "$#" -gt 1 && \
func_fatal_help "\`$dest' is not a directory"
fi
case $destdir in
[\\/]* | [A-Za-z]:[\\/]*) ;;
*)
for file in $files; do
case $file in
*.lo) ;;
*)
func_fatal_help "\`$destdir' must be an absolute directory name"
;;
esac
done
;;
esac
# This variable tells wrapper scripts just to set variables rather
# than running their programs.
libtool_install_magic="$magic"
staticlibs=
future_libdirs=
current_libdirs=
for file in $files; do
# Do each installation.
case $file in
*.$libext)
# Do the static libraries later.
staticlibs="$staticlibs $file"
;;
*.la)
# Check to see that this really is a libtool archive.
func_lalib_unsafe_p "$file" \
|| func_fatal_help "\`$file' is not a valid libtool archive"
library_names=
old_library=
relink_command=
func_source "$file"
# Add the libdir to current_libdirs if it is the destination.
if test "X$destdir" = "X$libdir"; then
case "$current_libdirs " in
*" $libdir "*) ;;
*) current_libdirs="$current_libdirs $libdir" ;;
esac
else
# Note the libdir as a future libdir.
case "$future_libdirs " in
*" $libdir "*) ;;
*) future_libdirs="$future_libdirs $libdir" ;;
esac
fi
func_dirname "$file" "/" ""
dir="$func_dirname_result"
dir="$dir$objdir"
if test -n "$relink_command"; then
# Determine the prefix the user has applied to our future dir.
inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"`
# Don't allow the user to place us outside of our expected
# location b/c this prevents finding dependent libraries that
# are installed to the same prefix.
# At present, this check doesn't affect windows .dll's that
# are installed into $libdir/../bin (currently, that works fine)
# but it's something to keep an eye on.
test "$inst_prefix_dir" = "$destdir" && \
func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
if test -n "$inst_prefix_dir"; then
# Stick the inst_prefix_dir data into the link command.
relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
else
relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"`
fi
func_warning "relinking \`$file'"
func_show_eval "$relink_command" \
'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
fi
# See the names of the shared library.
set dummy $library_names; shift
if test -n "$1"; then
realname="$1"
shift
srcname="$realname"
test -n "$relink_command" && srcname="$realname"T
# Install the shared library and build the symlinks.
func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \
'exit $?'
tstripme="$stripme"
case $host_os in
cygwin* | mingw* | pw32* | cegcc*)
case $realname in
*.dll.a)
tstripme=""
;;
esac
;;
esac
if test -n "$tstripme" && test -n "$striplib"; then
func_show_eval "$striplib $destdir/$realname" 'exit $?'
fi
if test "$#" -gt 0; then
# Delete the old symlinks, and create new ones.
# Try `ln -sf' first, because the `ln' binary might depend on
# the symlink we replace! Solaris /bin/ln does not understand -f,
# so we also need to try rm && ln -s.
for linkname
do
test "$linkname" != "$realname" \
&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
done
fi
# Do each command in the postinstall commands.
lib="$destdir/$realname"
func_execute_cmds "$postinstall_cmds" 'exit $?'
fi
# Install the pseudo-library for information purposes.
func_basename "$file"
name="$func_basename_result"
instname="$dir/$name"i
func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
# Maybe install the static library, too.
test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
;;
*.lo)
# Install (i.e. copy) a libtool object.
# Figure out destination file name, if it wasn't already specified.
if test -n "$destname"; then
destfile="$destdir/$destname"
else
func_basename "$file"
destfile="$func_basename_result"
destfile="$destdir/$destfile"
fi
# Deduce the name of the destination old-style object file.
case $destfile in
*.lo)
func_lo2o "$destfile"
staticdest=$func_lo2o_result
;;
*.$objext)
staticdest="$destfile"
destfile=
;;
*)
func_fatal_help "cannot copy a libtool object to \`$destfile'"
;;
esac
# Install the libtool object if requested.
test -n "$destfile" && \
func_show_eval "$install_prog $file $destfile" 'exit $?'
# Install the old object if enabled.
if test "$build_old_libs" = yes; then
# Deduce the name of the old-style object file.
func_lo2o "$file"
staticobj=$func_lo2o_result
func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
fi
exit $EXIT_SUCCESS
;;
*)
# Figure out destination file name, if it wasn't already specified.
if test -n "$destname"; then
destfile="$destdir/$destname"
else
func_basename "$file"
destfile="$func_basename_result"
destfile="$destdir/$destfile"
fi
# If the file is missing, and there is a .exe on the end, strip it
# because it is most likely a libtool script we actually want to
# install
stripped_ext=""
case $file in
*.exe)
if test ! -f "$file"; then
func_stripname '' '.exe' "$file"
file=$func_stripname_result
stripped_ext=".exe"
fi
;;
esac
# Do a test to see if this is really a libtool program.
case $host in
*cygwin* | *mingw*)
if func_ltwrapper_executable_p "$file"; then
func_ltwrapper_scriptname "$file"
wrapper=$func_ltwrapper_scriptname_result
else
func_stripname '' '.exe' "$file"
wrapper=$func_stripname_result
fi
;;
*)
wrapper=$file
;;
esac
if func_ltwrapper_script_p "$wrapper"; then
notinst_deplibs=
relink_command=
func_source "$wrapper"
# Check the variables that should have been set.
test -z "$generated_by_libtool_version" && \
func_fatal_error "invalid libtool wrapper script \`$wrapper'"
finalize=yes
for lib in $notinst_deplibs; do
# Check to see that each library is installed.
libdir=
if test -f "$lib"; then
func_source "$lib"
fi
libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
if test -n "$libdir" && test ! -f "$libfile"; then
func_warning "\`$lib' has not been installed in \`$libdir'"
finalize=no
fi
done
relink_command=
func_source "$wrapper"
outputname=
if test "$fast_install" = no && test -n "$relink_command"; then
$opt_dry_run || {
if test "$finalize" = yes; then
tmpdir=`func_mktempdir`
func_basename "$file$stripped_ext"
file="$func_basename_result"
outputname="$tmpdir/$file"
# Replace the output file specification.
relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
$opt_silent || {
func_quote_for_expand "$relink_command"
eval "func_echo $func_quote_for_expand_result"
}
if eval "$relink_command"; then :
else
func_error "error: relink \`$file' with the above command before installing it"
$opt_dry_run || ${RM}r "$tmpdir"
continue
fi
file="$outputname"
else
func_warning "cannot relink \`$file'"
fi
}
else
# Install the binary that we compiled earlier.
file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
fi
fi
# remove .exe since cygwin /usr/bin/install will append another
# one anyway
case $install_prog,$host in
*/usr/bin/install*,*cygwin*)
case $file:$destfile in
*.exe:*.exe)
# this is ok
;;
*.exe:*)
destfile=$destfile.exe
;;
*:*.exe)
func_stripname '' '.exe' "$destfile"
destfile=$func_stripname_result
;;
esac
;;
esac
func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
$opt_dry_run || if test -n "$outputname"; then
${RM}r "$tmpdir"
fi
;;
esac
done
for file in $staticlibs; do
func_basename "$file"
name="$func_basename_result"
# Set up the ranlib parameters.
oldlib="$destdir/$name"
func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
if test -n "$stripme" && test -n "$old_striplib"; then
func_show_eval "$old_striplib $oldlib" 'exit $?'
fi
# Do each command in the postinstall commands.
func_execute_cmds "$old_postinstall_cmds" 'exit $?'
done
test -n "$future_libdirs" && \
func_warning "remember to run \`$progname --finish$future_libdirs'"
if test -n "$current_libdirs"; then
# Maybe just do a dry run.
$opt_dry_run && current_libdirs=" -n$current_libdirs"
exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
else
exit $EXIT_SUCCESS
fi
}
test "$mode" = install && func_mode_install ${1+"$@"}
# func_generate_dlsyms outputname originator pic_p
# Extract symbols from dlprefiles and create ${outputname}S.o with
# a dlpreopen symbol table.
func_generate_dlsyms ()
{
$opt_debug
my_outputname="$1"
my_originator="$2"
my_pic_p="${3-no}"
my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
my_dlsyms=
if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
if test -n "$NM" && test -n "$global_symbol_pipe"; then
my_dlsyms="${my_outputname}S.c"
else
func_error "not configured to extract global symbols from dlpreopened files"
fi
fi
if test -n "$my_dlsyms"; then
case $my_dlsyms in
"") ;;
*.c)
# Discover the nlist of each of the dlfiles.
nlist="$output_objdir/${my_outputname}.nm"
func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
# Parse the name list into a source file.
func_verbose "creating $output_objdir/$my_dlsyms"
$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
#ifdef __cplusplus
extern \"C\" {
#endif
/* External symbol declarations for the compiler. */\
"
if test "$dlself" = yes; then
func_verbose "generating symbol list for \`$output'"
$opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
# Add our own program objects to the symbol list.
progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
for progfile in $progfiles; do
func_verbose "extracting global C symbols from \`$progfile'"
$opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'"
done
if test -n "$exclude_expsyms"; then
$opt_dry_run || {
eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
eval '$MV "$nlist"T "$nlist"'
}
fi
if test -n "$export_symbols_regex"; then
$opt_dry_run || {
eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
eval '$MV "$nlist"T "$nlist"'
}
fi
# Prepare the list of exported symbols
if test -z "$export_symbols"; then
export_symbols="$output_objdir/$outputname.exp"
$opt_dry_run || {
$RM $export_symbols
eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
case $host in
*cygwin* | *mingw* | *cegcc* )
eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
;;
esac
}
else
$opt_dry_run || {
eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
eval '$MV "$nlist"T "$nlist"'
case $host in
*cygwin | *mingw* | *cegcc* )
eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
;;
esac
}
fi
fi
for dlprefile in $dlprefiles; do
func_verbose "extracting global C symbols from \`$dlprefile'"
func_basename "$dlprefile"
name="$func_basename_result"
$opt_dry_run || {
eval '$ECHO ": $name " >> "$nlist"'
eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'"
}
done
$opt_dry_run || {
# Make sure we have at least an empty file.
test -f "$nlist" || : > "$nlist"
if test -n "$exclude_expsyms"; then
$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
$MV "$nlist"T "$nlist"
fi
# Try sorting and uniquifying the output.
if $GREP -v "^: " < "$nlist" |
if sort -k 3 /dev/null 2>&1; then
sort -k 3
else
sort +2
fi |
uniq > "$nlist"S; then
:
else
$GREP -v "^: " < "$nlist" > "$nlist"S
fi
if test -f "$nlist"S; then
eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
else
$ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms"
fi
$ECHO >> "$output_objdir/$my_dlsyms" "\
/* The mapping between symbol names and symbols. */
typedef struct {
const char *name;
void *address;
} lt_dlsymlist;
"
case $host in
*cygwin* | *mingw* | *cegcc* )
$ECHO >> "$output_objdir/$my_dlsyms" "\
/* DATA imports from DLLs on WIN32 con't be const, because
runtime relocations are performed -- see ld's documentation
on pseudo-relocs. */"
lt_dlsym_const= ;;
*osf5*)
echo >> "$output_objdir/$my_dlsyms" "\
/* This system does not cope well with relocations in const data */"
lt_dlsym_const= ;;
*)
lt_dlsym_const=const ;;
esac
$ECHO >> "$output_objdir/$my_dlsyms" "\
extern $lt_dlsym_const lt_dlsymlist
lt_${my_prefix}_LTX_preloaded_symbols[];
$lt_dlsym_const lt_dlsymlist
lt_${my_prefix}_LTX_preloaded_symbols[] =
{\
{ \"$my_originator\", (void *) 0 },"
case $need_lib_prefix in
no)
eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
;;
*)
eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
;;
esac
$ECHO >> "$output_objdir/$my_dlsyms" "\
{0, (void *) 0}
};
/* This works around a problem in FreeBSD linker */
#ifdef FREEBSD_WORKAROUND
static const void *lt_preloaded_setup() {
return lt_${my_prefix}_LTX_preloaded_symbols;
}
#endif
#ifdef __cplusplus
}
#endif\
"
} # !$opt_dry_run
pic_flag_for_symtable=
case "$compile_command " in
*" -static "*) ;;
*)
case $host in
# compiling the symbol table file with pic_flag works around
# a FreeBSD bug that causes programs to crash when -lm is
# linked before any other PIC object. But we must not use
# pic_flag when linking with -static. The problem exists in
# FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
*-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
*-*-hpux*)
pic_flag_for_symtable=" $pic_flag" ;;
*)
if test "X$my_pic_p" != Xno; then
pic_flag_for_symtable=" $pic_flag"
fi
;;
esac
;;
esac
symtab_cflags=
for arg in $LTCFLAGS; do
case $arg in
-pie | -fpie | -fPIE) ;;
*) symtab_cflags="$symtab_cflags $arg" ;;
esac
done
# Now compile the dynamic symbol file.
func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
# Clean up the generated files.
func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
# Transform the symbol file into the correct name.
symfileobj="$output_objdir/${my_outputname}S.$objext"
case $host in
*cygwin* | *mingw* | *cegcc* )
if test -f "$output_objdir/$my_outputname.def"; then
compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
else
compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
fi
;;
*)
compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"`
;;
esac
;;
*)
func_fatal_error "unknown suffix for \`$my_dlsyms'"
;;
esac
else
# We keep going just in case the user didn't refer to
# lt_preloaded_symbols. The linker will fail if global_symbol_pipe
# really was required.
# Nullify the symbol file.
compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
fi
}
# func_win32_libid arg
# return the library type of file 'arg'
#
# Need a lot of goo to handle *both* DLLs and import libs
# Has to be a shell function in order to 'eat' the argument
# that is supplied when $file_magic_command is called.
func_win32_libid ()
{
$opt_debug
win32_libid_type="unknown"
win32_fileres=`file -L $1 2>/dev/null`
case $win32_fileres in
*ar\ archive\ import\ library*) # definitely import
win32_libid_type="x86 archive import"
;;
*ar\ archive*) # could be an import, or static
if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
$EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
win32_nmres=`eval $NM -f posix -A $1 |
$SED -n -e '
1,100{
/ I /{
s,.*,import,
p
q
}
}'`
case $win32_nmres in
import*) win32_libid_type="x86 archive import";;
*) win32_libid_type="x86 archive static";;
esac
fi
;;
*DLL*)
win32_libid_type="x86 DLL"
;;
*executable*) # but shell scripts are "executable" too...
case $win32_fileres in
*MS\ Windows\ PE\ Intel*)
win32_libid_type="x86 DLL"
;;
esac
;;
esac
$ECHO "$win32_libid_type"
}
# func_extract_an_archive dir oldlib
func_extract_an_archive ()
{
$opt_debug
f_ex_an_ar_dir="$1"; shift
f_ex_an_ar_oldlib="$1"
func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?'
if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
:
else
func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
fi
}
# func_extract_archives gentop oldlib ...
func_extract_archives ()
{
$opt_debug
my_gentop="$1"; shift
my_oldlibs=${1+"$@"}
my_oldobjs=""
my_xlib=""
my_xabs=""
my_xdir=""
for my_xlib in $my_oldlibs; do
# Extract the objects.
case $my_xlib in
[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
*) my_xabs=`pwd`"/$my_xlib" ;;
esac
func_basename "$my_xlib"
my_xlib="$func_basename_result"
my_xlib_u=$my_xlib
while :; do
case " $extracted_archives " in
*" $my_xlib_u "*)
func_arith $extracted_serial + 1
extracted_serial=$func_arith_result
my_xlib_u=lt$extracted_serial-$my_xlib ;;
*) break ;;
esac
done
extracted_archives="$extracted_archives $my_xlib_u"
my_xdir="$my_gentop/$my_xlib_u"
func_mkdir_p "$my_xdir"
case $host in
*-darwin*)
func_verbose "Extracting $my_xabs"
# Do not bother doing anything if just a dry run
$opt_dry_run || {
darwin_orig_dir=`pwd`
cd $my_xdir || exit $?
darwin_archive=$my_xabs
darwin_curdir=`pwd`
darwin_base_archive=`basename "$darwin_archive"`
darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
if test -n "$darwin_arches"; then
darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
darwin_arch=
func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
for darwin_arch in $darwin_arches ; do
func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
$LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
func_extract_an_archive "`pwd`" "${darwin_base_archive}"
cd "$darwin_curdir"
$RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
done # $darwin_arches
## Okay now we've a bunch of thin objects, gotta fatten them up :)
darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
darwin_file=
darwin_files=
for darwin_file in $darwin_filelist; do
darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
$LIPO -create -output "$darwin_file" $darwin_files
done # $darwin_filelist
$RM -rf unfat-$$
cd "$darwin_orig_dir"
else
cd $darwin_orig_dir
func_extract_an_archive "$my_xdir" "$my_xabs"
fi # $darwin_arches
} # !$opt_dry_run
;;
*)
func_extract_an_archive "$my_xdir" "$my_xabs"
;;
esac
my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
done
func_extract_archives_result="$my_oldobjs"
}
# func_emit_wrapper_part1 [arg=no]
#
# Emit the first part of a libtool wrapper script on stdout.
# For more information, see the description associated with
# func_emit_wrapper(), below.
func_emit_wrapper_part1 ()
{
func_emit_wrapper_part1_arg1=no
if test -n "$1" ; then
func_emit_wrapper_part1_arg1=$1
fi
$ECHO "\
#! $SHELL
# $output - temporary wrapper script for $objdir/$outputname
# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
#
# The $output program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
#
# This wrapper script should never be moved out of the build directory.
# If it is, it will not operate correctly.
# Sed substitution that helps us do robust quoting. It backslashifies
# metacharacters that are still active within double-quoted strings.
Xsed='${SED} -e 1s/^X//'
sed_quote_subst='$sed_quote_subst'
# Be Bourne compatible
if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
emulate sh
NULLCMD=:
# Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
else
case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
fi
BIN_SH=xpg4; export BIN_SH # for Tru64
DUALCASE=1; export DUALCASE # for MKS sh
# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
relink_command=\"$relink_command\"
# This environment variable determines our operation mode.
if test \"\$libtool_install_magic\" = \"$magic\"; then
# install mode needs the following variables:
generated_by_libtool_version='$macro_version'
notinst_deplibs='$notinst_deplibs'
else
# When we are sourced in execute mode, \$file and \$ECHO are already set.
if test \"\$libtool_execute_magic\" != \"$magic\"; then
ECHO=\"$qecho\"
file=\"\$0\"
# Make sure echo works.
if test \"X\$1\" = X--no-reexec; then
# Discard the --no-reexec flag, and continue.
shift
elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then
# Yippee, \$ECHO works!
:
else
# Restart under the correct shell, and then maybe \$ECHO will work.
exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
fi
fi\
"
$ECHO "\
# Find the directory that this script lives in.
thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
test \"x\$thisdir\" = \"x\$file\" && thisdir=.
# Follow symbolic links until we get to the real thisdir.
file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
while test -n \"\$file\"; do
destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
# If there was a directory component, then change thisdir.
if test \"x\$destdir\" != \"x\$file\"; then
case \"\$destdir\" in
[\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
*) thisdir=\"\$thisdir/\$destdir\" ;;
esac
fi
file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
done
"
}
# end: func_emit_wrapper_part1
# func_emit_wrapper_part2 [arg=no]
#
# Emit the second part of a libtool wrapper script on stdout.
# For more information, see the description associated with
# func_emit_wrapper(), below.
func_emit_wrapper_part2 ()
{
func_emit_wrapper_part2_arg1=no
if test -n "$1" ; then
func_emit_wrapper_part2_arg1=$1
fi
$ECHO "\
# Usually 'no', except on cygwin/mingw when embedded into
# the cwrapper.
WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1
if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
# special case for '.'
if test \"\$thisdir\" = \".\"; then
thisdir=\`pwd\`
fi
# remove .libs from thisdir
case \"\$thisdir\" in
*[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;;
$objdir ) thisdir=. ;;
esac
fi
# Try to get the absolute directory name.
absdir=\`cd \"\$thisdir\" && pwd\`
test -n \"\$absdir\" && thisdir=\"\$absdir\"
"
if test "$fast_install" = yes; then
$ECHO "\
program=lt-'$outputname'$exeext
progdir=\"\$thisdir/$objdir\"
if test ! -f \"\$progdir/\$program\" ||
{ file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
test \"X\$file\" != \"X\$progdir/\$program\"; }; then
file=\"\$\$-\$program\"
if test ! -d \"\$progdir\"; then
$MKDIR \"\$progdir\"
else
$RM \"\$progdir/\$file\"
fi"
$ECHO "\
# relink executable if necessary
if test -n \"\$relink_command\"; then
if relink_command_output=\`eval \$relink_command 2>&1\`; then :
else
$ECHO \"\$relink_command_output\" >&2
$RM \"\$progdir/\$file\"
exit 1
fi
fi
$MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
{ $RM \"\$progdir/\$program\";
$MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
$RM \"\$progdir/\$file\"
fi"
else
$ECHO "\
program='$outputname'
progdir=\"\$thisdir/$objdir\"
"
fi
$ECHO "\
if test -f \"\$progdir/\$program\"; then"
# Export our shlibpath_var if we have one.
if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
$ECHO "\
# Add our own library path to $shlibpath_var
$shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
# Some systems cannot cope with colon-terminated $shlibpath_var
# The second colon is a workaround for a bug in BeOS R4 sed
$shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
export $shlibpath_var
"
fi
# fixup the dll searchpath if we need to.
if test -n "$dllsearchpath"; then
$ECHO "\
# Add the dll search path components to the executable PATH
PATH=$dllsearchpath:\$PATH
"
fi
$ECHO "\
if test \"\$libtool_execute_magic\" != \"$magic\"; then
# Run the actual program with our arguments.
"
case $host in
# Backslashes separate directories on plain windows
*-*-mingw | *-*-os2* | *-cegcc*)
$ECHO "\
exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
"
;;
*)
$ECHO "\
exec \"\$progdir/\$program\" \${1+\"\$@\"}
"
;;
esac
$ECHO "\
\$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
exit 1
fi
else
# The program doesn't exist.
\$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
\$ECHO \"This script is just a wrapper for \$program.\" 1>&2
$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
exit 1
fi
fi\
"
}
# end: func_emit_wrapper_part2
# func_emit_wrapper [arg=no]
#
# Emit a libtool wrapper script on stdout.
# Don't directly open a file because we may want to
# incorporate the script contents within a cygwin/mingw
# wrapper executable. Must ONLY be called from within
# func_mode_link because it depends on a number of variables
# set therein.
#
# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
# variable will take. If 'yes', then the emitted script
# will assume that the directory in which it is stored is
# the $objdir directory. This is a cygwin/mingw-specific
# behavior.
func_emit_wrapper ()
{
func_emit_wrapper_arg1=no
if test -n "$1" ; then
func_emit_wrapper_arg1=$1
fi
# split this up so that func_emit_cwrapperexe_src
# can call each part independently.
func_emit_wrapper_part1 "${func_emit_wrapper_arg1}"
func_emit_wrapper_part2 "${func_emit_wrapper_arg1}"
}
# func_to_host_path arg
#
# Convert paths to host format when used with build tools.
# Intended for use with "native" mingw (where libtool itself
# is running under the msys shell), or in the following cross-
# build environments:
# $build $host
# mingw (msys) mingw [e.g. native]
# cygwin mingw
# *nix + wine mingw
# where wine is equipped with the `winepath' executable.
# In the native mingw case, the (msys) shell automatically
# converts paths for any non-msys applications it launches,
# but that facility isn't available from inside the cwrapper.
# Similar accommodations are necessary for $host mingw and
# $build cygwin. Calling this function does no harm for other
# $host/$build combinations not listed above.
#
# ARG is the path (on $build) that should be converted to
# the proper representation for $host. The result is stored
# in $func_to_host_path_result.
func_to_host_path ()
{
func_to_host_path_result="$1"
if test -n "$1" ; then
case $host in
*mingw* )
lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
case $build in
*mingw* ) # actually, msys
# awkward: cmd appends spaces to result
lt_sed_strip_trailing_spaces="s/[ ]*\$//"
func_to_host_path_tmp1=`( cmd //c echo "$1" |\
$SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
$SED -e "$lt_sed_naive_backslashify"`
;;
*cygwin* )
func_to_host_path_tmp1=`cygpath -w "$1"`
func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
$SED -e "$lt_sed_naive_backslashify"`
;;
* )
# Unfortunately, winepath does not exit with a non-zero
# error code, so we are forced to check the contents of
# stdout. On the other hand, if the command is not
# found, the shell will set an exit code of 127 and print
# *an error message* to stdout. So we must check for both
# error code of zero AND non-empty stdout, which explains
# the odd construction:
func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
$SED -e "$lt_sed_naive_backslashify"`
else
# Allow warning below.
func_to_host_path_result=""
fi
;;
esac
if test -z "$func_to_host_path_result" ; then
func_error "Could not determine host path corresponding to"
func_error " '$1'"
func_error "Continuing, but uninstalled executables may not work."
# Fallback:
func_to_host_path_result="$1"
fi
;;
esac
fi
}
# end: func_to_host_path
# func_to_host_pathlist arg
#
# Convert pathlists to host format when used with build tools.
# See func_to_host_path(), above. This function supports the
# following $build/$host combinations (but does no harm for
# combinations not listed here):
# $build $host
# mingw (msys) mingw [e.g. native]
# cygwin mingw
# *nix + wine mingw
#
# Path separators are also converted from $build format to
# $host format. If ARG begins or ends with a path separator
# character, it is preserved (but converted to $host format)
# on output.
#
# ARG is a pathlist (on $build) that should be converted to
# the proper representation on $host. The result is stored
# in $func_to_host_pathlist_result.
func_to_host_pathlist ()
{
func_to_host_pathlist_result="$1"
if test -n "$1" ; then
case $host in
*mingw* )
lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
# Remove leading and trailing path separator characters from
# ARG. msys behavior is inconsistent here, cygpath turns them
# into '.;' and ';.', and winepath ignores them completely.
func_to_host_pathlist_tmp2="$1"
# Once set for this call, this variable should not be
# reassigned. It is used in tha fallback case.
func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
$SED -e 's|^:*||' -e 's|:*$||'`
case $build in
*mingw* ) # Actually, msys.
# Awkward: cmd appends spaces to result.
lt_sed_strip_trailing_spaces="s/[ ]*\$//"
func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\
$SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
$SED -e "$lt_sed_naive_backslashify"`
;;
*cygwin* )
func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"`
func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
$SED -e "$lt_sed_naive_backslashify"`
;;
* )
# unfortunately, winepath doesn't convert pathlists
func_to_host_pathlist_result=""
func_to_host_pathlist_oldIFS=$IFS
IFS=:
for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
IFS=$func_to_host_pathlist_oldIFS
if test -n "$func_to_host_pathlist_f" ; then
func_to_host_path "$func_to_host_pathlist_f"
if test -n "$func_to_host_path_result" ; then
if test -z "$func_to_host_pathlist_result" ; then
func_to_host_pathlist_result="$func_to_host_path_result"
else
func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
fi
fi
fi
IFS=:
done
IFS=$func_to_host_pathlist_oldIFS
;;
esac
if test -z "$func_to_host_pathlist_result" ; then
func_error "Could not determine the host path(s) corresponding to"
func_error " '$1'"
func_error "Continuing, but uninstalled executables may not work."
# Fallback. This may break if $1 contains DOS-style drive
# specifications. The fix is not to complicate the expression
# below, but for the user to provide a working wine installation
# with winepath so that path translation in the cross-to-mingw
# case works properly.
lt_replace_pathsep_nix_to_dos="s|:|;|g"
func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
$SED -e "$lt_replace_pathsep_nix_to_dos"`
fi
# Now, add the leading and trailing path separators back
case "$1" in
:* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
;;
esac
case "$1" in
*: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
;;
esac
;;
esac
fi
}
# end: func_to_host_pathlist
# func_emit_cwrapperexe_src
# emit the source code for a wrapper executable on stdout
# Must ONLY be called from within func_mode_link because
# it depends on a number of variable set therein.
func_emit_cwrapperexe_src ()
{
cat <
#include
#ifdef _MSC_VER
# include
# include
# include
# define setmode _setmode
#else
# include
# include
# ifdef __CYGWIN__
# include
# define HAVE_SETENV
# ifdef __STRICT_ANSI__
char *realpath (const char *, char *);
int putenv (char *);
int setenv (const char *, const char *, int);
# endif
# endif
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#if defined(PATH_MAX)
# define LT_PATHMAX PATH_MAX
#elif defined(MAXPATHLEN)
# define LT_PATHMAX MAXPATHLEN
#else
# define LT_PATHMAX 1024
#endif
#ifndef S_IXOTH
# define S_IXOTH 0
#endif
#ifndef S_IXGRP
# define S_IXGRP 0
#endif
#ifdef _MSC_VER
# define S_IXUSR _S_IEXEC
# define stat _stat
# ifndef _INTPTR_T_DEFINED
# define intptr_t int
# endif
#endif
#ifndef DIR_SEPARATOR
# define DIR_SEPARATOR '/'
# define PATH_SEPARATOR ':'
#endif
#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
defined (__OS2__)
# define HAVE_DOS_BASED_FILE_SYSTEM
# define FOPEN_WB "wb"
# ifndef DIR_SEPARATOR_2
# define DIR_SEPARATOR_2 '\\'
# endif
# ifndef PATH_SEPARATOR_2
# define PATH_SEPARATOR_2 ';'
# endif
#endif
#ifndef DIR_SEPARATOR_2
# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
#else /* DIR_SEPARATOR_2 */
# define IS_DIR_SEPARATOR(ch) \
(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
#endif /* DIR_SEPARATOR_2 */
#ifndef PATH_SEPARATOR_2
# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
#else /* PATH_SEPARATOR_2 */
# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
#endif /* PATH_SEPARATOR_2 */
#ifdef __CYGWIN__
# define FOPEN_WB "wb"
#endif
#ifndef FOPEN_WB
# define FOPEN_WB "w"
#endif
#ifndef _O_BINARY
# define _O_BINARY 0
#endif
#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
#define XFREE(stale) do { \
if (stale) { free ((void *) stale); stale = 0; } \
} while (0)
#undef LTWRAPPER_DEBUGPRINTF
#if defined DEBUGWRAPPER
# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args
static void
ltwrapper_debugprintf (const char *fmt, ...)
{
va_list args;
va_start (args, fmt);
(void) vfprintf (stderr, fmt, args);
va_end (args);
}
#else
# define LTWRAPPER_DEBUGPRINTF(args)
#endif
const char *program_name = NULL;
void *xmalloc (size_t num);
char *xstrdup (const char *string);
const char *base_name (const char *name);
char *find_executable (const char *wrapper);
char *chase_symlinks (const char *pathspec);
int make_executable (const char *path);
int check_executable (const char *path);
char *strendzap (char *str, const char *pat);
void lt_fatal (const char *message, ...);
void lt_setenv (const char *name, const char *value);
char *lt_extend_str (const char *orig_value, const char *add, int to_end);
void lt_opt_process_env_set (const char *arg);
void lt_opt_process_env_prepend (const char *arg);
void lt_opt_process_env_append (const char *arg);
int lt_split_name_value (const char *arg, char** name, char** value);
void lt_update_exe_path (const char *name, const char *value);
void lt_update_lib_path (const char *name, const char *value);
static const char *script_text_part1 =
EOF
func_emit_wrapper_part1 yes |
$SED -e 's/\([\\"]\)/\\\1/g' \
-e 's/^/ "/' -e 's/$/\\n"/'
echo ";"
cat <")));
for (i = 0; i < newargc; i++)
{
LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : "")));
}
EOF
case $host_os in
mingw*)
cat <<"EOF"
/* execv doesn't actually work on mingw as expected on unix */
rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
if (rval == -1)
{
/* failed to start process */
LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
return 127;
}
return rval;
EOF
;;
*)
cat <<"EOF"
execv (lt_argv_zero, newargz);
return rval; /* =127, but avoids unused variable warning */
EOF
;;
esac
cat <<"EOF"
}
void *
xmalloc (size_t num)
{
void *p = (void *) malloc (num);
if (!p)
lt_fatal ("Memory exhausted");
return p;
}
char *
xstrdup (const char *string)
{
return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
string) : NULL;
}
const char *
base_name (const char *name)
{
const char *base;
#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
/* Skip over the disk name in MSDOS pathnames. */
if (isalpha ((unsigned char) name[0]) && name[1] == ':')
name += 2;
#endif
for (base = name; *name; name++)
if (IS_DIR_SEPARATOR (*name))
base = name + 1;
return base;
}
int
check_executable (const char *path)
{
struct stat st;
LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n",
path ? (*path ? path : "EMPTY!") : "NULL!"));
if ((!path) || (!*path))
return 0;
if ((stat (path, &st) >= 0)
&& (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
return 1;
else
return 0;
}
int
make_executable (const char *path)
{
int rval = 0;
struct stat st;
LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n",
path ? (*path ? path : "EMPTY!") : "NULL!"));
if ((!path) || (!*path))
return 0;
if (stat (path, &st) >= 0)
{
rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
}
return rval;
}
/* Searches for the full path of the wrapper. Returns
newly allocated full path name if found, NULL otherwise
Does not chase symlinks, even on platforms that support them.
*/
char *
find_executable (const char *wrapper)
{
int has_slash = 0;
const char *p;
const char *p_next;
/* static buffer for getcwd */
char tmp[LT_PATHMAX + 1];
int tmp_len;
char *concat_name;
LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n",
wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"));
if ((wrapper == NULL) || (*wrapper == '\0'))
return NULL;
/* Absolute path? */
#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
{
concat_name = xstrdup (wrapper);
if (check_executable (concat_name))
return concat_name;
XFREE (concat_name);
}
else
{
#endif
if (IS_DIR_SEPARATOR (wrapper[0]))
{
concat_name = xstrdup (wrapper);
if (check_executable (concat_name))
return concat_name;
XFREE (concat_name);
}
#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
}
#endif
for (p = wrapper; *p; p++)
if (*p == '/')
{
has_slash = 1;
break;
}
if (!has_slash)
{
/* no slashes; search PATH */
const char *path = getenv ("PATH");
if (path != NULL)
{
for (p = path; *p; p = p_next)
{
const char *q;
size_t p_len;
for (q = p; *q; q++)
if (IS_PATH_SEPARATOR (*q))
break;
p_len = q - p;
p_next = (*q == '\0' ? q : q + 1);
if (p_len == 0)
{
/* empty path: current directory */
if (getcwd (tmp, LT_PATHMAX) == NULL)
lt_fatal ("getcwd failed");
tmp_len = strlen (tmp);
concat_name =
XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
memcpy (concat_name, tmp, tmp_len);
concat_name[tmp_len] = '/';
strcpy (concat_name + tmp_len + 1, wrapper);
}
else
{
concat_name =
XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
memcpy (concat_name, p, p_len);
concat_name[p_len] = '/';
strcpy (concat_name + p_len + 1, wrapper);
}
if (check_executable (concat_name))
return concat_name;
XFREE (concat_name);
}
}
/* not found in PATH; assume curdir */
}
/* Relative path | not found in path: prepend cwd */
if (getcwd (tmp, LT_PATHMAX) == NULL)
lt_fatal ("getcwd failed");
tmp_len = strlen (tmp);
concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
memcpy (concat_name, tmp, tmp_len);
concat_name[tmp_len] = '/';
strcpy (concat_name + tmp_len + 1, wrapper);
if (check_executable (concat_name))
return concat_name;
XFREE (concat_name);
return NULL;
}
char *
chase_symlinks (const char *pathspec)
{
#ifndef S_ISLNK
return xstrdup (pathspec);
#else
char buf[LT_PATHMAX];
struct stat s;
char *tmp_pathspec = xstrdup (pathspec);
char *p;
int has_symlinks = 0;
while (strlen (tmp_pathspec) && !has_symlinks)
{
LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n",
tmp_pathspec));
if (lstat (tmp_pathspec, &s) == 0)
{
if (S_ISLNK (s.st_mode) != 0)
{
has_symlinks = 1;
break;
}
/* search backwards for last DIR_SEPARATOR */
p = tmp_pathspec + strlen (tmp_pathspec) - 1;
while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
p--;
if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
{
/* no more DIR_SEPARATORS left */
break;
}
*p = '\0';
}
else
{
char *errstr = strerror (errno);
lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr);
}
}
XFREE (tmp_pathspec);
if (!has_symlinks)
{
return xstrdup (pathspec);
}
tmp_pathspec = realpath (pathspec, buf);
if (tmp_pathspec == 0)
{
lt_fatal ("Could not follow symlinks for %s", pathspec);
}
return xstrdup (tmp_pathspec);
#endif
}
char *
strendzap (char *str, const char *pat)
{
size_t len, patlen;
assert (str != NULL);
assert (pat != NULL);
len = strlen (str);
patlen = strlen (pat);
if (patlen <= len)
{
str += len - patlen;
if (strcmp (str, pat) == 0)
*str = '\0';
}
return str;
}
static void
lt_error_core (int exit_status, const char *mode,
const char *message, va_list ap)
{
fprintf (stderr, "%s: %s: ", program_name, mode);
vfprintf (stderr, message, ap);
fprintf (stderr, ".\n");
if (exit_status >= 0)
exit (exit_status);
}
void
lt_fatal (const char *message, ...)
{
va_list ap;
va_start (ap, message);
lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
va_end (ap);
}
void
lt_setenv (const char *name, const char *value)
{
LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
(name ? name : ""),
(value ? value : "")));
{
#ifdef HAVE_SETENV
/* always make a copy, for consistency with !HAVE_SETENV */
char *str = xstrdup (value);
setenv (name, str, 1);
#else
int len = strlen (name) + 1 + strlen (value) + 1;
char *str = XMALLOC (char, len);
sprintf (str, "%s=%s", name, value);
if (putenv (str) != EXIT_SUCCESS)
{
XFREE (str);
}
#endif
}
}
char *
lt_extend_str (const char *orig_value, const char *add, int to_end)
{
char *new_value;
if (orig_value && *orig_value)
{
int orig_value_len = strlen (orig_value);
int add_len = strlen (add);
new_value = XMALLOC (char, add_len + orig_value_len + 1);
if (to_end)
{
strcpy (new_value, orig_value);
strcpy (new_value + orig_value_len, add);
}
else
{
strcpy (new_value, add);
strcpy (new_value + add_len, orig_value);
}
}
else
{
new_value = xstrdup (add);
}
return new_value;
}
int
lt_split_name_value (const char *arg, char** name, char** value)
{
const char *p;
int len;
if (!arg || !*arg)
return 1;
p = strchr (arg, (int)'=');
if (!p)
return 1;
*value = xstrdup (++p);
len = strlen (arg) - strlen (*value);
*name = XMALLOC (char, len);
strncpy (*name, arg, len-1);
(*name)[len - 1] = '\0';
return 0;
}
void
lt_opt_process_env_set (const char *arg)
{
char *name = NULL;
char *value = NULL;
if (lt_split_name_value (arg, &name, &value) != 0)
{
XFREE (name);
XFREE (value);
lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg);
}
lt_setenv (name, value);
XFREE (name);
XFREE (value);
}
void
lt_opt_process_env_prepend (const char *arg)
{
char *name = NULL;
char *value = NULL;
char *new_value = NULL;
if (lt_split_name_value (arg, &name, &value) != 0)
{
XFREE (name);
XFREE (value);
lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg);
}
new_value = lt_extend_str (getenv (name), value, 0);
lt_setenv (name, new_value);
XFREE (new_value);
XFREE (name);
XFREE (value);
}
void
lt_opt_process_env_append (const char *arg)
{
char *name = NULL;
char *value = NULL;
char *new_value = NULL;
if (lt_split_name_value (arg, &name, &value) != 0)
{
XFREE (name);
XFREE (value);
lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg);
}
new_value = lt_extend_str (getenv (name), value, 1);
lt_setenv (name, new_value);
XFREE (new_value);
XFREE (name);
XFREE (value);
}
void
lt_update_exe_path (const char *name, const char *value)
{
LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
(name ? name : ""),
(value ? value : "")));
if (name && *name && value && *value)
{
char *new_value = lt_extend_str (getenv (name), value, 0);
/* some systems can't cope with a ':'-terminated path #' */
int len = strlen (new_value);
while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
{
new_value[len-1] = '\0';
}
lt_setenv (name, new_value);
XFREE (new_value);
}
}
void
lt_update_lib_path (const char *name, const char *value)
{
LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
(name ? name : ""),
(value ? value : "")));
if (name && *name && value && *value)
{
char *new_value = lt_extend_str (getenv (name), value, 0);
lt_setenv (name, new_value);
XFREE (new_value);
}
}
EOF
}
# end: func_emit_cwrapperexe_src
# func_mode_link arg...
func_mode_link ()
{
$opt_debug
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
# It is impossible to link a dll without this setting, and
# we shouldn't force the makefile maintainer to figure out
# which system we are compiling for in order to pass an extra
# flag for every libtool invocation.
# allow_undefined=no
# FIXME: Unfortunately, there are problems with the above when trying
# to make a dll which has undefined symbols, in which case not
# even a static library is built. For now, we need to specify
# -no-undefined on the libtool link line when we can be certain
# that all symbols are satisfied, otherwise we get a static library.
allow_undefined=yes
;;
*)
allow_undefined=yes
;;
esac
libtool_args=$nonopt
base_compile="$nonopt $@"
compile_command=$nonopt
finalize_command=$nonopt
compile_rpath=
finalize_rpath=
compile_shlibpath=
finalize_shlibpath=
convenience=
old_convenience=
deplibs=
old_deplibs=
compiler_flags=
linker_flags=
dllsearchpath=
lib_search_path=`pwd`
inst_prefix_dir=
new_inherited_linker_flags=
avoid_version=no
dlfiles=
dlprefiles=
dlself=no
export_dynamic=no
export_symbols=
export_symbols_regex=
generated=
libobjs=
ltlibs=
module=no
no_install=no
objs=
non_pic_objects=
precious_files_regex=
prefer_static_libs=no
preload=no
prev=
prevarg=
release=
rpath=
xrpath=
perm_rpath=
temp_rpath=
thread_safe=no
vinfo=
vinfo_number=no
weak_libs=
single_module="${wl}-single_module"
func_infer_tag $base_compile
# We need to know -static, to get the right output filenames.
for arg
do
case $arg in
-shared)
test "$build_libtool_libs" != yes && \
func_fatal_configuration "can not build a shared library"
build_old_libs=no
break
;;
-all-static | -static | -static-libtool-libs)
case $arg in
-all-static)
if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
func_warning "complete static linking is impossible in this configuration"
fi
if test -n "$link_static_flag"; then
dlopen_self=$dlopen_self_static
fi
prefer_static_libs=yes
;;
-static)
if test -z "$pic_flag" && test -n "$link_static_flag"; then
dlopen_self=$dlopen_self_static
fi
prefer_static_libs=built
;;
-static-libtool-libs)
if test -z "$pic_flag" && test -n "$link_static_flag"; then
dlopen_self=$dlopen_self_static
fi
prefer_static_libs=yes
;;
esac
build_libtool_libs=no
build_old_libs=yes
break
;;
esac
done
# See if our shared archives depend on static archives.
test -n "$old_archive_from_new_cmds" && build_old_libs=yes
# Go through the arguments, transforming them on the way.
while test "$#" -gt 0; do
arg="$1"
shift
func_quote_for_eval "$arg"
qarg=$func_quote_for_eval_unquoted_result
func_append libtool_args " $func_quote_for_eval_result"
# If the previous option needs an argument, assign it.
if test -n "$prev"; then
case $prev in
output)
func_append compile_command " @OUTPUT@"
func_append finalize_command " @OUTPUT@"
;;
esac
case $prev in
dlfiles|dlprefiles)
if test "$preload" = no; then
# Add the symbol object into the linking commands.
func_append compile_command " @SYMFILE@"
func_append finalize_command " @SYMFILE@"
preload=yes
fi
case $arg in
*.la | *.lo) ;; # We handle these cases below.
force)
if test "$dlself" = no; then
dlself=needless
export_dynamic=yes
fi
prev=
continue
;;
self)
if test "$prev" = dlprefiles; then
dlself=yes
elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
dlself=yes
else
dlself=needless
export_dynamic=yes
fi
prev=
continue
;;
*)
if test "$prev" = dlfiles; then
dlfiles="$dlfiles $arg"
else
dlprefiles="$dlprefiles $arg"
fi
prev=
continue
;;
esac
;;
expsyms)
export_symbols="$arg"
test -f "$arg" \
|| func_fatal_error "symbol file \`$arg' does not exist"
prev=
continue
;;
expsyms_regex)
export_symbols_regex="$arg"
prev=
continue
;;
framework)
case $host in
*-*-darwin*)
case "$deplibs " in
*" $qarg.ltframework "*) ;;
*) deplibs="$deplibs $qarg.ltframework" # this is fixed later
;;
esac
;;
esac
prev=
continue
;;
inst_prefix)
inst_prefix_dir="$arg"
prev=
continue
;;
objectlist)
if test -f "$arg"; then
save_arg=$arg
moreargs=
for fil in `cat "$save_arg"`
do
# moreargs="$moreargs $fil"
arg=$fil
# A libtool-controlled object.
# Check to see that this really is a libtool object.
if func_lalib_unsafe_p "$arg"; then
pic_object=
non_pic_object=
# Read the .lo file
func_source "$arg"
if test -z "$pic_object" ||
test -z "$non_pic_object" ||
test "$pic_object" = none &&
test "$non_pic_object" = none; then
func_fatal_error "cannot find name of object for \`$arg'"
fi
# Extract subdirectory from the argument.
func_dirname "$arg" "/" ""
xdir="$func_dirname_result"
if test "$pic_object" != none; then
# Prepend the subdirectory the object is found in.
pic_object="$xdir$pic_object"
if test "$prev" = dlfiles; then
if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
dlfiles="$dlfiles $pic_object"
prev=
continue
else
# If libtool objects are unsupported, then we need to preload.
prev=dlprefiles
fi
fi
# CHECK ME: I think I busted this. -Ossama
if test "$prev" = dlprefiles; then
# Preload the old-style object.
dlprefiles="$dlprefiles $pic_object"
prev=
fi
# A PIC object.
func_append libobjs " $pic_object"
arg="$pic_object"
fi
# Non-PIC object.
if test "$non_pic_object" != none; then
# Prepend the subdirectory the object is found in.
non_pic_object="$xdir$non_pic_object"
# A standard non-PIC object
func_append non_pic_objects " $non_pic_object"
if test -z "$pic_object" || test "$pic_object" = none ; then
arg="$non_pic_object"
fi
else
# If the PIC object exists, use it instead.
# $xdir was prepended to $pic_object above.
non_pic_object="$pic_object"
func_append non_pic_objects " $non_pic_object"
fi
else
# Only an error if not doing a dry-run.
if $opt_dry_run; then
# Extract subdirectory from the argument.
func_dirname "$arg" "/" ""
xdir="$func_dirname_result"
func_lo2o "$arg"
pic_object=$xdir$objdir/$func_lo2o_result
non_pic_object=$xdir$func_lo2o_result
func_append libobjs " $pic_object"
func_append non_pic_objects " $non_pic_object"
else
func_fatal_error "\`$arg' is not a valid libtool object"
fi
fi
done
else
func_fatal_error "link input file \`$arg' does not exist"
fi
arg=$save_arg
prev=
continue
;;
precious_regex)
precious_files_regex="$arg"
prev=
continue
;;
release)
release="-$arg"
prev=
continue
;;
rpath | xrpath)
# We need an absolute path.
case $arg in
[\\/]* | [A-Za-z]:[\\/]*) ;;
*)
func_fatal_error "only absolute run-paths are allowed"
;;
esac
if test "$prev" = rpath; then
case "$rpath " in
*" $arg "*) ;;
*) rpath="$rpath $arg" ;;
esac
else
case "$xrpath " in
*" $arg "*) ;;
*) xrpath="$xrpath $arg" ;;
esac
fi
prev=
continue
;;
shrext)
shrext_cmds="$arg"
prev=
continue
;;
weak)
weak_libs="$weak_libs $arg"
prev=
continue
;;
xcclinker)
linker_flags="$linker_flags $qarg"
compiler_flags="$compiler_flags $qarg"
prev=
func_append compile_command " $qarg"
func_append finalize_command " $qarg"
continue
;;
xcompiler)
compiler_flags="$compiler_flags $qarg"
prev=
func_append compile_command " $qarg"
func_append finalize_command " $qarg"
continue
;;
xlinker)
linker_flags="$linker_flags $qarg"
compiler_flags="$compiler_flags $wl$qarg"
prev=
func_append compile_command " $wl$qarg"
func_append finalize_command " $wl$qarg"
continue
;;
*)
eval "$prev=\"\$arg\""
prev=
continue
;;
esac
fi # test -n "$prev"
prevarg="$arg"
case $arg in
-all-static)
if test -n "$link_static_flag"; then
# See comment for -static flag below, for more details.
func_append compile_command " $link_static_flag"
func_append finalize_command " $link_static_flag"
fi
continue
;;
-allow-undefined)
# FIXME: remove this flag sometime in the future.
func_fatal_error "\`-allow-undefined' must not be used because it is the default"
;;
-avoid-version)
avoid_version=yes
continue
;;
-dlopen)
prev=dlfiles
continue
;;
-dlpreopen)
prev=dlprefiles
continue
;;
-export-dynamic)
export_dynamic=yes
continue
;;
-export-symbols | -export-symbols-regex)
if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
func_fatal_error "more than one -exported-symbols argument is not allowed"
fi
if test "X$arg" = "X-export-symbols"; then
prev=expsyms
else
prev=expsyms_regex
fi
continue
;;
-framework)
prev=framework
continue
;;
-inst-prefix-dir)
prev=inst_prefix
continue
;;
# The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
# so, if we see these flags be careful not to treat them like -L
-L[A-Z][A-Z]*:*)
case $with_gcc/$host in
no/*-*-irix* | /*-*-irix*)
func_append compile_command " $arg"
func_append finalize_command " $arg"
;;
esac
continue
;;
-L*)
func_stripname '-L' '' "$arg"
dir=$func_stripname_result
if test -z "$dir"; then
if test "$#" -gt 0; then
func_fatal_error "require no space between \`-L' and \`$1'"
else
func_fatal_error "need path for \`-L' option"
fi
fi
# We need an absolute path.
case $dir in
[\\/]* | [A-Za-z]:[\\/]*) ;;
*)
absdir=`cd "$dir" && pwd`
test -z "$absdir" && \
func_fatal_error "cannot determine absolute directory name of \`$dir'"
dir="$absdir"
;;
esac
case "$deplibs " in
*" -L$dir "*) ;;
*)
deplibs="$deplibs -L$dir"
lib_search_path="$lib_search_path $dir"
;;
esac
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'`
case :$dllsearchpath: in
*":$dir:"*) ;;
::) dllsearchpath=$dir;;
*) dllsearchpath="$dllsearchpath:$dir";;
esac
case :$dllsearchpath: in
*":$testbindir:"*) ;;
::) dllsearchpath=$testbindir;;
*) dllsearchpath="$dllsearchpath:$testbindir";;
esac
;;
esac
continue
;;
-l*)
if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)
# These systems don't actually have a C or math library (as such)
continue
;;
*-*-os2*)
# These systems don't actually have a C library (as such)
test "X$arg" = "X-lc" && continue
;;
*-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
# Do not include libc due to us having libc/libc_r.
test "X$arg" = "X-lc" && continue
;;
*-*-rhapsody* | *-*-darwin1.[012])
# Rhapsody C and math libraries are in the System framework
deplibs="$deplibs System.ltframework"
continue
;;
*-*-sco3.2v5* | *-*-sco5v6*)
# Causes problems with __ctype
test "X$arg" = "X-lc" && continue
;;
*-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
# Compiler inserts libc in the correct place for threads to work
test "X$arg" = "X-lc" && continue
;;
esac
elif test "X$arg" = "X-lc_r"; then
case $host in
*-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
# Do not include libc_r directly, use -pthread flag.
continue
;;
esac
fi
deplibs="$deplibs $arg"
continue
;;
-module)
module=yes
continue
;;
# Tru64 UNIX uses -model [arg] to determine the layout of C++
# classes, name mangling, and exception handling.
# Darwin uses the -arch flag to determine output architecture.
-model|-arch|-isysroot)
compiler_flags="$compiler_flags $arg"
func_append compile_command " $arg"
func_append finalize_command " $arg"
prev=xcompiler
continue
;;
-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
compiler_flags="$compiler_flags $arg"
func_append compile_command " $arg"
func_append finalize_command " $arg"
case "$new_inherited_linker_flags " in
*" $arg "*) ;;
* ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;;
esac
continue
;;
-multi_module)
single_module="${wl}-multi_module"
continue
;;
-no-fast-install)
fast_install=no
continue
;;
-no-install)
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
# The PATH hackery in wrapper scripts is required on Windows
# and Darwin in order for the loader to find any dlls it needs.
func_warning "\`-no-install' is ignored for $host"
func_warning "assuming \`-no-fast-install' instead"
fast_install=no
;;
*) no_install=yes ;;
esac
continue
;;
-no-undefined)
allow_undefined=no
continue
;;
-objectlist)
prev=objectlist
continue
;;
-o) prev=output ;;
-precious-files-regex)
prev=precious_regex
continue
;;
-release)
prev=release
continue
;;
-rpath)
prev=rpath
continue
;;
-R)
prev=xrpath
continue
;;
-R*)
func_stripname '-R' '' "$arg"
dir=$func_stripname_result
# We need an absolute path.
case $dir in
[\\/]* | [A-Za-z]:[\\/]*) ;;
*)
func_fatal_error "only absolute run-paths are allowed"
;;
esac
case "$xrpath " in
*" $dir "*) ;;
*) xrpath="$xrpath $dir" ;;
esac
continue
;;
-shared)
# The effects of -shared are defined in a previous loop.
continue
;;
-shrext)
prev=shrext
continue
;;
-static | -static-libtool-libs)
# The effects of -static are defined in a previous loop.
# We used to do the same as -all-static on platforms that
# didn't have a PIC flag, but the assumption that the effects
# would be equivalent was wrong. It would break on at least
# Digital Unix and AIX.
continue
;;
-thread-safe)
thread_safe=yes
continue
;;
-version-info)
prev=vinfo
continue
;;
-version-number)
prev=vinfo
vinfo_number=yes
continue
;;
-weak)
prev=weak
continue
;;
-Wc,*)
func_stripname '-Wc,' '' "$arg"
args=$func_stripname_result
arg=
save_ifs="$IFS"; IFS=','
for flag in $args; do
IFS="$save_ifs"
func_quote_for_eval "$flag"
arg="$arg $wl$func_quote_for_eval_result"
compiler_flags="$compiler_flags $func_quote_for_eval_result"
done
IFS="$save_ifs"
func_stripname ' ' '' "$arg"
arg=$func_stripname_result
;;
-Wl,*)
func_stripname '-Wl,' '' "$arg"
args=$func_stripname_result
arg=
save_ifs="$IFS"; IFS=','
for flag in $args; do
IFS="$save_ifs"
func_quote_for_eval "$flag"
arg="$arg $wl$func_quote_for_eval_result"
compiler_flags="$compiler_flags $wl$func_quote_for_eval_result"
linker_flags="$linker_flags $func_quote_for_eval_result"
done
IFS="$save_ifs"
func_stripname ' ' '' "$arg"
arg=$func_stripname_result
;;
-Xcompiler)
prev=xcompiler
continue
;;
-Xlinker)
prev=xlinker
continue
;;
-XCClinker)
prev=xcclinker
continue
;;
# -msg_* for osf cc
-msg_*)
func_quote_for_eval "$arg"
arg="$func_quote_for_eval_result"
;;
# -64, -mips[0-9] enable 64-bit mode on the SGI compiler
# -r[0-9][0-9]* specifies the processor on the SGI compiler
# -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
# +DA*, +DD* enable 64-bit mode on the HP compiler
# -q* pass through compiler args for the IBM compiler
# -m*, -t[45]*, -txscale* pass through architecture-specific
# compiler args for GCC
# -F/path gives path to uninstalled frameworks, gcc on darwin
# -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
# @file GCC response files
-64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
func_quote_for_eval "$arg"
arg="$func_quote_for_eval_result"
func_append compile_command " $arg"
func_append finalize_command " $arg"
compiler_flags="$compiler_flags $arg"
continue
;;
# Some other compiler flag.
-* | +*)
func_quote_for_eval "$arg"
arg="$func_quote_for_eval_result"
;;
*.$objext)
# A standard object.
objs="$objs $arg"
;;
*.lo)
# A libtool-controlled object.
# Check to see that this really is a libtool object.
if func_lalib_unsafe_p "$arg"; then
pic_object=
non_pic_object=
# Read the .lo file
func_source "$arg"
if test -z "$pic_object" ||
test -z "$non_pic_object" ||
test "$pic_object" = none &&
test "$non_pic_object" = none; then
func_fatal_error "cannot find name of object for \`$arg'"
fi
# Extract subdirectory from the argument.
func_dirname "$arg" "/" ""
xdir="$func_dirname_result"
if test "$pic_object" != none; then
# Prepend the subdirectory the object is found in.
pic_object="$xdir$pic_object"
if test "$prev" = dlfiles; then
if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
dlfiles="$dlfiles $pic_object"
prev=
continue
else
# If libtool objects are unsupported, then we need to preload.
prev=dlprefiles
fi
fi
# CHECK ME: I think I busted this. -Ossama
if test "$prev" = dlprefiles; then
# Preload the old-style object.
dlprefiles="$dlprefiles $pic_object"
prev=
fi
# A PIC object.
func_append libobjs " $pic_object"
arg="$pic_object"
fi
# Non-PIC object.
if test "$non_pic_object" != none; then
# Prepend the subdirectory the object is found in.
non_pic_object="$xdir$non_pic_object"
# A standard non-PIC object
func_append non_pic_objects " $non_pic_object"
if test -z "$pic_object" || test "$pic_object" = none ; then
arg="$non_pic_object"
fi
else
# If the PIC object exists, use it instead.
# $xdir was prepended to $pic_object above.
non_pic_object="$pic_object"
func_append non_pic_objects " $non_pic_object"
fi
else
# Only an error if not doing a dry-run.
if $opt_dry_run; then
# Extract subdirectory from the argument.
func_dirname "$arg" "/" ""
xdir="$func_dirname_result"
func_lo2o "$arg"
pic_object=$xdir$objdir/$func_lo2o_result
non_pic_object=$xdir$func_lo2o_result
func_append libobjs " $pic_object"
func_append non_pic_objects " $non_pic_object"
else
func_fatal_error "\`$arg' is not a valid libtool object"
fi
fi
;;
*.$libext)
# An archive.
deplibs="$deplibs $arg"
old_deplibs="$old_deplibs $arg"
continue
;;
*.la)
# A libtool-controlled library.
if test "$prev" = dlfiles; then
# This library was specified with -dlopen.
dlfiles="$dlfiles $arg"
prev=
elif test "$prev" = dlprefiles; then
# The library was specified with -dlpreopen.
dlprefiles="$dlprefiles $arg"
prev=
else
deplibs="$deplibs $arg"
fi
continue
;;
# Some other compiler argument.
*)
# Unknown arguments in both finalize_command and compile_command need
# to be aesthetically quoted because they are evaled later.
func_quote_for_eval "$arg"
arg="$func_quote_for_eval_result"
;;
esac # arg
# Now actually substitute the argument into the commands.
if test -n "$arg"; then
func_append compile_command " $arg"
func_append finalize_command " $arg"
fi
done # argument parsing loop
test -n "$prev" && \
func_fatal_help "the \`$prevarg' option requires an argument"
if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
eval arg=\"$export_dynamic_flag_spec\"
func_append compile_command " $arg"
func_append finalize_command " $arg"
fi
oldlibs=
# calculate the name of the file, without its directory
func_basename "$output"
outputname="$func_basename_result"
libobjs_save="$libobjs"
if test -n "$shlibpath_var"; then
# get the directories listed in $shlibpath_var
eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
else
shlib_search_path=
fi
eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
func_dirname "$output" "/" ""
output_objdir="$func_dirname_result$objdir"
# Create the object directory.
func_mkdir_p "$output_objdir"
# Determine the type of output
case $output in
"")
func_fatal_help "you must specify an output file"
;;
*.$libext) linkmode=oldlib ;;
*.lo | *.$objext) linkmode=obj ;;
*.la) linkmode=lib ;;
*) linkmode=prog ;; # Anything else should be a program.
esac
specialdeplibs=
libs=
# Find all interdependent deplibs by searching for libraries
# that are linked more than once (e.g. -la -lb -la)
for deplib in $deplibs; do
if $opt_duplicate_deps ; then
case "$libs " in
*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
esac
fi
libs="$libs $deplib"
done
if test "$linkmode" = lib; then
libs="$predeps $libs $compiler_lib_search_path $postdeps"
# Compute libraries that are listed more than once in $predeps
# $postdeps and mark them as special (i.e., whose duplicates are
# not to be eliminated).
pre_post_deps=
if $opt_duplicate_compiler_generated_deps; then
for pre_post_dep in $predeps $postdeps; do
case "$pre_post_deps " in
*" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
esac
pre_post_deps="$pre_post_deps $pre_post_dep"
done
fi
pre_post_deps=
fi
deplibs=
newdependency_libs=
newlib_search_path=
need_relink=no # whether we're linking any uninstalled libtool libraries
notinst_deplibs= # not-installed libtool libraries
notinst_path= # paths that contain not-installed libtool libraries
case $linkmode in
lib)
passes="conv dlpreopen link"
for file in $dlfiles $dlprefiles; do
case $file in
*.la) ;;
*)
func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
;;
esac
done
;;
prog)
compile_deplibs=
finalize_deplibs=
alldeplibs=no
newdlfiles=
newdlprefiles=
passes="conv scan dlopen dlpreopen link"
;;
*) passes="conv"
;;
esac
for pass in $passes; do
# The preopen pass in lib mode reverses $deplibs; put it back here
# so that -L comes before libs that need it for instance...
if test "$linkmode,$pass" = "lib,link"; then
## FIXME: Find the place where the list is rebuilt in the wrong
## order, and fix it there properly
tmp_deplibs=
for deplib in $deplibs; do
tmp_deplibs="$deplib $tmp_deplibs"
done
deplibs="$tmp_deplibs"
fi
if test "$linkmode,$pass" = "lib,link" ||
test "$linkmode,$pass" = "prog,scan"; then
libs="$deplibs"
deplibs=
fi
if test "$linkmode" = prog; then
case $pass in
dlopen) libs="$dlfiles" ;;
dlpreopen) libs="$dlprefiles" ;;
link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
esac
fi
if test "$linkmode,$pass" = "lib,dlpreopen"; then
# Collect and forward deplibs of preopened libtool libs
for lib in $dlprefiles; do
# Ignore non-libtool-libs
dependency_libs=
case $lib in
*.la) func_source "$lib" ;;
esac
# Collect preopened libtool deplibs, except any this library
# has declared as weak libs
for deplib in $dependency_libs; do
deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"`
case " $weak_libs " in
*" $deplib_base "*) ;;
*) deplibs="$deplibs $deplib" ;;
esac
done
done
libs="$dlprefiles"
fi
if test "$pass" = dlopen; then
# Collect dlpreopened libraries
save_deplibs="$deplibs"
deplibs=
fi
for deplib in $libs; do
lib=
found=no
case $deplib in
-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
if test "$linkmode,$pass" = "prog,link"; then
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
else
compiler_flags="$compiler_flags $deplib"
if test "$linkmode" = lib ; then
case "$new_inherited_linker_flags " in
*" $deplib "*) ;;
* ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
esac
fi
fi
continue
;;
-l*)
if test "$linkmode" != lib && test "$linkmode" != prog; then
func_warning "\`-l' is ignored for archives/objects"
continue
fi
func_stripname '-l' '' "$deplib"
name=$func_stripname_result
if test "$linkmode" = lib; then
searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
else
searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
fi
for searchdir in $searchdirs; do
for search_ext in .la $std_shrext .so .a; do
# Search the libtool library
lib="$searchdir/lib${name}${search_ext}"
if test -f "$lib"; then
if test "$search_ext" = ".la"; then
found=yes
else
found=no
fi
break 2
fi
done
done
if test "$found" != yes; then
# deplib doesn't seem to be a libtool library
if test "$linkmode,$pass" = "prog,link"; then
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
else
deplibs="$deplib $deplibs"
test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
fi
continue
else # deplib is a libtool library
# If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
# We need to do some special things here, and not later.
if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
case " $predeps $postdeps " in
*" $deplib "*)
if func_lalib_p "$lib"; then
library_names=
old_library=
func_source "$lib"
for l in $old_library $library_names; do
ll="$l"
done
if test "X$ll" = "X$old_library" ; then # only static version available
found=no
func_dirname "$lib" "" "."
ladir="$func_dirname_result"
lib=$ladir/$old_library
if test "$linkmode,$pass" = "prog,link"; then
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
else
deplibs="$deplib $deplibs"
test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
fi
continue
fi
fi
;;
*) ;;
esac
fi
fi
;; # -l
*.ltframework)
if test "$linkmode,$pass" = "prog,link"; then
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
else
deplibs="$deplib $deplibs"
if test "$linkmode" = lib ; then
case "$new_inherited_linker_flags " in
*" $deplib "*) ;;
* ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;;
esac
fi
fi
continue
;;
-L*)
case $linkmode in
lib)
deplibs="$deplib $deplibs"
test "$pass" = conv && continue
newdependency_libs="$deplib $newdependency_libs"
func_stripname '-L' '' "$deplib"
newlib_search_path="$newlib_search_path $func_stripname_result"
;;
prog)
if test "$pass" = conv; then
deplibs="$deplib $deplibs"
continue
fi
if test "$pass" = scan; then
deplibs="$deplib $deplibs"
else
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
fi
func_stripname '-L' '' "$deplib"
newlib_search_path="$newlib_search_path $func_stripname_result"
;;
*)
func_warning "\`-L' is ignored for archives/objects"
;;
esac # linkmode
continue
;; # -L
-R*)
if test "$pass" = link; then
func_stripname '-R' '' "$deplib"
dir=$func_stripname_result
# Make sure the xrpath contains only unique directories.
case "$xrpath " in
*" $dir "*) ;;
*) xrpath="$xrpath $dir" ;;
esac
fi
deplibs="$deplib $deplibs"
continue
;;
*.la) lib="$deplib" ;;
*.$libext)
if test "$pass" = conv; then
deplibs="$deplib $deplibs"
continue
fi
case $linkmode in
lib)
# Linking convenience modules into shared libraries is allowed,
# but linking other static libraries is non-portable.
case " $dlpreconveniencelibs " in
*" $deplib "*) ;;
*)
valid_a_lib=no
case $deplibs_check_method in
match_pattern*)
set dummy $deplibs_check_method; shift
match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \
| $EGREP "$match_pattern_regex" > /dev/null; then
valid_a_lib=yes
fi
;;
pass_all)
valid_a_lib=yes
;;
esac
if test "$valid_a_lib" != yes; then
$ECHO
$ECHO "*** Warning: Trying to link with static lib archive $deplib."
$ECHO "*** I have the capability to make that library automatically link in when"
$ECHO "*** you link to this library. But I can only do this if you have a"
$ECHO "*** shared version of the library, which you do not appear to have"
$ECHO "*** because the file extensions .$libext of this argument makes me believe"
$ECHO "*** that it is just a static archive that I should not use here."
else
$ECHO
$ECHO "*** Warning: Linking the shared library $output against the"
$ECHO "*** static library $deplib is not portable!"
deplibs="$deplib $deplibs"
fi
;;
esac
continue
;;
prog)
if test "$pass" != link; then
deplibs="$deplib $deplibs"
else
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
fi
continue
;;
esac # linkmode
;; # *.$libext
*.lo | *.$objext)
if test "$pass" = conv; then
deplibs="$deplib $deplibs"
elif test "$linkmode" = prog; then
if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
# If there is no dlopen support or we're linking statically,
# we need to preload.
newdlprefiles="$newdlprefiles $deplib"
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
else
newdlfiles="$newdlfiles $deplib"
fi
fi
continue
;;
%DEPLIBS%)
alldeplibs=yes
continue
;;
esac # case $deplib
if test "$found" = yes || test -f "$lib"; then :
else
func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
fi
# Check to see that this really is a libtool archive.
func_lalib_unsafe_p "$lib" \
|| func_fatal_error "\`$lib' is not a valid libtool archive"
func_dirname "$lib" "" "."
ladir="$func_dirname_result"
dlname=
dlopen=
dlpreopen=
libdir=
library_names=
old_library=
inherited_linker_flags=
# If the library was installed with an old release of libtool,
# it will not redefine variables installed, or shouldnotlink
installed=yes
shouldnotlink=no
avoidtemprpath=
# Read the .la file
func_source "$lib"
# Convert "-framework foo" to "foo.ltframework"
if test -n "$inherited_linker_flags"; then
tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'`
for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
case " $new_inherited_linker_flags " in
*" $tmp_inherited_linker_flag "*) ;;
*) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";;
esac
done
fi
dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
if test "$linkmode,$pass" = "lib,link" ||
test "$linkmode,$pass" = "prog,scan" ||
{ test "$linkmode" != prog && test "$linkmode" != lib; }; then
test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
fi
if test "$pass" = conv; then
# Only check for convenience libraries
deplibs="$lib $deplibs"
if test -z "$libdir"; then
if test -z "$old_library"; then
func_fatal_error "cannot find name of link library for \`$lib'"
fi
# It is a libtool convenience library, so add in its objects.
convenience="$convenience $ladir/$objdir/$old_library"
old_convenience="$old_convenience $ladir/$objdir/$old_library"
elif test "$linkmode" != prog && test "$linkmode" != lib; then
func_fatal_error "\`$lib' is not a convenience library"
fi
tmp_libs=
for deplib in $dependency_libs; do
deplibs="$deplib $deplibs"
if $opt_duplicate_deps ; then
case "$tmp_libs " in
*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
esac
fi
tmp_libs="$tmp_libs $deplib"
done
continue
fi # $pass = conv
# Get the name of the library we link against.
linklib=
for l in $old_library $library_names; do
linklib="$l"
done
if test -z "$linklib"; then
func_fatal_error "cannot find name of link library for \`$lib'"
fi
# This library was specified with -dlopen.
if test "$pass" = dlopen; then
if test -z "$libdir"; then
func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
fi
if test -z "$dlname" ||
test "$dlopen_support" != yes ||
test "$build_libtool_libs" = no; then
# If there is no dlname, no dlopen support or we're linking
# statically, we need to preload. We also need to preload any
# dependent libraries so libltdl's deplib preloader doesn't
# bomb out in the load deplibs phase.
dlprefiles="$dlprefiles $lib $dependency_libs"
else
newdlfiles="$newdlfiles $lib"
fi
continue
fi # $pass = dlopen
# We need an absolute path.
case $ladir in
[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
*)
abs_ladir=`cd "$ladir" && pwd`
if test -z "$abs_ladir"; then
func_warning "cannot determine absolute directory name of \`$ladir'"
func_warning "passing it literally to the linker, although it might fail"
abs_ladir="$ladir"
fi
;;
esac
func_basename "$lib"
laname="$func_basename_result"
# Find the relevant object directory and library name.
if test "X$installed" = Xyes; then
if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
func_warning "library \`$lib' was moved."
dir="$ladir"
absdir="$abs_ladir"
libdir="$abs_ladir"
else
dir="$libdir"
absdir="$libdir"
fi
test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
else
if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
dir="$ladir"
absdir="$abs_ladir"
# Remove this search path later
notinst_path="$notinst_path $abs_ladir"
else
dir="$ladir/$objdir"
absdir="$abs_ladir/$objdir"
# Remove this search path later
notinst_path="$notinst_path $abs_ladir"
fi
fi # $installed = yes
func_stripname 'lib' '.la' "$laname"
name=$func_stripname_result
# This library was specified with -dlpreopen.
if test "$pass" = dlpreopen; then
if test -z "$libdir" && test "$linkmode" = prog; then
func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
fi
# Prefer using a static library (so that no silly _DYNAMIC symbols
# are required to link).
if test -n "$old_library"; then
newdlprefiles="$newdlprefiles $dir/$old_library"
# Keep a list of preopened convenience libraries to check
# that they are being used correctly in the link pass.
test -z "$libdir" && \
dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library"
# Otherwise, use the dlname, so that lt_dlopen finds it.
elif test -n "$dlname"; then
newdlprefiles="$newdlprefiles $dir/$dlname"
else
newdlprefiles="$newdlprefiles $dir/$linklib"
fi
fi # $pass = dlpreopen
if test -z "$libdir"; then
# Link the convenience library
if test "$linkmode" = lib; then
deplibs="$dir/$old_library $deplibs"
elif test "$linkmode,$pass" = "prog,link"; then
compile_deplibs="$dir/$old_library $compile_deplibs"
finalize_deplibs="$dir/$old_library $finalize_deplibs"
else
deplibs="$lib $deplibs" # used for prog,scan pass
fi
continue
fi
if test "$linkmode" = prog && test "$pass" != link; then
newlib_search_path="$newlib_search_path $ladir"
deplibs="$lib $deplibs"
linkalldeplibs=no
if test "$link_all_deplibs" != no || test -z "$library_names" ||
test "$build_libtool_libs" = no; then
linkalldeplibs=yes
fi
tmp_libs=
for deplib in $dependency_libs; do
case $deplib in
-L*) func_stripname '-L' '' "$deplib"
newlib_search_path="$newlib_search_path $func_stripname_result"
;;
esac
# Need to link against all dependency_libs?
if test "$linkalldeplibs" = yes; then
deplibs="$deplib $deplibs"
else
# Need to hardcode shared library paths
# or/and link against static libraries
newdependency_libs="$deplib $newdependency_libs"
fi
if $opt_duplicate_deps ; then
case "$tmp_libs " in
*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
esac
fi
tmp_libs="$tmp_libs $deplib"
done # for deplib
continue
fi # $linkmode = prog...
if test "$linkmode,$pass" = "prog,link"; then
if test -n "$library_names" &&
{ { test "$prefer_static_libs" = no ||
test "$prefer_static_libs,$installed" = "built,yes"; } ||
test -z "$old_library"; }; then
# We need to hardcode the library path
if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
# Make sure the rpath contains only unique directories.
case "$temp_rpath:" in
*"$absdir:"*) ;;
*) temp_rpath="$temp_rpath$absdir:" ;;
esac
fi
# Hardcode the library path.
# Skip directories that are in the system default run-time
# search path.
case " $sys_lib_dlsearch_path " in
*" $absdir "*) ;;
*)
case "$compile_rpath " in
*" $absdir "*) ;;
*) compile_rpath="$compile_rpath $absdir"
esac
;;
esac
case " $sys_lib_dlsearch_path " in
*" $libdir "*) ;;
*)
case "$finalize_rpath " in
*" $libdir "*) ;;
*) finalize_rpath="$finalize_rpath $libdir"
esac
;;
esac
fi # $linkmode,$pass = prog,link...
if test "$alldeplibs" = yes &&
{ test "$deplibs_check_method" = pass_all ||
{ test "$build_libtool_libs" = yes &&
test -n "$library_names"; }; }; then
# We only need to search for static libraries
continue
fi
fi
link_static=no # Whether the deplib will be linked statically
use_static_libs=$prefer_static_libs
if test "$use_static_libs" = built && test "$installed" = yes; then
use_static_libs=no
fi
if test -n "$library_names" &&
{ test "$use_static_libs" = no || test -z "$old_library"; }; then
case $host in
*cygwin* | *mingw* | *cegcc*)
# No point in relinking DLLs because paths are not encoded
notinst_deplibs="$notinst_deplibs $lib"
need_relink=no
;;
*)
if test "$installed" = no; then
notinst_deplibs="$notinst_deplibs $lib"
need_relink=yes
fi
;;
esac
# This is a shared library
# Warn about portability, can't link against -module's on some
# systems (darwin). Don't bleat about dlopened modules though!
dlopenmodule=""
for dlpremoduletest in $dlprefiles; do
if test "X$dlpremoduletest" = "X$lib"; then
dlopenmodule="$dlpremoduletest"
break
fi
done
if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
$ECHO
if test "$linkmode" = prog; then
$ECHO "*** Warning: Linking the executable $output against the loadable module"
else
$ECHO "*** Warning: Linking the shared library $output against the loadable module"
fi
$ECHO "*** $linklib is not portable!"
fi
if test "$linkmode" = lib &&
test "$hardcode_into_libs" = yes; then
# Hardcode the library path.
# Skip directories that are in the system default run-time
# search path.
case " $sys_lib_dlsearch_path " in
*" $absdir "*) ;;
*)
case "$compile_rpath " in
*" $absdir "*) ;;
*) compile_rpath="$compile_rpath $absdir"
esac
;;
esac
case " $sys_lib_dlsearch_path " in
*" $libdir "*) ;;
*)
case "$finalize_rpath " in
*" $libdir "*) ;;
*) finalize_rpath="$finalize_rpath $libdir"
esac
;;
esac
fi
if test -n "$old_archive_from_expsyms_cmds"; then
# figure out the soname
set dummy $library_names
shift
realname="$1"
shift
libname=`eval "\\$ECHO \"$libname_spec\""`
# use dlname if we got it. it's perfectly good, no?
if test -n "$dlname"; then
soname="$dlname"
elif test -n "$soname_spec"; then
# bleh windows
case $host in
*cygwin* | mingw* | *cegcc*)
func_arith $current - $age
major=$func_arith_result
versuffix="-$major"
;;
esac
eval soname=\"$soname_spec\"
else
soname="$realname"
fi
# Make a new name for the extract_expsyms_cmds to use
soroot="$soname"
func_basename "$soroot"
soname="$func_basename_result"
func_stripname 'lib' '.dll' "$soname"
newlib=libimp-$func_stripname_result.a
# If the library has no export list, then create one now
if test -f "$output_objdir/$soname-def"; then :
else
func_verbose "extracting exported symbol list from \`$soname'"
func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
fi
# Create $newlib
if test -f "$output_objdir/$newlib"; then :; else
func_verbose "generating import library for \`$soname'"
func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
fi
# make sure the library variables are pointing to the new library
dir=$output_objdir
linklib=$newlib
fi # test -n "$old_archive_from_expsyms_cmds"
if test "$linkmode" = prog || test "$mode" != relink; then
add_shlibpath=
add_dir=
add=
lib_linked=yes
case $hardcode_action in
immediate | unsupported)
if test "$hardcode_direct" = no; then
add="$dir/$linklib"
case $host in
*-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
*-*-sysv4*uw2*) add_dir="-L$dir" ;;
*-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
*-*-unixware7*) add_dir="-L$dir" ;;
*-*-darwin* )
# if the lib is a (non-dlopened) module then we can not
# link against it, someone is ignoring the earlier warnings
if /usr/bin/file -L $add 2> /dev/null |
$GREP ": [^:]* bundle" >/dev/null ; then
if test "X$dlopenmodule" != "X$lib"; then
$ECHO "*** Warning: lib $linklib is a module, not a shared library"
if test -z "$old_library" ; then
$ECHO
$ECHO "*** And there doesn't seem to be a static archive available"
$ECHO "*** The link will probably fail, sorry"
else
add="$dir/$old_library"
fi
elif test -n "$old_library"; then
add="$dir/$old_library"
fi
fi
esac
elif test "$hardcode_minus_L" = no; then
case $host in
*-*-sunos*) add_shlibpath="$dir" ;;
esac
add_dir="-L$dir"
add="-l$name"
elif test "$hardcode_shlibpath_var" = no; then
add_shlibpath="$dir"
add="-l$name"
else
lib_linked=no
fi
;;
relink)
if test "$hardcode_direct" = yes &&
test "$hardcode_direct_absolute" = no; then
add="$dir/$linklib"
elif test "$hardcode_minus_L" = yes; then
add_dir="-L$dir"
# Try looking first in the location we're being installed to.
if test -n "$inst_prefix_dir"; then
case $libdir in
[\\/]*)
add_dir="$add_dir -L$inst_prefix_dir$libdir"
;;
esac
fi
add="-l$name"
elif test "$hardcode_shlibpath_var" = yes; then
add_shlibpath="$dir"
add="-l$name"
else
lib_linked=no
fi
;;
*) lib_linked=no ;;
esac
if test "$lib_linked" != yes; then
func_fatal_configuration "unsupported hardcode properties"
fi
if test -n "$add_shlibpath"; then
case :$compile_shlibpath: in
*":$add_shlibpath:"*) ;;
*) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
esac
fi
if test "$linkmode" = prog; then
test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
test -n "$add" && compile_deplibs="$add $compile_deplibs"
else
test -n "$add_dir" && deplibs="$add_dir $deplibs"
test -n "$add" && deplibs="$add $deplibs"
if test "$hardcode_direct" != yes &&
test "$hardcode_minus_L" != yes &&
test "$hardcode_shlibpath_var" = yes; then
case :$finalize_shlibpath: in
*":$libdir:"*) ;;
*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
esac
fi
fi
fi
if test "$linkmode" = prog || test "$mode" = relink; then
add_shlibpath=
add_dir=
add=
# Finalize command for both is simple: just hardcode it.
if test "$hardcode_direct" = yes &&
test "$hardcode_direct_absolute" = no; then
add="$libdir/$linklib"
elif test "$hardcode_minus_L" = yes; then
add_dir="-L$libdir"
add="-l$name"
elif test "$hardcode_shlibpath_var" = yes; then
case :$finalize_shlibpath: in
*":$libdir:"*) ;;
*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
esac
add="-l$name"
elif test "$hardcode_automatic" = yes; then
if test -n "$inst_prefix_dir" &&
test -f "$inst_prefix_dir$libdir/$linklib" ; then
add="$inst_prefix_dir$libdir/$linklib"
else
add="$libdir/$linklib"
fi
else
# We cannot seem to hardcode it, guess we'll fake it.
add_dir="-L$libdir"
# Try looking first in the location we're being installed to.
if test -n "$inst_prefix_dir"; then
case $libdir in
[\\/]*)
add_dir="$add_dir -L$inst_prefix_dir$libdir"
;;
esac
fi
add="-l$name"
fi
if test "$linkmode" = prog; then
test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
else
test -n "$add_dir" && deplibs="$add_dir $deplibs"
test -n "$add" && deplibs="$add $deplibs"
fi
fi
elif test "$linkmode" = prog; then
# Here we assume that one of hardcode_direct or hardcode_minus_L
# is not unsupported. This is valid on all known static and
# shared platforms.
if test "$hardcode_direct" != unsupported; then
test -n "$old_library" && linklib="$old_library"
compile_deplibs="$dir/$linklib $compile_deplibs"
finalize_deplibs="$dir/$linklib $finalize_deplibs"
else
compile_deplibs="-l$name -L$dir $compile_deplibs"
finalize_deplibs="-l$name -L$dir $finalize_deplibs"
fi
elif test "$build_libtool_libs" = yes; then
# Not a shared library
if test "$deplibs_check_method" != pass_all; then
# We're trying link a shared library against a static one
# but the system doesn't support it.
# Just print a warning and add the library to dependency_libs so
# that the program can be linked against the static library.
$ECHO
$ECHO "*** Warning: This system can not link to static lib archive $lib."
$ECHO "*** I have the capability to make that library automatically link in when"
$ECHO "*** you link to this library. But I can only do this if you have a"
$ECHO "*** shared version of the library, which you do not appear to have."
if test "$module" = yes; then
$ECHO "*** But as you try to build a module library, libtool will still create "
$ECHO "*** a static module, that should work as long as the dlopening application"
$ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime."
if test -z "$global_symbol_pipe"; then
$ECHO
$ECHO "*** However, this would only work if libtool was able to extract symbol"
$ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
$ECHO "*** not find such a program. So, this module is probably useless."
$ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
fi
if test "$build_old_libs" = no; then
build_libtool_libs=module
build_old_libs=yes
else
build_libtool_libs=no
fi
fi
else
deplibs="$dir/$old_library $deplibs"
link_static=yes
fi
fi # link shared/static library?
if test "$linkmode" = lib; then
if test -n "$dependency_libs" &&
{ test "$hardcode_into_libs" != yes ||
test "$build_old_libs" = yes ||
test "$link_static" = yes; }; then
# Extract -R from dependency_libs
temp_deplibs=
for libdir in $dependency_libs; do
case $libdir in
-R*) func_stripname '-R' '' "$libdir"
temp_xrpath=$func_stripname_result
case " $xrpath " in
*" $temp_xrpath "*) ;;
*) xrpath="$xrpath $temp_xrpath";;
esac;;
*) temp_deplibs="$temp_deplibs $libdir";;
esac
done
dependency_libs="$temp_deplibs"
fi
newlib_search_path="$newlib_search_path $absdir"
# Link against this library
test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
# ... and its dependency_libs
tmp_libs=
for deplib in $dependency_libs; do
newdependency_libs="$deplib $newdependency_libs"
if $opt_duplicate_deps ; then
case "$tmp_libs " in
*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
esac
fi
tmp_libs="$tmp_libs $deplib"
done
if test "$link_all_deplibs" != no; then
# Add the search paths of all dependency libraries
for deplib in $dependency_libs; do
case $deplib in
-L*) path="$deplib" ;;
*.la)
func_dirname "$deplib" "" "."
dir="$func_dirname_result"
# We need an absolute path.
case $dir in
[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
*)
absdir=`cd "$dir" && pwd`
if test -z "$absdir"; then
func_warning "cannot determine absolute directory name of \`$dir'"
absdir="$dir"
fi
;;
esac
if $GREP "^installed=no" $deplib > /dev/null; then
case $host in
*-*-darwin*)
depdepl=
eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
if test -n "$deplibrary_names" ; then
for tmp in $deplibrary_names ; do
depdepl=$tmp
done
if test -f "$absdir/$objdir/$depdepl" ; then
depdepl="$absdir/$objdir/$depdepl"
darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
if test -z "$darwin_install_name"; then
darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
fi
compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}"
path=
fi
fi
;;
*)
path="-L$absdir/$objdir"
;;
esac
else
eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
test -z "$libdir" && \
func_fatal_error "\`$deplib' is not a valid libtool archive"
test "$absdir" != "$libdir" && \
func_warning "\`$deplib' seems to be moved"
path="-L$absdir"
fi
;;
esac
case " $deplibs " in
*" $path "*) ;;
*) deplibs="$path $deplibs" ;;
esac
done
fi # link_all_deplibs != no
fi # linkmode = lib
done # for deplib in $libs
if test "$pass" = link; then
if test "$linkmode" = "prog"; then
compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
else
compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
fi
fi
dependency_libs="$newdependency_libs"
if test "$pass" = dlpreopen; then
# Link the dlpreopened libraries before other libraries
for deplib in $save_deplibs; do
deplibs="$deplib $deplibs"
done
fi
if test "$pass" != dlopen; then
if test "$pass" != conv; then
# Make sure lib_search_path contains only unique directories.
lib_search_path=
for dir in $newlib_search_path; do
case "$lib_search_path " in
*" $dir "*) ;;
*) lib_search_path="$lib_search_path $dir" ;;
esac
done
newlib_search_path=
fi
if test "$linkmode,$pass" != "prog,link"; then
vars="deplibs"
else
vars="compile_deplibs finalize_deplibs"
fi
for var in $vars dependency_libs; do
# Add libraries to $var in reverse order
eval tmp_libs=\"\$$var\"
new_libs=
for deplib in $tmp_libs; do
# FIXME: Pedantically, this is the right thing to do, so
# that some nasty dependency loop isn't accidentally
# broken:
#new_libs="$deplib $new_libs"
# Pragmatically, this seems to cause very few problems in
# practice:
case $deplib in
-L*) new_libs="$deplib $new_libs" ;;
-R*) ;;
*)
# And here is the reason: when a library appears more
# than once as an explicit dependence of a library, or
# is implicitly linked in more than once by the
# compiler, it is considered special, and multiple
# occurrences thereof are not removed. Compare this
# with having the same library being listed as a
# dependency of multiple other libraries: in this case,
# we know (pedantically, we assume) the library does not
# need to be listed more than once, so we keep only the
# last copy. This is not always right, but it is rare
# enough that we require users that really mean to play
# such unportable linking tricks to link the library
# using -Wl,-lname, so that libtool does not consider it
# for duplicate removal.
case " $specialdeplibs " in
*" $deplib "*) new_libs="$deplib $new_libs" ;;
*)
case " $new_libs " in
*" $deplib "*) ;;
*) new_libs="$deplib $new_libs" ;;
esac
;;
esac
;;
esac
done
tmp_libs=
for deplib in $new_libs; do
case $deplib in
-L*)
case " $tmp_libs " in
*" $deplib "*) ;;
*) tmp_libs="$tmp_libs $deplib" ;;
esac
;;
*) tmp_libs="$tmp_libs $deplib" ;;
esac
done
eval $var=\"$tmp_libs\"
done # for var
fi
# Last step: remove runtime libs from dependency_libs
# (they stay in deplibs)
tmp_libs=
for i in $dependency_libs ; do
case " $predeps $postdeps $compiler_lib_search_path " in
*" $i "*)
i=""
;;
esac
if test -n "$i" ; then
tmp_libs="$tmp_libs $i"
fi
done
dependency_libs=$tmp_libs
done # for pass
if test "$linkmode" = prog; then
dlfiles="$newdlfiles"
fi
if test "$linkmode" = prog || test "$linkmode" = lib; then
dlprefiles="$newdlprefiles"
fi
case $linkmode in
oldlib)
if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
func_warning "\`-dlopen' is ignored for archives"
fi
case " $deplibs" in
*\ -l* | *\ -L*)
func_warning "\`-l' and \`-L' are ignored for archives" ;;
esac
test -n "$rpath" && \
func_warning "\`-rpath' is ignored for archives"
test -n "$xrpath" && \
func_warning "\`-R' is ignored for archives"
test -n "$vinfo" && \
func_warning "\`-version-info/-version-number' is ignored for archives"
test -n "$release" && \
func_warning "\`-release' is ignored for archives"
test -n "$export_symbols$export_symbols_regex" && \
func_warning "\`-export-symbols' is ignored for archives"
# Now set the variables for building old libraries.
build_libtool_libs=no
oldlibs="$output"
objs="$objs$old_deplibs"
;;
lib)
# Make sure we only generate libraries of the form `libNAME.la'.
case $outputname in
lib*)
func_stripname 'lib' '.la' "$outputname"
name=$func_stripname_result
eval shared_ext=\"$shrext_cmds\"
eval libname=\"$libname_spec\"
;;
*)
test "$module" = no && \
func_fatal_help "libtool library \`$output' must begin with \`lib'"
if test "$need_lib_prefix" != no; then
# Add the "lib" prefix for modules if required
func_stripname '' '.la' "$outputname"
name=$func_stripname_result
eval shared_ext=\"$shrext_cmds\"
eval libname=\"$libname_spec\"
else
func_stripname '' '.la' "$outputname"
libname=$func_stripname_result
fi
;;
esac
if test -n "$objs"; then
if test "$deplibs_check_method" != pass_all; then
func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
else
$ECHO
$ECHO "*** Warning: Linking the shared library $output against the non-libtool"
$ECHO "*** objects $objs is not portable!"
libobjs="$libobjs $objs"
fi
fi
test "$dlself" != no && \
func_warning "\`-dlopen self' is ignored for libtool libraries"
set dummy $rpath
shift
test "$#" -gt 1 && \
func_warning "ignoring multiple \`-rpath's for a libtool library"
install_libdir="$1"
oldlibs=
if test -z "$rpath"; then
if test "$build_libtool_libs" = yes; then
# Building a libtool convenience library.
# Some compilers have problems with a `.al' extension so
# convenience libraries should have the same extension an
# archive normally would.
oldlibs="$output_objdir/$libname.$libext $oldlibs"
build_libtool_libs=convenience
build_old_libs=yes
fi
test -n "$vinfo" && \
func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
test -n "$release" && \
func_warning "\`-release' is ignored for convenience libraries"
else
# Parse the version information argument.
save_ifs="$IFS"; IFS=':'
set dummy $vinfo 0 0 0
shift
IFS="$save_ifs"
test -n "$7" && \
func_fatal_help "too many parameters to \`-version-info'"
# convert absolute version numbers to libtool ages
# this retains compatibility with .la files and attempts
# to make the code below a bit more comprehensible
case $vinfo_number in
yes)
number_major="$1"
number_minor="$2"
number_revision="$3"
#
# There are really only two kinds -- those that
# use the current revision as the major version
# and those that subtract age and use age as
# a minor version. But, then there is irix
# which has an extra 1 added just for fun
#
case $version_type in
darwin|linux|osf|windows|none)
func_arith $number_major + $number_minor
current=$func_arith_result
age="$number_minor"
revision="$number_revision"
;;
freebsd-aout|freebsd-elf|sunos)
current="$number_major"
revision="$number_minor"
age="0"
;;
irix|nonstopux)
func_arith $number_major + $number_minor
current=$func_arith_result
age="$number_minor"
revision="$number_minor"
lt_irix_increment=no
;;
esac
;;
no)
current="$1"
revision="$2"
age="$3"
;;
esac
# Check that each of the things are valid numbers.
case $current in
0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
*)
func_error "CURRENT \`$current' must be a nonnegative integer"
func_fatal_error "\`$vinfo' is not valid version information"
;;
esac
case $revision in
0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
*)
func_error "REVISION \`$revision' must be a nonnegative integer"
func_fatal_error "\`$vinfo' is not valid version information"
;;
esac
case $age in
0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
*)
func_error "AGE \`$age' must be a nonnegative integer"
func_fatal_error "\`$vinfo' is not valid version information"
;;
esac
if test "$age" -gt "$current"; then
func_error "AGE \`$age' is greater than the current interface number \`$current'"
func_fatal_error "\`$vinfo' is not valid version information"
fi
# Calculate the version variables.
major=
versuffix=
verstring=
case $version_type in
none) ;;
darwin)
# Like Linux, but with the current version available in
# verstring for coding it into the library header
func_arith $current - $age
major=.$func_arith_result
versuffix="$major.$age.$revision"
# Darwin ld doesn't like 0 for these options...
func_arith $current + 1
minor_current=$func_arith_result
xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
;;
freebsd-aout)
major=".$current"
versuffix=".$current.$revision";
;;
freebsd-elf)
major=".$current"
versuffix=".$current"
;;
irix | nonstopux)
if test "X$lt_irix_increment" = "Xno"; then
func_arith $current - $age
else
func_arith $current - $age + 1
fi
major=$func_arith_result
case $version_type in
nonstopux) verstring_prefix=nonstopux ;;
*) verstring_prefix=sgi ;;
esac
verstring="$verstring_prefix$major.$revision"
# Add in all the interfaces that we are compatible with.
loop=$revision
while test "$loop" -ne 0; do
func_arith $revision - $loop
iface=$func_arith_result
func_arith $loop - 1
loop=$func_arith_result
verstring="$verstring_prefix$major.$iface:$verstring"
done
# Before this point, $major must not contain `.'.
major=.$major
versuffix="$major.$revision"
;;
linux)
func_arith $current - $age
major=.$func_arith_result
versuffix="$major.$age.$revision"
;;
osf)
func_arith $current - $age
major=.$func_arith_result
versuffix=".$current.$age.$revision"
verstring="$current.$age.$revision"
# Add in all the interfaces that we are compatible with.
loop=$age
while test "$loop" -ne 0; do
func_arith $current - $loop
iface=$func_arith_result
func_arith $loop - 1
loop=$func_arith_result
verstring="$verstring:${iface}.0"
done
# Make executables depend on our current version.
verstring="$verstring:${current}.0"
;;
qnx)
major=".$current"
versuffix=".$current"
;;
sunos)
major=".$current"
versuffix=".$current.$revision"
;;
windows)
# Use '-' rather than '.', since we only want one
# extension on DOS 8.3 filesystems.
func_arith $current - $age
major=$func_arith_result
versuffix="-$major"
;;
*)
func_fatal_configuration "unknown library version type \`$version_type'"
;;
esac
# Clear the version info if we defaulted, and they specified a release.
if test -z "$vinfo" && test -n "$release"; then
major=
case $version_type in
darwin)
# we can't check for "0.0" in archive_cmds due to quoting
# problems, so we reset it completely
verstring=
;;
*)
verstring="0.0"
;;
esac
if test "$need_version" = no; then
versuffix=
else
versuffix=".0.0"
fi
fi
# Remove version info from name if versioning should be avoided
if test "$avoid_version" = yes && test "$need_version" = no; then
major=
versuffix=
verstring=""
fi
# Check to see if the archive will have undefined symbols.
if test "$allow_undefined" = yes; then
if test "$allow_undefined_flag" = unsupported; then
func_warning "undefined symbols not allowed in $host shared libraries"
build_libtool_libs=no
build_old_libs=yes
fi
else
# Don't allow undefined symbols.
allow_undefined_flag="$no_undefined_flag"
fi
fi
func_generate_dlsyms "$libname" "$libname" "yes"
libobjs="$libobjs $symfileobj"
test "X$libobjs" = "X " && libobjs=
if test "$mode" != relink; then
# Remove our outputs, but don't remove object files since they
# may have been created when compiling PIC objects.
removelist=
tempremovelist=`$ECHO "$output_objdir/*"`
for p in $tempremovelist; do
case $p in
*.$objext | *.gcno)
;;
$output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
if test "X$precious_files_regex" != "X"; then
if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
then
continue
fi
fi
removelist="$removelist $p"
;;
*) ;;
esac
done
test -n "$removelist" && \
func_show_eval "${RM}r \$removelist"
fi
# Now set the variables for building old libraries.
if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
oldlibs="$oldlibs $output_objdir/$libname.$libext"
# Transform .lo files to .o files.
oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
fi
# Eliminate all temporary directories.
#for path in $notinst_path; do
# lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"`
# deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"`
# dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"`
#done
if test -n "$xrpath"; then
# If the user specified any rpath flags, then add them.
temp_xrpath=
for libdir in $xrpath; do
temp_xrpath="$temp_xrpath -R$libdir"
case "$finalize_rpath " in
*" $libdir "*) ;;
*) finalize_rpath="$finalize_rpath $libdir" ;;
esac
done
if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
dependency_libs="$temp_xrpath $dependency_libs"
fi
fi
# Make sure dlfiles contains only unique files that won't be dlpreopened
old_dlfiles="$dlfiles"
dlfiles=
for lib in $old_dlfiles; do
case " $dlprefiles $dlfiles " in
*" $lib "*) ;;
*) dlfiles="$dlfiles $lib" ;;
esac
done
# Make sure dlprefiles contains only unique files
old_dlprefiles="$dlprefiles"
dlprefiles=
for lib in $old_dlprefiles; do
case "$dlprefiles " in
*" $lib "*) ;;
*) dlprefiles="$dlprefiles $lib" ;;
esac
done
if test "$build_libtool_libs" = yes; then
if test -n "$rpath"; then
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)
# these systems don't actually have a c library (as such)!
;;
*-*-rhapsody* | *-*-darwin1.[012])
# Rhapsody C library is in the System framework
deplibs="$deplibs System.ltframework"
;;
*-*-netbsd*)
# Don't link with libc until the a.out ld.so is fixed.
;;
*-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
# Do not include libc due to us having libc/libc_r.
;;
*-*-sco3.2v5* | *-*-sco5v6*)
# Causes problems with __ctype
;;
*-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
# Compiler inserts libc in the correct place for threads to work
;;
*)
# Add libc to deplibs on all other systems if necessary.
if test "$build_libtool_need_lc" = "yes"; then
deplibs="$deplibs -lc"
fi
;;
esac
fi
# Transform deplibs into only deplibs that can be linked in shared.
name_save=$name
libname_save=$libname
release_save=$release
versuffix_save=$versuffix
major_save=$major
# I'm not sure if I'm treating the release correctly. I think
# release should show up in the -l (ie -lgmp5) so we don't want to
# add it in twice. Is that correct?
release=""
versuffix=""
major=""
newdeplibs=
droppeddeps=no
case $deplibs_check_method in
pass_all)
# Don't check for shared/static. Everything works.
# This might be a little naive. We might want to check
# whether the library exists or not. But this is on
# osf3 & osf4 and I'm not really sure... Just
# implementing what was already the behavior.
newdeplibs=$deplibs
;;
test_compile)
# This code stresses the "libraries are programs" paradigm to its
# limits. Maybe even breaks it. We compile a program, linking it
# against the deplibs as a proxy for the library. Then we can check
# whether they linked in statically or dynamically with ldd.
$opt_dry_run || $RM conftest.c
cat > conftest.c </dev/null`
for potent_lib in $potential_libs; do
# Follow soft links.
if ls -lLd "$potent_lib" 2>/dev/null |
$GREP " -> " >/dev/null; then
continue
fi
# The statement above tries to avoid entering an
# endless loop below, in case of cyclic links.
# We might still enter an endless loop, since a link
# loop can be closed while we follow links,
# but so what?
potlib="$potent_lib"
while test -h "$potlib" 2>/dev/null; do
potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
case $potliblink in
[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
*) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
esac
done
if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
$SED -e 10q |
$EGREP "$file_magic_regex" > /dev/null; then
newdeplibs="$newdeplibs $a_deplib"
a_deplib=""
break 2
fi
done
done
fi
if test -n "$a_deplib" ; then
droppeddeps=yes
$ECHO
$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
$ECHO "*** I have the capability to make that library automatically link in when"
$ECHO "*** you link to this library. But I can only do this if you have a"
$ECHO "*** shared version of the library, which you do not appear to have"
$ECHO "*** because I did check the linker path looking for a file starting"
if test -z "$potlib" ; then
$ECHO "*** with $libname but no candidates were found. (...for file magic test)"
else
$ECHO "*** with $libname and none of the candidates passed a file format test"
$ECHO "*** using a file magic. Last file checked: $potlib"
fi
fi
;;
*)
# Add a -L argument.
newdeplibs="$newdeplibs $a_deplib"
;;
esac
done # Gone through all deplibs.
;;
match_pattern*)
set dummy $deplibs_check_method; shift
match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
for a_deplib in $deplibs; do
case $a_deplib in
-l*)
func_stripname -l '' "$a_deplib"
name=$func_stripname_result
if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
case " $predeps $postdeps " in
*" $a_deplib "*)
newdeplibs="$newdeplibs $a_deplib"
a_deplib=""
;;
esac
fi
if test -n "$a_deplib" ; then
libname=`eval "\\$ECHO \"$libname_spec\""`
for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
for potent_lib in $potential_libs; do
potlib="$potent_lib" # see symlink-check above in file_magic test
if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \
$EGREP "$match_pattern_regex" > /dev/null; then
newdeplibs="$newdeplibs $a_deplib"
a_deplib=""
break 2
fi
done
done
fi
if test -n "$a_deplib" ; then
droppeddeps=yes
$ECHO
$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
$ECHO "*** I have the capability to make that library automatically link in when"
$ECHO "*** you link to this library. But I can only do this if you have a"
$ECHO "*** shared version of the library, which you do not appear to have"
$ECHO "*** because I did check the linker path looking for a file starting"
if test -z "$potlib" ; then
$ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
else
$ECHO "*** with $libname and none of the candidates passed a file format test"
$ECHO "*** using a regex pattern. Last file checked: $potlib"
fi
fi
;;
*)
# Add a -L argument.
newdeplibs="$newdeplibs $a_deplib"
;;
esac
done # Gone through all deplibs.
;;
none | unknown | *)
newdeplibs=""
tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \
-e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'`
if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
for i in $predeps $postdeps ; do
# can't use Xsed below, because $i might contain '/'
tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"`
done
fi
if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' |
$GREP . >/dev/null; then
$ECHO
if test "X$deplibs_check_method" = "Xnone"; then
$ECHO "*** Warning: inter-library dependencies are not supported in this platform."
else
$ECHO "*** Warning: inter-library dependencies are not known to be supported."
fi
$ECHO "*** All declared inter-library dependencies are being dropped."
droppeddeps=yes
fi
;;
esac
versuffix=$versuffix_save
major=$major_save
release=$release_save
libname=$libname_save
name=$name_save
case $host in
*-*-rhapsody* | *-*-darwin1.[012])
# On Rhapsody replace the C library with the System framework
newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
;;
esac
if test "$droppeddeps" = yes; then
if test "$module" = yes; then
$ECHO
$ECHO "*** Warning: libtool could not satisfy all declared inter-library"
$ECHO "*** dependencies of module $libname. Therefore, libtool will create"
$ECHO "*** a static module, that should work as long as the dlopening"
$ECHO "*** application is linked with the -dlopen flag."
if test -z "$global_symbol_pipe"; then
$ECHO
$ECHO "*** However, this would only work if libtool was able to extract symbol"
$ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could"
$ECHO "*** not find such a program. So, this module is probably useless."
$ECHO "*** \`nm' from GNU binutils and a full rebuild may help."
fi
if test "$build_old_libs" = no; then
oldlibs="$output_objdir/$libname.$libext"
build_libtool_libs=module
build_old_libs=yes
else
build_libtool_libs=no
fi
else
$ECHO "*** The inter-library dependencies that have been dropped here will be"
$ECHO "*** automatically added whenever a program is linked with this library"
$ECHO "*** or is declared to -dlopen it."
if test "$allow_undefined" = no; then
$ECHO
$ECHO "*** Since this library must not contain undefined symbols,"
$ECHO "*** because either the platform does not support them or"
$ECHO "*** it was explicitly requested with -no-undefined,"
$ECHO "*** libtool will only create a static version of it."
if test "$build_old_libs" = no; then
oldlibs="$output_objdir/$libname.$libext"
build_libtool_libs=module
build_old_libs=yes
else
build_libtool_libs=no
fi
fi
fi
fi
# Done checking deplibs!
deplibs=$newdeplibs
fi
# Time to change all our "foo.ltframework" stuff back to "-framework foo"
case $host in
*-*-darwin*)
newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
;;
esac
# move library search paths that coincide with paths to not yet
# installed libraries to the beginning of the library search list
new_libs=
for path in $notinst_path; do
case " $new_libs " in
*" -L$path/$objdir "*) ;;
*)
case " $deplibs " in
*" -L$path/$objdir "*)
new_libs="$new_libs -L$path/$objdir" ;;
esac
;;
esac
done
for deplib in $deplibs; do
case $deplib in
-L*)
case " $new_libs " in
*" $deplib "*) ;;
*) new_libs="$new_libs $deplib" ;;
esac
;;
*) new_libs="$new_libs $deplib" ;;
esac
done
deplibs="$new_libs"
# All the library-specific variables (install_libdir is set above).
library_names=
old_library=
dlname=
# Test again, we may have decided not to build it any more
if test "$build_libtool_libs" = yes; then
if test "$hardcode_into_libs" = yes; then
# Hardcode the library paths
hardcode_libdirs=
dep_rpath=
rpath="$finalize_rpath"
test "$mode" != relink && rpath="$compile_rpath$rpath"
for libdir in $rpath; do
if test -n "$hardcode_libdir_flag_spec"; then
if test -n "$hardcode_libdir_separator"; then
if test -z "$hardcode_libdirs"; then
hardcode_libdirs="$libdir"
else
# Just accumulate the unique libdirs.
case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
*"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
;;
*)
hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
;;
esac
fi
else
eval flag=\"$hardcode_libdir_flag_spec\"
dep_rpath="$dep_rpath $flag"
fi
elif test -n "$runpath_var"; then
case "$perm_rpath " in
*" $libdir "*) ;;
*) perm_rpath="$perm_rpath $libdir" ;;
esac
fi
done
# Substitute the hardcoded libdirs into the rpath.
if test -n "$hardcode_libdir_separator" &&
test -n "$hardcode_libdirs"; then
libdir="$hardcode_libdirs"
if test -n "$hardcode_libdir_flag_spec_ld"; then
eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
else
eval dep_rpath=\"$hardcode_libdir_flag_spec\"
fi
fi
if test -n "$runpath_var" && test -n "$perm_rpath"; then
# We should set the runpath_var.
rpath=
for dir in $perm_rpath; do
rpath="$rpath$dir:"
done
eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
fi
test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
fi
shlibpath="$finalize_shlibpath"
test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
if test -n "$shlibpath"; then
eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
fi
# Get the real and link names of the library.
eval shared_ext=\"$shrext_cmds\"
eval library_names=\"$library_names_spec\"
set dummy $library_names
shift
realname="$1"
shift
if test -n "$soname_spec"; then
eval soname=\"$soname_spec\"
else
soname="$realname"
fi
if test -z "$dlname"; then
dlname=$soname
fi
lib="$output_objdir/$realname"
linknames=
for link
do
linknames="$linknames $link"
done
# Use standard objects if they are pic
test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
test "X$libobjs" = "X " && libobjs=
delfiles=
if test -n "$export_symbols" && test -n "$include_expsyms"; then
$opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
export_symbols="$output_objdir/$libname.uexp"
delfiles="$delfiles $export_symbols"
fi
orig_export_symbols=
case $host_os in
cygwin* | mingw* | cegcc*)
if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
# exporting using user supplied symfile
if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
# and it's NOT already a .def file. Must figure out
# which of the given symbols are data symbols and tag
# them as such. So, trigger use of export_symbols_cmds.
# export_symbols gets reassigned inside the "prepare
# the list of exported symbols" if statement, so the
# include_expsyms logic still works.
orig_export_symbols="$export_symbols"
export_symbols=
always_export_symbols=yes
fi
fi
;;
esac
# Prepare the list of exported symbols
if test -z "$export_symbols"; then
if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
func_verbose "generating symbol list for \`$libname.la'"
export_symbols="$output_objdir/$libname.exp"
$opt_dry_run || $RM $export_symbols
cmds=$export_symbols_cmds
save_ifs="$IFS"; IFS='~'
for cmd in $cmds; do
IFS="$save_ifs"
eval cmd=\"$cmd\"
func_len " $cmd"
len=$func_len_result
if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
func_show_eval "$cmd" 'exit $?'
skipped_export=false
else
# The command line is too long to execute in one step.
func_verbose "using reloadable object file for export list..."
skipped_export=:
# Break out early, otherwise skipped_export may be
# set to false by a later but shorter cmd.
break
fi
done
IFS="$save_ifs"
if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
fi
fi
fi
if test -n "$export_symbols" && test -n "$include_expsyms"; then
tmp_export_symbols="$export_symbols"
test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
$opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
fi
if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
# The given exports_symbols file has to be filtered, so filter it.
func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
# FIXME: $output_objdir/$libname.filter potentially contains lots of
# 's' commands which not all seds can handle. GNU sed should be fine
# though. Also, the filter scales superlinearly with the number of
# global variables. join(1) would be nice here, but unfortunately
# isn't a blessed tool.
$opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
export_symbols=$output_objdir/$libname.def
$opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
fi
tmp_deplibs=
for test_deplib in $deplibs; do
case " $convenience " in
*" $test_deplib "*) ;;
*)
tmp_deplibs="$tmp_deplibs $test_deplib"
;;
esac
done
deplibs="$tmp_deplibs"
if test -n "$convenience"; then
if test -n "$whole_archive_flag_spec" &&
test "$compiler_needs_object" = yes &&
test -z "$libobjs"; then
# extract the archives, so we have objects to list.
# TODO: could optimize this to just extract one archive.
whole_archive_flag_spec=
fi
if test -n "$whole_archive_flag_spec"; then
save_libobjs=$libobjs
eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
test "X$libobjs" = "X " && libobjs=
else
gentop="$output_objdir/${outputname}x"
generated="$generated $gentop"
func_extract_archives $gentop $convenience
libobjs="$libobjs $func_extract_archives_result"
test "X$libobjs" = "X " && libobjs=
fi
fi
if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
eval flag=\"$thread_safe_flag_spec\"
linker_flags="$linker_flags $flag"
fi
# Make a backup of the uninstalled library when relinking
if test "$mode" = relink; then
$opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
fi
# Do each of the archive commands.
if test "$module" = yes && test -n "$module_cmds" ; then
if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
eval test_cmds=\"$module_expsym_cmds\"
cmds=$module_expsym_cmds
else
eval test_cmds=\"$module_cmds\"
cmds=$module_cmds
fi
else
if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
eval test_cmds=\"$archive_expsym_cmds\"
cmds=$archive_expsym_cmds
else
eval test_cmds=\"$archive_cmds\"
cmds=$archive_cmds
fi
fi
if test "X$skipped_export" != "X:" &&
func_len " $test_cmds" &&
len=$func_len_result &&
test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
:
else
# The command line is too long to link in one step, link piecewise
# or, if using GNU ld and skipped_export is not :, use a linker
# script.
# Save the value of $output and $libobjs because we want to
# use them later. If we have whole_archive_flag_spec, we
# want to use save_libobjs as it was before
# whole_archive_flag_spec was expanded, because we can't
# assume the linker understands whole_archive_flag_spec.
# This may have to be revisited, in case too many
# convenience libraries get linked in and end up exceeding
# the spec.
if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
save_libobjs=$libobjs
fi
save_output=$output
output_la=`$ECHO "X$output" | $Xsed -e "$basename"`
# Clear the reloadable object creation command queue and
# initialize k to one.
test_cmds=
concat_cmds=
objlist=
last_robj=
k=1
if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
output=${output_objdir}/${output_la}.lnkscript
func_verbose "creating GNU ld script: $output"
$ECHO 'INPUT (' > $output
for obj in $save_libobjs
do
$ECHO "$obj" >> $output
done
$ECHO ')' >> $output
delfiles="$delfiles $output"
elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
output=${output_objdir}/${output_la}.lnk
func_verbose "creating linker input file list: $output"
: > $output
set x $save_libobjs
shift
firstobj=
if test "$compiler_needs_object" = yes; then
firstobj="$1 "
shift
fi
for obj
do
$ECHO "$obj" >> $output
done
delfiles="$delfiles $output"
output=$firstobj\"$file_list_spec$output\"
else
if test -n "$save_libobjs"; then
func_verbose "creating reloadable object files..."
output=$output_objdir/$output_la-${k}.$objext
eval test_cmds=\"$reload_cmds\"
func_len " $test_cmds"
len0=$func_len_result
len=$len0
# Loop over the list of objects to be linked.
for obj in $save_libobjs
do
func_len " $obj"
func_arith $len + $func_len_result
len=$func_arith_result
if test "X$objlist" = X ||
test "$len" -lt "$max_cmd_len"; then
func_append objlist " $obj"
else
# The command $test_cmds is almost too long, add a
# command to the queue.
if test "$k" -eq 1 ; then
# The first file doesn't have a previous command to add.
eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
else
# All subsequent reloadable object files will link in
# the last one created.
eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\"
fi
last_robj=$output_objdir/$output_la-${k}.$objext
func_arith $k + 1
k=$func_arith_result
output=$output_objdir/$output_la-${k}.$objext
objlist=$obj
func_len " $last_robj"
func_arith $len0 + $func_len_result
len=$func_arith_result
fi
done
# Handle the remaining objects by creating one last
# reloadable object file. All subsequent reloadable object
# files will link in the last one created.
test -z "$concat_cmds" || concat_cmds=$concat_cmds~
eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
if test -n "$last_robj"; then
eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
fi
delfiles="$delfiles $output"
else
output=
fi
if ${skipped_export-false}; then
func_verbose "generating symbol list for \`$libname.la'"
export_symbols="$output_objdir/$libname.exp"
$opt_dry_run || $RM $export_symbols
libobjs=$output
# Append the command to create the export file.
test -z "$concat_cmds" || concat_cmds=$concat_cmds~
eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
if test -n "$last_robj"; then
eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
fi
fi
test -n "$save_libobjs" &&
func_verbose "creating a temporary reloadable object file: $output"
# Loop through the commands generated above and execute them.
save_ifs="$IFS"; IFS='~'
for cmd in $concat_cmds; do
IFS="$save_ifs"
$opt_silent || {
func_quote_for_expand "$cmd"
eval "func_echo $func_quote_for_expand_result"
}
$opt_dry_run || eval "$cmd" || {
lt_exit=$?
# Restore the uninstalled library and exit
if test "$mode" = relink; then
( cd "$output_objdir" && \
$RM "${realname}T" && \
$MV "${realname}U" "$realname" )
fi
exit $lt_exit
}
done
IFS="$save_ifs"
if test -n "$export_symbols_regex" && ${skipped_export-false}; then
func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
fi
fi
if ${skipped_export-false}; then
if test -n "$export_symbols" && test -n "$include_expsyms"; then
tmp_export_symbols="$export_symbols"
test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
$opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"'
fi
if test -n "$orig_export_symbols"; then
# The given exports_symbols file has to be filtered, so filter it.
func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
# FIXME: $output_objdir/$libname.filter potentially contains lots of
# 's' commands which not all seds can handle. GNU sed should be fine
# though. Also, the filter scales superlinearly with the number of
# global variables. join(1) would be nice here, but unfortunately
# isn't a blessed tool.
$opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
delfiles="$delfiles $export_symbols $output_objdir/$libname.filter"
export_symbols=$output_objdir/$libname.def
$opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
fi
fi
libobjs=$output
# Restore the value of output.
output=$save_output
if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
test "X$libobjs" = "X " && libobjs=
fi
# Expand the library linking commands again to reset the
# value of $libobjs for piecewise linking.
# Do each of the archive commands.
if test "$module" = yes && test -n "$module_cmds" ; then
if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
cmds=$module_expsym_cmds
else
cmds=$module_cmds
fi
else
if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
cmds=$archive_expsym_cmds
else
cmds=$archive_cmds
fi
fi
fi
if test -n "$delfiles"; then
# Append the command to remove temporary files to $cmds.
eval cmds=\"\$cmds~\$RM $delfiles\"
fi
# Add any objects from preloaded convenience libraries
if test -n "$dlprefiles"; then
gentop="$output_objdir/${outputname}x"
generated="$generated $gentop"
func_extract_archives $gentop $dlprefiles
libobjs="$libobjs $func_extract_archives_result"
test "X$libobjs" = "X " && libobjs=
fi
save_ifs="$IFS"; IFS='~'
for cmd in $cmds; do
IFS="$save_ifs"
eval cmd=\"$cmd\"
$opt_silent || {
func_quote_for_expand "$cmd"
eval "func_echo $func_quote_for_expand_result"
}
$opt_dry_run || eval "$cmd" || {
lt_exit=$?
# Restore the uninstalled library and exit
if test "$mode" = relink; then
( cd "$output_objdir" && \
$RM "${realname}T" && \
$MV "${realname}U" "$realname" )
fi
exit $lt_exit
}
done
IFS="$save_ifs"
# Restore the uninstalled library and exit
if test "$mode" = relink; then
$opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
if test -n "$convenience"; then
if test -z "$whole_archive_flag_spec"; then
func_show_eval '${RM}r "$gentop"'
fi
fi
exit $EXIT_SUCCESS
fi
# Create links to the real library.
for linkname in $linknames; do
if test "$realname" != "$linkname"; then
func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
fi
done
# If -module or -export-dynamic was specified, set the dlname.
if test "$module" = yes || test "$export_dynamic" = yes; then
# On all known operating systems, these are identical.
dlname="$soname"
fi
fi
;;
obj)
if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
func_warning "\`-dlopen' is ignored for objects"
fi
case " $deplibs" in
*\ -l* | *\ -L*)
func_warning "\`-l' and \`-L' are ignored for objects" ;;
esac
test -n "$rpath" && \
func_warning "\`-rpath' is ignored for objects"
test -n "$xrpath" && \
func_warning "\`-R' is ignored for objects"
test -n "$vinfo" && \
func_warning "\`-version-info' is ignored for objects"
test -n "$release" && \
func_warning "\`-release' is ignored for objects"
case $output in
*.lo)
test -n "$objs$old_deplibs" && \
func_fatal_error "cannot build library object \`$output' from non-libtool objects"
libobj=$output
func_lo2o "$libobj"
obj=$func_lo2o_result
;;
*)
libobj=
obj="$output"
;;
esac
# Delete the old objects.
$opt_dry_run || $RM $obj $libobj
# Objects from convenience libraries. This assumes
# single-version convenience libraries. Whenever we create
# different ones for PIC/non-PIC, this we'll have to duplicate
# the extraction.
reload_conv_objs=
gentop=
# reload_cmds runs $LD directly, so let us get rid of
# -Wl from whole_archive_flag_spec and hope we can get by with
# turning comma into space..
wl=
if test -n "$convenience"; then
if test -n "$whole_archive_flag_spec"; then
eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'`
else
gentop="$output_objdir/${obj}x"
generated="$generated $gentop"
func_extract_archives $gentop $convenience
reload_conv_objs="$reload_objs $func_extract_archives_result"
fi
fi
# Create the old-style object.
reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
output="$obj"
func_execute_cmds "$reload_cmds" 'exit $?'
# Exit if we aren't doing a library object file.
if test -z "$libobj"; then
if test -n "$gentop"; then
func_show_eval '${RM}r "$gentop"'
fi
exit $EXIT_SUCCESS
fi
if test "$build_libtool_libs" != yes; then
if test -n "$gentop"; then
func_show_eval '${RM}r "$gentop"'
fi
# Create an invalid libtool object if no PIC, so that we don't
# accidentally link it into a program.
# $show "echo timestamp > $libobj"
# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
exit $EXIT_SUCCESS
fi
if test -n "$pic_flag" || test "$pic_mode" != default; then
# Only do commands if we really have different PIC objects.
reload_objs="$libobjs $reload_conv_objs"
output="$libobj"
func_execute_cmds "$reload_cmds" 'exit $?'
fi
if test -n "$gentop"; then
func_show_eval '${RM}r "$gentop"'
fi
exit $EXIT_SUCCESS
;;
prog)
case $host in
*cygwin*) func_stripname '' '.exe' "$output"
output=$func_stripname_result.exe;;
esac
test -n "$vinfo" && \
func_warning "\`-version-info' is ignored for programs"
test -n "$release" && \
func_warning "\`-release' is ignored for programs"
test "$preload" = yes \
&& test "$dlopen_support" = unknown \
&& test "$dlopen_self" = unknown \
&& test "$dlopen_self_static" = unknown && \
func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
case $host in
*-*-rhapsody* | *-*-darwin1.[012])
# On Rhapsody replace the C library is the System framework
compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'`
;;
esac
case $host in
*-*-darwin*)
# Don't allow lazy linking, it breaks C++ global constructors
# But is supposedly fixed on 10.4 or later (yay!).
if test "$tagname" = CXX ; then
case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
10.[0123])
compile_command="$compile_command ${wl}-bind_at_load"
finalize_command="$finalize_command ${wl}-bind_at_load"
;;
esac
fi
# Time to change all our "foo.ltframework" stuff back to "-framework foo"
compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'`
;;
esac
# move library search paths that coincide with paths to not yet
# installed libraries to the beginning of the library search list
new_libs=
for path in $notinst_path; do
case " $new_libs " in
*" -L$path/$objdir "*) ;;
*)
case " $compile_deplibs " in
*" -L$path/$objdir "*)
new_libs="$new_libs -L$path/$objdir" ;;
esac
;;
esac
done
for deplib in $compile_deplibs; do
case $deplib in
-L*)
case " $new_libs " in
*" $deplib "*) ;;
*) new_libs="$new_libs $deplib" ;;
esac
;;
*) new_libs="$new_libs $deplib" ;;
esac
done
compile_deplibs="$new_libs"
compile_command="$compile_command $compile_deplibs"
finalize_command="$finalize_command $finalize_deplibs"
if test -n "$rpath$xrpath"; then
# If the user specified any rpath flags, then add them.
for libdir in $rpath $xrpath; do
# This is the magic to use -rpath.
case "$finalize_rpath " in
*" $libdir "*) ;;
*) finalize_rpath="$finalize_rpath $libdir" ;;
esac
done
fi
# Now hardcode the library paths
rpath=
hardcode_libdirs=
for libdir in $compile_rpath $finalize_rpath; do
if test -n "$hardcode_libdir_flag_spec"; then
if test -n "$hardcode_libdir_separator"; then
if test -z "$hardcode_libdirs"; then
hardcode_libdirs="$libdir"
else
# Just accumulate the unique libdirs.
case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
*"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
;;
*)
hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
;;
esac
fi
else
eval flag=\"$hardcode_libdir_flag_spec\"
rpath="$rpath $flag"
fi
elif test -n "$runpath_var"; then
case "$perm_rpath " in
*" $libdir "*) ;;
*) perm_rpath="$perm_rpath $libdir" ;;
esac
fi
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
case :$dllsearchpath: in
*":$libdir:"*) ;;
::) dllsearchpath=$libdir;;
*) dllsearchpath="$dllsearchpath:$libdir";;
esac
case :$dllsearchpath: in
*":$testbindir:"*) ;;
::) dllsearchpath=$testbindir;;
*) dllsearchpath="$dllsearchpath:$testbindir";;
esac
;;
esac
done
# Substitute the hardcoded libdirs into the rpath.
if test -n "$hardcode_libdir_separator" &&
test -n "$hardcode_libdirs"; then
libdir="$hardcode_libdirs"
eval rpath=\" $hardcode_libdir_flag_spec\"
fi
compile_rpath="$rpath"
rpath=
hardcode_libdirs=
for libdir in $finalize_rpath; do
if test -n "$hardcode_libdir_flag_spec"; then
if test -n "$hardcode_libdir_separator"; then
if test -z "$hardcode_libdirs"; then
hardcode_libdirs="$libdir"
else
# Just accumulate the unique libdirs.
case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
*"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
;;
*)
hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
;;
esac
fi
else
eval flag=\"$hardcode_libdir_flag_spec\"
rpath="$rpath $flag"
fi
elif test -n "$runpath_var"; then
case "$finalize_perm_rpath " in
*" $libdir "*) ;;
*) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
esac
fi
done
# Substitute the hardcoded libdirs into the rpath.
if test -n "$hardcode_libdir_separator" &&
test -n "$hardcode_libdirs"; then
libdir="$hardcode_libdirs"
eval rpath=\" $hardcode_libdir_flag_spec\"
fi
finalize_rpath="$rpath"
if test -n "$libobjs" && test "$build_old_libs" = yes; then
# Transform all the library objects into standard objects.
compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
fi
func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
# template prelinking step
if test -n "$prelink_cmds"; then
func_execute_cmds "$prelink_cmds" 'exit $?'
fi
wrappers_required=yes
case $host in
*cygwin* | *mingw* )
if test "$build_libtool_libs" != yes; then
wrappers_required=no
fi
;;
*cegcc)
# Disable wrappers for cegcc, we are cross compiling anyway.
wrappers_required=no
;;
*)
if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
wrappers_required=no
fi
;;
esac
if test "$wrappers_required" = no; then
# Replace the output file specification.
compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
link_command="$compile_command$compile_rpath"
# We have no uninstalled library dependencies, so finalize right now.
exit_status=0
func_show_eval "$link_command" 'exit_status=$?'
# Delete the generated files.
if test -f "$output_objdir/${outputname}S.${objext}"; then
func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
fi
exit $exit_status
fi
if test -n "$compile_shlibpath$finalize_shlibpath"; then
compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
fi
if test -n "$finalize_shlibpath"; then
finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
fi
compile_var=
finalize_var=
if test -n "$runpath_var"; then
if test -n "$perm_rpath"; then
# We should set the runpath_var.
rpath=
for dir in $perm_rpath; do
rpath="$rpath$dir:"
done
compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
fi
if test -n "$finalize_perm_rpath"; then
# We should set the runpath_var.
rpath=
for dir in $finalize_perm_rpath; do
rpath="$rpath$dir:"
done
finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
fi
fi
if test "$no_install" = yes; then
# We don't need to create a wrapper script.
link_command="$compile_var$compile_command$compile_rpath"
# Replace the output file specification.
link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
# Delete the old output file.
$opt_dry_run || $RM $output
# Link the executable and exit
func_show_eval "$link_command" 'exit $?'
exit $EXIT_SUCCESS
fi
if test "$hardcode_action" = relink; then
# Fast installation is not supported
link_command="$compile_var$compile_command$compile_rpath"
relink_command="$finalize_var$finalize_command$finalize_rpath"
func_warning "this platform does not like uninstalled shared libraries"
func_warning "\`$output' will be relinked during installation"
else
if test "$fast_install" != no; then
link_command="$finalize_var$compile_command$finalize_rpath"
if test "$fast_install" = yes; then
relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
else
# fast_install is set to needless
relink_command=
fi
else
link_command="$compile_var$compile_command$compile_rpath"
relink_command="$finalize_var$finalize_command$finalize_rpath"
fi
fi
# Replace the output file specification.
link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
# Delete the old output files.
$opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
func_show_eval "$link_command" 'exit $?'
# Now create the wrapper script.
func_verbose "creating $output"
# Quote the relink command for shipping.
if test -n "$relink_command"; then
# Preserve any variables that may affect compiler behavior
for var in $variables_saved_for_relink; do
if eval test -z \"\${$var+set}\"; then
relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
elif eval var_value=\$$var; test -z "$var_value"; then
relink_command="$var=; export $var; $relink_command"
else
func_quote_for_eval "$var_value"
relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
fi
done
relink_command="(cd `pwd`; $relink_command)"
relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
fi
# Quote $ECHO for shipping.
if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then
case $progpath in
[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
esac
qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"`
else
qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"`
fi
# Only actually do things if not in dry run mode.
$opt_dry_run || {
# win32 will think the script is a binary if it has
# a .exe suffix, so we strip it off here.
case $output in
*.exe) func_stripname '' '.exe' "$output"
output=$func_stripname_result ;;
esac
# test for cygwin because mv fails w/o .exe extensions
case $host in
*cygwin*)
exeext=.exe
func_stripname '' '.exe' "$outputname"
outputname=$func_stripname_result ;;
*) exeext= ;;
esac
case $host in
*cygwin* | *mingw* )
func_dirname_and_basename "$output" "" "."
output_name=$func_basename_result
output_path=$func_dirname_result
cwrappersource="$output_path/$objdir/lt-$output_name.c"
cwrapper="$output_path/$output_name.exe"
$RM $cwrappersource $cwrapper
trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
func_emit_cwrapperexe_src > $cwrappersource
# The wrapper executable is built using the $host compiler,
# because it contains $host paths and files. If cross-
# compiling, it, like the target executable, must be
# executed on the $host or under an emulation environment.
$opt_dry_run || {
$LTCC $LTCFLAGS -o $cwrapper $cwrappersource
$STRIP $cwrapper
}
# Now, create the wrapper script for func_source use:
func_ltwrapper_scriptname $cwrapper
$RM $func_ltwrapper_scriptname_result
trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
$opt_dry_run || {
# note: this script will not be executed, so do not chmod.
if test "x$build" = "x$host" ; then
$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
else
func_emit_wrapper no > $func_ltwrapper_scriptname_result
fi
}
;;
* )
$RM $output
trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
func_emit_wrapper no > $output
chmod +x $output
;;
esac
}
exit $EXIT_SUCCESS
;;
esac
# See if we need to build an old-fashioned archive.
for oldlib in $oldlibs; do
if test "$build_libtool_libs" = convenience; then
oldobjs="$libobjs_save $symfileobj"
addlibs="$convenience"
build_libtool_libs=no
else
if test "$build_libtool_libs" = module; then
oldobjs="$libobjs_save"
build_libtool_libs=no
else
oldobjs="$old_deplibs $non_pic_objects"
if test "$preload" = yes && test -f "$symfileobj"; then
oldobjs="$oldobjs $symfileobj"
fi
fi
addlibs="$old_convenience"
fi
if test -n "$addlibs"; then
gentop="$output_objdir/${outputname}x"
generated="$generated $gentop"
func_extract_archives $gentop $addlibs
oldobjs="$oldobjs $func_extract_archives_result"
fi
# Do each command in the archive commands.
if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
cmds=$old_archive_from_new_cmds
else
# Add any objects from preloaded convenience libraries
if test -n "$dlprefiles"; then
gentop="$output_objdir/${outputname}x"
generated="$generated $gentop"
func_extract_archives $gentop $dlprefiles
oldobjs="$oldobjs $func_extract_archives_result"
fi
# POSIX demands no paths to be encoded in archives. We have
# to avoid creating archives with duplicate basenames if we
# might have to extract them afterwards, e.g., when creating a
# static archive out of a convenience library, or when linking
# the entirety of a libtool archive into another (currently
# not supported by libtool).
if (for obj in $oldobjs
do
func_basename "$obj"
$ECHO "$func_basename_result"
done | sort | sort -uc >/dev/null 2>&1); then
:
else
$ECHO "copying selected object files to avoid basename conflicts..."
gentop="$output_objdir/${outputname}x"
generated="$generated $gentop"
func_mkdir_p "$gentop"
save_oldobjs=$oldobjs
oldobjs=
counter=1
for obj in $save_oldobjs
do
func_basename "$obj"
objbase="$func_basename_result"
case " $oldobjs " in
" ") oldobjs=$obj ;;
*[\ /]"$objbase "*)
while :; do
# Make sure we don't pick an alternate name that also
# overlaps.
newobj=lt$counter-$objbase
func_arith $counter + 1
counter=$func_arith_result
case " $oldobjs " in
*[\ /]"$newobj "*) ;;
*) if test ! -f "$gentop/$newobj"; then break; fi ;;
esac
done
func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
oldobjs="$oldobjs $gentop/$newobj"
;;
*) oldobjs="$oldobjs $obj" ;;
esac
done
fi
eval cmds=\"$old_archive_cmds\"
func_len " $cmds"
len=$func_len_result
if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
cmds=$old_archive_cmds
else
# the command line is too long to link in one step, link in parts
func_verbose "using piecewise archive linking..."
save_RANLIB=$RANLIB
RANLIB=:
objlist=
concat_cmds=
save_oldobjs=$oldobjs
oldobjs=
# Is there a better way of finding the last object in the list?
for obj in $save_oldobjs
do
last_oldobj=$obj
done
eval test_cmds=\"$old_archive_cmds\"
func_len " $test_cmds"
len0=$func_len_result
len=$len0
for obj in $save_oldobjs
do
func_len " $obj"
func_arith $len + $func_len_result
len=$func_arith_result
func_append objlist " $obj"
if test "$len" -lt "$max_cmd_len"; then
:
else
# the above command should be used before it gets too long
oldobjs=$objlist
if test "$obj" = "$last_oldobj" ; then
RANLIB=$save_RANLIB
fi
test -z "$concat_cmds" || concat_cmds=$concat_cmds~
eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
objlist=
len=$len0
fi
done
RANLIB=$save_RANLIB
oldobjs=$objlist
if test "X$oldobjs" = "X" ; then
eval cmds=\"\$concat_cmds\"
else
eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
fi
fi
fi
func_execute_cmds "$cmds" 'exit $?'
done
test -n "$generated" && \
func_show_eval "${RM}r$generated"
# Now create the libtool archive.
case $output in
*.la)
old_library=
test "$build_old_libs" = yes && old_library="$libname.$libext"
func_verbose "creating $output"
# Preserve any variables that may affect compiler behavior
for var in $variables_saved_for_relink; do
if eval test -z \"\${$var+set}\"; then
relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
elif eval var_value=\$$var; test -z "$var_value"; then
relink_command="$var=; export $var; $relink_command"
else
func_quote_for_eval "$var_value"
relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
fi
done
# Quote the link command for shipping.
relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"`
if test "$hardcode_automatic" = yes ; then
relink_command=
fi
# Only create the output if not a dry run.
$opt_dry_run || {
for installed in no yes; do
if test "$installed" = yes; then
if test -z "$install_libdir"; then
break
fi
output="$output_objdir/$outputname"i
# Replace all uninstalled libtool libraries with the installed ones
newdependency_libs=
for deplib in $dependency_libs; do
case $deplib in
*.la)
func_basename "$deplib"
name="$func_basename_result"
eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
test -z "$libdir" && \
func_fatal_error "\`$deplib' is not a valid libtool archive"
newdependency_libs="$newdependency_libs $libdir/$name"
;;
*) newdependency_libs="$newdependency_libs $deplib" ;;
esac
done
dependency_libs="$newdependency_libs"
newdlfiles=
for lib in $dlfiles; do
case $lib in
*.la)
func_basename "$lib"
name="$func_basename_result"
eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
test -z "$libdir" && \
func_fatal_error "\`$lib' is not a valid libtool archive"
newdlfiles="$newdlfiles $libdir/$name"
;;
*) newdlfiles="$newdlfiles $lib" ;;
esac
done
dlfiles="$newdlfiles"
newdlprefiles=
for lib in $dlprefiles; do
case $lib in
*.la)
# Only pass preopened files to the pseudo-archive (for
# eventual linking with the app. that links it) if we
# didn't already link the preopened objects directly into
# the library:
func_basename "$lib"
name="$func_basename_result"
eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
test -z "$libdir" && \
func_fatal_error "\`$lib' is not a valid libtool archive"
newdlprefiles="$newdlprefiles $libdir/$name"
;;
esac
done
dlprefiles="$newdlprefiles"
else
newdlfiles=
for lib in $dlfiles; do
case $lib in
[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
*) abs=`pwd`"/$lib" ;;
esac
newdlfiles="$newdlfiles $abs"
done
dlfiles="$newdlfiles"
newdlprefiles=
for lib in $dlprefiles; do
case $lib in
[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
*) abs=`pwd`"/$lib" ;;
esac
newdlprefiles="$newdlprefiles $abs"
done
dlprefiles="$newdlprefiles"
fi
$RM $output
# place dlname in correct position for cygwin
tdlname=$dlname
case $host,$output,$installed,$module,$dlname in
*cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
esac
$ECHO > $output "\
# $outputname - a libtool library file
# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
#
# Please DO NOT delete this file!
# It is necessary for linking the library.
# The name that we can dlopen(3).
dlname='$tdlname'
# Names of this library.
library_names='$library_names'
# The name of the static archive.
old_library='$old_library'
# Linker flags that can not go in dependency_libs.
inherited_linker_flags='$new_inherited_linker_flags'
# Libraries that this one depends upon.
dependency_libs='$dependency_libs'
# Names of additional weak libraries provided by this library
weak_library_names='$weak_libs'
# Version information for $libname.
current=$current
age=$age
revision=$revision
# Is this an already installed library?
installed=$installed
# Should we warn about portability when linking against -modules?
shouldnotlink=$module
# Files to dlopen/dlpreopen
dlopen='$dlfiles'
dlpreopen='$dlprefiles'
# Directory that this library needs to be installed in:
libdir='$install_libdir'"
if test "$installed" = no && test "$need_relink" = yes; then
$ECHO >> $output "\
relink_command=\"$relink_command\""
fi
done
}
# Do a symbolic link so that the libtool archive can be found in
# LD_LIBRARY_PATH before the program is installed.
func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
;;
esac
exit $EXIT_SUCCESS
}
{ test "$mode" = link || test "$mode" = relink; } &&
func_mode_link ${1+"$@"}
# func_mode_uninstall arg...
func_mode_uninstall ()
{
$opt_debug
RM="$nonopt"
files=
rmforce=
exit_status=0
# This variable tells wrapper scripts just to set variables rather
# than running their programs.
libtool_install_magic="$magic"
for arg
do
case $arg in
-f) RM="$RM $arg"; rmforce=yes ;;
-*) RM="$RM $arg" ;;
*) files="$files $arg" ;;
esac
done
test -z "$RM" && \
func_fatal_help "you must specify an RM program"
rmdirs=
origobjdir="$objdir"
for file in $files; do
func_dirname "$file" "" "."
dir="$func_dirname_result"
if test "X$dir" = X.; then
objdir="$origobjdir"
else
objdir="$dir/$origobjdir"
fi
func_basename "$file"
name="$func_basename_result"
test "$mode" = uninstall && objdir="$dir"
# Remember objdir for removal later, being careful to avoid duplicates
if test "$mode" = clean; then
case " $rmdirs " in
*" $objdir "*) ;;
*) rmdirs="$rmdirs $objdir" ;;
esac
fi
# Don't error if the file doesn't exist and rm -f was used.
if { test -L "$file"; } >/dev/null 2>&1 ||
{ test -h "$file"; } >/dev/null 2>&1 ||
test -f "$file"; then
:
elif test -d "$file"; then
exit_status=1
continue
elif test "$rmforce" = yes; then
continue
fi
rmfiles="$file"
case $name in
*.la)
# Possibly a libtool archive, so verify it.
if func_lalib_p "$file"; then
func_source $dir/$name
# Delete the libtool libraries and symlinks.
for n in $library_names; do
rmfiles="$rmfiles $objdir/$n"
done
test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
case "$mode" in
clean)
case " $library_names " in
# " " in the beginning catches empty $dlname
*" $dlname "*) ;;
*) rmfiles="$rmfiles $objdir/$dlname" ;;
esac
test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
;;
uninstall)
if test -n "$library_names"; then
# Do each command in the postuninstall commands.
func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
fi
if test -n "$old_library"; then
# Do each command in the old_postuninstall commands.
func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
fi
# FIXME: should reinstall the best remaining shared library.
;;
esac
fi
;;
*.lo)
# Possibly a libtool object, so verify it.
if func_lalib_p "$file"; then
# Read the .lo file
func_source $dir/$name
# Add PIC object to the list of files to remove.
if test -n "$pic_object" &&
test "$pic_object" != none; then
rmfiles="$rmfiles $dir/$pic_object"
fi
# Add non-PIC object to the list of files to remove.
if test -n "$non_pic_object" &&
test "$non_pic_object" != none; then
rmfiles="$rmfiles $dir/$non_pic_object"
fi
fi
;;
*)
if test "$mode" = clean ; then
noexename=$name
case $file in
*.exe)
func_stripname '' '.exe' "$file"
file=$func_stripname_result
func_stripname '' '.exe' "$name"
noexename=$func_stripname_result
# $file with .exe has already been added to rmfiles,
# add $file without .exe
rmfiles="$rmfiles $file"
;;
esac
# Do a test to see if this is a libtool program.
if func_ltwrapper_p "$file"; then
if func_ltwrapper_executable_p "$file"; then
func_ltwrapper_scriptname "$file"
relink_command=
func_source $func_ltwrapper_scriptname_result
rmfiles="$rmfiles $func_ltwrapper_scriptname_result"
else
relink_command=
func_source $dir/$noexename
fi
# note $name still contains .exe if it was in $file originally
# as does the version of $file that was added into $rmfiles
rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
if test "$fast_install" = yes && test -n "$relink_command"; then
rmfiles="$rmfiles $objdir/lt-$name"
fi
if test "X$noexename" != "X$name" ; then
rmfiles="$rmfiles $objdir/lt-${noexename}.c"
fi
fi
fi
;;
esac
func_show_eval "$RM $rmfiles" 'exit_status=1'
done
objdir="$origobjdir"
# Try to remove the ${objdir}s in the directories where we deleted files
for dir in $rmdirs; do
if test -d "$dir"; then
func_show_eval "rmdir $dir >/dev/null 2>&1"
fi
done
exit $exit_status
}
{ test "$mode" = uninstall || test "$mode" = clean; } &&
func_mode_uninstall ${1+"$@"}
test -z "$mode" && {
help="$generic_help"
func_fatal_help "you must specify a MODE"
}
test -z "$exec_cmd" && \
func_fatal_help "invalid operation mode \`$mode'"
if test -n "$exec_cmd"; then
eval exec "$exec_cmd"
exit $EXIT_FAILURE
fi
exit $exit_status
# The TAGs below are defined such that we never get into a situation
# in which we disable both kinds of libraries. Given conflicting
# choices, we go for a static library, that is the most portable,
# since we can't tell whether shared libraries were disabled because
# the user asked for that or because the platform doesn't support
# them. This is particularly important on AIX, because we don't
# support having both static and shared libraries enabled at the same
# time on that platform, so we default to a shared-only configuration.
# If a disable-shared tag is given, we'll fallback to a static-only
# configuration. But we'll never go from static-only to shared-only.
# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
build_libtool_libs=no
build_old_libs=yes
# ### END LIBTOOL TAG CONFIG: disable-shared
# ### BEGIN LIBTOOL TAG CONFIG: disable-static
build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
# ### END LIBTOOL TAG CONFIG: disable-static
# Local Variables:
# mode:shell-script
# sh-indentation:2
# End:
# vi:sw=2
goocanvas-1.0.0/ChangeLog 0000644 0000764 0000764 00000223151 11512447642 012205 0000000 0000000 2011-01-10 Damon Chaplin
* src/goocanvasimage.c: added "alpha" property. Patch from xapantu
plus a few changes.
* demo/mv-demo.c:
* demo/demo.c: added test for the above for the flowers.
* demo/*: don't set page size for spin button adjustments since that
seems to be deprecated and outputs warnings.
2010-07-27 Damon Chaplin
* src/goocanvas.c (goo_canvas_adjustment_value_changed): fixed call
to redraw_static_items_at_position() - was using hadjustment twice.
2010-06-30 Damon Chaplin
* docs: added empty internal subset "[]" to the DOCTYPEs to keep
gtk-doc happy.
* src/goocanvas.c (goo_canvas_expose_event): do a cairo_save()/restore()
around painting the main items, so the static items don't get clipped.
2010-06-29 Damon Chaplin
* src/goocanvasitemsimple.c (goo_canvas_item_simple_set_property):
handle setting "clip-path" to NULL to reset it.
* src/goocanvastable.c: try to handle RTL direction better.
* src/goocanvasgroup.c (goo_canvas_group_paint): use the scale
argument rather than the canvas scale.
* src/goocanvas.c: added "before-initial-expose" flag which we use
to ignore any redraw requests before the initial expose (since we
know the entire canvas needs redrawing anyway). This speeds up the
creation of lots of items, e.g. scalability-demo.
* demo/Makefile.am (mv_demo_LDADD, demo_LDADD): added -lm to compile.
* demo/mv-scalability-demo.c:
* demo/scalability-demo.c: updated to compare with the new-api code.
2010-05-10 Damon Chaplin
* src/goocanvastext.c: improve docs for "width" and "height" properties.
#595164.
2010-05-10 Damon Chaplin
* src/goocanvaspolyline.c: don't use the reconfigure_arrows flag
any more - always reconfigure the arrows during an update. This
avoids a bug where the line width changes but the arrows don't get
reconfigured, since the line width is an inherited property and
reconfigure_arrows wasn't being set when it changed.
2010-05-07 Damon Chaplin
* src/goocanvasstyle.c (goo_canvas_style_set_stroke_options): handle
a NULL dash setting. #617960.
2010-04-28 Luis Medinas
* applied small patch to compile with GTK+ 3.0. #615435.
2009-08-20 Murray Cumming
* docs/architecture.xml: Fixed documenation typo. Bug #591983.
(Martin Olsson)
2009-06-29 Damon Chaplin
* Released GooCanvas 0.15
2009-06-29 Damon Chaplin
* src/goocanvasimage.c: added "scale-to-fit" property, which scales
the image to fit the "width" and "height" settings.
* demo/units-demo.c:
* demo/mv-demo.c (plant_flower):
* demo/demo.c (plant_flower): test "scale-to-fit" property.
2009-05-07 Damon Chaplin
* src/goocanvasatk.c: fixed GooCanvasWidgetAccessible's G_DEFINE_TYPE
call, using GOO_TYPE_CANVAS_ITEM_ACCESSIBLE as parent class.
This avoids a hang when using GooCanvasWidget with accessibility support
turned on. #581596.
2009-03-16 Damon Chaplin
* src/goocanvasitem.c: changed docs referring to "root_x" and "root_y"
fields of event structs to "x_root" and "y_root".
2009-03-15 Damon Chaplin
* Released GooCanvas 0.14
2009-03-15 Damon Chaplin
* src/goocanvas.c (goo_canvas_query_tooltip): new function to propagate the "query-tooltip"
signal up through the canvas items.
* src/goocanvasitem.[hc]: added "query-tooltip" signal and "tooltip" property.
* src/goocanvasitemmodel.c: added "tooltip" property.
* src/goocanvasitemsimple.c: added "tooltip" property and query_tooltip signal handler.
* configure.in: added dependancy on GTK+ 2.12 for tooltips.
* demo/mv-demo.c:
* demo/demo.c: added tests for tooltips.
2009-03-15 Damon Chaplin
* src/goocanvasgrid.c: improved section docs.
* src/goocanvas.c: improved a few function docs.
2009-03-15 Damon Chaplin
* docs/coordinates.xml:
* docs/architecture.xml:
* docs/creating-items.xml:
* src/goocanvasitemsimple.c: use the terms "canvas coordinate space" or
"canvas space" rather than "device space" which is a bit misleading.
* src/goocanvasitem.c: clarify the docs for the mouse position fields
of the event structs of the signals. #573458
2009-03-15 Gian Mario Tagliaretti
(Committed by Damon with a few changes.)
* src/goocanvasitem.h (struct _GooCanvasItemIface): added
scroll_event() signals on items.
* src/goocanvasitem.c: implemented "scroll_event" signals on items.
* src/goocanvas.c: implemented "scroll_event" signals on items.
* demo/demo.c: added test for above. #566110
2009-02-17 Damon Chaplin
* src/goocanvas.c (goo_canvas_convert_from_item_space): changed the
order of the arguments to cairo_matrix_multiply(). This was broken
for everything except translations. #572180
2009-01-12 Armin Burgmeier
* src/goocanvasellipse.c:
* src/goocanvaspolyline.c:
* src/goocanvasgroup.c:
* src/goocanvaspath.c:
* src/goocanvaswidget.c:
* src/goocanvastext.c:
* src/goocanvastable.c: Added "x", "y", "width" and "height"
properties where they do not exist already. GooCanvasGroup clips its
children if they are out of the specified area, and GooCanvasText
clips the text. It is possible to turn off the clipping by using -1
for width or height, respectively, which is the default.
* demo/generic-position-demo.c:
* demo/mv-generic-position-demo.c:
* demo/Makefile.am: Added a demo showing how this can be used to
generically resize items using drag and drop.
(Patch from bug #555097 committed with quite a few changes by Damon)
2008-12-29 Damon Chaplin
* src/goocanvasgrid.c (calculate_start_position)
(paint_vertical_lines, paint_horizontal_lines): handle step <= 0.0.
It should now draw a single line at the start position.
(based on patch from Murray Cumming) #563487.
2008-12-29 Jonathon Jongsma
* demo/Makefile.am: Fix building demos when builddir != srcdir.
goocanvasenumtypes.h is generated in the build dir and not the src dir
so we must also add the build dir to the INCLUDES. #561401.
2008-11-30 Damon Chaplin
* Released GooCanvas 0.13
2008-11-19 Damon Chaplin
* src/goocanvasitemmodel.c (goo_canvas_item_model_stop_animation):
* src/goocanvasitem.c (goo_canvas_item_animate_cb)
(goo_canvas_item_stop_animation): remove the current animation data
before emitting "animation-finished", so signal handlers can start a
new animation.
2008-11-17 Damon Chaplin
* src/goocanvasgrid.c: added "show-horz-grid-lines" and
"show-vert-grid-lines" properties, to turn off horz/vert grid lines.
2008-11-17 Damon Chaplin
* src/goocanvas.c (redraw_static_items_at_position): redraw each
group of static items separately, to stop GTK+ merging the redraw
rect into one massive one.
* demo/mv-demo.c (create_static_model):
* demo/demo.c (setup_static_items): use a group for all the static
items.
2008-11-17 Damon Chaplin
* src/goocanvas.c: added "redraw-when-scrolled" boolean property,
which makes the canvas redraw the entire window when scrolled. This
is useful for static items to reduce flicker, but is slower.
(goo_canvas_adjustment_value_changed): map/unmap the temporary window
to implement "redraw-when-scrolled".
2008-11-04 Damon Chaplin
* src/goocanvasutils.h: added typedefs for wrappers of cairo types
(but ifdef'd out so not usable), so we can add docs for them.
And added the docs, pointing to the cairo docs.
* src/goocanvasutils.c (goo_canvas_line_dash_get_type): changed the
registered type name from GooCairoLineDash to GooCanvasLineDash so the
docs work. The struct was already called GooCanvasLineDash.
2008-11-03 Damon Chaplin
* src/goocanvas.c (emit_pointer_event): handle NULL target_item.
* src/goocanvaswidget.c: note that widgets can't be static.
* README:
* docs/overview.xml: mention static items and the grid item.
2008-11-03 Damon Chaplin
* src/goocanvas.c (goo_canvas_scroll_to_item): just return if the
item is static, as we can't scroll to a static item.
(emit_pointer_event): convert the pointer position to static item space
for static items.
* src/goocanvasatk.c (goo_canvas_item_accessible_get_item_extents):
handle static items - don't need to convert to pixels within the
window as they are already like that.
2008-11-03 Damon Chaplin
* src/goocanvasgrid.[hc]: new grid item.
* demo/mv-demo.c (setup_grids):
* demo/demo.c (setup_grids): added a grid.
* src/Makefile.am: added grid.
* src/goocanvas.[hc] (goo_canvas_convert_bounds_to_item_space): new
function to convert a bounding box in device space to a bounding box
in item space. Useful in paint() methods to optimize painting.
* src/goocanvasutils.c (goo_canvas_convert_colors_to_rgba)
(goo_canvas_get_rgba_value_from_pattern)
(goo_canvas_set_style_property_from_pattern)
(goo_canvas_create_pattern_from_color_value)
(goo_canvas_create_pattern_from_rgba_value)
(goo_canvas_create_pattern_from_pixbuf_value): new private utility
functions taken out of goocanvasitemsimple.c code.
* src/goocanvasitemsimple.c: use above utility functions.
2008-10-31 Damon Chaplin
* src/goocanvasitemmodel.h (struct _GooCanvasItemModelIface):
* src/goocanvasitem.h (struct _GooCanvasItemIface): added
animation_finished() signals.
* src/goocanvasitemmodel.c:
* src/goocanvasitem.c: implemented "animation-finished" signals.
* demo/mv-demo-animation.c:
* demo/demo-animation.c: added test for above.
2008-10-31 Damon Chaplin
* demo/mv-demo-arrowhead.c (on_button_press):
* demo/demo-arrowhead.c (on_button_press):
* demo/mv-demo.c (on_button_press):
* demo/demo.c (on_button_press): use GDK_POINTER_MOTION_HINT_MASK for
the pointer grab, so we don't get too many events.
2008-10-31 Damon Chaplin
* src/goocanvas.h:
(goo_canvas_get_static_root_item): new function to get static root item.
(goo_canvas_set_static_root_item): new function to set static root item.
(goo_canvas_get_static_root_item_model): new function to get static
root item model.
(goo_canvas_set_static_root_item_model): new function to set static
root item model.
(goo_canvas_request_item_redraw): new function to request a redraw of
an item either in device space or in the static item space.
* src/goocanvasitem.h (struct _GooCanvasItemIface): added
get_is_static() and set_is_static() interface methods.
* src/goocanvasitemsimple.h (struct _GooCanvasItemSimpleData): removed
one bit from cache_setting and used it for is_static. Hopefully that
won't break binary compatibility.
* src/goocanvas.c (struct _GooCanvasPrivate): added new private struct
with static root item & model and current window position.
(goo_canvas_init): init private struct and create static root item.
(goo_canvas_dispose): free static root item & model.
(goo_canvas_update_internal): update static items.
(goo_canvas_get_item_at): check static items as well.
(goo_canvas_get_items_at): check static items as well.
(goo_canvas_realize): store original window position in private struct.
(request_static_redraw): new function to request a redraw in static
coordinate space.
(request_all_static_redraws): new function to request a redraw of all
static items.
(paint_static_items): new function to paint the static items.
(goo_canvas_expose_event): call paint_static_items().
(goo_canvas_convert_to_static_item_space): new function to convert
coords to static space.
(goo_canvas_adjustment_value_changed): redraw the static items before
the window is scrolled, but in their new position. We do this so we
don't see them being dragged along when scrolling.
Redraw them again after the window has been moved. Hopefully we can
optimize this a bit in future to avoid the flickering.
* src/goocanvasitem.c (goo_canvas_item_get_is_static)
(goo_canvas_item_set_is_static): new functions to call the interface
methods if they are implemented. The default behavior allows old code
to work without crashing (but old items can't be static).
* src/goocanvasitemsimple.c (goo_canvas_item_simple_get_is_static)
(goo_canvas_item_simple_set_is_static): implemented new interface
functions - just get/set the bit-flag.
* src/goocanvasgroup.c (goo_canvas_group_add_child): call
set_is_static() on new child.
* src/goocanvasgroup.c (goo_canvas_group_set_is_static): implement new
interface method, calling set_is_static() for all children if changed.
* src/goocanvasitemsimple.c:
* src/goocanvasgroup.c:
* src/goocanvastable.c: use new goo_canvas_request_item_redraw()
function so static items are redrawn correctly.
* demo/mv-demo.c (create_static_model):
* demo/demo.c (setup_static_items): added some static items to test.
Note that dragging around when scale != 1.0 is weird as the coord
spaces are different, but is expected.
2008-10-15 Damon Chaplin
* src/goocanvaspolyline.c (goo_canvas_polyline_is_item_at): only check
the fill if the polyline path is closed. Otherwise if we call
cairo_in_fill() it will automatically close the path which is not what
we want.
* src/goocanvaspath.c (goo_canvas_path_is_item_at): only check the fill
if a fill color/pattern has been set, for similar reasons.
2008-10-12 Damon Chaplin
* src/goocanvastext.c (goo_canvas_text_create_layout): fixed calculation
of text bounds.
2008-10-12 Armin Burgmeier
* src/goocanvastable.c (goo_canvas_table_get_requested_area)
(goo_canvas_table_allocate_area): Request redraw of the table's
bounds, as GooCanvasItemSimple does, to fix incorrect drawing when
changing the table's width or height.
(goo_canvas_table_paint): Keep clipping to the allocated size when
drawing the children, so they are not rendered outside the allocated
area when the table is shrunk. #555093
2008-10-11 Damon Chaplin
* docs/coordinates.xml: added section on Cairo limits.
* README: updated home page URL.
2008-10-05 Damon Chaplin
* src/goocanvastext.c (goo_canvas_text_create_layout): don't turn off
font hinting. I don't think it has any effect on text layout so we can
safely leave it on. Small text should be easier to read, as well as
non-antialiased text. Though it does seem to sometimes produce slightly
odd results for rotated text (see the 8-bit text in the demo).
2008-09-21 Damon Chaplin
* Released GooCanvas 0.12
2008-09-21 Damon Chaplin
* configure.in: renamed LT_CURRENT, LT_AGE & LT_REVISION to CURRENT,
AGE & REVISION to avoid problems with libtool 2.2. #552725.
2008-09-14 Damon Chaplin
* src/goocanvasitemsimple.c (goo_canvas_item_simple_get_requested_area)
(goo_canvas_item_simple_allocate_area): request redraws of the old and
new item bounds.
2008-09-09 Damon Chaplin
* Released GooCanvas 0.11
2008-09-02 Damon Chaplin
* src/goocanvastable.c (goo_canvas_table_paint): use the item's
fill and stroke colors for the table background and grid.
* demo/table-demo.c: test the above.
2008-08-17 Damon Chaplin
* src/goocanvasgroup.c (goo_canvas_group_add_child)
(goo_canvas_group_remove_child): emit the "children_changed" ATK
signal, if ATK is enabled. This needs testing.
2008-08-17 Damon Chaplin
* src/Makefile.am (INCLUDES):
* demo/Makefile.am (INCLUDES): get rid of the XXX_DISABLE_DEPRECATED
flags so we don't break compilation when GTK+ deprecates stuff. #548086
2008-06-24 Damon Chaplin
* src/goocanvasgroup.c (goo_canvas_group_get_child)
(goo_canvas_group_model_get_child): return NULL if child_num is out
of range. #535150
* src/goocanvasitemmodel.c (goo_canvas_item_model_get_child):
* src/goocanvasitem.c (goo_canvas_item_get_child): updated docs.
2008-06-24 Damon Chaplin
* src/goocanvasutils.h: removed comma at end of GooCanvasItemVisibility
enum. Patch from Hubert Figuiere. #539844
2008-06-22 Kjartan Maraas
* demo/demo-animation.c: (create_animation_page):
* demo/demo-arrowhead.c: (create_drag_box):
* demo/demo-clipping.c: (setup_canvas):
* demo/demo-events.c: (setup_item_signals):
* demo/demo-features.c: (create_canvas_features):
* demo/demo-fifteen.c: (setup_item_signals),
(create_canvas_fifteen):
* demo/demo-focus.c: (create_focus_box):
* demo/demo-grabs.c: (create_fixed), (setup_item_signals):
* demo/demo-large-items.c: (create_large_items_page):
* demo/demo-paths.c: (create_paths_page):
* demo/demo-table.c: (create_demo_item), (create_demo_table),
(create_width_for_height_table):
* demo/demo.c: (setup_item_signals), (create_canvas_primitives),
(setup_canvas), (create_window):
* demo/mv-demo-animation.c: (create_animation_page):
* demo/mv-demo-arrowhead.c: (on_item_created),
(create_canvas_arrowhead):
* demo/mv-demo-clipping.c: (setup_canvas):
* demo/mv-demo-events.c: (on_item_created), (create_events_page):
* demo/mv-demo-features.c: (on_item_created),
(create_canvas_features):
* demo/mv-demo-fifteen.c: (on_item_created),
(create_canvas_fifteen):
* demo/mv-demo-focus.c: (on_item_created), (create_focus_page):
* demo/mv-demo-grabs.c: (create_fixed), (on_item_created),
(create_canvas):
* demo/mv-demo-paths.c: (create_paths_page):
* demo/mv-demo-table.c: (create_demo_item), (create_demo_table),
(create_width_for_height_table):
* demo/mv-demo.c: (on_item_created), (create_canvas_primitives),
(create_window):
* demo/mv-scalability-demo.c: (setup_canvas), (create_canvas),
(main):
* demo/mv-simple-demo.c: (main):
* demo/mv-table-demo.c: (main):
* demo/scalability-demo.c: (setup_canvas), (create_canvas), (main):
* demo/simple-demo.c: (main):
* demo/table-demo.c: (main):
* demo/units-demo.c: (setup_canvas), (create_canvas), (main):
* demo/widgets-demo.c: (create_focus_box), (main):
Use G_CALLBACK instead of the deprecated GtkSignal stuff.
2008-05-18 Damon Chaplin
* src/goocanvasatk.c (goo_canvas_widget_accessible_new): made static.
2008-05-18 Damon Chaplin
* src/goocanvas.c (goo_canvas_expose_event): when clipping, clip to
the intersection of the canvas bounds and the expose bounds, to avoid
problems with cairo's coordinate limits. (This was apparent in the
scalability demo - it wasn't redrawing properly at the bottom of the
canvas.)
2008-05-09 Damon Chaplin
* src/goocanvasitemmodel.h:
* src/goocanvasitem.h: removed _CLASS macros since they are interfaces.
(From Masatake YAMATO).
2008-05-09 Damon Chaplin
* demo/widgets-demo.c (remove_widget_clicked): use g_list_delete_link
to update the GList, to avoid a crash.
2008-04-27 Damon Chaplin
* Released GooCanvas 0.10
2008-04-06 Armin Burgmeier
* src/goocanvastable.c: Implemented grid lines between table items by
adding "horz-grid-line-width", "vert-grid-line-width",
"x-border-spacing" and "y-border-spacing" properties.
(Patch applied by Damon with a few changes.)
* demo/mv-table-demo.c:
* demo/table-demo.c: added tests for the gridlines.
2008-04-04 Damon Chaplin
* docs/coordinates.xml:
* docs/architecture.xml: new sections.
* docs/creating-items.xml: rewritten.
* src/goocanvasitemmodel.c (goo_canvas_item_model_set_parent):
* src/goocanvasitem.c (goo_canvas_item_set_parent): note in the docs
that the "parent" property can be used to set the parent, but that
these functions are only for implementing new items (a bit confusing).
* src/goocanvasitem.c (goo_canvas_item_is_visible): fixed a bug
where if the item doesn't support the method it would just return
TRUE, but it should also check the ancestors are visible.
* src/goocanvasitemsimple.c (goo_canvas_item_simple_set_property)
(goo_canvas_item_model_simple_set_property): use the _remove()
functions instead of the find_child()/remove_child() code.
2008-03-27 Damon Chaplin
* src/goocanvasitem.c (goo_canvas_item_get_simple_transform):
* src/goocanvasitemmodel.c (goo_canvas_item_model_get_simple_transform):
new functions to do opposite of set_simple_transform().
* demo/mv-demo.c (test_simple_transforms):
* demo/demo.c (test_simple_transforms): added some test code for above.
2008-03-27 Damon Chaplin
* docs/wysiwyg.xml: new section to document WYSIWYG stuff.
2008-03-23 Damon Chaplin
* src/goocanvasitemsimple.c: made "stroke-color-rgba" and
"fill-color-rgba" properties read/write.
* configure.in (pkg_modules): depend on cairo >= 1.4.0 for
cairo_pattern_get_rgba().
* demo/demo.c (test_color_properties): added some test code.
2008-02-25 Damon Chaplin
* src/goocanvasitemsimple.c: added default implementations for the
simple_update/paint/get_item_at() virtual functions that call
simple_create_path(). These make it easier for language bindings.
Based on patch from Jonathon Jongsma.
2008-02-25 Damon Chaplin
* src/goocanvastext.c (goo_canvas_text_get_natural_extents): added
function to get the natural extents of the text.
2007-11-23 Damon Chaplin
* src/goocanvastable.c (goo_canvas_table_size_allocate_pass1): when
shrinking, make sure the extra value is always decreasing, so we don't
get into an infinite loop.
2007-11-18 Damon Chaplin
* src/goocanvas.c: added support for "clear-background" property,
patch from Grahame Bowland.
2007-11-18 Damon Chaplin
* src/goocanvasitem.c (goo_canvas_item_get_child_property)
(goo_canvas_item_set_child_property):
* src/goocanvasitemmodel.c (goo_canvas_item_model_get_child_property)
(goo_canvas_item_model_set_child_property): new functions to get/set
individual child properties (to help language bindings).
* demo/demo-table.c (create_demo_item):
* demo/mv-demo-table.c (create_demo_item): test the above.
* src/goocanvasitem.c:
* src/goocanvasitemmodel.c: fixed some docs that wrongly say functions
are for implementing new items only.
2007-11-13 Murray Cumming
* src/goocanvasitem.c: goo_canvas_item_add_child():
* src/goocanvasitemmodel.c: goo_canvas_item_model_add_child():
Add a debugging check to make sure the child is not the same as the
parent, preventing an endless loop.
2007-11-13 Murray Cumming
* src/goocanvasimage.c: goo_canvas_image_set_common_property():
Support setting the pixbuf property to NULL.
2007-11-13 Murray Cumming
* src/goocanvas.c: goo_canvas_render(): Call goo_canvas_update()
if necessary, as suggested by Damon, to fix a crash when rendering
a GooCanvasTable that has never been shown on screen.
2007-08-13 Damon Chaplin
* Released GooCanvas 0.9
2007-08-13 Damon Chaplin
* src/goocanvastext.c: added "wrap" property (patch from James
Dietrich).
* src/goocanvastable.c: use static goo_canvas_table_parent_iface
and goo_canvas_table_model_parent_iface variables which are set in
the class_init functions. That makes it much easier to call the
GooCanvasGroup methods when needed.
* src/goocanvasitemsimple.c (goo_canvas_item_simple_set_parent): call
goo_canvas_item_set_canvas() so items can do whatever is needed
(e.g. groups can pass the canvas on to children).
* src/goocanvasitem.c (goo_canvas_item_request_update): don't use
return here as it is a void function.
* src/goocanvastable.c (goo_canvas_table_remove_child):
* src/goocanvasgroup.c (goo_canvas_group_remove_child): check the
child_num arg is valid.
2007-06-20 Damon Chaplin
* src/goocanvas.c: added "automatic-bounds", "bounds-from-origin" and
"bounds-padding" properties, used to calculate the canvas bounds
automatically.
* demo/demo.c (change_bounds_clicked):
* demo/mv-demo.c (change_bounds_clicked): test the above.
2007-06-19 Damon Chaplin
* src/goocanvas.c: added "integer-layout" boolean property, to specify
that all layout in the canvas (i.e. in GooCanvasTable) is done to the
nearest integer.
* src/goocanvastable.c: implement integer layout.
* demo/table-demo.c:
* demo/mv-table-demo.c: tests for integer layout.
2007-05-15 Damon Chaplin
* src/goocanvas.c: added "scale-x" and "scale-y" properties to set
the horizontal and vertical scale independently. Note that if items
use the visibility threshold setting it will compare it to the minimum
of scale_x and scale_y.
* demo/demo.c: added "Scale X" and "Scale Y" spinbuttons.
2007-05-15 Damon Chaplin
* src/goocanvas.c (goo_canvas_style_set, goo_canvas_realize): reset
the window backgrounds to nothing, to avoid flicker when scrolling.
(This happened due to the delay between X clearing the window and
GooCanvas repainting it.)
(goo_canvas_expose_event): clear the background ourselves here.
2007-05-14 Damon Chaplin
* src/goocanvas.c (goo_canvas_set_property)
(goo_canvas_set_bounds): queue a redraw of the widget.
(goo_canvas_expose_event): clip to the canvas bounds if necessary.
* demo/mv-demo.c (change_bounds_clicked):
* demo/demo.c (change_bounds_clicked): test changing the bounds
dynamically.
2007-05-13 Damon Chaplin
* src/goocanvaspath.c: use a common GooCanvasPathData like the other
standard items. This fixes a crash where the model's path_commands
GArray was updated but the view still pointed to the old GArray
which had been freed.
* demo/mv-demo-paths.c:
* demo/demo-paths.c: added a button to test changing the path data
dynamically.
2007-05-11 Damon Chaplin
* demo/demo-large-rect.c:
* demo/demo-large-line.c:
* demo/demo-large-items.c: new demo and items to show how to create a
very large canvas and very large items.
* src/goocanvasitemsimple.c (goo_canvas_item_simple_get_line_width):
added utility function to get an item's line width.
Also changed default line width property value to 2.0, and returned
canvas line width setting if item's line width isn't set.
* src/goocanvasrect.c (goo_canvas_rect_update):
* src/goocanvaspolyline.c (goo_canvas_polyline_reconfigure_arrows): use
the above function to get the line width.
2007-04-30 Damon Chaplin
* src/goocanvas.c (goo_canvas_create_cairo_context): if the GooCanvas
isn't realized, use a temporary image surface to create the cairo_t.
Hopefully that will result in exactly the same bounds of items.
(goo_canvas_get_item): initialize item to NULL.
2007-04-27 Damon Chaplin
* src/goocanvasitem.h:
* src/goocanvasutils.c (goo_canvas_bounds_get_type): added type stuff
for language bindings (patch from Murray Cumming).
2007-04-25 Damon Chaplin
* src/goocanvasitemmodel.c (_goo_canvas_item_model_emit_child_added)
(_goo_canvas_item_model_emit_changed): new simple functions to emit
signals faster (avoids signal name lookups).
* src/goocanvasitemsimple.c
(goo_canvas_item_model_simple_set_property)
(goo_canvas_item_model_simple_set_transform)
(goo_canvas_item_model_simple_set_style):
* src/goocanvasgroup.c (goo_canvas_group_model_add_child): use the
above functions for a little speedup.
2007-04-25 Damon Chaplin
* demo/mv-scalability-demo.c:
* demo/scalability-demo.c: instead of connecting signals to all items
we just use a handler on the root item. Also added a switch to turn
off the text items, to see the difference in performance (a lot).
Without text items we can startup with 100,000 items in 1 second
for a simple canvas, or 4 seconds for model-view (compared to 4 seconds
and 7 seconds with text items).
* src/goocanvasitemsimple.c (goo_canvas_item_simple_set_model): only
setup the accessibility stuff if accessibility is enabled (as it is
quite slow if you have lots of items).
2007-04-25 Damon Chaplin
* src/goocanvasrect.c (goo_canvas_rect_update): added optimized
function to calculate the bounds without using cairo.
2007-04-16 Damon Chaplin
* src/goocanvasitem.c (goo_canvas_item_animate_cb): check keep_source
before updating the item so we don't use the freed animation data.
2007-04-16 Damon Chaplin
* src/goocanvasitemsimple.c (goo_canvas_item_simple_get_path_bounds):
handle empty bounds for an item's fill or stroke. cairo 1.4.x returns
0.0 for x1/y1/x2/y2 in that case, though older versions of cairo
returned odd values. So I've added a workaround for that as well.
2007-04-05 Damon Chaplin
* src/goocanvas.c (goo_canvas_key_press, goo_canvas_key_release): only
emit "key-press" and "key-release" signals on items if the canvas has
the focus. (We were incorrectly emitting signals if an embedded widget
had the focus, as the events were propagating up to the canvas.)
2007-04-03 Damon Chaplin
* Released GooCanvas 0.8
2007-04-03 Damon Chaplin
* demo/mv-demo.c (create_canvas_primitives):
* demo/demo.c (create_canvas_primitives): set the maximum scale to 50,
since if we go above that we hit the cairo 16-bit limit and the large
rectangle isn't painted correctly.
* src/goocanvasitemsimple.c (goo_canvas_item_simple_install_common_properties): improved docs for fill/stroke properties.
* src/goocanvaswidget.c (goo_canvas_widget_new)
(goo_canvas_widget_set_widget): keep our own reference to the widget,
rather than just relying on the canvas widget's reference. Otherwise
once the widget is removed from the canvas we have an invalid pointer.
2007-03-30 Damon Chaplin
* src/goocanvasutils.c (goo_canvas_boolean_handled_accumulator): new
function, copied from _gtk_boolean_handled_accumulator().
* src/goocanvasitem.c (goo_canvas_item_base_init): use the above
accumulator for the event signals, so returning TRUE from a handler
stops the signal.
* src/goocanvasitemsimple.h (struct _GooCanvasItemSimpleData):
* src/goocanvasitem.h (struct _GooCanvasItemIface): added a few bits
that will be needed to support tooltips with GTK+ 2.12. I have a patch
to support tooltips but I don't want to depend on GTK+ 2.12 yet.
2007-03-28 Damon Chaplin
* src/goocanvasstyle.c (goo_canvas_style_set_fill_options): check if
the fill pattern is set to NULL, which is used to reset any fill
pattern or color. If it is, don't set the cairo source and return
FALSE.
* demo/demo.c (move_ellipse_clicked): set the fill pattern to NULL
occasionally to test the above.
2007-03-27 Damon Chaplin
* src/goocanvas.c: added "background-color" and "background-color-rgb"
properties to set the background color of the canvas, based on a patch
from Gian Mario Tagliaretti.
* demo/demo.c (create_canvas_primitives):
* demo/mv-demo.c (create_canvas_primitives): use above properties.
2007-03-16 Murray Cumming
* src/goocanvasitemsimple.h: Change the struct field name from
private to priv, to avoid problems when using this from C++.
2007-03-08 Damon Chaplin
* src/goocanvasitemsimple.h (struct _GooCanvasItemSimpleData): use
guints for the bitflags rather than the enum types, since that is what
GTK+ does. Maybe enums cause a problem because of being signed ints.
Also added cache_setting which we may use in future.
(struct _GooCanvasItemSimple): added private pointer to allow a bit
of expansion in future (e.g. maybe a cache).
2007-03-08 Damon Chaplin
* src/goocanvaswidget.c (goo_canvas_widget_set_canvas): unparent the
widget if the canvas is set to NULL (i.e. when the item is removed
from the canvas).
2007-03-08 Damon Chaplin
* src/goocanvasitemmodel.c (goo_canvas_item_model_remove):
* src/goocanvasitem.c (goo_canvas_item_remove): new convenience
functions to easily remove items & models from the canvas.
* demo/mv-demo-features.c (on_button_press):
* demo/demo-features.c (on_button_press):
* demo/demo.c (on_button_press):
* demo/mv-demo.c (on_button_press):
* demo/widgets-demo.c (remove_widget_clicked): use new remove()
functions to test them.
* docs/goocanvas-sections.txt: rearranged GooCanvasItem/Model to put
commonly-used functions first, and added remove() functions.
2007-03-08 Damon Chaplin
* src/goocanvastext.[hc]: added ellipsize property, and used bit flags
to cut down on memory use a bit.
* demo/demo.c (setup_texts): added test for ellipsized text.
* demo/mv-demo.c:
* demo/mv-demo-table.c:
* demo/mv-demo-clipping.c: updated model-view demos, adding new stuff
from simple demo.
2007-03-07 Damon Chaplin
* src/*.c: added notes to all functions that are only meant to be used
when implementing new canvas items.
* docs/goocanvas-sections.txt: placed all the functions only used when
implementing new canvas items together at the bottom.
2007-03-06 Damon Chaplin
* src/goocanvasitem.c (goo_canvas_item_get_items_at): if the item
doesn't support this method just return found_items.
* src/goocanvas.c (goo_canvas_create_cairo_context): made this public.
2007-03-06 Damon Chaplin
* */*: added 'const' to a number of arguments taking a cairo_matrix_t*
or a GooCanvasBounds*.
2007-03-06 Damon Chaplin
* src/goocanvasitem.[hc]: added get_requested_height() method.
* src/goocanvastable.c: Reworked a lot of code to support
width-for-height layout. This gets the requested area of all children,
calculates the column widths, then checks if any children want to
change their requested height given their allocated width. Text items
change their requested height based on their width, so this results in
a better layout.
* src/goocanvastext.h (struct _GooCanvasText): added layout_width to
store the width used for the PangoLayout. This initially comes from
the text's width property, but can be modified when the text item
is layed out in a container like GooCanvasTable.
* src/goocanvastext.c (goo_canvas_text_get_requested_height):
calculates the requested height for the given width, or just returns
-1 if the text item is rotated or has a clip path, in which case the
original height is used.
(goo_canvas_text_init, goo_canvas_text_create_layout)
(goo_canvas_text_update): use layout_width.
* demo/demo-table.c (create_width_for_height_table): added tests for
width-for-height layout.
* demo/demo-clipping.c (setup_canvas): added text item to check
clipping works OK with them.
2007-02-27 Damon Chaplin
* Released GooCanvas 0.7
2007-02-27 Damon Chaplin
* src/goocanvas.c (goo_canvas_get_items_in_area): new function to
get items inside or outside a given area.
* demo/demo.c: added little test for goo_canvas_get_items_at() and
goo_canvas_get_items_in_area().
2007-02-27 Damon Chaplin
* src/goocanvasitemmodel.[hc]:
* src/goocanvasitem.[hc]: used name "transform" for all arguments
to get/set_transform functions.
2007-02-27 Damon Chaplin
* src/goocanvasitemmodel.[hc]:
* src/goocanvasitem.[hc]: changed get_transform() method to take a
cairo_matrix_t* to fill in, and return a boolean if a transform is set.
This is better for bindings.
* src/goocanvasitemsimple.c: updated get_transform() methods.
2007-02-27 Damon Chaplin
* src/goocanvasitem.[hc]: changed get_item_at method to get_items_at
which returns a list of found items rather than a single found item.
* src/goocanvasitemsimple.[hc]: changed get_item_at() method to
is_item_at() which just returns a boolean, and updated to new API.
* src/goocanvas.c (goo_canvas_get_item_at): updated to use new API.
(goo_canvas_get_items_at): new function to return list of found items.
* src/goocanvastable.c (goo_canvas_table_get_items_at):
* src/goocanvasgroup.c (goo_canvas_group_get_items_at):
* src/goocanvasimage.c (goo_canvas_image_is_item_at):
* src/goocanvaspolyline.c (goo_canvas_polyline_is_item_at):
* src/goocanvastext.c (goo_canvas_text_is_item_at):
* src/goocanvaswidget.c (goo_canvas_widget_is_item_at):
* docs/creating-items.xml:
* demo/demo-item.c (goo_demo_item_is_item_at): updated for new API.
2007-02-25 Damon Chaplin
* src/goocanvasitemsimple.c: added "hint-metrics" property so people
can use hinted metrics for prettier text if they aren't scaling the
canvas at all.
* src/goocanvasstyle.c: added goo_canvas_style_hint_metrics_id quark.
* src/goocanvasutils.c (goo_cairo_hint_metrics_get_type): added enum
stuff for cairo_hint_metrics_t.
* src/goocanvastext.c (goo_canvas_text_create_layout): use hint metrics
property.
2007-02-25 Damon Chaplin
* src/goocanvas.c (goo_canvas_create_cairo): use CAIRO_ANTIALIAS_GRAY
as the default antialiasing mode, as that is what is recommended when
using unhinted text. (subpixel antialiasing looks really bad.)
2007-02-25 Damon Chaplin
* src/*.c: checked over all finalize methods and moved code to dispose
methods where appropriate. (Dispose methods should be used to unref
any other objects.) This was done to help the Ruby bindings.
It was a bit fiddly so it might cause a few bugs.
* src/goocanvasutils.c (goo_cairo_matrix_copy)
(goo_cairo_matrix_free): allocate and free with g_slice_new/free() as
that is what was being used in GooCanvasItemSimple.
* demo/scalability-demo.c: added a test for a very wide canvas, almost
up to the 31-bit GDK window size limit. (It is slow to start though.)
2007-02-24 Damon Chaplin
* demo/widgets-demo.c (on_delete_event):
* demo/units-demo.c (on_delete_event):
* demo/mv-scalability-demo.c (on_delete_event):
* demo/scalability-demo.c (on_delete_event):
* demo/mv-demo.c (on_delete_event):
* demo/demo.c (on_delete_event): use gtk_main_quit() rather than exit()
here, so GTK+ destroys the window and the finalization code gets
tested.
* src/goocanvas.c (goo_canvas_remove): implement this so embedded
widgets are removed properly.
2007-02-20 Damon Chaplin
* demo/demo-table.c:
* demo/mv-demo-table.c: moved table-demo.c into main demo app, and
made a model-view version.
2007-02-20 Damon Chaplin
* src/goocanvastable.c (goo_canvas_table_get_item_at)
(goo_canvas_table_paint): if the table was shrunk below its requested
size, clip the children if appropriate.
* src/goocanvastable.c (goo_canvas_table_get_item_at)
(goo_canvas_table_paint):
* src/goocanvasgroup.c (goo_canvas_group_get_item_at)
(goo_canvas_group_paint): check the bounds and handle the clip path.
* demo/table-demo.c (create_demo_table): added parameters and created
a second table of shapes, this time with the items shrunk and clipped.
2007-02-20 Damon Chaplin
* src/goocanvastext.c (goo_canvas_text_create_layout):
(goo_canvas_text_get_item_at): use the ink rect as well as the logical
rect when calculating the bounds or doing hit-testing.
* src/goocanvastable.c (goo_canvas_table_size_allocate_pass1): shrink
homogeneous tables if appropriate.
* src/goocanvaswidget.c (goo_canvas_widget_get_item_at): return the
widget item if the point is within its bounds.
* src/goocanvas.c (goo_canvas_render): if bounds are passed in set
the clip path to the bounds.
* demo/demo.c (write_pdf_clicked): added code to test clipped painting.
2007-02-19 Damon Chaplin
* demo/scalability-demo.c (setup_canvas): set the font on the root
group so we don't need to set it on all the text items.
Also output the time to the first expose.
* demo/mv-scalability-demo.c: new demo based on scalability-demo.c.
2007-02-19 Damon Chaplin
* demo/demo.c:
* demo/mv-demo.c:
* demo/demo-animation.c:
* demo/mv-demo-animation.c: made the file-global variables static so
they don't clash, and updated the demos a bit.
2007-02-19 Damon Chaplin
* configure.in:
* src/Makefile.am: rewrote the stuff that handles the autogeneration
of goocanvasmarshal.[hc] and goocanvasenumtypes.[hc], copying what
GTK+ does. It now has a --disable-rebuilds option to disable the
autogeneration and it doesn't try autogeneration if Perl isn't
available.
2007-02-17 Damon Chaplin
* Released GooCanvas 0.6
2007-02-17 Damon Chaplin
* src/goocanvasitemsimple.h (struct _GooCanvasItemSimpleClass): renamed
create_path, update, paint and get_item_at class methods to
simple_create_path, simple_update, simple_paint and simple_get_item_at.
This avoids confusion with the GooCanvasItem interface methods with the
same name (and may avoid problems with language bindings etc.)
* src/goocanvasellipse.c (goo_canvas_ellipse_class_init):
* src/goocanvasimage.c (goo_canvas_image_class_init):
* src/goocanvaspath.c (goo_canvas_path_class_init):
* src/goocanvaspolyline.c (goo_canvas_polyline_class_init):
* src/goocanvasrect.c (goo_canvas_rect_class_init):
* src/goocanvastext.c (goo_canvas_text_class_init):
* src/goocanvaswidget.c (goo_canvas_widget_class_init):
* demo/demo-item.c (goo_demo_item_class_init):
* src/goocanvasitemsimple.c: updated use of above class methods.
* src/goocanvasgroup.c (goo_canvas_group_update): handle children with
empty bounds (i.e. ignore their bounds when computing the group's
bounds).
* src/goocanvastable.c (goo_canvas_table_paint)
(goo_canvas_table_get_item_at):
* src/goocanvasgroup.c (goo_canvas_group_get_item_at)
(goo_canvas_group_paint): don't check the
child bounds here. Leave it up to the children to do that.
* src/goocanvasitemsimple.c (goo_canvas_item_simple_get_item_at)
(goo_canvas_item_simple_paint): check the item's bounds here.
2007-02-15 Damon Chaplin
* src/goocanvasutils.c:
* src/goocanvaspath.c: moved data structures and code for parsing and
creating SVG paths from goocanvaspath.[hc] to goocanvasutils.[hc].
Added goo_canvas_parse_path_data() and goo_canvas_create_path() public
functions.
* src/goocanvasitemsimple.c: added "clip-path" and "clip-fill-rule"
properties to specify the clip path and fill rule, and used these
to calculate bounds, paint, and do hit testing.
* src/goocanvasitemsimple.h (struct _GooCanvasItemSimpleData): added
clip_path_commands and clip_fill_rule.
* src/goocanvastext.c (goo_canvas_text_set_model):
* src/goocanvasrect.c (goo_canvas_rect_set_model):
* src/goocanvaspolyline.c (goo_canvas_polyline_set_model):
* src/goocanvaspath.c (goo_canvas_path_set_model):
* src/goocanvasimage.c (goo_canvas_image_set_model):
* src/goocanvasgroup.c (goo_canvas_group_set_model):
* src/goocanvasellipse.c (goo_canvas_ellipse_set_model): use
goo_canvas_item_simple_set_model() rather than getting parent iface.
(For GooCanvasTable this actually caused a crash as when it called
the GooCanvasGroup function that got the parent iface which pointed to
itself so it got into an infinite loop.)
* demo/mv-demo-clipping.c:
* demo/demo-clipping.c: new files for clipping demo pages.
* demo/Makefile.am:
* demo/mv-demo.c:
* demo/demo.c: added clipping pages.
2007-02-13 Damon Chaplin
* src/goocanvas.c (goo_canvas_size_allocate): only allocate the child
widgets if we are realized, otherwise it crashes.
2007-02-13 Damon Chaplin
* src/goocanvasitemmodel.c (goo_canvas_item_model_animate):
* src/goocanvasitem.c (goo_canvas_item_animate): added "absolute"
parameter, and rewrote the animation code, using the same code for
GooCanvasItem and GooCanvasItemModel.
* demo/demo-animation.c:
* demo/mv-demo-animation.c: new files for animation demo pages.
* demo/mv-demo.c:
* demo/demo.c: added new animation pages and updated animation calls.
2007-02-12 Damon Chaplin
* src/goocanvasitemmodel.c (goo_canvas_item_model_set_simple_transform):
* src/goocanvasitem.c (goo_canvas_item_set_simple_transform): convert
rotation to radians.
2007-02-09 Damon Chaplin
* demo/demo-item.c (goo_demo_item_update): don't convert bounds to
device space.
* src/*.h: added padding to all *Class structs, to allow a bit of
expansion without breaking backwards compatibility.
* docs/*.xml: added example code to the introductory sections.
Needs more explanation at some point.
* configure.in:
* src/Makefile.am: added libtool version numbers.
2007-02-08 Damon Chaplin
* src/goocanvasitemmodel.c
(goo_canvas_item_model_set_simple_transform):
* src/goocanvasitem.c (goo_canvas_item_set_simple_transform): new
convenience functions to set the position, scale and rotation easily.
* demo/demo.c (move_ellipse_clicked): added tests for
goo_canvas_item_set_simple_transform().
* */*: more documentation updates. I've started adding a few
introductory sections, tidied up a few bits, and tried to update all
the docs that referred to the old model/view terminology.
2007-02-08 Damon Chaplin
* */*: more documentation updates. It is 100% complete now, though it
still needs docs on the optional model/view split and creating new
items.
2007-02-07 Damon Chaplin
* src/goocanvasutils.c (goo_canvas_query_child_properties): check if
type is classed before calling g_type_interface_peek().
2007-02-06 Damon Chaplin
* src/goocanvas.[hc]: updated docs.
2007-02-04 Damon Chaplin
* src/goocanvasstyle.[hc]: extern the GQuarks in the header and define
them in the .c file.
2007-02-04 Damon Chaplin
* src/goocanvasitemmodel.c (goo_canvas_item_model_base_init): fix type
of "parent" property, from Gian Mario Tagliaretti.
2007-02-04 Damon Chaplin
* src/goocanvasitemsimple.c (goo_canvas_item_simple_check_style): fixed
bug where if item was using its parent's style it wouldn't get updated.
* */*: documented most of the other symbols. I just need to document
the 2 main interfaces - GooCanvasItemIface and GooCanvasItemModelIface,
check it all over for out-of-date docs, and document the optional
model/view split a bit more. (And maybe a section on writing new items)
2007-02-02 Damon Chaplin
* */*: updated docs for all canvas items & models.
2007-02-01 Damon Chaplin
* src/goocanvastable.c: finished table item. I think the only API
breakage this introduces is that GooCanvasItemSimple subclasses that
override the update() class method must now return the bounds in user
space rather than device space. (This is needed to do the table
layout.)
* demo/table-demo.c: added more test tables with various transforms
and settings.
* src/goocanvasitem.c (goo_canvas_item_get_requested_area)
(goo_canvas_item_allocate_area)
(goo_canvas_item_get_transform_for_child) : new functions and interface
methods to support GooCanvasTable and other layout containers.
* src/goocanvasitemsimple.c: added support for GOO_CANVAS_ITEM_HIDDEN,
initialized the model's visibility setting to GOO_CANVAS_ITEM_VISIBLE.
(goo_canvas_item_simple_update): split part of it out into
goo_canvas_item_simple_update_internal and updated slightly.
(goo_canvas_item_simple_get_requested_area)
(goo_canvas_item_simple_allocate_area): new functions to support
GooCanvasTable and other layout containers.
(goo_canvas_item_simple_get_path_bounds): don't convert to device space
as some code needs the bounds in user space.
* src/goocanvas.c (goo_canvas_convert_to_item_space)
(goo_canvas_convert_from_item_space): used the new
goo_canvas_item_get_transform_for_child() function to get the transform
for each item.
* src/goocanvasutils.h: added GOO_CANVAS_ITEM_HIDDEN visibility setting
which is used for items which are invisible and not allocated any space
in containter items like GooCanvasTable.
* src/goocanvasgroup.c (goo_canvas_group_get_item_at)
(goo_canvas_group_paint): support GOO_CANVAS_ITEM_HIDDEN.
* src/goocanvaspolyline.c (goo_canvas_polyline_compute_bounds):
* src/goocanvasimage.c (goo_canvas_image_update): leave bounds in user
space.
* src/goocanvaswidget.c: updated to override the GooCanvasItemSimple
update, paint & get_item_at methods instead of the interface methods,
added support for GOO_CANVAS_ITEM_HIDDEN, and added
goo_canvas_widget_allocate_area() implementation.
* src/goocanvastext.c (goo_canvas_text_get_item_at): fixed bug that
meant it didn't work for text items with no fill color/pattern set.
2006-12-09 Damon Chaplin
* docs/goocanvas-sections.txt:
* docs/goocanvas-docs.sgml: use separate sections for model objects,
as gtk-doc doesn't support multiple objects per section.
* docs/Makefile.am (SCANGOBJ_OPTIONS): added --query-child-properties
argument to document child properties (needs cvs gtk-doc).
* src/goocanvasutils.c (goo_canvas_query_child_properties): new
function to allow documentation of child properties with gtk-doc.
* src/goocanvasitemmodel.c:
* src/goocanvasitem.c: added support for child properties of item
models.
* src/goocanvastable.c: beginnings of a new table item to layout child
items. Doesn't do much yet.
* demo/table-demo.c: beginnings of demo for GooCanvasTable.
* src/goocanvasitem.c (goo_canvas_item_animate): clarified docs.
* src/goocanvasgroup.c: use goo_canvas_item_add/move/remove_child()
rather than goo_canvas_group_add/move_remove_child() so subclasses can
reuse group's code. Also fix some docs & variable names.
2006-11-30 Damon Chaplin
* src/goocanvasitemsimple.h (struct _GooCanvasItemSimpleClass): added
new update/paint/get_item_at methods that subclasses can override.
If items use these methods GooCanvasItemSimple will perform all the
standard stuff before passing control to them. This makes it much
easier to create simple canvas items.
* demo/demo-item.c:
* src/goocanvaspolyline.c:
* src/goocanvastext.c:
* src/goocanvasimage.c: use the above methods, so we can get rid of
all the boilerplate code.
2006-11-29 Damon Chaplin
* demo/demo-item.[hc]: new demo item to show how to create new items.
There's more boilerplate code than I'd like, but I don't know the best
way to deal with it.
2006-11-29 Damon Chaplin
* */*: major rewrite to make the model optional, so people can choose
to have either a simple canvas or a model/view canvas. (Many people
found the model/view split awkward.) The standard items can be used
in either scenario.
Also added support for cascading styles, with arbitrary properties,
and embedded widget items. I'm in the middle of adding support for
layout items as well (e.g. something like a GtkTable for items).
2006-10-12 Damon Chaplin
* src/goocanvastextview.c (goo_canvas_text_view_create_layout)
(goo_canvas_text_view_get_item_view_at)
(goo_canvas_text_view_paint): patch from Martin Soto to fix a text
positioning bug. The position was wrong when the text width was set
and the alignment wasn't PANGO_ALIGN_LEFT. (Pango uses the set width
to calculate the text origin, but we were using the logical width.)
2006-10-12 Damon Chaplin
* src/goocanvasutils.h:
* src/goocanvasprivate.h: make get_type() declarations public as
they are useful for bindings.
2006-10-12 Damon Chaplin
Applied patch from Paul Davis to use glib_mkenums, slightly modified:
* configure.in: use pkg-config to get the glib_genmarshal and
glib_mkenums binaries.
* src/Makefile.am: use glib_mkenums to generate goocanvasenums.[hc].
* src/goocanvasutils.c: removed goo_canvas_pointer_events_get_type()
and goo_canvas_item_visibility_get_type() as they're generated now.
* src/goocanvasutils.h: removed get_type() declarations that are now
in goocanvasenums.h, and modifed GooCanvasPointerEvents so glib_mkenums
could parse it.
* src/goocanvas.h:
* src/goocanvasitem.c: include goocanvasenums.h.
2006-10-12 Damon Chaplin
* src/goocanvaspolyline.h (struct _GooCanvasPoints): use a separate
typedef declaration for the struct, to help C++ bindings. From Paul
Davis.
* src/goocanvaspath.c (goo_canvas_path_new): use 'const' for the
path_data argument. From Paul Davis.
* src/goocanvaspathview.c (goo_canvas_path_view_create_path): init
last_control_point_x/y to avoid compiler warning.
2006-09-11 Damon Chaplin
* src/goocanvaspolylineview.c: be more careful about using points and
arrow data.
* demo/demo.c (setup_lines): add checks for polylines with 0 and 1
points.
* configure.in: require GTK+ 2.10.0, for GtkUnit (Gian Mario
Tagliaretti).
2006-08-31 Damon Chaplin
* src/goocanvasview.c: added "units", "resolution-x" & "resolution-y"
properties so we can support points, inches and millimeters being used
for item units as well as just pixels. Thus you can create a complete
WYSIWYG printable document. But note that you must use absolute units
for font sizes, i.e. use "px" after the size in any font description
strings, e.g. "Sans 10px". That stops us scaling fonts twice.
(goo_canvas_view_set_default_line_width): set a reasonable default
line width according to the current units.
* demo/units-demo.c: new demo showing different units in use.
2006-08-30 Damon Chaplin
* src/goocanvasitemviewsimple.c (goo_canvas_item_view_simple_update)
* src/goocanvaspolylineview.c (goo_canvas_polyline_view_update):
added a workaround for cairo limits. Cairo uses fixed point integer
maths and is currently limited to 16-bits for the integer component.
So we remove any current translation before calculating the bounds
of the item, then add it back to the results. This means the 16-bit
limit only applies to items' user space rather than the entire canvas.
* src/goocanvasitemviewsimple.c
(goo_canvas_item_view_simple_get_item_view_at):
* src/goocanvaspolylineview.c
(goo_canvas_polyline_view_get_item_view_at): as above, remove any
current translation before checking if the point is in the item.
* demo/scalability-demo.c: updated to create ~100,000 items, either
rectangles or images. For images it now reuses a single cairo pattern
rather than passing the pixbuf to the GooCanvasImage (which created a
new pattern for each one and ran out of memory). It takes about 10
seconds to setup the canvas which is slower than I'd like, but once
created it seems to work fast enough.
2006-08-27 Damon Chaplin
* src/goocanvasview.c (goo_canvas_view_class_init):
* src/goocanvasitemviewsimple.c (goo_canvas_item_view_simple_class_init)
* src/goocanvasgroupview.c (goo_canvas_group_view_class_init): only
register the accessible factories if accessibility is enabled (i.e.
GtkWidget has registered a factory).
* src/goocanvasitemviewsimple.c (goo_canvas_item_view_simple_setup_accessibility):
* src/goocanvasgroupview.c (goo_canvas_group_view_set_group): only
set the accessible title & description and connect the signal handlers
if accessibility is enabled. (It would be better to not call
atk_gobject_accessible_for_object() at all, as it isn't useful.)
* demo/scalability-demo.c: start of new demo/test for scalability.
We are currently hitting the cairo 16-bit limit (transformed coords
can't be larger than 16-bit ints). A workaround would be nice.
I also want to profile it and see if there are any major bottlenecks.
(Creating canvases with thousands of items is very slow, though
scrolling etc. is OK as long as the canvas is split into groups.)
2006-08-24 Damon Chaplin
* Released GooCanvas 0.4
2006-08-24 Damon Chaplin
* src/*.c: updated docs to point to goo_canvas_view_get_item_view() as
a simple alternative for setting up signal handlers.
* src/goocanvasview.c (goo_canvas_view_pointer_ungrab): only call
gdk_display_pointer_ungrab() if we have an active pointer grab.
So maybe we can now use goo_canvas_view_pointer_ungrab() to ungrab
passive grabs on canvas item views (need to test this though).
2006-08-23 Damon Chaplin
* src/goocanvasview.c: keep an item_to_view hash table so apps can
get the view for particular items (e.g. as an easy alternative for
setting up signal handlers).
(goo_canvas_view_get_item_view): new function to get the item view for
a given item.
(goo_canvas_view_unregister_item_view): new function that implementors
of GooCanvasItemView should call in their finalize method to unregister
the view (so the GooCanvasView removes it from the hash table.)
(goo_canvas_view_create_item_view): add the new item view to the
item_to_view hash table.
* src/goocanvasitemviewsimple.c (goo_canvas_item_view_simple_finalize):
* src/goocanvasgroupview.c (goo_canvas_group_view_finalize): unregister
the item view.
(goo_canvas_group_view_set_parent_view): don't change the canvas view
here any more, since we don't support that.
* demo/simple-demo.c: updated to use simple signal handler setup.
2006-08-22 Damon Chaplin
* src/goocanvasview.c (goo_canvas_view_class_init): 2 minor fixes for
the docs (from Gian Mario Tagliaretti).
2006-08-15 Damon Chaplin
* src/goocanvasutils.h: moved GOO_TYPE_CAIRO_PATTERN stuff here, so
bindings can use it.
Also renamed goo_cairo_line_dash stuff to goo_canvas_line_dash for
consistency.
* src/goocanvasutils.c (goo_canvas_line_dash_newv): new non-varargs
variant of function of goo_canvas_line_dash_new() for bindings.
(from Gustavo J. A. M. Carneiro.)
2006-08-14 Damon Chaplin
* Makefile.am: require automake 1.7, since it is needed for
glib-genmarshal (from Gian Mario Tagliaretti).
2006-08-08 Damon Chaplin
* src/goocanvastextview.c (goo_canvas_text_view_update):
* src/goocanvaspolylineview.c (goo_canvas_polyline_view_update):
* src/goocanvasitemviewsimple.c (goo_canvas_item_view_simple_update):
* src/goocanvasimageview.c (goo_canvas_image_view_update):
* src/goocanvasgroupview.c (goo_canvas_group_view_update): rewrote the
update methods to make sure the bounds is always set and returned
correctly.
2006-07-26 Damon Chaplin
* src/goocanvasgroup.[hc]: added goo_canvas_group_set_model() function,
to set the model of the root group.
* src/goocanvasmodelsimple.c (goo_canvas_model_simple_init): use the
above function.
* src/goocanvas*view.c: support an optional transformation matrix for
each view, which is combined with the underlying item's transform.
(I'm not sure if this will overcomplicate things.)
* src/goocanvasgroupview.c: support generic GooCanvasItems as the
underlying group rather than just GooCanvasGroups. This allows us to
use subclasses of GooCanvasGroupView easily.
(goo_canvas_group_view_set_group): new function to set the underlying
group item, creating child views and setting up signal handlers etc.
2006-07-21 Damon Chaplin
* src/goocanvas*view.c: renamed get_item_at() methods to
get_item_view_at().
* src/goocanvasview.c (goo_canvas_view_get_root_view): new function
to return the root view.
(goo_canvas_view_get_item_view_at): new function to return the item
view at a given point.
2006-07-19 Damon Chaplin
* src/goocanvasatk.c:
* src/goocanvasgroupview.c:
* src/goocanvasimageview.c:
* src/goocanvasitemview.c:
* src/goocanvasitemview.h:
* src/goocanvasitemviewsimple.c:
* src/goocanvaspolylineview.c:
* src/goocanvastextview.c:
* src/goocanvasview.c: changed item view update() and get_bounds()
methods to take a GooCanvasBounds* to fill in, rather than returning
a pointer to a static GooCanvasBounds. This makes it easier for
language bindings.
2006-07-19 Damon Chaplin
* src/goocanvasview.c (goo_canvas_view_scroll): handle scroll events
ourselves, in case we aren't placed directly in a scrolled window.
* src/goocanvasitem.c (goo_canvas_item_get_transform): if the item
doesn't support this method just return NULL.
* demo/demo-fifteen.c: use generic goo_canvas_item_view_get_item()
method to get the item rather than private struct members.
* configure.in: depend on glib 2.10.0 (from Gian Mario Tagliaretti).
* src/goocanvasutils.c (goo_canvas_pointer_events_get_type): use a
flags type rather than an enum type (from Gustavo J. A. M. Carneiro).
* src/goocanvasitem.c (goo_canvas_item_base_init):
* src/goocanvasitemsimple.c:
* src/goocanvasgroup.c: updated to use the flags type for
"pointer-events" instead of enum.
* src/goocanvasprivate.h:
* src/goocanvasutils.h: The type GOO_TYPE_CAIRO_MATRIX is used in
a public interface (a property in the GooCanvasItem interface),
therefore it has to be public (from Gustavo J. A. M. Carneiro).
2006-06-08 Damon Chaplin
* src/goocanvasitemsimple.c (goo_canvas_item_simple_set_property):
only create the item's style when needed.
(goo_canvas_style_get_type): register boxed type (from Gustavo J. A. M.
Carneiro).
2006-06-01 Damon Chaplin
* demo/demo.c: only add the "Output PDF" option if cairo has PDF
support compiled in.
2006-05-27 Damon Chaplin
* src/*.c: removed ';' after all G_DEFINE_TYPE* macros.
2006-05-27 Damon Chaplin
* autogen.sh: check for AC_CONFIG_HEADER as well as old AM_*.
2006-05-16 Damon Chaplin
* goocanvas.pc.in:
* Makefile.am:
* configure.in: added .pc file (patch from Gian Mario Tagliaretti).
2006-05-12 Damon Chaplin
* src/goocanvastextview.c (goo_canvas_text_view_create_layout): if
there is no text return an empty layout rather than NULL.
(goo_canvas_text_view_get_item_at): check if there is no text first.
* src/goocanvasitemsimple.[hc]: rename operator to op since operator
is a C++ keyword (reported by Yevgen Muntyan).
2006-04-24 Damon Chaplin
* Released GooCanvas 0.3
2006-04-24 Damon Chaplin
* src/goocanvasview.c: added "model", "scale", "anchor", "x1", "y1",
"x2", "y2" properties, and goo_canvas_view_get_bounds() and
goo_canvas_view_get_scale() accessors.
Removed goo_canvas_view_set_anchor() as the property should be enough.
(I think we should only have accessor functions for major properties.)
* src/goocanvasitemview.c (goo_canvas_item_view_is_visible)
(goo_canvas_item_view_get_item_at): removed scale argument. We get it
from the canvas view now, to make the API a little simpler.
* src/goocanvasitemviewsimple.h (struct _GooCanvasItemViewSimple):
added pointer to the canvas view.
* src/*view.[hc]: added canvas view argument to all view creation
functions.
2006-04-23 Damon Chaplin
* src/goocanvasview.c (goo_canvas_view_focus): scroll to show the new
focused item if necessary.
(goo_canvas_view_set_model): set need_update to TRUE.
(goo_canvas_view_focus_check_is_best): try to avoid wild jumps when
moving around with the cursor keys.
2006-04-22 Damon Chaplin
* src/goocanvasview.c: added support for keyboard focus navigation.
(I still need to make it scroll to show the focused item if needed.)
* demo/demo-focus.c: new demo page to test keyboard focus navigation.
* src/goocanvasitemview.c: added "focus-in-event" & "focus-out-event"
signals.
* src/goocanvasitemsimple.c (goo_canvas_item_simple_get_path_bounds):
make sure we do min/max over all points of bounds.
* src/goocanvasview.c (goo_canvas_view_focus_out): emit
"focus_out_event", not "focus_in_event".
2006-04-19 Damon Chaplin
* src/goocanvasitem.c (goo_canvas_item_base_init): added "title" and
"description" properties for accessibility. Note that we only support
per-item settings for the standard canvas items, though more complex
items may want to support per-view settings.
* src/goocanvasitemsimple.c:
* src/goocanvasgroup.c: implemented "title" and "description"
properties.
* src/goocanvas*view.c: set the accessible name & description based
on the item's settings, and update them if changed.
* src/goocanvasatk.c (goo_canvas_item_view_accessible_ref_child):
return the accessible rather than the item view.
2006-04-18 Damon Chaplin
* src/goocanvasview.c (goo_canvas_view_get_model): new function.
(goo_canvas_view_adjustment_value_changed): emit "visible_data_changed"
on accessible object.
(goo_canvas_view_init): initialize default bounds, and create default
adjustments.
* src/goocanvasitemview.[hc]: added new is_visible() method, and
"can-focus" property, and convenience find_child() function.
* src/goocanvasitemviewsimple.c: implemented "can-focus" property
and "is_visible" method.
* src/goocanvasgroupview.c: implemented "can-focus" property and
"is_visible" method, and used same flags field as
GooCanvasItemViewSimple.
* src/goocanvasatk.[c]: new files to support accessibility. Most of
the code has been copied from foocanvas & libgnomecanvas, with slight
changes to handle our model/view split.
* src/goocanvasitemviewsimple.c (goo_canvas_item_view_simple_finalize):
chain up to parent's finalize method.
2006-04-16 Damon Chaplin
* src/goocanvasview.c (propagate_event, emit_pointer_event): ref views
and check they are still valid.
* src/*view.[hc]: made views hold reference on items, to ensure we
never use invalid pointers.
2006-04-16 Damon Chaplin
* demo/simple-demo.c: new very simple demo, also used in docs.
* src/goocanvasitemviewsimple.[hc]: new base class for item views,
so we can share a lot of the common code.
* src/*view.[hc]: updated item views to be a subclass of above.
* src/*.c: removed lots of unused debugging code.
* src/goocanvasitem.c:
* src/goocanvasitemsimple.c:
* src/goocanvasgroup.c: moved "pointer-events" and "transform"
properties, and the "changed" signal to the GooCanvasItem interface.
* src/*.[hc]: updated use of above.
2006-04-14 Damon Chaplin
* src/goocanvasview.c: documented GooCanvasView, though it needs an
overview and demo code.
* src/*.[hc]: documented most of the core objects.
* src/goocanvasutils.h: renamed goo_cairo_dash* to goo_canvas_dash*
for consistency.
* src/goocanvasprivate.h: new header to contain private declarations
that we don't install.
* src/*.[hc]: documented enums & structs on the types page.
2006-04-13 Damon Chaplin
* src/*.[hc]: documented views for standard items.
* src/*.[hc]: documented standard items.
2006-04-12 Damon Chaplin
* configure.in: updated to use newer forms of macros.
* COPYING: added LGPL license.
* src/Makefile.am (libgoocanvasincludedir): install headers into
$(includedir)/goocanvas-1.0 rather than $(includedir)/libgoocanvas-1.0.
* demo/*: moved all the demo code here.
* src/goocanvas.h: new main header to include all the public headers.
* autogen.sh:
* configure.in:
* Makefile.am: setup to use gtk-doc.
* src/Makefile.am: build libgoocanvas as a library now, so we can
document it with gtk-doc. The demo will be moved to a separate
directory.
* src/goocanvastext.h:
* src/goocanvasitem.h: rename a few parameters to match the sources,
since gtk-doc complains if they are different.
2006-04-11 Damon Chaplin
* src/demo-paths.c (create_paths): added more arc tests.
* src/goocanvaspathview.c: finished the elliptical arc and split
up the create_path() function a bit.
2006-04-10 Damon Chaplin
* src/goocanvaspathview.[hc]:
* src/goocanvaspath.[hc]: new path item and view, that uses the same
path spec strings as SVG. I think everything works, except the
elliptical arc, which I haven't finished yet.
* src/demo-paths.c: new demo page to test paths.
2006-04-08 Damon Chaplin
* src/goocanvasitemsimple.[hc]:
* src/goocanvasgroup.[hc]: added "pointer-events" property, like SVG.
* src/goocanvasitemsimple.c (goo_canvas_item_simple_get_path_bounds):
changed to include both the stroke and fill extents, even if they will
not be painted. This is needed to handle the "pointer-events" property.
* src/goocanvasitemsimple.c (goo_canvas_item_simple_check_in_path):
added "pointer_events" argument, to specify which parts of the path
to check.
* src/goocanvasitemview.[hc]: change get_item_at() to take
"is_pointer_event", "parent_visible", and "scale" properties, so we
can handle the "pointer-events" property.
* src/goocanvasgroupview.c (goo_canvas_group_view_get_item_at):
* src/goocanvasellipseview.c (goo_canvas_ellipse_view_get_item_at):
* src/goocanvasimageview.c (goo_canvas_image_view_get_item_at):
* src/goocanvaspolylineview.c (goo_canvas_polyline_view_get_item_at):
* src/goocanvasrectview.c (goo_canvas_rect_view_get_item_at):
* src/goocanvastextview.c (goo_canvas_text_view_get_item_at): updated
to support "pointer-events".
* src/goocanvasutils.[hc]: added GooCanvasPointerEvents enum, and
goo_cairo_line_dash_new().
* src/demo-events.c: new demo page to test "pointer-events" property.
* src/goocanvastextview.c (goo_canvas_text_view_paint): if the fill
pattern has been explicitly set to NULL, don't paint the text.
2006-04-03 Damon Chaplin
* src/goocanvasview.c (goo_canvas_view_style_set)
(goo_canvas_view_realize): use the base color for the background.
* src/demo.c (create_canvas_primitives): use gtk_widget_modify_base()
to test setting the background color.
2006-03-24 Damon Chaplin
* src/goocanvasitemview.c (goo_canvas_item_view_ensure_updated): new
convenience function to do an immediate update.
* src/goocanvasview.c (goo_canvas_view_update): turned this into a
public function for use by the above.
* src/goocanvastextview.c (goo_canvas_text_view_get_bounds)
(goo_canvas_text_view_get_item_at):
* src/goocanvasrectview.c (goo_canvas_rect_view_get_bounds)
(goo_canvas_rect_view_get_item_at):
* src/goocanvaspolylineview.c (goo_canvas_polyline_view_get_bounds)
(goo_canvas_polyline_view_get_item_at):
* src/goocanvasgroupview.c (goo_canvas_group_view_get_bounds)
(goo_canvas_group_view_get_item_at):
* src/goocanvasimageview.c (goo_canvas_image_view_get_bounds)
(goo_canvas_image_view_get_item_at):
* src/goocanvasellipseview.c (goo_canvas_ellipse_view_get_bounds)
(goo_canvas_ellipse_view_get_item_at): make sure the canvas is updated
first, if needed.
2006-03-24 Damon Chaplin
* src/goocanvasview.c (goo_canvas_view_render): new function to
render all or part of the canvas to a given cairo context.
* src/demo.c: added "Write PDF" test, that creates a pdf file
containing the main canvas.
* src/goocanvasview.[hc]: used a GooCanvasBounds rather than left,
right, top, bottom for the bounds. Also renamed "pixels_per_unit"
to "scale".
* src/goocanvasitemview.[hc]:
* src/goocanvastextview.c (goo_canvas_text_view_paint):
* src/goocanvasgroupview.c (goo_canvas_group_view_paint):
* src/goocanvasellipseview.c (goo_canvas_ellipse_view_paint):
* src/goocanvasimageview.c (goo_canvas_image_view_paint):
* src/goocanvaspolylineview.c (goo_canvas_polyline_view_paint): we
now just pass the effective scale to the paint function rather than the
GooCanvasView*, since when rendering to an arbitrary cairo_t we may not
want to use a different effective scale (to determine which items are
shown). (Also fixed some of the visibility checks.)
2006-03-23 Damon Chaplin
* src/goocanvasitem.c: added new "visibility" and
"visibility-threshold" properties to specify when an item should be
visible (always, never, or above a certain scale threshold).
* src/goocanvasutils.[hc]: added GooCanvasItemVisibility enum stuff.
* src/goocanvasitemsimple.[hc]:
* src/goocanvasgroup.[hc]: implemented new properties.
* src/goocanvasgroupview.c (goo_canvas_group_view_paint):
* src/goocanvastextview.c (goo_canvas_text_view_paint):
* src/goocanvasrectview.c (goo_canvas_rect_view_paint):
* src/goocanvasimageview.c (goo_canvas_image_view_paint):
* src/goocanvasellipseview.c (goo_canvas_ellipse_view_paint): check
the visibility settings to see if the items should be painted.
* src/demo.c (setup_invisible_texts): added test for visibility
settings.
* src/goocanvasitem.[hc] (goo_canvas_item_create_view): removed this as
it is mainly an internal function and the interface can be used
directly instead where needed.
2006-03-23 Damon Chaplin
* src/goocanvasview.c (goo_canvas_view_scroll_to): freeze the canvas
while setting the adjustments so we don't redraw twice.
2006-03-22 Damon Chaplin
* src/goocanvasview.[hc]: convert to a subclass of GtkContainer rather
than GtkLayout, since the layout code didn't help much and just added
to the confusion. (Getting scrolling/zooming to work smoothly is
pretty difficult.)
Added a goo_canvas_view_scroll_to() function to scroll to a desired
position.
Added an anchor setting to specify where to place the contents of the
canvas if it is smaller than the allocated widget area. (Like the
"center_scroll_region" setting in GnomeCanvas but a bit more general.)
Mapped a temporary window above the canvas when zooming in/out to
stop X from scrolling the canvas contents before it is redrawn.
(Idea pinched from FooCanvas.) Though this could possibly cause
problems with keyboard input in future, in which case I think we should
drop the fancy window scrolling stuff and just scroll ourselves.
Added an internal freeze_count like GtkLayout used to have. This is
used while reconfiguring the scrollbars etc. so we don't scroll more
than once (e.g. horizontally then vertically).
Added coordinate conversion functions to convert between device units
and canvas item units or pixels.
* src/goocanvastextview.[hc]: create a cairo_font_options_t object in
the class init function and use it for all created PangoLayouts.
This ensures that text is layed out the same at any scale, which
also avoids the problems with items not being redrawn properly
(since the bounds were slightly wrong). Note that I was using
cairo_set_font_options(cr) before, but that isn't picked up by Pango
so didn't work. (Font options seem to be associated with surfaces and
also with the graphics state which is confusing.)
goocanvas-1.0.0/demo/ 0000755 0000764 0000764 00000000000 11512612761 011427 5 0000000 0000000 goocanvas-1.0.0/demo/mv-demo-clipping.c 0000644 0000764 0000764 00000013412 11412723611 014657 0000000 0000000 #include
#include
#include
#include
static gboolean
on_button_press (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventButton *event,
gchar *id)
{
g_print ("%s received 'button-press' signal at %g, %g (root: %g, %g)\n",
id, event->x, event->y, event->x_root, event->y_root);
return TRUE;
}
static void
setup_canvas (GooCanvas *canvas)
{
GooCanvasItemModel *root, *model, *table;
GooCanvasItem *item;
root = goo_canvas_group_model_new (NULL, NULL);
goo_canvas_set_root_item_model (canvas, root);
g_object_unref (root);
/* Plain items without clip path. */
model = goo_canvas_ellipse_model_new (root, 0, 0, 50, 30,
"fill-color", "blue",
NULL);
goo_canvas_item_model_translate (model, 100, 100);
goo_canvas_item_model_rotate (model, 30, 0, 0);
item = goo_canvas_get_item (canvas, model);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Blue ellipse (unclipped)");
model = goo_canvas_rect_model_new (root, 200, 50, 100, 100,
"fill-color", "red",
"clip-fill-rule", CAIRO_FILL_RULE_EVEN_ODD,
NULL);
item = goo_canvas_get_item (canvas, model);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Red rectangle (unclipped)");
model = goo_canvas_rect_model_new (root, 380, 50, 100, 100,
"fill-color", "yellow",
NULL);
item = goo_canvas_get_item (canvas, model);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Yellow rectangle (unclipped)");
model = goo_canvas_text_model_new (root, "Sample Text", 520, 100, -1, GTK_ANCHOR_NW,
NULL);
item = goo_canvas_get_item (canvas, model);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Text (unclipped)");
/* Clipped items. */
model = goo_canvas_ellipse_model_new (root, 0, 0, 50, 30,
"fill-color", "blue",
"clip-path", "M 0 0 h 100 v 100 h -100 Z",
NULL);
goo_canvas_item_model_translate (model, 100, 300);
goo_canvas_item_model_rotate (model, 30, 0, 0);
item = goo_canvas_get_item (canvas, model);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Blue ellipse");
model = goo_canvas_rect_model_new (root, 200, 250, 100, 100,
"fill-color", "red",
"clip-path", "M 250 300 h 100 v 100 h -100 Z",
"clip-fill-rule", CAIRO_FILL_RULE_EVEN_ODD,
NULL);
item = goo_canvas_get_item (canvas, model);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Red rectangle");
model = goo_canvas_rect_model_new (root, 380, 250, 100, 100,
"fill-color", "yellow",
"clip-path", "M480,230 l40,100 l-80 0 z",
NULL);
item = goo_canvas_get_item (canvas, model);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Yellow rectangle");
model = goo_canvas_text_model_new (root, "Sample Text", 520, 300, -1, GTK_ANCHOR_NW,
"clip-path", "M535,300 h75 v40 h-75 z",
NULL);
item = goo_canvas_get_item (canvas, model);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Text (unclipped)");
/* Table with clipped items. */
table = goo_canvas_table_model_new (root, NULL);
goo_canvas_item_model_translate (table, 200, 400);
goo_canvas_item_model_rotate (table, 30, 0, 0);
model = goo_canvas_ellipse_model_new (table, 0, 0, 50, 30,
"fill-color", "blue",
"clip-path", "M 0 0 h 100 v 100 h -100 Z",
NULL);
goo_canvas_item_model_translate (model, 100, 300);
goo_canvas_item_model_rotate (model, 30, 0, 0);
item = goo_canvas_get_item (canvas, model);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Blue ellipse");
model = goo_canvas_rect_model_new (table, 200, 250, 100, 100,
"fill-color", "red",
"clip-path", "M 250 300 h 100 v 100 h -100 Z",
"clip-fill-rule", CAIRO_FILL_RULE_EVEN_ODD,
NULL);
goo_canvas_item_model_set_child_properties (table, model,
"column", 1,
NULL);
item = goo_canvas_get_item (canvas, model);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Red rectangle");
model = goo_canvas_rect_model_new (table, 380, 250, 100, 100,
"fill-color", "yellow",
"clip-path", "M480,230 l40,100 l-80 0 z",
NULL);
goo_canvas_item_model_set_child_properties (table, model,
"column", 2,
NULL);
item = goo_canvas_get_item (canvas, model);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Yellow rectangle");
model = goo_canvas_text_model_new (table, "Sample Text", 520, 300, -1, GTK_ANCHOR_NW,
"clip-path", "M535,300 h75 v40 h-75 z",
NULL);
goo_canvas_item_model_set_child_properties (table, model,
"column", 3,
NULL);
item = goo_canvas_get_item (canvas, model);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Text (unclipped)");
}
GtkWidget *
create_clipping_page (void)
{
GtkWidget *vbox, *scrolled_win, *canvas;
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_widget_show (vbox);
scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win),
GTK_SHADOW_IN);
gtk_widget_show (scrolled_win);
gtk_container_add (GTK_CONTAINER (vbox), scrolled_win);
canvas = goo_canvas_new ();
gtk_widget_set_size_request (canvas, 600, 450);
goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, 1000, 1000);
gtk_widget_show (canvas);
gtk_container_add (GTK_CONTAINER (scrolled_win), canvas);
setup_canvas (GOO_CANVAS (canvas));
return vbox;
}
goocanvas-1.0.0/demo/demo-scalability.c 0000644 0000764 0000764 00000004275 11412723611 014741 0000000 0000000 #include
#include
#include
#include
#define N_COLS 5
#define N_ROWS 20
#define PADDING 10
#if 1
#define USE_PIXMAP
#endif
GtkWidget *
create_canvas_scalability (void)
{
GtkWidget *vbox;
GtkWidget *frame;
GtkWidget *scrolled_win, *canvas;
GtkWidget *table;
GdkPixbuf *pixbuf;
GooCanvasItem *root, *item;
int i, j, width, height;
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_widget_show (vbox);
table = gtk_table_new (2, 2, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 4);
gtk_table_set_col_spacings (GTK_TABLE (table), 4);
gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);
gtk_widget_show (table);
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_table_attach (GTK_TABLE (table), frame,
0, 1, 0, 1,
GTK_EXPAND | GTK_FILL | GTK_SHRINK,
GTK_EXPAND | GTK_FILL | GTK_SHRINK,
0, 0);
gtk_widget_show (frame);
/* Create the canvas and board */
pixbuf = gdk_pixbuf_new_from_file("toroid.png", NULL);
#ifdef USE_PIXMAP
width = gdk_pixbuf_get_width (pixbuf) + 3;
height = gdk_pixbuf_get_height (pixbuf) +1;
#else
width = 37;
height = 19;
#endif
canvas = goo_canvas_new ();
root = goo_canvas_get_root_item (GOO_CANVAS (canvas));
gtk_widget_set_size_request (canvas, 600, 450);
goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0,
N_COLS * (width + PADDING),
N_ROWS * (height + PADDING));
gtk_widget_show (canvas);
scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_widget_show (scrolled_win);
gtk_container_add (GTK_CONTAINER (frame), scrolled_win);
gtk_container_add (GTK_CONTAINER (scrolled_win), canvas);
for (i = 0; i < N_COLS; i++) {
for (j = 0; j < N_ROWS; j++) {
#ifdef USE_PIXMAP
item = goo_canvas_image_new (root, pixbuf,
i * (width + PADDING),
j * (height + PADDING),
NULL);
#else
item = goo_canvas_rect_new (root,
i * (width + PADDING),
j * (height + PADDING),
width, height);
g_object_set (item,
"fill_color", (j%2)?"mediumseagreen":"steelblue",
NULL);
#endif
}
}
return vbox;
}
goocanvas-1.0.0/demo/demo-animation.c 0000644 0000764 0000764 00000010544 11423522047 014416 0000000 0000000 #include
#include
#include
#include
static GooCanvasItem *ellipse1, *ellipse2, *rect1, *rect2, *rect3, *rect4;
static void
start_animation_clicked (GtkWidget *button, gpointer data)
{
/* Absolute. */
goo_canvas_item_set_simple_transform (ellipse1, 100, 100, 1, 0);
goo_canvas_item_animate (ellipse1, 500, 100, 2, 720, TRUE, 2000, 40,
GOO_CANVAS_ANIMATE_BOUNCE);
goo_canvas_item_set_simple_transform (rect1, 100, 200, 1, 0);
goo_canvas_item_animate (rect1, 100, 200, 1, 350, TRUE, 40 * 36, 40,
GOO_CANVAS_ANIMATE_RESTART);
goo_canvas_item_set_simple_transform (rect3, 200, 200, 1, 0);
goo_canvas_item_animate (rect3, 200, 200, 3, 0, TRUE, 400, 40,
GOO_CANVAS_ANIMATE_BOUNCE);
/* Relative. */
goo_canvas_item_set_simple_transform (ellipse2, 100, 400, 1, 0);
goo_canvas_item_animate (ellipse2, 400, 0, 2, 720, FALSE, 2000, 40,
GOO_CANVAS_ANIMATE_BOUNCE);
goo_canvas_item_set_simple_transform (rect2, 100, 500, 1, 0);
goo_canvas_item_animate (rect2, 0, 0, 1, 350, FALSE, 40 * 36, 40,
GOO_CANVAS_ANIMATE_RESTART);
goo_canvas_item_set_simple_transform (rect4, 200, 500, 1, 0);
goo_canvas_item_animate (rect4, 0, 0, 3, 0, FALSE, 400, 40,
GOO_CANVAS_ANIMATE_BOUNCE);
}
static void
stop_animation_clicked (GtkWidget *button, gpointer data)
{
goo_canvas_item_stop_animation (ellipse1);
goo_canvas_item_stop_animation (ellipse2);
goo_canvas_item_stop_animation (rect1);
goo_canvas_item_stop_animation (rect2);
goo_canvas_item_stop_animation (rect3);
goo_canvas_item_stop_animation (rect4);
}
static void
on_animation_finished (GooCanvasItem *item,
gboolean stopped,
gpointer data)
{
g_print ("Animation finished stopped: %i\n", stopped);
#if 0
/* Test starting another animation. */
goo_canvas_item_animate (ellipse1, 500, 200, 2, 720, TRUE, 2000, 40,
GOO_CANVAS_ANIMATE_BOUNCE);
#endif
}
static void
setup_canvas (GtkWidget *canvas)
{
GooCanvasItem *root;
root = goo_canvas_get_root_item (GOO_CANVAS (canvas));
/* Absolute. */
ellipse1 = goo_canvas_ellipse_new (root, 0, 0, 25, 15,
"fill-color", "blue",
NULL);
goo_canvas_item_translate (ellipse1, 100, 100);
g_signal_connect (ellipse1, "animation_finished",
G_CALLBACK (on_animation_finished), NULL);
rect1 = goo_canvas_rect_new (root, -10, -10, 20, 20,
"fill-color", "blue",
NULL);
goo_canvas_item_translate (rect1, 100, 200);
rect3 = goo_canvas_rect_new (root, -10, -10, 20, 20,
"fill-color", "blue",
NULL);
goo_canvas_item_translate (rect3, 200, 200);
/* Relative. */
ellipse2 = goo_canvas_ellipse_new (root, 0, 0, 25, 15,
"fill-color", "red",
NULL);
goo_canvas_item_translate (ellipse2, 100, 400);
rect2 = goo_canvas_rect_new (root, -10, -10, 20, 20,
"fill-color", "red",
NULL);
goo_canvas_item_translate (rect2, 100, 500);
rect4 = goo_canvas_rect_new (root, -10, -10, 20, 20,
"fill-color", "red",
NULL);
goo_canvas_item_translate (rect4, 200, 500);
}
GtkWidget *
create_animation_page (void)
{
GtkWidget *vbox, *hbox, *w, *scrolled_win, *canvas;
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_widget_show (vbox);
hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
w = gtk_button_new_with_label("Start Animation");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "clicked", G_CALLBACK (start_animation_clicked),
NULL);
w = gtk_button_new_with_label("Stop Animation");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "clicked", G_CALLBACK (stop_animation_clicked),
NULL);
scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win),
GTK_SHADOW_IN);
gtk_widget_show (scrolled_win);
gtk_container_add (GTK_CONTAINER (vbox), scrolled_win);
canvas = goo_canvas_new ();
gtk_widget_set_size_request (canvas, 600, 450);
goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, 1000, 1000);
gtk_widget_show (canvas);
gtk_container_add (GTK_CONTAINER (scrolled_win), canvas);
setup_canvas (canvas);
return vbox;
}
goocanvas-1.0.0/demo/demo-grabs.c 0000644 0000764 0000764 00000026207 11412723611 013536 0000000 0000000 #include
#include
#include
#include
static gboolean
on_widget_expose (GtkWidget *widget,
GdkEventExpose *event,
char *item_id)
{
g_print ("%s received 'expose' signal\n", item_id);
gtk_paint_box (widget->style, widget->window, GTK_STATE_NORMAL,
GTK_SHADOW_IN, &event->area, widget, NULL, 0, 0,
widget->allocation.width, widget->allocation.height);
return FALSE;
}
static gboolean
on_widget_enter_notify (GtkWidget *widget,
GdkEventCrossing *event,
char *item_id)
{
g_print ("%s received 'enter-notify' signal\n", item_id);
return TRUE;
}
static gboolean
on_widget_leave_notify (GtkWidget *widget,
GdkEventCrossing *event,
char *item_id)
{
g_print ("%s received 'leave-notify' signal\n", item_id);
return TRUE;
}
static gboolean
on_widget_motion_notify (GtkWidget *widget,
GdkEventMotion *event,
char *item_id)
{
g_print ("%s received 'motion-notify' signal (window: %p)\n", item_id,
event->window);
if (event->is_hint)
gdk_window_get_pointer (event->window, NULL, NULL, NULL);
return TRUE;
}
static gboolean
on_widget_button_press (GtkWidget *widget,
GdkEventButton *event,
char *item_id)
{
g_print ("%s received 'button-press' signal\n", item_id);
if (strstr (item_id, "explicit"))
{
GdkGrabStatus status;
GdkEventMask mask = GDK_BUTTON_PRESS_MASK
| GDK_BUTTON_RELEASE_MASK
| GDK_POINTER_MOTION_MASK
| GDK_POINTER_MOTION_HINT_MASK
| GDK_ENTER_NOTIFY_MASK
| GDK_LEAVE_NOTIFY_MASK;
status = gdk_pointer_grab (widget->window, FALSE, mask, FALSE, NULL,
event->time);
if (status == GDK_GRAB_SUCCESS)
g_print ("grabbed pointer\n");
else
g_print ("pointer grab failed\n");
}
return TRUE;
}
static gboolean
on_widget_button_release (GtkWidget *widget,
GdkEventButton *event,
char *item_id)
{
g_print ("%s received 'button-release' signal\n", item_id);
if (strstr (item_id, "explicit"))
{
GdkDisplay *display;
display = gtk_widget_get_display (widget);
gdk_display_pointer_ungrab (display, event->time);
g_print ("released pointer grab\n");
}
return TRUE;
}
static gboolean
on_enter_notify (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventCrossing *event,
gpointer data)
{
char *item_id = g_object_get_data (G_OBJECT (item), "id");
g_print ("%s received 'enter-notify' signal\n", item_id);
return FALSE;
}
static gboolean
on_leave_notify (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventCrossing *event,
gpointer data)
{
char *item_id = g_object_get_data (G_OBJECT (item), "id");
g_print ("%s received 'leave-notify' signal\n", item_id);
return FALSE;
}
static gboolean
on_motion_notify (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventMotion *event,
gpointer data)
{
char *item_id = g_object_get_data (G_OBJECT (item), "id");
g_print ("%s received 'motion-notify' signal\n", item_id);
return FALSE;
}
static gboolean
on_button_press (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventButton *event,
gpointer data)
{
char *item_id = g_object_get_data (G_OBJECT (item), "id");
g_print ("%s received 'button-press' signal\n", item_id);
if (strstr (item_id, "explicit"))
{
GooCanvas *canvas;
GdkGrabStatus status;
GdkEventMask mask = GDK_BUTTON_PRESS_MASK
| GDK_BUTTON_RELEASE_MASK
| GDK_POINTER_MOTION_MASK
| GDK_POINTER_MOTION_HINT_MASK
| GDK_ENTER_NOTIFY_MASK
| GDK_LEAVE_NOTIFY_MASK;
canvas = goo_canvas_item_get_canvas (item);
status = goo_canvas_pointer_grab (canvas, item, mask, NULL, event->time);
if (status == GDK_GRAB_SUCCESS)
g_print ("grabbed pointer\n");
else
g_print ("pointer grab failed\n");
}
return FALSE;
}
static gboolean
on_button_release (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventButton *event,
gpointer data)
{
char *item_id = g_object_get_data (G_OBJECT (item), "id");
g_print ("%s received 'button-release' signal\n", item_id);
if (strstr (item_id, "explicit"))
{
GooCanvas *canvas;
canvas = goo_canvas_item_get_canvas (item);
goo_canvas_pointer_ungrab (canvas, item, event->time);
g_print ("released pointer grab\n");
}
return FALSE;
}
static void
create_fixed (GtkTable *table, gint row, gchar *text, gchar *id)
{
GtkWidget *label, *fixed, *drawing_area;
char *view_id;
label = gtk_label_new (text);
gtk_table_attach (table, label, 0, 1, row, row + 1,
0, 0, 0, 0);
gtk_widget_show (label);
fixed = gtk_fixed_new ();
gtk_fixed_set_has_window (GTK_FIXED (fixed), TRUE);
gtk_widget_set_events (fixed,
GDK_EXPOSURE_MASK
| GDK_BUTTON_PRESS_MASK
| GDK_BUTTON_RELEASE_MASK
| GDK_POINTER_MOTION_MASK
| GDK_POINTER_MOTION_HINT_MASK
| GDK_KEY_PRESS_MASK
| GDK_KEY_RELEASE_MASK
| GDK_ENTER_NOTIFY_MASK
| GDK_LEAVE_NOTIFY_MASK
| GDK_FOCUS_CHANGE_MASK);
gtk_widget_set_size_request (fixed, 200, 100);
gtk_table_attach (GTK_TABLE (table), fixed, 1, 2, row, row + 1,
0, 0, 0, 0);
gtk_widget_show (fixed);
view_id = g_strdup_printf ("%s-background", id);
g_signal_connect (fixed, "expose_event",
G_CALLBACK (on_widget_expose), view_id);
g_signal_connect (fixed, "enter_notify_event",
G_CALLBACK (on_widget_enter_notify), view_id);
g_signal_connect (fixed, "leave_notify_event",
G_CALLBACK (on_widget_leave_notify), view_id);
g_signal_connect (fixed, "motion_notify_event",
G_CALLBACK (on_widget_motion_notify), view_id);
g_signal_connect (fixed, "button_press_event",
G_CALLBACK (on_widget_button_press), view_id);
g_signal_connect (fixed, "button_release_event",
G_CALLBACK (on_widget_button_release), view_id);
drawing_area = gtk_drawing_area_new ();
gtk_widget_set_events (drawing_area,
GDK_EXPOSURE_MASK
| GDK_BUTTON_PRESS_MASK
| GDK_BUTTON_RELEASE_MASK
| GDK_POINTER_MOTION_MASK
| GDK_POINTER_MOTION_HINT_MASK
| GDK_KEY_PRESS_MASK
| GDK_KEY_RELEASE_MASK
| GDK_ENTER_NOTIFY_MASK
| GDK_LEAVE_NOTIFY_MASK
| GDK_FOCUS_CHANGE_MASK);
gtk_widget_set_size_request (drawing_area, 60, 60);
gtk_fixed_put (GTK_FIXED (fixed), drawing_area, 20, 20);
gtk_widget_show (drawing_area);
view_id = g_strdup_printf ("%s-left", id);
g_signal_connect (drawing_area, "expose_event",
G_CALLBACK (on_widget_expose), view_id);
g_signal_connect (drawing_area, "enter_notify_event",
G_CALLBACK (on_widget_enter_notify), view_id);
g_signal_connect (drawing_area, "leave_notify_event",
G_CALLBACK (on_widget_leave_notify), view_id);
g_signal_connect (drawing_area, "motion_notify_event",
G_CALLBACK (on_widget_motion_notify), view_id);
g_signal_connect (drawing_area, "button_press_event",
G_CALLBACK (on_widget_button_press), view_id);
g_signal_connect (drawing_area, "button_release_event",
G_CALLBACK (on_widget_button_release), view_id);
drawing_area = gtk_drawing_area_new ();
gtk_widget_set_events (drawing_area,
GDK_EXPOSURE_MASK
| GDK_BUTTON_PRESS_MASK
| GDK_BUTTON_RELEASE_MASK
| GDK_POINTER_MOTION_MASK
| GDK_POINTER_MOTION_HINT_MASK
| GDK_KEY_PRESS_MASK
| GDK_KEY_RELEASE_MASK
| GDK_ENTER_NOTIFY_MASK
| GDK_LEAVE_NOTIFY_MASK
| GDK_FOCUS_CHANGE_MASK);
gtk_widget_set_size_request (drawing_area, 60, 60);
gtk_fixed_put (GTK_FIXED (fixed), drawing_area, 120, 20);
gtk_widget_show (drawing_area);
view_id = g_strdup_printf ("%s-right", id);
g_signal_connect (drawing_area, "expose_event",
G_CALLBACK (on_widget_expose), view_id);
g_signal_connect (drawing_area, "enter_notify_event",
G_CALLBACK (on_widget_enter_notify), view_id);
g_signal_connect (drawing_area, "leave_notify_event",
G_CALLBACK (on_widget_leave_notify), view_id);
g_signal_connect (drawing_area, "motion_notify_event",
G_CALLBACK (on_widget_motion_notify), view_id);
g_signal_connect (drawing_area, "button_press_event",
G_CALLBACK (on_widget_button_press), view_id);
g_signal_connect (drawing_area, "button_release_event",
G_CALLBACK (on_widget_button_release), view_id);
}
static void
setup_item_signals (GooCanvasItem *item)
{
g_signal_connect (item, "enter_notify_event",
G_CALLBACK (on_enter_notify), NULL);
g_signal_connect (item, "leave_notify_event",
G_CALLBACK (on_leave_notify), NULL);
g_signal_connect (item, "motion_notify_event",
G_CALLBACK (on_motion_notify), NULL);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), NULL);
g_signal_connect (item, "button_release_event",
G_CALLBACK (on_button_release), NULL);
}
static void
create_canvas (GtkTable *table, gint row, gchar *text, gchar *id)
{
GtkWidget *label, *canvas;
GooCanvasItem *root, *rect;
char *view_id;
label = gtk_label_new (text);
gtk_table_attach (table, label, 0, 1, row, row + 1, 0, 0, 0, 0);
gtk_widget_show (label);
canvas = goo_canvas_new ();
gtk_widget_set_size_request (canvas, 200, 100);
goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, 200, 100);
gtk_table_attach (table, canvas, 1, 2, row, row + 1, 0, 0, 0, 0);
gtk_widget_show (canvas);
root = goo_canvas_get_root_item (GOO_CANVAS (canvas));
rect = goo_canvas_rect_new (root, 0, 0, 200, 100,
"stroke-pattern", NULL,
"fill-color", "yellow",
NULL);
view_id = g_strdup_printf ("%s-yellow", id);
g_object_set_data_full (G_OBJECT (rect), "id", view_id, g_free);
setup_item_signals (rect);
rect = goo_canvas_rect_new (root, 20, 20, 60, 60,
"stroke-pattern", NULL,
"fill-color", "blue",
NULL);
view_id = g_strdup_printf ("%s-blue", id);
g_object_set_data_full (G_OBJECT (rect), "id", view_id, g_free);
setup_item_signals (rect);
rect = goo_canvas_rect_new (root, 120, 20, 60, 60,
"stroke-pattern", NULL,
"fill-color", "red",
NULL);
view_id = g_strdup_printf ("%s-red", id);
g_object_set_data_full (G_OBJECT (rect), "id", view_id, g_free);
setup_item_signals (rect);
}
GtkWidget *
create_grabs_page (void)
{
GtkWidget *table, *label;
table = gtk_table_new (5, 2, FALSE);
gtk_container_set_border_width (GTK_CONTAINER (table), 12);
gtk_table_set_row_spacings (GTK_TABLE (table), 12);
gtk_table_set_col_spacings (GTK_TABLE (table), 12);
gtk_widget_show (table);
label = gtk_label_new ("Move the mouse over the widgets and canvas items on the right to see what events they receive.\nClick buttons to start explicit or implicit pointer grabs and see what events they receive now.\n(They should all receive the same events.)");
gtk_table_attach (GTK_TABLE (table), label, 0, 2, 0, 1, 0, 0, 0, 0);
gtk_widget_show (label);
/* Drawing area with explicit grabs. */
create_fixed (GTK_TABLE (table), 1,
"Widget with Explicit Grabs:",
"widget-explicit");
/* Drawing area with implicit grabs. */
create_fixed (GTK_TABLE (table), 2,
"Widget with Implicit Grabs:",
"widget-implicit");
/* Canvas with explicit grabs. */
create_canvas (GTK_TABLE (table), 3,
"Canvas with Explicit Grabs:",
"canvas-explicit");
/* Canvas with implicit grabs. */
create_canvas (GTK_TABLE (table), 4,
"Canvas with Implicit Grabs:",
"canvas-implicit");
return table;
}
goocanvas-1.0.0/demo/mv-demo-features.c 0000644 0000764 0000764 00000007706 11412723611 014701 0000000 0000000 #include
#include
#include
#include
static gboolean
on_button_press (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventButton *event,
gpointer data)
{
GooCanvasItemModel *model = goo_canvas_item_get_model (item);
GooCanvasItemModel *parent1, *parent2, *parent;
if (event->button != 1 || event->type != GDK_BUTTON_PRESS)
return FALSE;
parent1 = g_object_get_data (G_OBJECT (model), "parent1");
parent2 = g_object_get_data (G_OBJECT (model), "parent2");
parent = goo_canvas_item_model_get_parent (model);
g_object_ref (model);
goo_canvas_item_model_remove (model);
if (parent == parent1)
goo_canvas_item_model_add_child (parent2, model, -1);
else
goo_canvas_item_model_add_child (parent1, model, -1);
g_object_unref (model);
return TRUE;
}
static void
on_item_created (GooCanvas *canvas,
GooCanvasItem *item,
GooCanvasItemModel *model,
gpointer data)
{
if (g_object_get_data (G_OBJECT (model), "parent1"))
{
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), NULL);
}
}
GtkWidget *
create_canvas_features (void)
{
GtkWidget *vbox;
GtkWidget *w;
GtkWidget *alignment;
GtkWidget *frame;
GtkWidget *canvas;
GooCanvasItemModel *root, *item;
GooCanvasItemModel *parent1;
GooCanvasItemModel *parent2;
GooCanvasItemModel *group;
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_widget_show (vbox);
/* Instructions */
w = gtk_label_new ("Reparent test: click on the items to switch them between parents");
gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
/* Frame and canvas */
alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
gtk_box_pack_start (GTK_BOX (vbox), alignment, FALSE, FALSE, 0);
gtk_widget_show (alignment);
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_container_add (GTK_CONTAINER (alignment), frame);
gtk_widget_show (frame);
canvas = goo_canvas_new ();
g_signal_connect (canvas, "item_created",
G_CALLBACK (on_item_created), NULL);
root = goo_canvas_group_model_new (NULL, NULL);
gtk_widget_set_size_request (canvas, 400, 200);
goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, 400, 200);
gtk_container_add (GTK_CONTAINER (frame), canvas);
gtk_widget_show (canvas);
/* First parent and box */
parent1 = goo_canvas_group_model_new (root, NULL);
goo_canvas_rect_model_new (parent1, 0, 0, 200, 200,
"fill_color", "tan",
NULL);
/* Second parent and box */
parent2 = goo_canvas_group_model_new (root, NULL);
goo_canvas_item_model_translate (parent2, 200, 0);
goo_canvas_rect_model_new (parent2, 0, 0, 200, 200,
"fill_color", "#204060",
NULL);
/* Big circle to be reparented */
item = goo_canvas_ellipse_model_new (parent1, 100, 100, 90, 90,
"stroke_color", "black",
"fill_color", "mediumseagreen",
"line-width", 3.0,
NULL);
g_object_set_data (G_OBJECT (item), "parent1", parent1);
g_object_set_data (G_OBJECT (item), "parent2", parent2);
#if 0
g_signal_connect (G_OBJECT (item), "event",
G_CALLBACK (item_event),
NULL);
#endif
/* A group to be reparented */
group = goo_canvas_group_model_new (parent2, NULL);
goo_canvas_item_model_translate (group, 100, 100);
goo_canvas_ellipse_model_new (group, 0, 0, 50, 50,
"stroke_color", "black",
"fill_color", "wheat",
"line_width", 3.0,
NULL);
goo_canvas_ellipse_model_new (group, 0, 0, 25, 25,
"fill_color", "steelblue",
NULL);
g_object_set_data (G_OBJECT (group), "parent1", parent1);
g_object_set_data (G_OBJECT (group), "parent2", parent2);
#if 0
g_signal_connect (G_OBJECT (group), "event",
G_CALLBACK (item_event),
NULL);
#endif
goo_canvas_set_root_item_model (GOO_CANVAS (canvas), root);
g_object_unref (root);
/* Done */
return vbox;
}
goocanvas-1.0.0/demo/demo-events.c 0000644 0000764 0000764 00000012352 11412723611 013740 0000000 0000000 #include
#include
#include
#include
static gboolean
on_motion_notify (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventMotion *event,
gpointer data)
{
char *item_id = NULL;
if (target)
item_id = g_object_get_data (G_OBJECT (target), "id");
if (item_id)
g_print ("%s item received 'motion-notify' signal\n", item_id);
return FALSE;
}
static void
setup_item_signals (GooCanvasItem *item)
{
g_signal_connect (item, "motion_notify_event",
G_CALLBACK (on_motion_notify), NULL);
}
static void
create_events_area (GtkWidget *canvas,
gint area_num,
GooCanvasPointerEvents pointer_events,
gchar *label)
{
gint row = area_num / 3, col = area_num % 3;
gdouble x = col * 200, y = row * 150;
GooCanvasItem *root, *rect;
char *view_id;
GooCanvasLineDash *dash;
root = goo_canvas_get_root_item (GOO_CANVAS (canvas));
dash = goo_canvas_line_dash_new (2, 5.0, 5.0);
/* Create invisible item. */
rect = goo_canvas_rect_new (root, x + 45, y + 35, 30, 30,
"fill-color", "red",
"visibility", GOO_CANVAS_ITEM_INVISIBLE,
"line-width", 5.0,
"pointer-events", pointer_events,
NULL);
view_id = g_strdup_printf ("%s invisible", label);
g_object_set_data_full (G_OBJECT (rect), "id", view_id, g_free);
setup_item_signals (rect);
/* Display a thin rect around it to indicate it is there. */
#if 1
rect = goo_canvas_rect_new (root, x + 42.5, y + 32.5, 36, 36,
"line-dash", dash,
"line-width", 1.0,
"stroke-color", "gray",
NULL);
#endif
/* Create unpainted item. */
rect = goo_canvas_rect_new (root, x + 85, y + 35, 30, 30,
"stroke-pattern", NULL,
"line-width", 5.0,
"pointer-events", pointer_events,
NULL);
view_id = g_strdup_printf ("%s unpainted", label);
g_object_set_data_full (G_OBJECT (rect), "id", view_id, g_free);
setup_item_signals (rect);
/* Display a thin rect around it to indicate it is there. */
#if 1
rect = goo_canvas_rect_new (root, x + 82.5, y + 32.5, 36, 36,
"line-dash", dash,
"line-width", 1.0,
"stroke-color", "gray",
NULL);
#endif
/* Create stroked item. */
rect = goo_canvas_rect_new (root, x + 125, y + 35, 30, 30,
"line-width", 5.0,
"pointer-events", pointer_events,
NULL);
view_id = g_strdup_printf ("%s stroked", label);
g_object_set_data_full (G_OBJECT (rect), "id", view_id, g_free);
setup_item_signals (rect);
/* Create filled item. */
rect = goo_canvas_rect_new (root, x + 60, y + 75, 30, 30,
"fill-color", "red",
"stroke-pattern", NULL,
"line-width", 5.0,
"pointer-events", pointer_events,
NULL);
view_id = g_strdup_printf ("%s filled", label);
g_object_set_data_full (G_OBJECT (rect), "id", view_id, g_free);
setup_item_signals (rect);
/* Create stroked & filled item. */
rect = goo_canvas_rect_new (root, x + 100, y + 75, 30, 30,
"fill-color", "red",
"line-width", 5.0,
"pointer-events", pointer_events,
NULL);
view_id = g_strdup_printf ("%s stroked & filled", label);
g_object_set_data_full (G_OBJECT (rect), "id", view_id, g_free);
setup_item_signals (rect);
goo_canvas_text_new (root, label, x + 100, y + 130, -1, GTK_ANCHOR_CENTER,
"font", "Sans 12",
"fill-color", "blue",
NULL);
goo_canvas_line_dash_unref (dash);
}
GtkWidget *
create_events_page (void)
{
GtkWidget *vbox, *alignment, *frame, *label, *canvas;
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_widget_show (vbox);
/* Instructions */
label = gtk_label_new ("Move the mouse over the items to check they receive the right motion events.\nThe first 2 items in each group are 1) invisible and 2) visible but unpainted.");
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
/* Frame and canvas */
alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
gtk_box_pack_start (GTK_BOX (vbox), alignment, FALSE, FALSE, 0);
gtk_widget_show (alignment);
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_container_add (GTK_CONTAINER (alignment), frame);
gtk_widget_show (frame);
canvas = goo_canvas_new ();
gtk_widget_set_size_request (canvas, 600, 450);
goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, 600, 450);
gtk_container_add (GTK_CONTAINER (frame), canvas);
gtk_widget_show (canvas);
create_events_area (canvas, 0, GOO_CANVAS_EVENTS_NONE, "none");
create_events_area (canvas, 1, GOO_CANVAS_EVENTS_VISIBLE_PAINTED, "visible-painted");
create_events_area (canvas, 2, GOO_CANVAS_EVENTS_VISIBLE_FILL, "visible-fill");
create_events_area (canvas, 3, GOO_CANVAS_EVENTS_VISIBLE_STROKE, "visible-stroke");
create_events_area (canvas, 4, GOO_CANVAS_EVENTS_VISIBLE, "visible");
create_events_area (canvas, 5, GOO_CANVAS_EVENTS_PAINTED, "painted");
create_events_area (canvas, 6, GOO_CANVAS_EVENTS_FILL, "fill");
create_events_area (canvas, 7, GOO_CANVAS_EVENTS_STROKE, "stroke");
create_events_area (canvas, 8, GOO_CANVAS_EVENTS_ALL, "all");
return vbox;
}
goocanvas-1.0.0/demo/demo.c 0000644 0000764 0000764 00000122055 11512447174 012450 0000000 0000000 /*
* GooCanvas Demo. Copyright (C) 2005 Damon Chaplin.
* Released under the GNU LGPL license. See COPYING for details.
*
* main.c - demo app.
*/
#include
#include
#include
#include
#include
#include
#include
#if CAIRO_HAS_PDF_SURFACE
#include
#endif
#include
#include "demo-item.h"
static GooCanvasItem *ellipse2, *textitem;
static gboolean dragging = FALSE;
static double drag_x, drag_y;
static void setup_canvas (GooCanvas *canvas);
GtkWidget *create_canvas_fifteen (void);
GtkWidget *create_canvas_features (void);
GtkWidget *create_canvas_arrowhead (void);
GtkWidget *create_canvas_scalability (void);
GtkWidget *create_grabs_page (void);
GtkWidget *create_events_page (void);
GtkWidget *create_paths_page (void);
GtkWidget *create_focus_page (void);
GtkWidget *create_animation_page (void);
GtkWidget *create_clipping_page (void);
GtkWidget *create_table_page (void);
GtkWidget *create_large_items_page (void);
#if CAIRO_HAS_PDF_SURFACE
static void
write_pdf_clicked (GtkWidget *button, GooCanvas *canvas)
{
cairo_surface_t *surface;
GooCanvasBounds bounds;
cairo_t *cr;
g_print ("In write_pdf_clicked\n");
surface = cairo_pdf_surface_create ("demo.pdf", 9 * 72, 10 * 72);
cr = cairo_create (surface);
/* Place it in the middle of our 9x10 page. */
cairo_translate (cr, 20, 130);
bounds.x1 = 100;
bounds.y1 = 100;
bounds.x2 = 300;
bounds.y2 = 300;
#if 1
goo_canvas_render (canvas, cr, NULL, 1.0);
#else
goo_canvas_render (canvas, cr, &bounds, 1.0);
#endif
cairo_show_page (cr);
cairo_surface_destroy (surface);
cairo_destroy (cr);
}
#endif
static void
zoom_changed (GtkAdjustment *adj, GooCanvas *canvas)
{
goo_canvas_set_scale (canvas, adj->value);
}
static void
zoom_x_changed (GtkAdjustment *adj, GooCanvas *canvas)
{
g_object_set (G_OBJECT (canvas),
"scale-x", adj->value,
NULL);
}
static void
zoom_y_changed (GtkAdjustment *adj, GooCanvas *canvas)
{
g_object_set (G_OBJECT (canvas),
"scale-y", adj->value,
NULL);
}
static void
center_toggled (GtkToggleButton *button, gpointer data)
{
/*foo_canvas_set_center_scroll_region (data,
gtk_toggle_button_get_active (button));*/
}
static void
anchor_toggled (GtkWidget *button, GooCanvas *canvas)
{
GtkAnchorType anchor;
anchor = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (button), "anchor"));
if (GTK_TOGGLE_BUTTON (button)->active)
g_object_set (canvas, "anchor", anchor, NULL);
}
static void
scroll_to_50_50_clicked (GtkWidget *button, GooCanvas *canvas)
{
goo_canvas_scroll_to (canvas, 50, 50);
}
static void
scroll_to_500_500_clicked (GtkWidget *button, GooCanvas *canvas)
{
goo_canvas_scroll_to (canvas, 500, 500);
}
static void
scroll_to_250_250_clicked (GtkWidget *button, GooCanvas *canvas)
{
goo_canvas_scroll_to (canvas, 250, 250);
}
static void
animate_ellipse_clicked (GtkWidget *button, GooCanvas *canvas)
{
#if 1
goo_canvas_item_animate (ellipse2, 100, 100, 1, 90, TRUE, 1000, 40,
GOO_CANVAS_ANIMATE_BOUNCE);
#endif
#if 0
goo_canvas_item_animate (textitem, -300, -200, 1, 90, TRUE, 1000, 40,
GOO_CANVAS_ANIMATE_BOUNCE);
#endif
}
static void
stop_animation_clicked (GtkWidget *button, GooCanvas *canvas)
{
goo_canvas_item_stop_animation (ellipse2);
}
static void
change_bounds_clicked (GtkWidget *button, GooCanvas *canvas)
{
static gdouble bounds[4][4] = {
{ -100, -100, 200, 200 },
{ 100, 100, 200, 200 },
{ 0, 0, 300, 300 },
{ 0, 0, 604, 454 }
};
static gint bounds_num = 0;
gboolean automatic_bounds = TRUE;
gboolean bounds_from_origin = FALSE;
gdouble bounds_padding = 50.0;
if (bounds_num < 4)
{
automatic_bounds = FALSE;
goo_canvas_set_bounds (canvas,
bounds[bounds_num][0], bounds[bounds_num][1],
bounds[bounds_num][2], bounds[bounds_num][3]);
}
else if (bounds_num == 4)
{
bounds_from_origin = TRUE;
bounds_padding = 50.0;
}
g_object_set (G_OBJECT (canvas),
"automatic-bounds", automatic_bounds,
"bounds-from-origin", bounds_from_origin,
"bounds-padding", bounds_padding,
NULL);
bounds_num = (bounds_num + 1) % 6;
}
static void
move_ellipse_clicked (GtkWidget *button, GooCanvas *canvas)
{
static int last_state = 0;
#if 0
g_print ("Moving ellipse\n");
#endif
goo_canvas_item_set_transform (ellipse2, NULL);
if (last_state == 0)
{
g_object_set (ellipse2,
"center-x", 300.0,
"center-y", 70.0,
"radius-x", 45.0,
"radius-y", 30.0,
"fill-color", "red",
"stroke-color", "midnightblue",
"line-width", 4.0,
"title", "A red ellipse",
NULL);
last_state = 1;
}
else if (last_state == 1)
{
g_object_set (ellipse2,
"center-x", 390.0,
"center-y", 150.0,
"radius-x", 45.0,
"radius-y", 40.0,
"fill-pattern", NULL,
"stroke-color", "midnightblue",
"line-width", 4.0,
"title", "A brown ellipse",
NULL);
last_state = 2;
}
else if (last_state == 2)
{
g_object_set (ellipse2,
"center-x", 0.0,
"center-y", 0.0,
"radius-y", 30.0,
NULL);
goo_canvas_item_set_simple_transform (ellipse2, 100, 100, 1, 0);
last_state = 3;
}
else if (last_state == 3)
{
goo_canvas_item_set_simple_transform (ellipse2, 200, 100, 2, 0);
last_state = 4;
}
else if (last_state == 4)
{
goo_canvas_item_set_simple_transform (ellipse2, 200, 200, 1, 45);
last_state = 5;
}
else if (last_state == 5)
{
goo_canvas_item_set_simple_transform (ellipse2, 50, 50, 0.2, 225);
last_state = 6;
}
else
{
g_object_set (ellipse2,
"center-x", 335.0,
"center-y", 70.0,
"radius-x", 45.0,
"radius-y", 30.0,
"fill-color", "purple",
"stroke-color", "midnightblue",
"line-width", 4.0,
"title", "A purple ellipse",
NULL);
last_state = 0;
}
}
static gboolean
on_motion_notify (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventMotion *event,
gpointer data)
{
#if 0
g_print ("received 'motion-notify' signal at %g, %g\n",
event->x, event->y);
#endif
if (dragging && (event->state & GDK_BUTTON1_MASK))
{
double new_x = event->x;
double new_y = event->y;
goo_canvas_item_translate (item, new_x - drag_x, new_y - drag_y);
}
return TRUE;
}
static void
output_items_in_area (GooCanvas *canvas,
gdouble x,
gdouble y)
{
static gdouble last_x = 0.0, last_y = 0.0;
GooCanvasBounds area;
GList *items, *elem;
/* Print out the items from the last point to this one. */
area.x1 = MIN (x, last_x);
area.x2 = MAX (x, last_x);
area.y1 = MIN (y, last_y);
area.y2 = MAX (y, last_y);
items = goo_canvas_get_items_in_area (canvas, &area, TRUE, FALSE, FALSE);
for (elem = items; elem; elem = elem->next)
{
g_print (" found items in area (%g, %g - %g, %g): %p\n",
area.x1, area.y1, area.x2, area.y2, elem->data);
}
g_list_free (items);
last_x = x;
last_y = y;
}
static gboolean
on_button_press (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventButton *event,
gpointer data)
{
GooCanvas *canvas;
GdkCursor *fleur;
GList *items, *elem;
g_print ("%p received 'button-press' signal at %g, %g (root: %g, %g)\n",
item, event->x, event->y, event->x_root, event->y_root);
canvas = goo_canvas_item_get_canvas (item);
items = goo_canvas_get_items_at (canvas, event->x_root, event->y_root,
TRUE);
for (elem = items; elem; elem = elem->next)
g_print (" found items: %p\n", elem->data);
g_list_free (items);
output_items_in_area (canvas, event->x_root, event->y_root);
switch (event->button)
{
case 1:
if (event->state & GDK_SHIFT_MASK)
{
goo_canvas_item_remove (item);
}
else
{
drag_x = event->x;
drag_y = event->y;
fleur = gdk_cursor_new (GDK_FLEUR);
goo_canvas_pointer_grab (canvas, item,
GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_RELEASE_MASK,
fleur,
event->time);
gdk_cursor_unref (fleur);
dragging = TRUE;
}
break;
case 2:
goo_canvas_item_lower (item, NULL);
break;
case 3:
goo_canvas_item_raise (item, NULL);
break;
default:
break;
}
return TRUE;
}
static gboolean
on_scroll (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventScroll *event,
gpointer data)
{
#if 0
g_print ("received 'scroll-event' signal\n");
#endif
if (event->direction == GDK_SCROLL_UP)
goo_canvas_item_scale (item, 1.1, 1.1);
else if (event->direction == GDK_SCROLL_DOWN)
goo_canvas_item_scale (item, 0.909, 0.909);
else return FALSE;
return TRUE;
}
static gboolean
on_button_release (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventButton *event,
gpointer data)
{
GooCanvas *canvas;
#if 0
g_print ("received 'button-release' signal\n");
#endif
canvas = goo_canvas_item_get_canvas (item);
goo_canvas_pointer_ungrab (canvas, item, event->time);
dragging = FALSE;
return TRUE;
}
static gboolean
on_background_button_press (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventButton *event,
gpointer data)
{
GooCanvas *canvas;
GList *items, *elem;
#if 1
g_print ("background received 'button-press' signal\n");
#endif
canvas = goo_canvas_item_get_canvas (item);
output_items_in_area (canvas, event->x_root, event->y_root);
items = goo_canvas_get_items_at (canvas, event->x_root, event->y_root,
FALSE);
for (elem = items; elem; elem = elem->next)
g_print (" clicked items: %p\n", elem->data);
g_list_free (items);
return TRUE;
}
static void
setup_item_signals (GooCanvasItem *item)
{
g_signal_connect (item, "motion_notify_event",
G_CALLBACK (on_motion_notify), NULL);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), NULL);
g_signal_connect (item, "button_release_event",
G_CALLBACK (on_button_release), NULL);
}
GtkWidget *
create_canvas_primitives ()
{
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *w;
GtkWidget *scrolled_win, *canvas;
GtkAdjustment *adj;
GSList *group = NULL;
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_widget_show (vbox);
w = gtk_label_new ("Drag an item with button 1. Click button 2 on an item to lower it, or button 3 to raise it.");
gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
/* Create the canvas */
canvas = goo_canvas_new ();
g_object_set (G_OBJECT (canvas),
"automatic-bounds", TRUE,
"bounds-from-origin", FALSE,
"bounds-padding", 4.0,
"background-color-rgb", 0xC3C3FF,
"has-tooltip", TRUE,
#if 0
"redraw-when-scrolled", TRUE,
#endif
NULL);
goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, 604, 454);
/* Scale */
w = gtk_label_new ("Scale:");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
adj = GTK_ADJUSTMENT (gtk_adjustment_new (1.00, 0.05, 50.00, 0.05, 0.50, 0.0));
w = gtk_spin_button_new (adj, 0.0, 2);
g_signal_connect (adj, "value_changed",
G_CALLBACK (zoom_changed),
canvas);
gtk_widget_set_size_request (w, 50, -1);
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
w = gtk_label_new ("Scale X:");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
adj = GTK_ADJUSTMENT (gtk_adjustment_new (1.00, 0.05, 50.00, 0.05, 0.50, 0.0));
w = gtk_spin_button_new (adj, 0.0, 2);
g_signal_connect (adj, "value_changed",
G_CALLBACK (zoom_x_changed),
canvas);
gtk_widget_set_size_request (w, 50, -1);
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
w = gtk_label_new ("Scale Y:");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
adj = GTK_ADJUSTMENT (gtk_adjustment_new (1.00, 0.05, 50.00, 0.05, 0.50, 0.0));
w = gtk_spin_button_new (adj, 0.0, 2);
g_signal_connect (adj, "value_changed",
G_CALLBACK (zoom_y_changed),
canvas);
gtk_widget_set_size_request (w, 50, -1);
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
/* Center: */
w = gtk_check_button_new_with_label("Center scroll region");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
/*gtk_widget_show (w);*/
g_signal_connect (w, "toggled",
G_CALLBACK (center_toggled),
canvas);
/* Move Ellipse */
w = gtk_button_new_with_label("Move Ellipse");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "clicked",
G_CALLBACK (move_ellipse_clicked),
canvas);
/* Animate Ellipse */
w = gtk_button_new_with_label("Animate Ellipse");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "clicked",
G_CALLBACK (animate_ellipse_clicked),
canvas);
/* Stop Animation */
w = gtk_button_new_with_label("Stop Animation");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "clicked",
G_CALLBACK (stop_animation_clicked),
canvas);
#if CAIRO_HAS_PDF_SURFACE
/* Create PDF */
w = gtk_button_new_with_label("Write PDF");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "clicked",
G_CALLBACK (write_pdf_clicked),
canvas);
#endif
w = gtk_button_new_with_label("Change Bounds");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "clicked",
G_CALLBACK (change_bounds_clicked),
canvas);
hbox = gtk_hbox_new (FALSE, 4);
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show (hbox);
/* Scroll to */
w = gtk_label_new ("Scroll To:");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
w = gtk_button_new_with_label("50,50");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "clicked",
G_CALLBACK (scroll_to_50_50_clicked),
canvas);
w = gtk_button_new_with_label("250,250");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "clicked",
G_CALLBACK (scroll_to_250_250_clicked),
canvas);
w = gtk_button_new_with_label("500,500");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "clicked",
G_CALLBACK (scroll_to_500_500_clicked),
canvas);
/* Scroll anchor */
w = gtk_label_new ("Anchor:");
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
w = gtk_radio_button_new_with_label (group, "NW");
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (w));
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "toggled",
G_CALLBACK (anchor_toggled),
canvas);
g_object_set_data (G_OBJECT (w), "anchor",
GINT_TO_POINTER (GTK_ANCHOR_NW));
w = gtk_radio_button_new_with_label (group, "N");
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (w));
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "toggled",
G_CALLBACK (anchor_toggled),
canvas);
g_object_set_data (G_OBJECT (w), "anchor",
GINT_TO_POINTER (GTK_ANCHOR_N));
w = gtk_radio_button_new_with_label (group, "NE");
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (w));
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "toggled",
G_CALLBACK (anchor_toggled),
canvas);
g_object_set_data (G_OBJECT (w), "anchor",
GINT_TO_POINTER (GTK_ANCHOR_NE));
w = gtk_radio_button_new_with_label (group, "W");
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (w));
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "toggled",
G_CALLBACK (anchor_toggled),
canvas);
g_object_set_data (G_OBJECT (w), "anchor",
GINT_TO_POINTER (GTK_ANCHOR_W));
w = gtk_radio_button_new_with_label (group, "C");
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (w));
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "toggled",
G_CALLBACK (anchor_toggled),
canvas);
g_object_set_data (G_OBJECT (w), "anchor",
GINT_TO_POINTER (GTK_ANCHOR_CENTER));
w = gtk_radio_button_new_with_label (group, "E");
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (w));
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "toggled",
G_CALLBACK (anchor_toggled),
canvas);
g_object_set_data (G_OBJECT (w), "anchor",
GINT_TO_POINTER (GTK_ANCHOR_E));
w = gtk_radio_button_new_with_label (group, "SW");
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (w));
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "toggled",
G_CALLBACK (anchor_toggled),
canvas);
g_object_set_data (G_OBJECT (w), "anchor",
GINT_TO_POINTER (GTK_ANCHOR_SW));
w = gtk_radio_button_new_with_label (group, "S");
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (w));
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "toggled",
G_CALLBACK (anchor_toggled),
canvas);
g_object_set_data (G_OBJECT (w), "anchor",
GINT_TO_POINTER (GTK_ANCHOR_S));
w = gtk_radio_button_new_with_label (group, "SE");
group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (w));
gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
gtk_widget_show (w);
g_signal_connect (w, "toggled",
G_CALLBACK (anchor_toggled),
canvas);
g_object_set_data (G_OBJECT (w), "anchor",
GINT_TO_POINTER (GTK_ANCHOR_SE));
/* Layout the stuff */
scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_widget_show (scrolled_win);
gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
gtk_widget_show (canvas);
gtk_container_add (GTK_CONTAINER (scrolled_win), canvas);
/* Add all the canvas items. */
setup_canvas (GOO_CANVAS (canvas));
#if 0
g_signal_connect_after (canvas, "key_press_event",
G_CALLBACK (key_press),
NULL);
GTK_WIDGET_SET_FLAGS (canvas, GTK_CAN_FOCUS);
gtk_widget_grab_focus (canvas);
#endif
return vbox;
}
static void
setup_heading (GooCanvasItem *root, char *text, int pos)
{
double x = (pos % 3) * 200 + 100;
double y = (pos / 3) * 150 + 5;
GooCanvasItem *item;
PangoRectangle ink_rect, logical_rect;
item = goo_canvas_text_new (root, text, x, y, -1, GTK_ANCHOR_N,
"font", "Sans 12",
NULL);
goo_canvas_item_skew_y (item, 30, x, y);
/*goo_canvas_item_rotate (item, 30, x, y);*/
goo_canvas_text_get_natural_extents (GOO_CANVAS_TEXT (item),
&ink_rect, &logical_rect);
g_print ("Ink Extents: %i,%i %ix%i Logical: %i,%i %ix%i\n",
ink_rect.x, ink_rect.y, ink_rect.width, ink_rect.height,
logical_rect.x, logical_rect.y,
logical_rect.width, logical_rect.height);
}
static void
setup_divisions (GooCanvasItem *root)
{
GooCanvasItem *group, *item;
group = goo_canvas_group_new (root, NULL);
goo_canvas_item_translate (group, 2, 2);
item = goo_canvas_rect_new (group, 0, 0, 600, 450,
"line-width", 4.0,
NULL);
item = goo_canvas_polyline_new_line (group, 0, 150, 600, 150,
"line-width", 4.0,
NULL);
item = goo_canvas_polyline_new_line (group, 0, 300, 600, 300,
"line-width", 4.0,
NULL);
item = goo_canvas_polyline_new_line (group, 200, 0, 200, 450,
"line-width", 4.0,
NULL);
item = goo_canvas_polyline_new_line (group, 400, 0, 400, 450,
"line-width", 4.0,
NULL);
#if 1
setup_heading (group, "Rectangles", 0);
setup_heading (group, "Ellipses", 1);
setup_heading (group, "Texts", 2);
setup_heading (group, "Images", 3);
setup_heading (group, "Lines", 4);
/*setup_heading (group, "No Curves", 5);*/
/*setup_heading (group, "Arcs", 6);*/
setup_heading (group, "Polygons", 7);
/*setup_heading (group, "Widgets", 8);*/
#endif
}
/* FIXME: I think we may need to check byte order. */
static cairo_pattern_t*
create_stipple (const char *color_name, guchar stipple_data[16])
{
cairo_surface_t *surface;
cairo_pattern_t *pattern;
GdkColor color;
gdk_color_parse (color_name, &color);
stipple_data[2] = stipple_data[14] = color.red >> 8;
stipple_data[1] = stipple_data[13] = color.green >> 8;
stipple_data[0] = stipple_data[12] = color.blue >> 8;
surface = cairo_image_surface_create_for_data (stipple_data,
CAIRO_FORMAT_ARGB32,
2, 2, 8);
pattern = cairo_pattern_create_for_surface (surface);
cairo_surface_destroy (surface);
cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);
return pattern;
}
static void
setup_rectangles (GooCanvasItem *root)
{
GooCanvasItem *item;
cairo_pattern_t *pattern;
static guchar stipple_data[16] = {
0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255
};
item = goo_canvas_rect_new (root, 20, 30, 50, 30,
"stroke-color", "red",
"line-width", 8.0,
"tooltip", "Red stroked rectangle",
NULL);
setup_item_signals (item);
pattern = create_stipple ("mediumseagreen", stipple_data);
item = goo_canvas_rect_new (root, 90, 40, 90, 60,
"fill-pattern", pattern,
"stroke-color", "black",
"line-width", 4.0,
"tooltip", "Medium Sea Green stippled rectangle",
NULL);
cairo_pattern_destroy (pattern);
setup_item_signals (item);
item = goo_canvas_rect_new (root, 10, 80, 70, 60,
"fill-color", "steelblue",
/*"fill-pattern", NULL,*/
"tooltip", "Steel Blue rectangle",
NULL);
setup_item_signals (item);
item = goo_canvas_rect_new (root, 20, 90, 70, 60,
"fill-color-rgba", 0x3cb37180,
"stroke-color", "blue",
"line-width", 2.0,
"tooltip", "Partially transparent rectangle",
NULL);
setup_item_signals (item);
item = goo_canvas_rect_new (root, 110, 80, 50, 30,
"radius-x", 20.0,
"radius-y", 10.0,
"stroke-color", "yellow",
"fill-color-rgba", 0x3cb3f180,
"tooltip", "Rectangle with rounded corners",
NULL);
setup_item_signals (item);
item = goo_demo_item_new (root, 30, 20, 50, 30,
"fill-color", "yellow",
"tooltip", "Yellow demo item",
NULL);
setup_item_signals (item);
}
static void
setup_ellipses (GooCanvasItem *root)
{
GooCanvasItem *ellipse1, *ellipse3;
cairo_pattern_t *pattern;
static guchar stipple_data[16] = {
0, 0, 0, 255, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 255
};
#if 1
ellipse1 = goo_canvas_ellipse_new (root, 245, 45, 25, 15,
"stroke-color", "goldenrod",
"line-width", 8.0,
NULL);
setup_item_signals (ellipse1);
#endif
ellipse2 = goo_canvas_ellipse_new (root, 335, 70, 45, 30,
"fill-color", "wheat",
"stroke-color", "midnightblue",
"line-width", 4.0,
"title", "An ellipse",
NULL);
#if 0
goo_canvas_item_rotate (ellipse2, 30, 0, 0);
#endif
setup_item_signals (ellipse2);
#if 1
pattern = create_stipple ("cadetblue", stipple_data);
ellipse3 = goo_canvas_ellipse_new (root, 245, 110, 35, 30,
"fill-pattern", pattern,
"stroke-color", "black",
"line-width", 1.0,
NULL);
cairo_pattern_destroy (pattern);
setup_item_signals (ellipse3);
#endif
}
#define VERTICES 10
#define RADIUS 60.0
static void
polish_diamond (GooCanvasItem *root)
{
GooCanvasItem *group, *item;
int i, j;
double a, x1, y1, x2, y2;
group = goo_canvas_group_new (root,
"line-width", 1.0,
"line-cap", CAIRO_LINE_CAP_ROUND,
NULL);
goo_canvas_item_translate (group, 270, 230);
setup_item_signals (group);
for (i = 0; i < VERTICES; i++) {
a = 2.0 * M_PI * i / VERTICES;
x1 = RADIUS * cos (a);
y1 = RADIUS * sin (a);
for (j = i + 1; j < VERTICES; j++) {
a = 2.0 * M_PI * j / VERTICES;
x2 = RADIUS * cos (a);
y2 = RADIUS * sin (a);
item = goo_canvas_polyline_new_line (group, x1, y1, x2, y2, NULL);
}
}
}
#define SCALE 7.0
static void
make_hilbert (GooCanvasItem *root)
{
char hilbert[] = "urdrrulurulldluuruluurdrurddldrrruluurdrurddldrddlulldrdldrrurd";
char *c;
double *pp, *p;
GooCanvasItem *item;
GooCanvasPoints *points;
cairo_pattern_t *pattern;
static guchar stipple_data[16] = {
0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255
};
points = goo_canvas_points_new (strlen (hilbert) + 1);
points->coords[0] = 340.0;
points->coords[1] = 290.0;
pp = points->coords;
for (c = hilbert, p = points->coords + 2; *c; c++, p += 2, pp += 2)
switch (*c) {
case 'u':
p[0] = pp[0];
p[1] = pp[1] - SCALE;
break;
case 'd':
p[0] = pp[0];
p[1] = pp[1] + SCALE;
break;
case 'l':
p[0] = pp[0] - SCALE;
p[1] = pp[1];
break;
case 'r':
p[0] = pp[0] + SCALE;
p[1] = pp[1];
break;
}
pattern = create_stipple ("red", stipple_data);
item = goo_canvas_polyline_new (root, FALSE, 0,
"points", points,
"line-width", 4.0,
"stroke-pattern", pattern,
"line-cap", CAIRO_LINE_CAP_SQUARE,
"line-join", CAIRO_LINE_JOIN_MITER,
NULL);
cairo_pattern_destroy (pattern);
setup_item_signals (item);
goo_canvas_points_unref (points);
}
static void
setup_lines (GooCanvasItem *root)
{
GooCanvasItem *polyline1, *polyline2, *polyline3, *polyline4, *polyline5;
polish_diamond (root);
make_hilbert (root);
/* Arrow tests */
polyline1 = goo_canvas_polyline_new (root, FALSE, 4,
340.0, 170.0,
340.0, 230.0,
390.0, 230.0,
390.0, 170.0,
"stroke-color", "midnightblue",
"line-width", 3.0,
"start-arrow", TRUE,
"end-arrow", TRUE,
"arrow-tip-length", 3.0,
"arrow-length", 4.0,
"arrow-width", 3.5,
NULL);
setup_item_signals (polyline1);
polyline2 = goo_canvas_polyline_new (root, FALSE, 2,
356.0, 180.0,
374.0, 220.0,
"stroke-color", "blue",
"line-width", 1.0,
"start-arrow", TRUE,
"end-arrow", TRUE,
"arrow-tip-length", 5.0,
"arrow-length", 6.0,
"arrow-width", 6.0,
NULL);
setup_item_signals (polyline2);
polyline3 = goo_canvas_polyline_new (root, FALSE, 2,
356.0, 220.0,
374.0, 180.0,
"stroke-color", "blue",
"line-width", 1.0,
"start-arrow", TRUE,
"end-arrow", TRUE,
"arrow-tip-length", 5.0,
"arrow-length", 6.0,
"arrow-width", 6.0,
NULL);
setup_item_signals (polyline3);
/* Test polyline without any coords. */
polyline4 = goo_canvas_polyline_new (root, FALSE, 0,
NULL);
setup_item_signals (polyline4);
/* Test polyline with 1 coord and arrows. */
polyline5 = goo_canvas_polyline_new (root, FALSE, 1,
356.0, 220.0,
"start-arrow", TRUE,
"end-arrow", TRUE,
NULL);
setup_item_signals (polyline5);
}
static void
setup_polygons (GooCanvasItem *root)
{
GooCanvasItem *polyline1, *polyline2;
GooCanvasPoints *points;
cairo_pattern_t *pattern;
static guchar stipple_data[16] = {
0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255
};
points = goo_canvas_points_new (3);
points->coords[0] = 210.0;
points->coords[1] = 320.0;
points->coords[2] = 210.0;
points->coords[3] = 380.0;
points->coords[4] = 260.0;
points->coords[5] = 350.0;
pattern = create_stipple ("blue", stipple_data);
polyline1 = goo_canvas_polyline_new (root, TRUE, 0,
"line-width", 1.0,
"points", points,
"fill_pattern", pattern,
"stroke_color", "black",
NULL);
cairo_pattern_destroy (pattern);
goo_canvas_points_unref (points);
setup_item_signals (polyline1);
points = goo_canvas_points_new (14);
points->coords[0] = 270.0;
points->coords[1] = 330.0;
points->coords[2] = 270.0;
points->coords[3] = 430.0;
points->coords[4] = 390.0;
points->coords[5] = 430.0;
points->coords[6] = 390.0;
points->coords[7] = 330.0;
points->coords[8] = 310.0;
points->coords[9] = 330.0;
points->coords[10] = 310.0;
points->coords[11] = 390.0;
points->coords[12] = 350.0;
points->coords[13] = 390.0;
points->coords[14] = 350.0;
points->coords[15] = 370.0;
points->coords[16] = 330.0;
points->coords[17] = 370.0;
points->coords[18] = 330.0;
points->coords[19] = 350.0;
points->coords[20] = 370.0;
points->coords[21] = 350.0;
points->coords[22] = 370.0;
points->coords[23] = 410.0;
points->coords[24] = 290.0;
points->coords[25] = 410.0;
points->coords[26] = 290.0;
points->coords[27] = 330.0;
polyline2 = goo_canvas_polyline_new (root, TRUE, 0,
"points", points,
"fill_color", "tan",
"stroke_color", "black",
"line-width", 3.0,
NULL);
goo_canvas_points_unref (points);
setup_item_signals (polyline2);
}
static GooCanvasItem *
make_anchor (GooCanvasItem *root, double x, double y)
{
GooCanvasItem *group, *item;
cairo_matrix_t transform = { 0.8, 0.2, -0.3, 0.5, x, y };
group = goo_canvas_group_new (root, NULL);
goo_canvas_item_translate (group, x, y);
#if 1
g_object_set (group,
"transform", &transform,
NULL);
#endif
item = goo_canvas_rect_new (group, -2.5, -2.5, 4, 4,
"line-width", 1.0,
NULL);
setup_item_signals (item);
g_signal_connect (group, "scroll_event",
G_CALLBACK (on_scroll), NULL);
return group;
}
static void
setup_texts (GooCanvasItem *root)
{
GooCanvasItem *item;
cairo_pattern_t *pattern;
static guchar stipple_data[16] = {
0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255
};
#if 1
pattern = create_stipple ("blue", stipple_data);
item = goo_canvas_text_new (make_anchor (root, 420, 20),
"Anchor NW", 0, 0, -1, GTK_ANCHOR_NW,
"font", "Sans Bold 24",
"fill_pattern", pattern,
NULL);
cairo_pattern_destroy (pattern);
setup_item_signals (item);
item = goo_canvas_text_new (make_anchor (root, 470, 75),
"Anchor center\nJustify center\nMultiline text\nb8bit text ÅÄÖåäö",
0, 0, -1, GTK_ANCHOR_CENTER,
"font", "monospace bold 14",
"alignment", PANGO_ALIGN_CENTER,
"fill_color", "firebrick",
NULL);
setup_item_signals (item);
#endif
#if 0
item = goo_canvas_text_new (make_anchor (root, 590, 140),
"Clipped text\nClipped text\nClipped text\nClipped text\nClipped text\nClipped text",
0, 0, -1, GTK_ANCHOR_SE,
"font", "Sans 12",
/*"clip", TRUE,*/
/*"clip_width", 50.0,*/
/*"clip_height", 55.0,*/
/*"x_offset", 10.0,*/
"fill_color", "darkgreen",
NULL);
setup_item_signals (item);
#endif
#if 1
textitem = goo_canvas_text_new (make_anchor (root, 420, 240),
"This is a very long paragraph that will need to be wrapped over several lines so we can see what happens to line-breaking as the view is zoomed in and out.",
0, 0, 180, GTK_ANCHOR_W,
"font", "Sans 12",
"fill_color", "goldenrod",
NULL);
setup_item_signals (textitem);
#endif
#if 1
textitem = goo_canvas_text_new (root,
"Ellipsized text.",
20, 420, 115, GTK_ANCHOR_W,
"font", "Sans 12",
"fill_color", "blue",
"ellipsize", PANGO_ELLIPSIZE_END,
NULL);
setup_item_signals (textitem);
#endif
}
static void
setup_invisible_texts (GooCanvasItem *root)
{
goo_canvas_text_new (root, "Visible above 0.8x", 500, 330, -1,
GTK_ANCHOR_CENTER,
"visibility", GOO_CANVAS_ITEM_VISIBLE_ABOVE_THRESHOLD,
"visibility-threshold", 0.8,
NULL);
goo_canvas_rect_new (root, 410.5, 322.5, 180, 15,
"line-width", 1.0,
"visibility", GOO_CANVAS_ITEM_VISIBLE_ABOVE_THRESHOLD,
"visibility-threshold", 0.8,
NULL);
goo_canvas_text_new (root, "Visible above 1.5x", 500, 350, -1,
GTK_ANCHOR_CENTER,
"visibility", GOO_CANVAS_ITEM_VISIBLE_ABOVE_THRESHOLD,
"visibility-threshold", 1.5,
NULL);
goo_canvas_rect_new (root, 410.5, 342.5, 180, 15,
"line-width", 1.0,
"visibility", GOO_CANVAS_ITEM_VISIBLE_ABOVE_THRESHOLD,
"visibility-threshold", 1.5,
NULL);
goo_canvas_text_new (root, "Visible above 3.0x", 500, 370, -1,
GTK_ANCHOR_CENTER,
"visibility", GOO_CANVAS_ITEM_VISIBLE_ABOVE_THRESHOLD,
"visibility-threshold", 3.0,
NULL);
goo_canvas_rect_new (root, 410.5, 362.5, 180, 15,
"line-width", 1.0,
"visibility", GOO_CANVAS_ITEM_VISIBLE_ABOVE_THRESHOLD,
"visibility-threshold", 3.0,
NULL);
/* This should never be seen. */
goo_canvas_text_new (root, "Always Invisible", 500, 390, -1,
GTK_ANCHOR_CENTER,
"visibility", GOO_CANVAS_ITEM_INVISIBLE,
NULL);
goo_canvas_rect_new (root, 410.5, 350.5, 180, 15,
"line-width", 1.0,
"visibility", GOO_CANVAS_ITEM_INVISIBLE,
NULL);
}
static void
plant_flower (GooCanvasItem *root, double x, double y, GtkAnchorType anchor,
gdouble opacity)
{
cairo_pattern_t *pattern;
cairo_surface_t *surface;
GooCanvasItem *image;
double w, h;
surface = cairo_image_surface_create_from_png ("flower.png");
w = cairo_image_surface_get_width (surface);
h = cairo_image_surface_get_height (surface);
pattern = cairo_pattern_create_for_surface (surface);
cairo_surface_destroy (surface);
image = goo_canvas_image_new (root, NULL, x, y,
"pattern", pattern,
"width", w * 1.5,
"height", h * 2,
"scale-to-fit", TRUE,
"alpha", opacity,
NULL);
cairo_pattern_destroy (pattern);
setup_item_signals (image);
}
static void
setup_images (GooCanvasItem *root)
{
GdkPixbuf *im;
GooCanvasItem *image;
im = gdk_pixbuf_new_from_file ("toroid.png", NULL);
if (im)
{
double w = gdk_pixbuf_get_width (im);
double h = gdk_pixbuf_get_height (im);
image = goo_canvas_image_new (root, im, 100.0 - w / 2, 225.0 - h / 2,
"width", w,
"height", h,
/* "anchor", GTK_ANCHOR_CENTER, */
NULL);
g_object_unref(im);
setup_item_signals (image);
}
else
g_warning ("Could not find the toroid.png sample file");
plant_flower (root, 20.0, 170.0, GTK_ANCHOR_NW, 0.3);
plant_flower (root, 180.0, 170.0, GTK_ANCHOR_NE, 0.5);
plant_flower (root, 20.0, 280.0, GTK_ANCHOR_SW, 0.7);
plant_flower (root, 180.0, 280.0, GTK_ANCHOR_SE, 1.0);
}
static void
setup_static_items (GooCanvas *canvas)
{
GooCanvasItem *static_root, *group, *item;
static_root = goo_canvas_get_static_root_item (canvas);
/* All static items in one place in the canvas should be placed in the same
group. */
group = goo_canvas_group_new (static_root, NULL);
item = goo_canvas_polyline_new_line (group,
40.0, 410.0,
40.0, 330.0,
"stroke-color", "midnightblue",
"line-width", 3.0,
"end-arrow", TRUE,
"arrow-tip-length", 3.0,
"arrow-length", 4.0,
"arrow-width", 3.5,
NULL);
setup_item_signals (item);
item = goo_canvas_polyline_new_line (group,
32.0, 370.0,
48.0, 370.0,
"stroke-color", "midnightblue",
"line-width", 3.0,
NULL);
setup_item_signals (item);
item = goo_canvas_text_new (group, "N", 40, 320, -1, GTK_ANCHOR_S,
"font", "Sans 12",
NULL);
setup_item_signals (item);
}
/* This checks that the rgba color properties work properly, i.e. the value
written to them is the same when read back out. */
static void
test_color_properties (GooCanvasItem *root)
{
#if 0
GooCanvasItem *item;
guint red, green, blue, alpha, rgba_in, rgba_out;
item = goo_canvas_rect_new (root, 20, 30, 50, 30,
NULL);
for (red = 0; red < 256; red += 15)
{
for (green = 0; green < 256; green += 15)
{
for (blue = 0; blue < 256; blue ++)
{
for (alpha = 0; alpha < 256; alpha += 15)
{
rgba_in = (red << 24) + (green << 16) + (blue << 8) + alpha;
g_object_set (item, "fill_color_rgba", rgba_in, NULL);
rgba_out = 0;
g_object_get (item, "fill_color_rgba", &rgba_out, NULL);
if (rgba_in != rgba_out)
g_print ("ERROR: rgba in: %.8X out: %.8X\n", rgba_in, rgba_out);
}
}
}
}
#endif
}
static void
test_simple_transforms (GooCanvasItem *root)
{
#if 0
GooCanvasItem *item;
int rotation, x, y;
double scale, x_out, y_out, scale_out, rotation_out, max_error = 0.0000001;
item = goo_canvas_rect_new (root, 20, 30, 50, 30,
NULL);
for (rotation = 0; rotation < 360; rotation += 20)
{
scale = 0.1;
while (scale < 10)
{
g_print ("Rotation: %i Scale: %g\n", rotation, scale);
for (x = -100; x < 100; x += 10)
{
for (y = -100; y < 100; y += 10)
{
goo_canvas_item_set_simple_transform (item, x, y, scale,
rotation);
goo_canvas_item_get_simple_transform (item, &x_out, &y_out,
&scale_out,
&rotation_out);
if (fabs (x_out - x) > max_error
|| fabs (y_out - y) > max_error
|| fabs (scale_out - scale) > max_error
|| fabs (rotation_out - rotation) > max_error)
{
g_print ("IN X:%i Y:%i Scale:%g Rotation:%i -> %g, %g, %g, %g\n", x, y, scale, rotation, x_out, y_out, scale_out, rotation_out);
}
}
}
scale += 0.1;
}
}
#endif
}
static void
setup_grids (GooCanvasItem *root)
{
GooCanvasItem *item;
item = goo_canvas_grid_new (root, 80, 310, 90, 90, 10, 10, 5, 5,
"stroke-color", "yellow",
"fill-color", "pink",
"border-width", 2.0,
"border-color", "red",
"vert-grid-line-color", "lightblue",
"horz-grid-line-width", 1.0,
"vert-grid-line-width", 1.0,
"vert-grid-lines-on-top", TRUE,
NULL);
}
static void
setup_canvas (GooCanvas *canvas)
{
GooCanvasItem *root;
root = goo_canvas_get_root_item (canvas);
g_signal_connect (root, "button_press_event",
G_CALLBACK (on_background_button_press), NULL);
/* Setup canvas items */
#if 1
setup_divisions (root);
setup_rectangles (root);
setup_ellipses (root);
setup_lines (root);
setup_polygons (root);
setup_texts (root);
setup_images (root);
setup_invisible_texts (root);
setup_static_items (canvas);
setup_grids (root);
#endif
test_color_properties (root);
test_simple_transforms (root);
}
static gboolean
on_delete_event (GtkWidget *window,
GdkEvent *event,
gpointer unused_data)
{
gtk_main_quit ();
return FALSE;
}
static GtkWidget*
create_window ()
{
GtkWidget *window, *notebook;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size (GTK_WINDOW (window), 640, 600);
gtk_widget_show (window);
g_signal_connect (window, "delete_event", G_CALLBACK (on_delete_event),
NULL);
notebook = gtk_notebook_new ();
gtk_widget_show (notebook);
gtk_container_add (GTK_CONTAINER (window), notebook);
#if 1
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_canvas_primitives (),
gtk_label_new ("Primitives"));
#endif
#if 1
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_canvas_arrowhead (),
gtk_label_new ("Arrowhead"));
#endif
#if 1
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_canvas_fifteen (),
gtk_label_new ("Fifteen"));
#endif
#if 1
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_canvas_features (),
gtk_label_new ("Reparent"));
#endif
#if 1
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_canvas_scalability (),
gtk_label_new ("Scalability"));
#endif
#if 1
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_grabs_page (),
gtk_label_new ("Grabs"));
#endif
#if 1
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_events_page (),
gtk_label_new ("Events"));
#endif
#if 1
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_paths_page (),
gtk_label_new ("Paths"));
#endif
#if 1
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_focus_page (),
gtk_label_new ("Focus"));
#endif
#if 1
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_animation_page (),
gtk_label_new ("Animation"));
#endif
#if 1
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_clipping_page (),
gtk_label_new ("Clipping"));
#endif
#if 1
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_table_page (),
gtk_label_new ("Table"));
#endif
#if 1
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
create_large_items_page (),
gtk_label_new ("Large Items"));
#endif
return window;
}
int
main (int argc, char *argv[])
{
GtkWidget *window;
gtk_set_locale ();
gtk_init (&argc, &argv);
window = create_window ();
gtk_main ();
return 0;
}
goocanvas-1.0.0/demo/demo-large-line.c 0000644 0000764 0000764 00000015706 11412723611 014461 0000000 0000000 /*
* GooCanvas Demo. Copyright (C) 2007 Damon Chaplin.
* Released under the GNU LGPL license. See COPYING for details.
*
* demo-large-line.c - a demo item that exceeds the cairo 16-bit size limit.
* Note that it doesn't support miters.
*/
#include
#include "goocanvas.h"
#include "demo-large-line.h"
/* Use the GLib convenience macro to define the type. GooDemoLargeLine is the
class struct, goo_demo_large_line is the function prefix, and our class is a
subclass of GOO_TYPE_CANVAS_ITEM_SIMPLE. */
G_DEFINE_TYPE (GooDemoLargeLine, goo_demo_large_line,
GOO_TYPE_CANVAS_ITEM_SIMPLE)
/* The standard object initialization function. */
static void
goo_demo_large_line_init (GooDemoLargeLine *demo_large_line)
{
demo_large_line->x1 = 0.0;
demo_large_line->y1 = 0.0;
demo_large_line->x2 = 0.0;
demo_large_line->y2 = 0.0;
}
/* The convenience function to create new items. This should start with a
parent argument and end with a variable list of object properties to fit
in with the standard canvas items. */
GooCanvasItem*
goo_demo_large_line_new (GooCanvasItem *parent,
gdouble x1,
gdouble y1,
gdouble x2,
gdouble y2,
...)
{
GooCanvasItem *item;
GooDemoLargeLine *demo_large_line;
const char *first_property;
va_list var_args;
item = g_object_new (GOO_TYPE_DEMO_LARGE_LINE, NULL);
demo_large_line = (GooDemoLargeLine*) item;
demo_large_line->x1 = x1;
demo_large_line->y1 = y1;
demo_large_line->x2 = x2;
demo_large_line->y2 = y2;
va_start (var_args, y2);
first_property = va_arg (var_args, char*);
if (first_property)
g_object_set_valist ((GObject*) item, first_property, var_args);
va_end (var_args);
if (parent)
{
goo_canvas_item_add_child (parent, item, -1);
g_object_unref (item);
}
return item;
}
/* The update method. This is called when the canvas is initially shown and
also whenever the object is updated and needs to change its size and/or
shape. It should calculate its new bounds in its own coordinate space,
storing them in simple->bounds. */
static void
goo_demo_large_line_update (GooCanvasItemSimple *simple,
cairo_t *cr)
{
GooDemoLargeLine *item = (GooDemoLargeLine*) simple;
gdouble half_line_width;
half_line_width = goo_canvas_item_simple_get_line_width (simple) / 2;
/* Compute the new bounds. */
simple->bounds.x1 = MIN (item->x1, item->x2) - half_line_width;
simple->bounds.y1 = MIN (item->y1, item->y2) - half_line_width;
simple->bounds.x2 = MAX (item->x1, item->x2) + half_line_width;
simple->bounds.y2 = MAX (item->y1, item->y2) + half_line_width;
}
static void
clamp_x (gdouble point1[2],
gdouble point2[2],
gdouble clamp)
{
gdouble fraction = (clamp - point1[0]) / (point2[0] - point1[0]);
point1[0] = clamp;
point1[1] += fraction * (point2[1] - point1[1]);
}
static void
clamp_y (gdouble point1[2],
gdouble point2[2],
gdouble clamp)
{
gdouble fraction = (clamp - point1[1]) / (point2[1] - point1[1]);
point1[1] = clamp;
point1[0] += fraction * (point2[0] - point1[0]);
}
static void
paint_large_line (GooDemoLargeLine *line,
cairo_t *cr,
const GooCanvasBounds *bounds,
gdouble line_width,
gdouble x1,
gdouble y1,
gdouble x2,
gdouble y2)
{
GooCanvasItem *item = (GooCanvasItem*) line;
GooCanvasItemSimple *simple = (GooCanvasItemSimple*) line;
GooCanvas *canvas = simple->canvas;
GooCanvasBounds tmp_bounds = *bounds;
gdouble point1[2], point2[2], *p1, *p2;
point1[0] = x1;
point1[1] = y1;
point2[0] = x2;
point2[1] = y2;
/* Transform the coordinates to the canvas device space, so we can clamp
the line to the bounds to be painted. */
goo_canvas_convert_from_item_space (canvas, item, &point1[0], &point1[1]);
goo_canvas_convert_from_item_space (canvas, item, &point2[0], &point2[1]);
/* Extend the bounds a bit to account for the line width. */
tmp_bounds.x1 -= line_width;
tmp_bounds.y1 -= line_width;
tmp_bounds.x2 += line_width;
tmp_bounds.y2 += line_width;
/* Make p1 the left-most point. */
if (point1[0] < point2[0])
{
p1 = point1;
p2 = point2;
}
else
{
p1 = point2;
p2 = point1;
}
/* Just return if the line is completely outside the bounds horizontally. */
if (p2[0] < tmp_bounds.x1 || p1[0] > tmp_bounds.x2)
return;
/* Clamp each x coordinate to the bounds. */
if (p1[0] < tmp_bounds.x1)
clamp_x (p1, p2, tmp_bounds.x1);
if (p2[0] > tmp_bounds.x2)
clamp_x (p2, p1, tmp_bounds.x2);
/* Now make p1 the top-most point. */
if (point1[1] < point2[1])
{
p1 = point1;
p2 = point2;
}
else
{
p1 = point2;
p2 = point1;
}
/* Just return if the line is completely outside the bounds vertically. */
if (p2[1] < tmp_bounds.y1 || p1[1] > tmp_bounds.y2)
return;
/* Clamp each y coordinate to the bounds. */
if (p1[1] < tmp_bounds.y1)
clamp_y (p1, p2, tmp_bounds.y1);
if (p2[1] > tmp_bounds.y2)
clamp_y (p2, p1, tmp_bounds.y2);
/* Convert back to item space. */
goo_canvas_convert_to_item_space (canvas, item, &point1[0], &point1[1]);
goo_canvas_convert_to_item_space (canvas, item, &point2[0], &point2[1]);
/* Draw the line. */
cairo_move_to (cr, point1[0], point1[1]);
cairo_line_to (cr, point2[0], point2[1]);
cairo_stroke (cr);
}
/* The paint method. This should draw the item on the given cairo_t, using
the item's own coordinate space. */
static void
goo_demo_large_line_paint (GooCanvasItemSimple *simple,
cairo_t *cr,
const GooCanvasBounds *bounds)
{
GooDemoLargeLine *item = (GooDemoLargeLine*) simple;
gdouble line_width;
goo_canvas_style_set_stroke_options (simple->simple_data->style, cr);
line_width = goo_canvas_item_simple_get_line_width (simple);
paint_large_line (item, cr, bounds, line_width,
item->x1, item->y1, item->x2, item->y2);
}
/* Hit detection. This should check if the given coordinate (in the item's
coordinate space) is within the item. If it is it should return TRUE,
otherwise it should return FALSE. */
static gboolean
goo_demo_large_line_is_item_at (GooCanvasItemSimple *simple,
gdouble x,
gdouble y,
cairo_t *cr,
gboolean is_pointer_event)
{
/*GooDemoLargeLine *item = (GooDemoLargeLine*) simple;*/
/* FIXME: Implement this. */
return FALSE;
}
/* The class initialization function. Here we set the class' update(), paint()
and is_item_at() methods. */
static void
goo_demo_large_line_class_init (GooDemoLargeLineClass *klass)
{
GooCanvasItemSimpleClass *simple_class = (GooCanvasItemSimpleClass*) klass;
simple_class->simple_update = goo_demo_large_line_update;
simple_class->simple_paint = goo_demo_large_line_paint;
simple_class->simple_is_item_at = goo_demo_large_line_is_item_at;
}
goocanvas-1.0.0/demo/demo-clipping.c 0000644 0000764 0000764 00000011635 11412723611 014244 0000000 0000000 #include
#include
#include
#include
static gboolean
on_button_press (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventButton *event,
gchar *id)
{
g_print ("%s received 'button-press' signal at %g, %g (root: %g, %g)\n",
id, event->x, event->y, event->x_root, event->y_root);
return TRUE;
}
static void
setup_canvas (GtkWidget *canvas)
{
GooCanvasItem *root, *item, *table;
root = goo_canvas_get_root_item (GOO_CANVAS (canvas));
/* Plain items without clip path. */
item = goo_canvas_ellipse_new (root, 0, 0, 50, 30,
"fill-color", "blue",
NULL);
goo_canvas_item_translate (item, 100, 100);
goo_canvas_item_rotate (item, 30, 0, 0);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Blue ellipse (unclipped)");
item = goo_canvas_rect_new (root, 200, 50, 100, 100,
"fill-color", "red",
"clip-fill-rule", CAIRO_FILL_RULE_EVEN_ODD,
NULL);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Red rectangle (unclipped)");
item = goo_canvas_rect_new (root, 380, 50, 100, 100,
"fill-color", "yellow",
NULL);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Yellow rectangle (unclipped)");
item = goo_canvas_text_new (root, "Sample Text", 520, 100, -1, GTK_ANCHOR_NW,
NULL);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Text (unclipped)");
/* Clipped items. */
item = goo_canvas_ellipse_new (root, 0, 0, 50, 30,
"fill-color", "blue",
"clip-path", "M 0 0 h 100 v 100 h -100 Z",
NULL);
goo_canvas_item_translate (item, 100, 300);
goo_canvas_item_rotate (item, 30, 0, 0);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Blue ellipse");
item = goo_canvas_rect_new (root, 200, 250, 100, 100,
"fill-color", "red",
"clip-path", "M 250 300 h 100 v 100 h -100 Z",
"clip-fill-rule", CAIRO_FILL_RULE_EVEN_ODD,
NULL);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Red rectangle");
item = goo_canvas_rect_new (root, 380, 250, 100, 100,
"fill-color", "yellow",
"clip-path", "M480,230 l40,100 l-80 0 z",
NULL);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Yellow rectangle");
item = goo_canvas_text_new (root, "Sample Text", 520, 300, -1, GTK_ANCHOR_NW,
"clip-path", "M535,300 h75 v40 h-75 z",
NULL);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Text");
/* Table with clipped items. */
table = goo_canvas_table_new (root, NULL);
goo_canvas_item_translate (table, 200, 400);
goo_canvas_item_rotate (table, 30, 0, 0);
item = goo_canvas_ellipse_new (table, 0, 0, 50, 30,
"fill-color", "blue",
"clip-path", "M 0 0 h 100 v 100 h -100 Z",
NULL);
goo_canvas_item_translate (item, 100, 300);
goo_canvas_item_rotate (item, 30, 0, 0);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Blue ellipse");
item = goo_canvas_rect_new (table, 200, 250, 100, 100,
"fill-color", "red",
"clip-path", "M 250 300 h 100 v 100 h -100 Z",
"clip-fill-rule", CAIRO_FILL_RULE_EVEN_ODD,
NULL);
goo_canvas_item_set_child_properties (table, item,
"column", 1,
NULL);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Red rectangle");
item = goo_canvas_rect_new (table, 380, 250, 100, 100,
"fill-color", "yellow",
"clip-path", "M480,230 l40,100 l-80 0 z",
NULL);
goo_canvas_item_set_child_properties (table, item,
"column", 2,
NULL);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Yellow rectangle");
item = goo_canvas_text_new (table, "Sample Text", 520, 300, -1,
GTK_ANCHOR_NW,
"clip-path", "M535,300 h75 v40 h-75 z",
NULL);
goo_canvas_item_set_child_properties (table, item,
"column", 3,
NULL);
g_signal_connect (item, "button_press_event",
G_CALLBACK (on_button_press), "Text");
}
GtkWidget *
create_clipping_page (void)
{
GtkWidget *vbox, *scrolled_win, *canvas;
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_widget_show (vbox);
scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win),
GTK_SHADOW_IN);
gtk_widget_show (scrolled_win);
gtk_container_add (GTK_CONTAINER (vbox), scrolled_win);
canvas = goo_canvas_new ();
gtk_widget_set_size_request (canvas, 600, 450);
goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, 1000, 1000);
gtk_widget_show (canvas);
gtk_container_add (GTK_CONTAINER (scrolled_win), canvas);
setup_canvas (canvas);
return vbox;
}
goocanvas-1.0.0/demo/mv-simple-demo.c 0000644 0000764 0000764 00000005362 11412723611 014350 0000000 0000000 #include
#include
static gboolean on_rect_button_press (GooCanvasItem *view,
GooCanvasItem *target,
GdkEventButton *event,
gpointer data);
static gboolean on_delete_event (GtkWidget *window,
GdkEvent *event,
gpointer unused_data);
int
main (int argc, char *argv[])
{
GtkWidget *window, *scrolled_win, *canvas;
GooCanvasItemModel *root, *rect_model, *text_model;
GooCanvasItem *rect_item;
/* Initialize GTK+. */
gtk_set_locale ();
gtk_init (&argc, &argv);
/* Create the window and widgets. */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size (GTK_WINDOW (window), 640, 600);
gtk_widget_show (window);
g_signal_connect (window, "delete_event", G_CALLBACK (on_delete_event),
NULL);
scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win),
GTK_SHADOW_IN);
gtk_widget_show (scrolled_win);
gtk_container_add (GTK_CONTAINER (window), scrolled_win);
canvas = goo_canvas_new ();
gtk_widget_set_size_request (canvas, 600, 450);
goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, 1000, 1000);
gtk_widget_show (canvas);
gtk_container_add (GTK_CONTAINER (scrolled_win), canvas);
root = goo_canvas_group_model_new (NULL, NULL);
/* Add a few simple items. */
rect_model = goo_canvas_rect_model_new (root, 100, 100, 400, 400,
"line-width", 10.0,
"radius-x", 20.0,
"radius-y", 10.0,
"stroke-color", "yellow",
"fill-color", "red",
NULL);
text_model = goo_canvas_text_model_new (root, "Hello World", 300, 300, -1,
GTK_ANCHOR_CENTER,
"font", "Sans 24",
NULL);
goo_canvas_item_model_rotate (text_model, 45, 300, 300);
goo_canvas_set_root_item_model (GOO_CANVAS (canvas), root);
/* Connect a signal handler for the rectangle item. */
rect_item = goo_canvas_get_item (GOO_CANVAS (canvas), rect_model);
g_signal_connect (rect_item, "button_press_event",
G_CALLBACK (on_rect_button_press), NULL);
/* Pass control to the GTK+ main event loop. */
gtk_main ();
return 0;
}
/* This handles button presses in item views. We simply output a message to
the console. */
static gboolean
on_rect_button_press (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventButton *event,
gpointer data)
{
g_print ("rect item received button press event\n");
return TRUE;
}
/* This is our handler for the "delete-event" signal of the window, which
is emitted when the 'x' close button is clicked. We just exit here. */
static gboolean
on_delete_event (GtkWidget *window,
GdkEvent *event,
gpointer unused_data)
{
exit (0);
}
goocanvas-1.0.0/demo/mv-demo-events.c 0000644 0000764 0000764 00000012733 11412723611 014363 0000000 0000000 #include
#include
#include
#include
static gboolean
on_motion_notify (GooCanvasItem *item,
GooCanvasItem *target,
GdkEventMotion *event,
gpointer data)
{
GooCanvasItemModel *model = NULL;
char *item_id = NULL;
if (target)
model = goo_canvas_item_get_model (target);
if (model)
item_id = g_object_get_data (G_OBJECT (model), "id");
if (item_id)
g_print ("%s item received 'motion-notify' signal\n", item_id);
return FALSE;
}
static void
on_item_created (GooCanvas *view,
GooCanvasItem *item,
GooCanvasItemModel *model,
gpointer data)
{
g_signal_connect (item, "motion_notify_event",
G_CALLBACK (on_motion_notify), NULL);
}
static void
create_events_area (GooCanvasItemModel *root,
gint area_num,
GooCanvasPointerEvents pointer_events,
gchar *label)
{
gint row = area_num / 3, col = area_num % 3;
gdouble x = col * 200, y = row * 150;
GooCanvasItemModel *rect;
char *view_id;
GooCanvasLineDash *dash;
dash = goo_canvas_line_dash_new (2, 5.0, 5.0);
/* Create invisible item. */
rect = goo_canvas_rect_model_new (root, x + 45, y + 35, 30, 30,
"fill-color", "red",
"visibility", GOO_CANVAS_ITEM_INVISIBLE,
"line-width", 5.0,
"pointer-events", pointer_events,
NULL);
view_id = g_strdup_printf ("%s invisible", label);
g_object_set_data_full (G_OBJECT (rect), "id", view_id, g_free);
/* Display a thin rect around it to indicate it is there. */
#if 1
rect = goo_canvas_rect_model_new (root, x + 42.5, y + 32.5, 36, 36,
"line-dash", dash,
"line-width", 1.0,
"stroke-color", "gray",
NULL);
#endif
/* Create unpainted item. */
rect = goo_canvas_rect_model_new (root, x + 85, y + 35, 30, 30,
"stroke-pattern", NULL,
"line-width", 5.0,
"pointer-events", pointer_events,
NULL);
view_id = g_strdup_printf ("%s unpainted", label);
g_object_set_data_full (G_OBJECT (rect), "id", view_id, g_free);
/* Display a thin rect around it to indicate it is there. */
#if 1
rect = goo_canvas_rect_model_new (root, x + 82.5, y + 32.5, 36, 36,
"line-dash", dash,
"line-width", 1.0,
"stroke-color", "gray",
NULL);
#endif
/* Create stroked item. */
rect = goo_canvas_rect_model_new (root, x + 125, y + 35, 30, 30,
"line-width", 5.0,
"pointer-events", pointer_events,
NULL);
view_id = g_strdup_printf ("%s stroked", label);
g_object_set_data_full (G_OBJECT (rect), "id", view_id, g_free);
/* Create filled item. */
rect = goo_canvas_rect_model_new (root, x + 60, y + 75, 30, 30,
"fill-color", "red",
"stroke-pattern", NULL,
"line-width", 5.0,
"pointer-events", pointer_events,
NULL);
view_id = g_strdup_printf ("%s filled", label);
g_object_set_data_full (G_OBJECT (rect), "id", view_id, g_free);
/* Create stroked & filled item. */
rect = goo_canvas_rect_model_new (root, x + 100, y + 75, 30, 30,
"fill-color", "red",
"line-width", 5.0,
"pointer-events", pointer_events,
NULL);
view_id = g_strdup_printf ("%s stroked & filled", label);
g_object_set_data_full (G_OBJECT (rect), "id", view_id, g_free);
goo_canvas_text_model_new (root, label, x + 100, y + 130, -1,
GTK_ANCHOR_CENTER,
"font", "Sans 12",
"fill-color", "blue",
NULL);
goo_canvas_line_dash_unref (dash);
}
GtkWidget *
create_events_page (void)
{
GtkWidget *vbox, *alignment, *frame, *label, *canvas;
GooCanvasItemModel *root;
vbox = gtk_vbox_new (FALSE, 4);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 4);
gtk_widget_show (vbox);
/* Instructions */
label = gtk_label_new ("Move the mouse over the items to check they receive the right motion events.\nThe first 2 items in each group are 1) invisible and 2) visible but unpainted.");
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
/* Frame and canvas */
alignment = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
gtk_box_pack_start (GTK_BOX (vbox), alignment, FALSE, FALSE, 0);
gtk_widget_show (alignment);
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_container_add (GTK_CONTAINER (alignment), frame);
gtk_widget_show (frame);
canvas = goo_canvas_new ();
g_signal_connect (canvas, "item_created",
G_CALLBACK (on_item_created), NULL);
root = goo_canvas_group_model_new (NULL, NULL);
gtk_widget_set_size_request (canvas, 600, 450);
goo_canvas_set_bounds (GOO_CANVAS (canvas), 0, 0, 600, 450);
gtk_container_add (GTK_CONTAINER (frame), canvas);
gtk_widget_show (canvas);
create_events_area (root, 0, GOO_CANVAS_EVENTS_NONE, "none");
create_events_area (root, 1, GOO_CANVAS_EVENTS_VISIBLE_PAINTED, "visible-painted");
create_events_area (root, 2, GOO_CANVAS_EVENTS_VISIBLE_FILL, "visible-fill");
create_events_area (root, 3, GOO_CANVAS_EVENTS_VISIBLE_STROKE, "visible-stroke");
create_events_area (root, 4, GOO_CANVAS_EVENTS_VISIBLE, "visible");
create_events_area (root, 5, GOO_CANVAS_EVENTS_PAINTED, "painted");
create_events_area (root, 6, GOO_CANVAS_EVENTS_FILL, "fill");
create_events_area (root, 7, GOO_CANVAS_EVENTS_STROKE, "stroke");
create_events_area (root, 8, GOO_CANVAS_EVENTS_ALL, "all");
goo_canvas_set_root_item_model (GOO_CANVAS (canvas), root);
g_object_unref (root);
return vbox;
}
goocanvas-1.0.0/demo/simple-demo.c 0000644 0000764 0000764 00000005075 11412723611 013731 0000000 0000000 #include