Commit 342ea125 authored by Matthew Allum's avatar Matthew Allum

Merge gobject-branch into trunk

parent c936f265
This diff is collapsed.
This diff is collapsed.
SUBDIRS=clutter gst examples
\ No newline at end of file
SUBDIRS=clutter bindings doc examples
pcfiles = clutter-@CLUTTER_MAJORMINOR@.pc
%-@CLUTTER_MAJORMINOR@.pc: %.pc
cp $< $@
pkgconfig_DATA = $(pcfiles)
pkgconfigdir = $(libdir)/pkgconfig
EXTRA_DIST = clutter.pc.in
CLEANFILES = $(pcfiles)
DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc
# Extra clean files so that maintainer-clean removes *everything*
MAINTAINERCLEANFILES = aclocal.m4 compile config.guess config.sub \
configure depcomp install-sh ltmain.sh \
Makefile.in missing config.h.in
\ No newline at end of file
What it will do:
- Give a nice easy GObject based API for creating fast, mainly 2D
single window stylalised applications such as media box UI's,
presentaions, kiosk style apps etc.
- If you've ever used Director, thats the kind of functionality,
clutter aims for.
What it wont do:
- Provide a general interface to all openGL functionality
TODO
====
- Element
o depth and z positioning ?
o can glscale -1 for mirroring / flipping, or just use rotation ?
- Stage
o Events - mouse
- Texture
o display lists ?
- Rect
o rounded
o gradients ( or add to elements ? )
o general polygon handler ?
- Video Texture
o complete API from bacon-video-widget *Mostly done*
o Work with pixel aspect and use this info to size element correctly ?
o mostly rewrite or check with orig author for LGPL.
- Group
o apply tranforms to group of elements
o scissor to clip
o sizing ? how does set/get_geometry affect ?
o stacking orders with 'depth' value.
- GST
o Fix FIXME's
o Remove and use fake sinc instead
- Audio api for sound effects etc
- Document, Document, Document!
o fix GTK Doc set up with index, grouping etc
- Glitz integration ?
\ No newline at end of file
#! /bin/sh
gtkdocize || exit 1
autoreconf -v --install || exit 1
./configure --enable-maintainer-mode "$@"
2006-05-27 Emmanuele Bassi <ebassi@openedhand.com>
* python/clutter-base.defs: Make static functions appear like
package methods, e.g.: clutter_main() is clutter.main() and
not clutter.clutter_main(). Changed functions are:
C name Python name
- clutter_main - clutter.main
- clutter_stage - clutter.stage
- clutter_want_debug - clutter.want_debug
- clutter_redraw - clutter.redraw
- clutter_threads_enter - clutter.threads_enter
- clutter_threads_leave - clutter.threads_leave
* python/clutter.override: Ignore all X11 and GL related
functions, as we don't have type definitions for them; fix typos
and cut-and-paste errors; make the threads_enter and main static
function use the pygobject threading facilities.
* Makefile.am: Rework the build system. The defs files have been
split in two: clutter-base-types.def for the type declarations
and clutter-base.defs for the methods and functions. The python
glue code depends on two auto-generated files: clutter.defs and
clutter-types.defs; these two files includes the clutter-base
files. If the API changes, run "make update-defs": it will
create a "clutter-api.defs" which should be hand-edited and
the new sections added to the clutter-base files. This is needed
because we do some mangling of the namespace and static functions
names, so we can't rely on the h2defs generator.
2006-05-27 Emmanuele Bassi <ebassi@openedhand.com>
API coverage:
- global functions: 71.43% (10/14)
- methods: 95.40% (83/87)
* python/clutter.override: Implement bindings for the missing
ClutterTexture methods:
- get_base_size
- get_n_tiles
- get_x_tile_detail
- get_y_tile_detail
* python/clutter.override: Implement the ClutterGroup.add_many
method.
2006-05-26 Emmanuele Bassi <ebassi@openedhand.com>
* python/clutter-base.defs:
* python/clutter-base-types.defs:
* python/clutter.override: Fix ClutterGeometry bindings;
implement ClutterElementBox bindings.
* python/Makefile.am: Use variables instead of hard-coded
file names.
SUBDIRS =
if ENABLE_PYTHON
SUBDIRS += python
endif
AUTOMAKE_OPTIONS = 1.7
CLEANFILES =
EXTRA_DIST =
CLUTTER_DEFS = clutter-base.defs
CLUTTER_TYPES_DEFS = clutter-base-types.defs
CREATEDEFS = $(PYTHON) createdefs.py
CLUTTER_OVERRIDES = clutter.override
CLEANFILES += \
clutter.defs \
clutter-types.defs
EXTRA_DIST += \
$(CLUTTER_DEFS) \
$(CLUTTER_TYPES_DEFS) \
$(CLUTTER_OVERRIDES)
clutter.defs: $(CLUTTER_DEFS)
@echo "*** Creating clutter.defs" && \
echo ";; -*- scheme -*-" > gen-cdefs && \
echo ";; THIS FILE IS AUTOGENERATED" >> gen-cdefs && \
for p in $(CLUTTER_DEFS); do \
echo "(include \"$$p\")" >> gen-cdefs; \
done && \
(cmp -s gen-cdefs clutter.defs || cp gen-cdefs clutter.defs) && \
rm -f gen-cdefs
clutter.defs: Makefile
clutter-types.defs: $(CLUTTER_TYPES_DEFS)
@echo "*** Creating clutter-types.defs" && \
echo ";; -*- scheme -*-" > gen-ctdefs && \
echo ";; THIS FILE IS AUTOGENERATED" >> gen-ctdefs && \
for p in $(CLUTTER_TYPES_DEFS); do \
echo "(include \"$$p\")" >> gen-ctdefs; \
done && \
(cmp -s gen-ctdefs clutter-types.defs || cp gen-ctdefs clutter-types.defs) && \
rm -f gen-ctdefs
clutter-types.defs: Makefile
clutter-pyglue.c: clutter.defs clutter-types.defs $(CLUTTER_OVERRIDES)
$(PYGTK_CODEGEN) \
--register $(PYGTK_DEFSDIR)/gdk-types.defs \
--register $(PYGTK_DEFSDIR)/gtk-types.defs \
--register $(PYGTK_DEFSDIR)/pango-types.defs \
--register clutter-types.defs \
--override $(CLUTTER_OVERRIDES) \
--prefix clutter \
clutter.defs > gen-$@ && \
(cmp -s $@ gen-$@ || cp gen-$@ $@) && \
rm -f gen-$@
CLEANFILES += clutter-pyglue.c
pythondir = $(libdir)/python${PY_VER}/site-packages
python_LTLIBRARIES = clutter.la
INCLUDES = $(PYTHON_CFLAGS) $(PYGTK_CFLAGS) -I$(top_srcdir) $(CLUTTER_CFLAGS)
clutter_la_DEPENDENCIES = cluttermodule.c clutter-pyglue.c
clutter_la_SOURCES = clutter-pyglue.c cluttermodule.c
clutter_la_LIBADD = $(PYTHON_LIBS) $(PYGTK_LIBS) \
$(top_builddir)/clutter/libclutter-@CLUTTER_MAJORMINOR@.la
clutter_la_LDFLAGS = -module avoid-version -export-symbols-regex initclutter
# Run this to update the API and then copy then newly generated
# definitions into clutter-base.defs and clutter-base-types.defs;
# it's manual, as my might do some name mangling for static
# methods.
update-defs:
$(PYTHON) $(PYGTK_CODEGENDIR)/h2def.py -v \
$(top_srcdir)/clutter/clutter-keysyms.h \
$(top_srcdir)/clutter/clutter-timeline.h \
$(top_srcdir)/clutter/clutter-main.h \
$(top_srcdir)/clutter/clutter-event.h \
$(top_srcdir)/clutter/clutter-element.h \
$(top_srcdir)/clutter/clutter-rectangle.h \
$(top_srcdir)/clutter/clutter-texture.h \
$(top_srcdir)/clutter/clutter-color.h \
$(top_srcdir)/clutter/clutter-clone-texture.h \
$(top_srcdir)/clutter/clutter-video-texture.h \
$(top_srcdir)/clutter/clutter-label.h \
$(top_srcdir)/clutter/clutter-group.h \
$(top_srcdir)/clutter/clutter-stage.h \
$(top_srcdir)/clutter/clutter-enum-types.h \
> gen-cdefs && \
(cmp -s gen-cdefs clutter-api.def || cp gen-cdefs clutter-api.def) && \
rm -f gen-cdefs
;; -*- scheme -*-
;;
;; Try and keep everything sorted
;;
;; Boxed types
(define-boxed ElementBox
(in-module "Clutter")
(c-name "ClutterElementBox")
(gtype-id "CLUTTER_TYPE_ELEMENT_BOX")
(fields
'("gint" "x1")
'("gint" "y1")
'("gint" "x2")
'("gint" "y2")
)
)
(define-boxed Geometry
(in-module "Clutter")
(c-name "ClutterGeometry")
(gtype-id "CLUTTER_TYPE_GEOMETRY")
(fields
'("gint" "x")
'("gint" "y")
'("gint" "width")
'("gint" "height")
)
)
;; Enumerations and flags ...
(define-flags ElementTransform
(in-module "Clutter")
(c-name "ClutterElementTransform")
(gtype-id "CLUTTER_TYPE_ELEMENT_TRANSFORM")
(values
'("x" "CLUTTER_ELEMENT_MIRROR_X")
'("y" "CLUTTER_ELEMENT_MIRROR_Y")
)
)
(define-flags ElementFlags
(in-module "Clutter")
(c-name "ClutterElementFlags")
(gtype-id "CLUTTER_TYPE_ELEMENT_FLAGS")
(values
'("mapped" "CLUTTER_ELEMENT_MAPPED")
'("realized" "CLUTTER_ELEMENT_REALIZED")
)
)
(define-enum EventType
(in-module "Clutter")
(c-name "ClutterEventType")
(gtype-id "CLUTTER_TYPE_EVENT_TYPE")
(values
'("key-press" "CLUTTER_KEY_PRESS")
'("key-release" "CLUTTER_KEY_RELEASE")
'("motion" "CLUTTER_MOTION")
'("button-press" "CLUTTER_BUTTON_PRESS")
'("2button-press" "CLUTTER_2BUTTON_PRESS")
'("button-release" "CLUTTER_BUTTON_RELEASE")
)
)
(define-enum VideoTextureAspectRatio
(in-module "Clutter")
(c-name "ClutterVideoTextureAspectRatio")
(gtype-id "CLUTTER_TYPE_VIDEO_TEXTURE_ASPECT_RATIO")
(values
'("auto" "CLUTTER_VIDEO_TEXTURE_AUTO")
'("square" "CLUTTER_VIDEO_TEXTURE_SQUARE")
'("fourbythree" "CLUTTER_VIDEO_TEXTURE_FOURBYTHREE")
'("anamorphic" "CLUTTER_VIDEO_TEXTURE_ANAMORPHIC")
'("dvb" "CLUTTER_VIDEO_TEXTURE_DVB")
)
)
(define-enum VideoTextureError
(in-module "Clutter")
(c-name "ClutterVideoTextureError")
(gtype-id "CLUTTER_TYPE_VIDEO_TEXTURE_ERROR")
(values
'("audio-plugin" "CLUTTER_VIDEO_TEXTURE_ERROR_AUDIO_PLUGIN")
'("no-plugin-for-file" "CLUTTER_VIDEO_TEXTURE_ERROR_NO_PLUGIN_FOR_FILE")
'("video-plugin" "CLUTTER_VIDEO_TEXTURE_ERROR_VIDEO_PLUGIN")
'("audio-busy" "CLUTTER_VIDEO_TEXTURE_ERROR_AUDIO_BUSY")
'("broken-file" "CLUTTER_VIDEO_TEXTURE_ERROR_BROKEN_FILE")
'("file-generic" "CLUTTER_VIDEO_TEXTURE_ERROR_FILE_GENERIC")
'("file-permission" "CLUTTER_VIDEO_TEXTURE_ERROR_FILE_PERMISSION")
'("file-encrypted" "CLUTTER_VIDEO_TEXTURE_ERROR_FILE_ENCRYPTED")
'("file-not-found" "CLUTTER_VIDEO_TEXTURE_ERROR_FILE_NOT_FOUND")
'("dvd-encrypted" "CLUTTER_VIDEO_TEXTURE_ERROR_DVD_ENCRYPTED")
'("invalid-device" "CLUTTER_VIDEO_TEXTURE_ERROR_INVALID_DEVICE")
'("unknown-host" "CLUTTER_VIDEO_TEXTURE_ERROR_UNKNOWN_HOST")
'("network-unreachable" "CLUTTER_VIDEO_TEXTURE_ERROR_NETWORK_UNREACHABLE")
'("connection-refused" "CLUTTER_VIDEO_TEXTURE_ERROR_CONNECTION_REFUSED")
'("unvalid-location" "CLUTTER_VIDEO_TEXTURE_ERROR_UNVALID_LOCATION")
'("generic" "CLUTTER_VIDEO_TEXTURE_ERROR_GENERIC")
'("codec-not-handled" "CLUTTER_VIDEO_TEXTURE_ERROR_CODEC_NOT_HANDLED")
'("audio-only" "CLUTTER_VIDEO_TEXTURE_ERROR_AUDIO_ONLY")
'("cannot-capture" "CLUTTER_VIDEO_TEXTURE_ERROR_CANNOT_CAPTURE")
'("read-error" "CLUTTER_VIDEO_TEXTURE_ERROR_READ_ERROR")
'("plugin-load" "CLUTTER_VIDEO_TEXTURE_ERROR_PLUGIN_LOAD")
'("still-image" "CLUTTER_VIDEO_TEXTURE_ERROR_STILL_IMAGE")
'("empty-file" "CLUTTER_VIDEO_TEXTURE_ERROR_EMPTY_FILE")
)
)
(define-enum VideoTextureMetadataType
(in-module "Clutter")
(c-name "ClutterVideoTextureMetadataType")
(gtype-id "CLUTTER_TYPE_VIDEO_TEXTURE_METADATA_TYPE")
(values
'("title" "CLUTTER_INFO_TITLE")
'("artist" "CLUTTER_INFO_ARTIST")
'("year" "CLUTTER_INFO_YEAR")
'("album" "CLUTTER_INFO_ALBUM")
'("duration" "CLUTTER_INFO_DURATION")
'("track-number" "CLUTTER_INFO_TRACK_NUMBER")
'("has-video" "CLUTTER_INFO_HAS_VIDEO")
'("dimension-x" "CLUTTER_INFO_DIMENSION_X")
'("dimension-y" "CLUTTER_INFO_DIMENSION_Y")
'("video-bitrate" "CLUTTER_INFO_VIDEO_BITRATE")
'("video-codec" "CLUTTER_INFO_VIDEO_CODEC")
'("fps" "CLUTTER_INFO_FPS")
'("has-audio" "CLUTTER_INFO_HAS_AUDIO")
'("audio-bitrate" "CLUTTER_INFO_AUDIO_BITRATE")
'("audio-codec" "CLUTTER_INFO_AUDIO_CODEC")
)
)
;; Objects
(define-object Element
(in-module "Clutter")
(parent "GObject")
(c-name "ClutterElement")
(gtype-id "CLUTTER_TYPE_ELEMENT")
)
(define-object CloneTexture
(in-module "Clutter")
(parent "ClutterElement")
(c-name "ClutterCloneTexture")
(gtype-id "CLUTTER_TYPE_CLONE_TEXTURE")
)
(define-object Group
(in-module "Clutter")
(parent "ClutterElement")
(c-name "ClutterGroup")
(gtype-id "CLUTTER_TYPE_GROUP")
)
(define-object Rectangle
(in-module "Clutter")
(parent "ClutterElement")
(c-name "ClutterRectangle")
(gtype-id "CLUTTER_TYPE_RECTANGLE")
)
(define-object Stage
(in-module "Clutter")
(parent "ClutterGroup")
(c-name "ClutterStage")
(gtype-id "CLUTTER_TYPE_STAGE")
)
(define-object Texture
(in-module "Clutter")
(parent "ClutterElement")
(c-name "ClutterTexture")
(gtype-id "CLUTTER_TYPE_TEXTURE")
)
(define-object Label
(in-module "Clutter")
(parent "ClutterTexture")
(c-name "ClutterLabel")
(gtype-id "CLUTTER_TYPE_LABEL")
)
(define-object Timeline
(in-module "Clutter")
(parent "GObject")
(c-name "ClutterTimeline")
(gtype-id "CLUTTER_TYPE_TIMELINE")
)
(define-object VideoTexture
(in-module "Clutter")
(parent "ClutterTexture")
(c-name "ClutterVideoTexture")
(gtype-id "CLUTTER_TYPE_VIDEO_TEXTURE")
)
;; Pointers
;; Unsupported
This diff is collapsed.
/* -*- C -*- */
%%
headers
#define NO_IMPORT_PYGOBJECT
#include "pygobject.h"
#include <clutter/clutter-keysyms.h>
#include <clutter/clutter-event.h>
#include <clutter/clutter-main.h>
#include <clutter/clutter-timeline.h>
#include <clutter/clutter-stage.h>
#include <clutter/clutter-color.h>
#include <clutter/clutter-element.h>
#include <clutter/clutter-rectangle.h>
#include <clutter/clutter-group.h>
#include <clutter/clutter-texture.h>
#include <clutter/clutter-clone-texture.h>
#include <clutter/clutter-video-texture.h>
#include <clutter/clutter-label.h>
#include <clutter/clutter-util.h>
#include <clutter/clutter-enum-types.h>
%%
modulename clutter
%%
import gobject.GObject as PyGObject_Type
import gtk.gdk.Pixbuf as PyGdkPixbuf_Type
%%
ignore
clutter_video_texture_error_quark
clutter_group_add_many_valist
clutter_stage_get_xwindow
clutter_init
clutter_xdisplay
clutter_root_xwindow
clutter_gl_context
%%
ignore-glob
*_get_type
%%
override clutter_geometry_new kwargs
static int
_wrap_clutter_geometry_new (PyGBoxed *self, PyObject *args, PyObject *kwargs)
{
static char *kwlist[] = { "x", "y", "width", "height", NULL };
ClutterGeometry geom = { 0, 0, 0, 0 };
if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"|iiii:ClutterGeometry.__init__",
kwlist,
&(geom.x), &(geom.y),
&(geom.width), &(geom.height)))
return -1;
self->boxed = g_boxed_copy (CLUTTER_TYPE_GEOMETRY, &geom);
self->free_on_dealloc = TRUE;
self->gtype = CLUTTER_TYPE_GEOMETRY;
return 0;
}
%%
override-slot ClutterGeometry.tp_as_sequence
static int
_wrap_clutter_geometry_length (PyGBoxed *self)
{
return 4;
}
static PyObject *
_wrap_clutter_geometry_getitem(PyGBoxed *self, int pos)
{
ClutterGeometry *geom;
if (pos < 0)
pos += 4;
if (pos < 0 || pos >= 4) {
PyErr_SetString(PyExc_IndexError, "index out of range");
return NULL;
}
geom = pyg_boxed_get (self, ClutterGeometry);
switch (pos) {
case 0: return PyInt_FromLong (geom->x);
case 1: return PyInt_FromLong (geom->y);
case 2: return PyInt_FromLong (geom->width);
case 3: return PyInt_FromLong (geom->height);
default:
g_assert_not_reached();
return NULL;
}
}
static int
_wrap_clutter_geometry_setitem (PyGBoxed *self, int pos, PyObject *value)
{
ClutterGeometry *geom;
gint val;
if (pos < 0)
pos += 4;
if (pos < 0 || pos >= 4) {
PyErr_SetString(PyExc_IndexError, "index out of range");
return -1;
}
geom = pyg_boxed_get (self, ClutterGeometry);
val = PyInt_AsLong (value);
if (PyErr_Occurred ())
return -1;
switch(pos) {
case 0: geom->x = val; break;
case 1: geom->y = val; break;
case 2: geom->width = val; break;
case 3: geom->height = val; break;
default:
g_assert_not_reached();
return -1;
}
return 0;
}
static PySequenceMethods _wrap_clutter_geometry_tp_as_sequence = {
(inquiry) _wrap_clutter_geometry_length,
(binaryfunc) 0,
(intargfunc) 0,
(intargfunc) _wrap_clutter_geometry_getitem,
(intintargfunc) 0,
(intobjargproc) _wrap_clutter_geometry_setitem,
(intintobjargproc) 0
};
%%
override-attr ClutterGeometry.x
static int
_wrap_clutter_geomtry__set_x (PyGBoxed *self, PyObject *value, void *closure)
{
gint val;
val = PyInt_AsLong (value);
if (PyErr_Occurred ())
return -1;
pyg_boxed_get (self, ClutterGeometry)->x = val;
return 0;
}
%%
override-attr ClutterGeometry.y
static int
_wrap_clutter_geometry__set_y (PyGBoxed *self, PyObject *value, void *closure)
{
gint val;
val = PyInt_AsLong (value);
if (PyErr_Occurred ())
return -1;
pyg_boxed_get (self, ClutterGeometry)->y = val;
return 0;
}
%%
override-attr ClutterGeometry.width
static int
_wrap_clutter_geometry__set_width (PyGBoxed *self, PyObject *value, void *closure)
{
gint val;
val = PyInt_AsLong (value);
if (PyErr_Occurred ())
return -1;
pyg_boxed_get(self, ClutterGeometry)->width = val;
return 0;
}
%%
override-attr ClutterGeometry.height
static int
_wrap_clutter_geometry__set_height (PyGBoxed *self, PyObject *value, void *closure)
{
gint val;
val = PyInt_AsLong (value);
if (PyErr_Occurred ())
return -1;
pyg_boxed_get (self, ClutterGeometry)->height = val;
return 0;
}
%%
override clutter_element_box_new kwargs
static int
_wrap_clutter_element_box_new (PyGBoxed *self, PyObject *args, PyObject *kwargs)
{
static char *kwlist[] = { "x1", "y1", "x2", "y2", NULL };
ClutterElementBox box = { 0, 0, 0, 0 };
if (!PyArg_ParseTupleAndKeywords(args, kwargs,
"|iiii:ClutterElementBox.__init__",
kwlist,
&(box.x1), &(box.y1),
&(box.x2), &(box.y2)))
return -1;
self->boxed = g_boxed_copy (CLUTTER_TYPE_ELEMENT_BOX, &box);
self->free_on_dealloc = TRUE;
self->gtype = CLUTTER_TYPE_ELEMENT_BOX;
return 0;
}
%%
override-slot ClutterElementBox.tp_as_sequence
static int
_wrap_clutter_element_box_length (PyGBoxed *self)
{
return 4;
}
static PyObject *
_wrap_clutter_element_box_getitem(PyGBoxed *self, int pos)
{
ClutterElementBox *box;
if (pos < 0)
pos += 4;
if (pos < 0 || pos >= 4) {
PyErr_SetString(PyExc_IndexError, "index out of range");
return NULL;
}
box = pyg_boxed_get (self, ClutterElementBox);
switch (pos) {
case 0: return PyInt_FromLong (box->x1);
case 1: return PyInt_FromLong (box->y1);
case 2: return PyInt_FromLong (box->x2);
case 3: return PyInt_FromLong (box->y2);
default:
g_assert_not_reached();
return NULL;
}
}
static int
_wrap_clutter_element_box_setitem (PyGBoxed *self, int pos, PyObject *value)
{
ClutterElementBox *box;
gint val;
if (pos < 0)
pos += 4;
if (pos < 0 || pos >= 4) {
PyErr_SetString(PyExc_IndexError, "index out of range");