summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippo Argiolas <filippo.argiolas@gmail.com>2009-04-04 09:08:09 +0200
committerFilippo Argiolas <filippo.argiolas@gmail.com>2009-04-04 09:20:20 +0200
commitee6adea4bf28545b6dd49607aec2da7974944c03 (patch)
tree450d80a864fe47bbfab24dc1b723d7a006ddf282
First autotools skeleton
Import clutteractortee.c from gst-plugins-gl examples and rename it to cheese-texture.c. Add initial support for Map and Unmap event handling. Create a little autotools skeleton.
-rw-r--r--Makefile.am1
-rwxr-xr-xautogen.sh505
-rw-r--r--configure.ac26
-rw-r--r--src/Makefile.am17
-rw-r--r--src/cheese-texture.c281
5 files changed, 830 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..af437a6
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = src
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..ba61f82
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,505 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+
+#name of package
+PKG_NAME=${PKG_NAME:-Package}
+srcdir=${srcdir:-.}
+
+# default version requirements ...
+REQUIRED_AUTOCONF_VERSION=${REQUIRED_AUTOCONF_VERSION:-2.53}
+REQUIRED_AUTOMAKE_VERSION=${REQUIRED_AUTOMAKE_VERSION:-1.9}
+REQUIRED_LIBTOOL_VERSION=${REQUIRED_LIBTOOL_VERSION:-1.4.3}
+REQUIRED_GETTEXT_VERSION=${REQUIRED_GETTEXT_VERSION:-0.10.40}
+REQUIRED_GLIB_GETTEXT_VERSION=${REQUIRED_GLIB_GETTEXT_VERSION:-2.2.0}
+REQUIRED_INTLTOOL_VERSION=${REQUIRED_INTLTOOL_VERSION:-0.25}
+REQUIRED_PKG_CONFIG_VERSION=${REQUIRED_PKG_CONFIG_VERSION:-0.14.0}
+REQUIRED_GTK_DOC_VERSION=${REQUIRED_GTK_DOC_VERSION:-1.0}
+REQUIRED_DOC_COMMON_VERSION=${REQUIRED_DOC_COMMON_VERSION:-2.3.0}
+REQUIRED_GNOME_DOC_UTILS_VERSION=${REQUIRED_GNOME_DOC_UTILS_VERSION:-0.4.2}
+
+# a list of required m4 macros. Package can set an initial value
+REQUIRED_M4MACROS=${REQUIRED_M4MACROS:-}
+FORBIDDEN_M4MACROS=${FORBIDDEN_M4MACROS:-}
+
+# Not all echo versions allow -n, so we check what is possible. This test is
+# based on the one in autoconf.
+ECHO_C=
+ECHO_N=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ;;
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# some terminal codes ...
+boldface="`tput bold 2>/dev/null`"
+normal="`tput sgr0 2>/dev/null`"
+printbold() {
+ echo $ECHO_N "$boldface" $ECHO_C
+ echo "$@"
+ echo $ECHO_N "$normal" $ECHO_C
+}
+printerr() {
+ echo "$@" >&2
+}
+
+# Usage:
+# compare_versions MIN_VERSION ACTUAL_VERSION
+# returns true if ACTUAL_VERSION >= MIN_VERSION
+compare_versions() {
+ ch_min_version=$1
+ ch_actual_version=$2
+ ch_status=0
+ IFS="${IFS= }"; ch_save_IFS="$IFS"; IFS="."
+ set $ch_actual_version
+ for ch_min in $ch_min_version; do
+ ch_cur=`echo $1 | sed 's/[^0-9].*$//'`; shift # remove letter suffixes
+ if [ -z "$ch_min" ]; then break; fi
+ if [ -z "$ch_cur" ]; then ch_status=1; break; fi
+ if [ $ch_cur -gt $ch_min ]; then break; fi
+ if [ $ch_cur -lt $ch_min ]; then ch_status=1; break; fi
+ done
+ IFS="$ch_save_IFS"
+ return $ch_status
+}
+
+# Usage:
+# version_check PACKAGE VARIABLE CHECKPROGS MIN_VERSION SOURCE
+# checks to see if the package is available
+version_check() {
+ vc_package=$1
+ vc_variable=$2
+ vc_checkprogs=$3
+ vc_min_version=$4
+ vc_source=$5
+ vc_status=1
+
+ vc_checkprog=`eval echo "\\$$vc_variable"`
+ if [ -n "$vc_checkprog" ]; then
+ printbold "using $vc_checkprog for $vc_package"
+ return 0
+ fi
+
+ if test "x$vc_package" = "xautomake" -a "x$vc_min_version" = "x1.4"; then
+ vc_comparator="="
+ else
+ vc_comparator=">="
+ fi
+ printbold "checking for $vc_package $vc_comparator $vc_min_version..."
+ for vc_checkprog in $vc_checkprogs; do
+ echo $ECHO_N " testing $vc_checkprog... " $ECHO_C
+ if $vc_checkprog --version < /dev/null > /dev/null 2>&1; then
+ vc_actual_version=`$vc_checkprog --version | head -n 1 | \
+ sed 's/^.*[ ]\([0-9.]*[a-z]*\).*$/\1/'`
+ if compare_versions $vc_min_version $vc_actual_version; then
+ echo "found $vc_actual_version"
+ # set variables
+ eval "$vc_variable=$vc_checkprog; \
+ ${vc_variable}_VERSION=$vc_actual_version"
+ vc_status=0
+ break
+ else
+ echo "too old (found version $vc_actual_version)"
+ fi
+ else
+ echo "not found."
+ fi
+ done
+ if [ "$vc_status" != 0 ]; then
+ printerr "***Error***: You must have $vc_package $vc_comparator $vc_min_version installed"
+ printerr " to build $PKG_NAME. Download the appropriate package for"
+ printerr " from your distribution or get the source tarball at"
+ printerr " $vc_source"
+ printerr
+ exit $vc_status
+ fi
+ return $vc_status
+}
+
+# Usage:
+# require_m4macro filename.m4
+# adds filename.m4 to the list of required macros
+require_m4macro() {
+ case "$REQUIRED_M4MACROS" in
+ $1\ * | *\ $1\ * | *\ $1) ;;
+ *) REQUIRED_M4MACROS="$REQUIRED_M4MACROS $1" ;;
+ esac
+}
+
+forbid_m4macro() {
+ case "$FORBIDDEN_M4MACROS" in
+ $1\ * | *\ $1\ * | *\ $1) ;;
+ *) FORBIDDEN_M4MACROS="$FORBIDDEN_M4MACROS $1" ;;
+ esac
+}
+
+# Usage:
+# add_to_cm_macrodirs dirname
+# Adds the dir to $cm_macrodirs, if it's not there yet.
+add_to_cm_macrodirs() {
+ case $cm_macrodirs in
+ "$1 "* | *" $1 "* | *" $1") ;;
+ *) cm_macrodirs="$cm_macrodirs $1";;
+ esac
+}
+
+# Usage:
+# print_m4macros_error
+# Prints an error message saying that autoconf macros were misused
+print_m4macros_error() {
+ printerr "***Error***: some autoconf macros required to build $PKG_NAME"
+ printerr " were not found in your aclocal path, or some forbidden"
+ printerr " macros were found. Perhaps you need to adjust your"
+ printerr " ACLOCAL_FLAGS?"
+ printerr
+}
+
+# Usage:
+# check_m4macros
+# Checks that all the requested macro files are in the aclocal macro path
+# Uses REQUIRED_M4MACROS and ACLOCAL variables.
+check_m4macros() {
+ # construct list of macro directories
+ cm_macrodirs=`$ACLOCAL --print-ac-dir`
+ # aclocal also searches a version specific dir, eg. /usr/share/aclocal-1.9
+ # but it contains only Automake's own macros, so we can ignore it.
+
+ # Read the dirlist file, supported by Automake >= 1.7.
+ if compare_versions 1.7 $AUTOMAKE_VERSION && [ -s $cm_macrodirs/dirlist ]; then
+ cm_dirlist=`sed 's/[ ]*#.*//;/^$/d' $cm_macrodirs/dirlist`
+ if [ -n "$cm_dirlist" ] ; then
+ for cm_dir in $cm_dirlist; do
+ if [ -d $cm_dir ]; then
+ add_to_cm_macrodirs $cm_dir
+ fi
+ done
+ fi
+ fi
+
+ # Parse $ACLOCAL_FLAGS
+ set - $ACLOCAL_FLAGS
+ while [ $# -gt 0 ]; do
+ if [ "$1" = "-I" ]; then
+ add_to_cm_macrodirs "$2"
+ shift
+ fi
+ shift
+ done
+
+ cm_status=0
+ if [ -n "$REQUIRED_M4MACROS" ]; then
+ printbold "Checking for required M4 macros..."
+ # check that each macro file is in one of the macro dirs
+ for cm_macro in $REQUIRED_M4MACROS; do
+ cm_macrofound=false
+ for cm_dir in $cm_macrodirs; do
+ if [ -f "$cm_dir/$cm_macro" ]; then
+ cm_macrofound=true
+ break
+ fi
+ # The macro dir in Cygwin environments may contain a file
+ # called dirlist containing other directories to look in.
+ if [ -f "$cm_dir/dirlist" ]; then
+ for cm_otherdir in `cat $cm_dir/dirlist`; do
+ if [ -f "$cm_otherdir/$cm_macro" ]; then
+ cm_macrofound=true
+ break
+ fi
+ done
+ fi
+ done
+ if $cm_macrofound; then
+ :
+ else
+ printerr " $cm_macro not found"
+ cm_status=1
+ fi
+ done
+ fi
+ if [ "$cm_status" != 0 ]; then
+ print_m4macros_error
+ exit $cm_status
+ fi
+ if [ -n "$FORBIDDEN_M4MACROS" ]; then
+ printbold "Checking for forbidden M4 macros..."
+ # check that each macro file is in one of the macro dirs
+ for cm_macro in $FORBIDDEN_M4MACROS; do
+ cm_macrofound=false
+ for cm_dir in $cm_macrodirs; do
+ if [ -f "$cm_dir/$cm_macro" ]; then
+ cm_macrofound=true
+ break
+ fi
+ done
+ if $cm_macrofound; then
+ printerr " $cm_macro found (should be cleared from macros dir)"
+ cm_status=1
+ fi
+ done
+ fi
+ if [ "$cm_status" != 0 ]; then
+ print_m4macros_error
+ exit $cm_status
+ fi
+}
+
+# try to catch the case where the macros2/ directory hasn't been cleared out.
+forbid_m4macro gnome-cxx-check.m4
+
+want_libtool=false
+want_gettext=false
+want_glib_gettext=false
+want_intltool=false
+want_pkg_config=false
+want_gtk_doc=false
+want_gnome_doc_utils=false
+want_maintainer_mode=false
+
+configure_files="`find $srcdir -name '{arch}' -prune -o -name '_darcs' -prune -o -name '.??*' -prune -o -name configure.ac -print -o -name configure.in -print`"
+for configure_ac in $configure_files; do
+ dirname=`dirname $configure_ac`
+ if [ -f $dirname/NO-AUTO-GEN ]; then
+ echo skipping $dirname -- flagged as no auto-gen
+ continue
+ fi
+ if grep "^A[CM]_PROG_LIBTOOL" $configure_ac >/dev/null ||
+ grep "^LT_INIT" $configure_ac >/dev/null; then
+ want_libtool=true
+ fi
+ if grep "^AM_GNU_GETTEXT" $configure_ac >/dev/null; then
+ want_gettext=true
+ fi
+ if grep "^AM_GLIB_GNU_GETTEXT" $configure_ac >/dev/null; then
+ want_glib_gettext=true
+ fi
+ if grep "^AC_PROG_INTLTOOL" $configure_ac >/dev/null ||
+ grep "^IT_PROG_INTLTOOL" $configure_ac >/dev/null; then
+ want_intltool=true
+ fi
+ if grep "^PKG_CHECK_MODULES" $configure_ac >/dev/null; then
+ want_pkg_config=true
+ fi
+ if grep "^GTK_DOC_CHECK" $configure_ac >/dev/null; then
+ want_gtk_doc=true
+ fi
+ if grep "^GNOME_DOC_INIT" $configure_ac >/dev/null; then
+ want_gnome_doc_utils=true
+ fi
+
+ # check that AM_MAINTAINER_MODE is used
+ if grep "^AM_MAINTAINER_MODE" $configure_ac >/dev/null; then
+ want_maintainer_mode=true
+ fi
+
+ # check to make sure gnome-common macros can be found ...
+ if grep "^GNOME_COMMON_INIT" $configure_ac >/dev/null ||
+ grep "^GNOME_DEBUG_CHECK" $configure_ac >/dev/null ||
+ grep "^GNOME_MAINTAINER_MODE_DEFINES" $configure_ac >/dev/null; then
+ require_m4macro gnome-common.m4
+ fi
+ if grep "^GNOME_COMPILE_WARNINGS" $configure_ac >/dev/null ||
+ grep "^GNOME_CXX_WARNINGS" $configure_ac >/dev/null; then
+ require_m4macro gnome-compiler-flags.m4
+ fi
+done
+
+#tell Mandrake autoconf wrapper we want autoconf 2.5x, not 2.13
+WANT_AUTOCONF_2_5=1
+export WANT_AUTOCONF_2_5
+version_check autoconf AUTOCONF 'autoconf2.50 autoconf autoconf-2.53' $REQUIRED_AUTOCONF_VERSION \
+ "http://ftp.gnu.org/pub/gnu/autoconf/autoconf-$REQUIRED_AUTOCONF_VERSION.tar.gz"
+AUTOHEADER=`echo $AUTOCONF | sed s/autoconf/autoheader/`
+
+case $REQUIRED_AUTOMAKE_VERSION in
+ 1.4*) automake_progs="automake-1.4" ;;
+ 1.5*) automake_progs="automake-1.10 automake-1.9 automake-1.8 automake-1.7 automake-1.6 automake-1.5" ;;
+ 1.6*) automake_progs="automake-1.10 automake-1.9 automake-1.8 automake-1.7 automake-1.6" ;;
+ 1.7*) automake_progs="automake-1.10 automake-1.9 automake-1.8 automake-1.7" ;;
+ 1.8*) automake_progs="automake-1.10 automake-1.9 automake-1.8" ;;
+ 1.9*) automake_progs="automake-1.10 automake-1.9" ;;
+ 1.10*) automake_progs="automake-1.10" ;;
+esac
+version_check automake AUTOMAKE "$automake_progs" $REQUIRED_AUTOMAKE_VERSION \
+ "http://ftp.gnu.org/pub/gnu/automake/automake-$REQUIRED_AUTOMAKE_VERSION.tar.gz"
+ACLOCAL=`echo $AUTOMAKE | sed s/automake/aclocal/`
+
+if $want_libtool; then
+ version_check libtool LIBTOOLIZE libtoolize $REQUIRED_LIBTOOL_VERSION \
+ "http://ftp.gnu.org/pub/gnu/libtool/libtool-$REQUIRED_LIBTOOL_VERSION.tar.gz"
+ require_m4macro libtool.m4
+fi
+
+if $want_gettext; then
+ version_check gettext GETTEXTIZE gettextize $REQUIRED_GETTEXT_VERSION \
+ "http://ftp.gnu.org/pub/gnu/gettext/gettext-$REQUIRED_GETTEXT_VERSION.tar.gz"
+ require_m4macro gettext.m4
+fi
+
+if $want_glib_gettext; then
+ version_check glib-gettext GLIB_GETTEXTIZE glib-gettextize $REQUIRED_GLIB_GETTEXT_VERSION \
+ "ftp://ftp.gtk.org/pub/gtk/v2.2/glib-$REQUIRED_GLIB_GETTEXT_VERSION.tar.gz"
+ require_m4macro glib-gettext.m4
+fi
+
+if $want_intltool; then
+ version_check intltool INTLTOOLIZE intltoolize $REQUIRED_INTLTOOL_VERSION \
+ "http://ftp.gnome.org/pub/GNOME/sources/intltool/"
+ require_m4macro intltool.m4
+fi
+
+if $want_pkg_config; then
+ version_check pkg-config PKG_CONFIG pkg-config $REQUIRED_PKG_CONFIG_VERSION \
+ "'http://www.freedesktop.org/software/pkgconfig/releases/pkgconfig-$REQUIRED_PKG_CONFIG_VERSION.tar.gz"
+ require_m4macro pkg.m4
+fi
+
+if $want_gtk_doc; then
+ version_check gtk-doc GTKDOCIZE gtkdocize $REQUIRED_GTK_DOC_VERSION \
+ "http://ftp.gnome.org/pub/GNOME/sources/gtk-doc/"
+ require_m4macro gtk-doc.m4
+fi
+
+if $want_gnome_doc_utils; then
+ version_check gnome-doc-utils GNOME_DOC_PREPARE gnome-doc-prepare $REQUIRED_GNOME_DOC_UTILS_VERSION \
+ "http://ftp.gnome.org/pub/GNOME/sources/gnome-doc-utils/"
+fi
+
+if [ "x$USE_COMMON_DOC_BUILD" = "xyes" ]; then
+ version_check gnome-common DOC_COMMON gnome-doc-common \
+ $REQUIRED_DOC_COMMON_VERSION " "
+fi
+
+check_m4macros
+
+if [ "$#" = 0 -a "x$NOCONFIGURE" = "x" ]; then
+ printerr "**Warning**: I am going to run \`configure' with no arguments."
+ printerr "If you wish to pass any to it, please specify them on the"
+ printerr \`$0\'" command line."
+ printerr
+fi
+
+topdir=`pwd`
+for configure_ac in $configure_files; do
+ dirname=`dirname $configure_ac`
+ basename=`basename $configure_ac`
+ if [ -f $dirname/NO-AUTO-GEN ]; then
+ echo skipping $dirname -- flagged as no auto-gen
+ elif [ ! -w $dirname ]; then
+ echo skipping $dirname -- directory is read only
+ else
+ printbold "Processing $configure_ac"
+ cd $dirname
+
+ # Note that the order these tools are called should match what
+ # autoconf's "autoupdate" package does. See bug 138584 for
+ # details.
+
+ # programs that might install new macros get run before aclocal
+ if grep "^A[CM]_PROG_LIBTOOL" $basename >/dev/null ||
+ grep "^LT_INIT" $basename >/dev/null; then
+ printbold "Running $LIBTOOLIZE..."
+ $LIBTOOLIZE --force --copy || exit 1
+ fi
+
+ if grep "^AM_GLIB_GNU_GETTEXT" $basename >/dev/null; then
+ printbold "Running $GLIB_GETTEXTIZE... Ignore non-fatal messages."
+ echo "no" | $GLIB_GETTEXTIZE --force --copy || exit 1
+ elif grep "^AM_GNU_GETTEXT" $basename >/dev/null; then
+ if grep "^AM_GNU_GETTEXT_VERSION" $basename > /dev/null; then
+ printbold "Running autopoint..."
+ autopoint --force || exit 1
+ else
+ printbold "Running $GETTEXTIZE... Ignore non-fatal messages."
+ echo "no" | $GETTEXTIZE --force --copy || exit 1
+ fi
+ fi
+
+ if grep "^AC_PROG_INTLTOOL" $basename >/dev/null ||
+ grep "^IT_PROG_INTLTOOL" $basename >/dev/null; then
+ printbold "Running $INTLTOOLIZE..."
+ $INTLTOOLIZE --force --copy --automake || exit 1
+ fi
+ if grep "^GTK_DOC_CHECK" $basename >/dev/null; then
+ printbold "Running $GTKDOCIZE..."
+ $GTKDOCIZE --copy || exit 1
+ fi
+
+ if [ "x$USE_COMMON_DOC_BUILD" = "xyes" ]; then
+ printbold "Running gnome-doc-common..."
+ gnome-doc-common --copy || exit 1
+ fi
+ if grep "^GNOME_DOC_INIT" $basename >/dev/null; then
+ printbold "Running $GNOME_DOC_PREPARE..."
+ $GNOME_DOC_PREPARE --force --copy || exit 1
+ fi
+
+ # Now run aclocal to pull in any additional macros needed
+
+ # if the AC_CONFIG_MACRO_DIR() macro is used, pass that
+ # directory to aclocal.
+ m4dir=`cat "$basename" | grep '^AC_CONFIG_MACRO_DIR' | sed -n -e 's/AC_CONFIG_MACRO_DIR(\([^()]*\))/\1/p' | sed -e 's/^\[\(.*\)\]$/\1/' | sed -e 1q`
+ if [ -n "$m4dir" ]; then
+ m4dir="-I $m4dir"
+ fi
+ printbold "Running $ACLOCAL..."
+ $ACLOCAL $m4dir $ACLOCAL_FLAGS || exit 1
+
+ if grep "GNOME_AUTOGEN_OBSOLETE" aclocal.m4 >/dev/null; then
+ printerr "*** obsolete gnome macros were used in $configure_ac"
+ fi
+
+ # Now that all the macros are sorted, run autoconf and autoheader ...
+ printbold "Running $AUTOCONF..."
+ $AUTOCONF || exit 1
+ if grep "^A[CM]_CONFIG_HEADER" $basename >/dev/null; then
+ printbold "Running $AUTOHEADER..."
+ $AUTOHEADER || exit 1
+ # this prevents automake from thinking config.h.in is out of
+ # date, since autoheader doesn't touch the file if it doesn't
+ # change.
+ test -f config.h.in && touch config.h.in
+ fi
+
+ # Finally, run automake to create the makefiles ...
+ printbold "Running $AUTOMAKE..."
+ if [ -f COPYING ]; then
+ cp -pf COPYING COPYING.autogen_bak
+ fi
+ if [ -f INSTALL ]; then
+ cp -pf INSTALL INSTALL.autogen_bak
+ fi
+ if [ $REQUIRED_AUTOMAKE_VERSION != 1.4 ]; then
+ $AUTOMAKE --gnu --add-missing --force --copy -Wno-portability || exit 1
+ else
+ $AUTOMAKE --gnu --add-missing --copy || exit 1
+ fi
+ if [ -f COPYING.autogen_bak ]; then
+ cmp COPYING COPYING.autogen_bak > /dev/null || cp -pf COPYING.autogen_bak COPYING
+ rm -f COPYING.autogen_bak
+ fi
+ if [ -f INSTALL.autogen_bak ]; then
+ cmp INSTALL INSTALL.autogen_bak > /dev/null || cp -pf INSTALL.autogen_bak INSTALL
+ rm -f INSTALL.autogen_bak
+ fi
+
+ cd "$topdir"
+ fi
+done
+
+conf_flags=""
+
+if $want_maintainer_mode; then
+ conf_flags="--enable-maintainer-mode"
+fi
+
+if test x$NOCONFIGURE = x; then
+ printbold Running $srcdir/configure $conf_flags "$@" ...
+ $srcdir/configure $conf_flags "$@" \
+ && echo Now type \`make\' to compile $PKG_NAME || exit 1
+else
+ echo Skipping configure process.
+fi
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..b96f896
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,26 @@
+AC_INIT([cheese-texture], 0.1)
+AM_INIT_AUTOMAKE (AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
+
+AC_PROG_CC
+AC_HEADER_STDC
+AM_PROG_LIBTOOL
+
+GNOME_MAINTAINER_MODE_DEFINES
+GNOME_COMPILE_WARNINGS
+
+PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.16.0])
+
+PKG_CHECK_MODULES([GTK], [gtk+-2.0 >= 2.14.0])
+
+PKG_CHECK_MODULES([GSTREAMER], \
+ gstreamer-0.10 >= 0.10.20 \
+ gstreamer-plugins-base-0.10 >= 0.10.20)
+
+PKG_CHECK_MODULES([CLUTTER], \
+ clutter-0.9 >= 0.9.0 \
+ clutter-glx-0.9 >= 0.9.0 \
+ clutter-x11-0.9 >= 0.9.0)
+
+AC_OUTPUT([
+Makefile
+src/Makefile])
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..b57c100
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,17 @@
+bin_PROGRAMS = cheese-stage
+
+cheese_stage_SOURCES = \
+ cheese-texture.c
+
+cheese_stage_LDADD = \
+ $(GLIB_LIBS) \
+ $(GTK_LIBS) \
+ $(GSTREAMER_LIBS) \
+ $(CLUTTER_LIBS) \
+ -lgstinterfaces-0.10
+
+cheese_stage_CFLAGS = \
+ $(GLIB_CFLAGS) \
+ $(GTK_CFLAGS) \
+ $(GSTREAMER_CFLAGS) \
+ $(CLUTTER_CFLAGS)
diff --git a/src/cheese-texture.c b/src/cheese-texture.c
new file mode 100644
index 0000000..5447379
--- /dev/null
+++ b/src/cheese-texture.c
@@ -0,0 +1,281 @@
+/*
+ * GStreamer
+ * Copyright (C) 2008 Filippo Argiolas <filippo.argiolas@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <X11/Xlib.h>
+
+#include <X11/extensions/Xcomposite.h>
+#include <clutter/clutter.h>
+#include <clutter/x11/clutter-x11.h>
+#include <clutter/glx/clutter-glx.h>
+#include <gst/gst.h>
+#include <gst/interfaces/xoverlay.h>
+
+#define ROWS 3
+#define COLS 3
+#define N_ACTORS ROWS*COLS
+#define W 160
+#define H 120
+
+struct GstGLClutterActor_
+{
+ Window win;
+ Window root;
+ ClutterActor *texture;
+ ClutterActor *stage;
+};
+
+typedef struct GstGLClutterActor_ GstGLClutterActor;
+
+static ClutterX11FilterReturn event_filter (XEvent * ev, ClutterEvent * cev,
+ gpointer unused);
+
+static ClutterX11FilterReturn
+event_filter (XEvent * ev, ClutterEvent * cev, gpointer data)
+{
+ Window *windows = (Window *) data;
+ gint i;
+ switch (ev->type) {
+ case MapRequest:
+ g_message ("map request");
+ return CLUTTER_X11_FILTER_CONTINUE;
+ case MapNotify:
+ if (ev->xmap.window == windows[N_ACTORS]) {
+ g_message ("stage map");
+// XMapSubwindows (ev->xmap.display, ev->xmap.window);
+ for (i = 0; i < N_ACTORS; i++) {
+ XMapWindow (ev->xmap.display, windows[i]);
+ }
+ XSync (ev->xmap.display, FALSE);
+ } else
+ g_message ("map");
+ XMapSubwindows (ev->xmap.display, ev->xmap.window);
+ return CLUTTER_X11_FILTER_CONTINUE;
+ case UnmapNotify:
+ if (ev->xmap.window == windows[N_ACTORS]) {
+ g_message ("stage unmap");
+// XUnmapSubwindows (ev->xmap.display, ev->xmap.window);
+ for (i = 0; i < N_ACTORS; i++) {
+ XUnmapWindow (ev->xmap.display, windows[i]);
+ }
+ XSync (ev->xmap.display, FALSE);
+ } else
+ g_message ("unmap");
+ return CLUTTER_X11_FILTER_CONTINUE;
+ default:
+ return CLUTTER_X11_FILTER_CONTINUE;
+ }
+}
+
+static gboolean
+create_actor (GstGLClutterActor * actor)
+{
+ static gint xpos = 0;
+ static gint ypos = 0;
+ Display *disp;
+ actor->texture = g_object_new (CLUTTER_GLX_TYPE_TEXTURE_PIXMAP,
+ "window", actor->win, "automatic-updates", TRUE, NULL);
+ clutter_container_add_actor (CLUTTER_CONTAINER (actor->stage),
+ actor->texture);
+ clutter_actor_set_position (actor->texture, xpos, ypos);
+
+ disp = clutter_x11_get_default_display ();
+
+ if (xpos > (COLS - 1) * W) {
+ xpos = 0;
+ ypos += H + 1;
+ } else
+ xpos += W + 1;
+ clutter_actor_show (actor->texture);
+
+ return FALSE;
+}
+
+static GstBusSyncReply
+create_window (GstBus * bus, GstMessage * message, gpointer data)
+{
+ GstGLClutterActor **actor = (GstGLClutterActor **) data;
+ static gint count = 0;
+ static GMutex *mutex = NULL;
+ // ignore anything but 'prepare-xwindow-id' element messages
+ if (GST_MESSAGE_TYPE (message) != GST_MESSAGE_ELEMENT)
+ return GST_BUS_PASS;
+
+ if (!gst_structure_has_name (message->structure, "prepare-xwindow-id"))
+ return GST_BUS_PASS;
+
+ if (!mutex)
+ mutex = g_mutex_new ();
+
+ g_mutex_lock (mutex);
+
+ if (count < N_ACTORS) {
+ g_message ("adding actor %d", count);
+ gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (GST_MESSAGE_SRC (message)),
+ actor[count]->win);
+ clutter_threads_add_idle ((GSourceFunc) create_actor, actor[count]);
+ count++;
+ }
+
+ g_mutex_unlock (mutex);
+
+ gst_message_unref (message);
+ return GST_BUS_DROP;
+}
+
+#if 0
+void
+apply_fx (GstElement * element, const gchar * fx)
+{
+ GEnumClass *p_class;
+
+ /* from fxtest ;) */
+ /* heeeellppppp!! */
+ p_class =
+ G_PARAM_SPEC_ENUM (g_object_class_find_property (G_OBJECT_GET_CLASS
+ (G_OBJECT (data)), "effect")
+ )->enum_class;
+
+ g_print ("setting: %s - %s\n", fx, g_enum_get_value_by_nick (p_class,
+ fx)->value_name);
+ g_object_set (G_OBJECT (element), "effect", g_enum_get_value_by_nick (p_class,
+ fx)->value, NULL);
+}
+#endif
+
+int
+main (int argc, char *argv[])
+{
+ GstPipeline *pipeline;
+ GstBus *bus;
+
+ GstElement *srcbin;
+ GstElement *tee;
+ GstElement *queue[N_ACTORS], *sink[N_ACTORS];
+/*
+ GstElement *upload[N_ACTORS];
+ GstElement *effect[N_ACTORS];
+*/
+ ClutterActor *stage;
+ GstGLClutterActor *actor[N_ACTORS];
+ Window windows[N_ACTORS + 1];
+ Display *disp;
+ Window stage_win;
+ const gchar *desc;
+ gint i;
+ gint ok = FALSE;
+
+ XSetWindowAttributes attributes;
+ unsigned long mask;
+
+ clutter_init (&argc, &argv);
+ gst_init (&argc, &argv);
+
+ disp = clutter_x11_get_default_display ();
+ if (!clutter_x11_has_composite_extension ()) {
+ g_error ("XComposite extension missing");
+ }
+
+ stage = clutter_stage_get_default ();
+ clutter_actor_set_size (CLUTTER_ACTOR (stage),
+ W * COLS + (COLS - 1), H * ROWS + (ROWS - 1));
+
+ stage_win = clutter_x11_get_stage_window (CLUTTER_STAGE (stage));
+
+ attributes.background_pixel = BlackPixel (disp, DefaultScreen (disp));
+ attributes.event_mask = StructureNotifyMask | VisibilityChangeMask;
+ mask = CWBackPixel | CWEventMask;
+
+ for (i = 0; i < N_ACTORS; i++) {
+ actor[i] = g_new0 (GstGLClutterActor, 1);
+ actor[i]->stage = stage;
+ actor[i]->win = XCreateWindow (disp, stage_win,
+ 0, 0, W, H, 0, CopyFromParent, InputOutput, CopyFromParent,
+ mask, &attributes);
+ windows[i] = actor[i]->win;
+ XCompositeRedirectWindow (disp, actor[i]->win, CompositeRedirectManual);
+ XMapRaised (disp, actor[i]->win);
+ XSync (disp, FALSE);
+ }
+ windows[N_ACTORS] = stage_win;
+ clutter_x11_add_filter (event_filter, windows);
+
+/*
+ desc = g_strdup_printf ("v4l2src ! "
+ "video/x-raw-yuv, width=640, height=480, framerate=30/1 ! "
+ "videoscale !"
+ "video/x-raw-yuv, width=%d, height=%d ! "
+ "identity", W, H);
+*/
+ desc = g_strdup_printf ("videotestsrc ! "
+ "video/x-raw-rgb, width=%d, height=%d !" "identity", W, H);
+ pipeline = GST_PIPELINE (gst_pipeline_new (NULL));
+
+ srcbin = gst_parse_bin_from_description (desc, TRUE, NULL);
+ if (!srcbin)
+ g_error ("Source bin creation failed");
+
+ tee = gst_element_factory_make ("tee", NULL);
+
+ gst_bin_add_many (GST_BIN (pipeline), srcbin, tee, NULL);
+
+ for (i = 0; i < N_ACTORS; i++) {
+ queue[i] = gst_element_factory_make ("queue", NULL);
+/* upload[i] = gst_element_factory_make ("glupload", NULL);
+ effect[i] = gst_element_factory_make ("gleffects", NULL); */
+ sink[i] = gst_element_factory_make ("glimagesink", NULL);
+/* gst_bin_add_many (GST_BIN (pipeline),
+ queue[i], upload[i], effect[i], sink[i], NULL); */
+ gst_bin_add_many (GST_BIN (pipeline), queue[i], sink[i], NULL);
+ }
+
+ gst_element_link_many (srcbin, tee, NULL);
+
+ for (i = 0; i < N_ACTORS; i++) {
+ ok |=
+// gst_element_link_many (tee, queue[i], upload[i], effect[i], sink[i],
+ gst_element_link_many (tee, queue[i], sink[i], NULL);
+ }
+
+ if (!ok)
+ g_error ("Failed to link one or more elements");
+
+/*
+ for (i = 0; i < N_ACTORS; i++) {
+ g_message ("setting effect %d on %s", i + 1,
+ gst_element_get_name (effect[i]));
+ g_object_set (G_OBJECT (effect[i]), "effect", i + 1, NULL);
+ }
+*/
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+
+ gst_bus_set_sync_handler (bus, (GstBusSyncHandler) create_window, actor);
+
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
+
+ clutter_actor_show_all (stage);
+
+ clutter_main ();
+
+ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
+ g_object_unref (pipeline);
+
+ return 0;
+}