/* -*- Mode: C; c-basic-offset: 4 -*- */
#ifndef _PYGTK_H_
#define _PYGTK_H_
#include <Python.h>
#include <gtk/gtk.h>
struct _PyGtk_FunctionStruct {
char *pygtkVersion;
gboolean fatalExceptions;
void (* blockThreads)(void);
void (* unblockThreads)(void);
GtkDestroyNotify destroyNotify;
GtkCallbackMarshal callbackMarshal;
PyObject *(* argsAsTuple)(int nparams, GtkArg *args);
int (* argsFromSequence)(GtkArg *args, int nparams, PyObject *seq);
int (* argFromPyObject)(GtkArg *arg, PyObject *obj);
PyObject *(* argAsPyObject)(GtkArg *arg);
void (* retFromPyObject)(GtkArg *ret, PyObject *obj);
PyObject *(* retAsPyObject)(GtkArg *ret);
GtkArg *(* dictAsGtkArgs)(PyObject *dict, GtkType type, gint *nargs);
void (* registerBoxed)(GtkType boxed_type,
PyObject *(*from_func)(gpointer boxed),
int (*to_func)(gpointer *boxed, PyObject *obj));
gint (* enum_get_value)(GtkType enum_type, PyObject *obj, int *val);
gint (* flag_get_value)(GtkType enum_type, PyObject *obj, int *val);
PyTypeObject *gtk_type;
PyObject *(* gtk_new)(GtkObject *obj);
PyTypeObject *gtkAccelGroup_type;
PyObject *(*gtkAccelGroup_new)(GtkAccelGroup *ag);
PyTypeObject *gtkStyle_type;
PyObject *(* gtkStyle_new)(GtkStyle *style);
PyTypeObject *gdkFont_type;
PyObject *(* gdkFont_new)(GdkFont *font);
PyTypeObject *gdkColor_type;
PyObject *(* gdkColor_new)(GdkColor *colour);
PyTypeObject *gdkEvent_type;
PyObject *(* gdkEvent_new)(GdkEvent *event);
PyTypeObject *gdkWindow_type;
PyObject *(* gdkWindow_new)(GdkWindow *win);
PyTypeObject *gdkGC_type;
PyObject *(* gdkGC_new)(GdkGC *gc);
PyTypeObject *gdkColormap_type;
PyObject *(* gdkColormap_new)(GdkColormap *colourmap);
PyTypeObject *gdkDragContext_type;
PyObject *(* gdkDragContext_new)(GdkDragContext *ctx);
PyTypeObject *gtkSelectionData_type;
PyObject *(* gtkSelectionData_new)(GtkSelectionData *data);
PyTypeObject *gdkAtom_type;
PyObject *(* gdkAtom_new)(GdkAtom atom);
PyTypeObject *gdkCursor_type;
PyObject *(* gdkCursor_new)(GdkCursor *cursor);
PyTypeObject *gtkCTreeNode_type;
PyObject *(* gtkCTreeNode_new)(GtkCTreeNode *node);
};
/* structure definitions for the various object types in PyGTK */
typedef struct {
PyObject_HEAD
GtkObject *obj;
} PyGtk_Object;
typedef struct {
PyObject_HEAD
GtkAccelGroup *obj;
} PyGtkAccelGroup_Object;
typedef struct {
PyObject_HEAD
GtkStyle *obj;
} PyGtkStyle_Object;
typedef struct {
PyObject_HEAD
GdkFont *obj;
} PyGdkFont_Object;
typedef struct {
PyObject_HEAD
GdkColor obj;
} PyGdkColor_Object;
typedef struct {
PyObject_HEAD
GdkEvent *obj;
PyObject *attrs;
} PyGdkEvent_Object;
typedef struct {
PyObject_HEAD
GdkWindow *obj;
} PyGdkWindow_Object;
typedef struct {
PyObject_HEAD
GdkGC *obj;
} PyGdkGC_Object;
typedef struct {
PyObject_HEAD
GdkColormap *obj;
} PyGdkColormap_Object;
typedef struct {
PyObject_HEAD
GdkDragContext *obj;
} PyGdkDragContext_Object;
typedef struct {
PyObject_HEAD
GtkSelectionData *obj;
} PyGtkSelectionData_Object;
typedef struct {
PyObject_HEAD
gchar *name;
GdkAtom atom;
} PyGdkAtom_Object;
typedef struct {
PyObject_HEAD
GdkCursor *obj;
} PyGdkCursor_Object;
typedef struct {
PyObject_HEAD
GtkCTreeNode *node;
} PyGtkCTreeNode_Object;
/* routines to get the C object value out of the PyObject wrapper */
#define PyGtk_Get(v) (((PyGtk_Object *)(v))->obj)
#define PyGtkAccelGroup_Get(v) (((PyGtkAccelGroup_Object *)(v))->obj)
#define PyGtkStyle_Get(v) (((PyGtkStyle_Object *)(v))->obj)
#define PyGdkFont_Get(v) (((PyGdkFont_Object *)(v))->obj)
#define PyGdkColor_Get(v) (&((PyGdkColor_Object *)(v))->obj)
#define PyGdkEvent_Get(v) (((PyGdkEvent_Object *)(v))->obj)
#define PyGdkWindow_Get(v) (((PyGdkWindow_Object *)(v))->obj)
#define PyGdkGC_Get(v) (((PyGdkGC_Object *)(v))->obj)
#define PyGdkColormap_Get(v) (((PyGdkColormap_Object *)(v))->obj)
#define PyGdkDragContext_Get(v) (((PyGdkDragContext_Object *)(v))->obj)
#define PyGtkSelectionData_Get(v) (((PyGtkSelectionData_Object *)(v))->obj)
#define PyGdkAtom_Get(v) (((PyGdkAtom_Object *)(v))->atom)
#define PyGdkCursor_Get(v) (((PyGdkCursor_Object *)(v))->obj)
#define PyGtkCTreeNode_Get(v) (((PyGtkCTreeNode_Object *)(v))->node)
/* this section is dependent on whether we are being included from gtkmodule.c
* or not. A similar source level interface should be provided in both
* instances. */
#ifdef _INSIDE_PYGTK_
staticforward PyTypeObject PyGtk_Type;
staticforward PyTypeObject PyGtkAccelGroup_Type;
staticforward PyTypeObject PyGtkStyle_Type;
staticforward PyTypeObject PyGdkFont_Type;
staticforward PyTypeObject PyGdkColor_Type;
staticforward PyTypeObject PyGdkEvent_Type;
staticforward PyTypeObject PyGdkWindow_Type;
staticforward PyTypeObject PyGdkGC_Type;
staticforward PyTypeObject PyGdkColormap_Type;
staticforward PyTypeObject PyGdkDragContext_Type;
staticforward PyTypeObject PyGtkSelectionData_Type;
staticforward PyTypeObject PyGdkAtom_Type;
staticforward PyTypeObject PyGdkCursor_Type;
staticforward PyTypeObject PyGtkCTreeNode_Type;
/* check the type of a PyObject */
#define PyGtk_Check(v) ((v)->ob_type == &PyGtk_Type)
#define PyGtkAccelGroup_Check(v) ((v)->ob_type == &PyGtkAccelGroup_Type)
#define PyGtkStyle_Check(v) ((v)->ob_type == &PyGtkStyle_Type)
#define PyGdkFont_Check(v) ((v)->ob_type == &PyGdkFont_Type)
#define PyGdkColor_Check(v) ((v)->ob_type == &PyGdkColor_Type)
#define PyGdkEvent_Check(v) ((v)->ob_type == &PyGdkEvent_Type)
#define PyGdkWindow_Check(v) ((v)->ob_type == &PyGdkWindow_Type)
#define PyGdkGC_Check(v) ((v)->ob_type == &PyGdkGC_Type)
#define PyGdkColormap_Check(v) ((v)->ob_type == &PyGdkColormap_Type)
#define PyGdkDragContext_Check(v) ((v)->ob_type == &PyGdkDragContext_Type)
#define PyGtkSelectionData_Check(v) ((v)->ob_type == &PyGtkSelectionData_Type)
#define PyGdkAtom_Check(v) ((v)->ob_type == &PyGdkAtom_Type)
#define PyGdkCursor_Check(v) ((v)->ob_type == &PyGdkCursor_Type)
#define PyGtkCTreeNode_Check(v) ((v)->ob_type == &PyGtkCTreeNode_Type)
/* constructors for PyObject wrappers ... */
static PyObject *PyGtk_New(GtkObject *obj);
static PyObject *PyGtkAccelGroup_New(GtkAccelGroup *obj);
static PyObject *PyGtkStyle_New(GtkStyle *style);
static PyObject *PyGdkFont_New(GdkFont *font);
static PyObject *PyGdkColor_New(GdkColor *colour);
static PyObject *PyGdkEvent_New(GdkEvent *event);
static PyObject *PyGdkWindow_New(GdkWindow *window);
static PyObject *PyGdkGC_New(GdkGC *gc);
static PyObject *PyGdkColormap_New(GdkColormap *colourmap);
static PyObject *PyGdkDragContext_New(GdkDragContext *ctx);
static PyObject *PyGtkSelectionData_New(GtkSelectionData *data);
static PyObject *PyGdkAtom_New(GdkAtom atom);
static PyObject *PyGdkCursor_New(GdkCursor *cursor);
static PyObject *PyGtkCTreeNode_New(GtkCTreeNode *node);
/* miscelaneous functions */
static void PyGtk_BlockThreads(void);
static void PyGtk_UnblockThreads(void);
static void PyGtk_DestroyNotify(gpointer data);
static void PyGtk_CallbackMarshal(GtkObject *o, gpointer d, guint nargs,
GtkArg *args);
static PyObject *GtkArgs_AsTuple(int nparams, GtkArg *args);
static int GtkArgs_FromSequence(GtkArg *args, int nparams, PyObject *seq);
static int GtkArg_FromPyObject(GtkArg *arg, PyObject *obj);
static PyObject *GtkArg_AsPyObject(GtkArg *arg);
static void GtkRet_FromPyObject(GtkArg *ret, PyObject *py_ret);
static PyObject *GtkRet_AsPyObject(GtkArg *arg);
static GtkArg *PyDict_AsGtkArgs(PyObject *dict, GtkType type, gint *nargs);
static void PyGtk_RegisterBoxed(GtkType boxed_type,
PyObject *(*fromarg)(gpointer boxed),
int (*toarg)(gpointer *boxed, PyObject *obj));
gint PyGtkEnum_get_value(GtkType enum_type, PyObject *obj, int *val);
gint PyGtkFlag_get_value(GtkType enum_type, PyObject *obj, int *val);
static gboolean PyGtk_FatalExceptions = FALSE;
#else
/* for multi file extensions, define one of these in all but the main file
* of the module */
#if defined(NO_IMPORT) || defined(NO_IMPORT_PYGTK)
extern struct _PyGtk_FunctionStruct *_PyGtk_API;
#else
struct _PyGtk_FunctionStruct *_PyGtk_API;
#endif
/* type objects */
#define PyGtk_Type *(_PyGtk_API->gtk_type)
#define PyGtkAccelGroup_Type *(_PyGtk_API->gtkAccelGroup_type)
#define PyGtkStyle_Type *(_PyGtk_API->gtkStyle_type)
#define PyGdkFont_Type *(_PyGtk_API->gdkFont_type)
#define PyGdkColor_Type *(_PyGtk_API->gdkColor_type)
#define PyGdkEvent_Type *(_PyGtk_API->gdkEvent_type)
#define PyGdkWindow_Type *(_PyGtk_API->gdkWindow_type)
#define PyGdkGC_Type *(_PyGtk_API->gdkGC_type)
#define PyGdkColormap_Type *(_PyGtk_API->gdkColormap_type)
#define PyGdkDragContext_Type *(_PyGtk_API->gdkDragContext_type)
#define PyGtkSelectionData_Type *(_PyGtk_API->gtkSelectionData_type)
#define PyGdkAtom_Type *(_PyGtk_API->gdkAtom_type)
#define PyGdkCursor_Type *(_PyGtk_API->gdkCursor_type)
#define PyGtkCTreeNode_Type *(_PyGtk_API->gtkCTreeNode_type)
/* type checking routines */
#define PyGtk_Check(v) ((v)->ob_type == _PyGtk_API->gtk_type)
#define PyGtkAccelGroup_Check(v) ((v)->ob_type == _PyGtk_API->gtkAccelGroup_type)
#define PyGtkStyle_Check(v) ((v)->ob_type == _PyGtk_API->gtkStyle_type)
#define PyGdkFont_Check(v) ((v)->ob_type == _PyGtk_API->gdkFont_type)
#define PyGdkColor_Check(v) ((v)->ob_type == _PyGtk_API->gdkColor_type)
#define PyGdkEvent_Check(v) ((v)->ob_type == _PyGtk_API->gdkEvent_type)
#define PyGdkWindow_Check(v) ((v)->ob_type == _PyGtk_API->gdkWindow_type)
#define PyGdkGC_Check(v) ((v)->ob_type == _PyGtk_API->gdkGC_type)
#define PyGdkColormap_Check(v) ((v)->ob_type == _PyGtk_API->gdkColormap_type)
#define PyGdkDragContext_Check(v) ((v)->ob_type == _PyGtk_API->gdkDragContext_type)
#define PyGtkSelectionData_Check(v) ((v)->ob_type == _PyGtk_API->gtkSelectionData_type)
#define PyGdkAtom_Check(v) ((v)->ob_type == _PyGtk_API->gdkAtom_type)
#define PyGdkCursor_Check(v) ((v)->ob_type == _PyGtk_API->gdkCursor_type)
#define PyGtkCTreeNode_Check(v) ((v)->ob_type == _PyGtk_API->GtkCTreeNode_type)
/* type objects */
#define PyGtk_New (_PyGtk_API->gtk_new)
#define PyGtkAccelGroup_New (_PyGtk_API->gtkAccelGroup_new)
#define PyGtkStyle_New (_PyGtk_API->gtkStyle_new)
#define PyGdkFont_New (_PyGtk_API->gdkFont_new)
#define PyGdkColor_New (_PyGtk_API->gdkColor_new)
#define PyGdkEvent_New (_PyGtk_API->gdkEvent_new)
#define PyGdkWindow_New (_PyGtk_API->gdkWindow_new)
#define PyGdkGC_New (_PyGtk_API->gdkGC_new)
#define PyGdkColormap_New (_PyGtk_API->gdkColormap_new)
#define PyGdkDragContext_New (_PyGtk_API->gdkDragContext_new)
#define PyGtkSelectionData_New (_PyGtk_API->gtkSelectionData_new)
#define PyGdkAtom_New (_PyGtk_API->gdkAtom_new)
#define PyGdkCursor_New (_PyGtk_API->gdkCursor_new)
#define PyGtkCTreeNode_New (_PyGtk_API->gtkCTreeNode_new)
/* miscelaneous other functions */
#define PyGtk_BlockThreads (_PyGtk_API->blockThreads)
#define PyGtk_UnblockThreads (_PyGtk_API->unblockThreads)
#define PyGtk_DestroyNotify (_PyGtk_API->destroyNotify)
#define PyGtk_CallbackMarshal (_PyGtk_API->callbackMarshal)
#define GtkArgs_AsTuple (_PyGtk_API->argsAsTuple)
#define GtkArgs_FromSequence (_PyGtk_API->argsFromSequence)
#define GtkArg_FromPyObject (_PyGtk_API->argFromPyObject)
#define GtkArg_AsPyObject (_PyGtk_API->argAsPyObject)
#define GtkRet_FromPyObject (_PyGtk_API->retFromPyObject)
#define GtkRet_AsPyObject (_PyGtk_API->retAsPyObject)
#define PyDict_AsGtkArgs (_PyGtk_API->dictAsGtkArgs)
#define PyGtk_RegisterBoxed (_PyGtk_API->registerBoxed)
#define PyGtkEnum_get_value (_PyGtk_API->enum_get_value)
#define PyGtkFlag_get_value (_PyGtk_API->flag_get_value)
/* some variables */
#define PyGtk_FatalExceptions (_PyGtk_API->fatalExceptions)
#define PYGTK_VERSION (_PyGtk_API->pygtkVersion)
/* a function to initialise the pygtk functions */
#define init_pygtk() { \
PyObject *pygtk = PyImport_ImportModule("_gtk"); \
if (pygtk != NULL) { \
PyObject *module_dict = PyModule_GetDict(pygtk); \
PyObject *cobject = PyDict_GetItemString(module_dict, "_PyGtk_API"); \
if (PyCObject_Check(cobject)) \
_PyGtk_API = PyCObject_AsVoidPtr(cobject); \
else { \
Py_FatalError("could not find _PyGtk_API object"); \
return; \
} \
} else { \
Py_FatalError("could not import _gtk"); \
return; \
} \
}
#endif
#endif /* !_PYGTK_H_ */