diff options
Diffstat (limited to 'gobject/pygobject-private.h')
-rw-r--r-- | gobject/pygobject-private.h | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/gobject/pygobject-private.h b/gobject/pygobject-private.h new file mode 100644 index 0000000..2a09eed --- /dev/null +++ b/gobject/pygobject-private.h @@ -0,0 +1,229 @@ +#ifndef _PYGOBJECT_PRIVATE_H_ +#define _PYGOBJECT_PRIVATE_H_ + +#ifdef _PYGOBJECT_H_ +# error "include pygobject.h or pygobject-private.h, but not both" +#endif + +#define _INSIDE_PYGOBJECT_ +#include "pygobject.h" + +#include "pyglib-python-compat.h" + +#define PYGOBJECT_REGISTER_GTYPE(d, type, name, gtype) \ + { \ + PyObject *o; \ + PYGLIB_REGISTER_TYPE(d, type, name); \ + PyDict_SetItemString(type.tp_dict, "__gtype__", \ + o=pyg_type_wrapper_new(gtype)); \ + Py_DECREF(o); \ +} + +/* from gobjectmodule.c */ +extern struct _PyGObject_Functions pygobject_api_functions; +#define pyg_block_threads() G_STMT_START { \ + if (pygobject_api_functions.block_threads != NULL) \ + (* pygobject_api_functions.block_threads)(); \ + } G_STMT_END +#define pyg_unblock_threads() G_STMT_START { \ + if (pygobject_api_functions.unblock_threads != NULL) \ + (* pygobject_api_functions.unblock_threads)(); \ + } G_STMT_END + +#define pyg_threads_enabled (pygobject_api_functions.threads_enabled) + + +#define pyg_gil_state_ensure() (pygobject_api_functions.threads_enabled? (PyGILState_Ensure()) : 0) +#define pyg_gil_state_release(state) G_STMT_START { \ + if (pygobject_api_functions.threads_enabled) \ + PyGILState_Release(state); \ + } G_STMT_END + +#define pyg_begin_allow_threads \ + G_STMT_START { \ + PyThreadState *_save = NULL; \ + if (pygobject_api_functions.threads_enabled) \ + _save = PyEval_SaveThread(); +#define pyg_end_allow_threads \ + if (pygobject_api_functions.threads_enabled) \ + PyEval_RestoreThread(_save); \ + } G_STMT_END + + +#ifndef Py_CLEAR /* since Python 2.4 */ +# define Py_CLEAR(op) \ + do { \ + if (op) { \ + PyObject *tmp = (PyObject *)(op); \ + (op) = NULL; \ + Py_DECREF(tmp); \ + } \ + } while (0) +#endif + +extern GType PY_TYPE_OBJECT; + +extern GQuark pygboxed_type_key; +extern GQuark pygboxed_marshal_key; +extern GQuark pygenum_class_key; +extern GQuark pygflags_class_key; +extern GQuark pyginterface_type_key; +extern GQuark pyginterface_info_key; +extern GQuark pygobject_class_init_key; +extern GQuark pygobject_class_key; +extern GQuark pygobject_wrapper_key; +extern GQuark pygpointer_class_key; +extern GQuark pygobject_has_updated_constructor_key; +extern GQuark pygobject_instance_data_key; + +void pygobject_data_free (PyGObjectData *data); +void pyg_destroy_notify (gpointer user_data); +gboolean pyg_handler_marshal (gpointer user_data); +gboolean pyg_error_check (GError **error); +int pygobject_constructv (PyGObject *self, + guint n_parameters, + GParameter *parameters); +int pygobject_construct (PyGObject *self, + const char *first_property_name, + ...); +void pyg_set_object_has_new_constructor (GType gtype); + +PyObject *pyg_integer_richcompare(PyObject *v, + PyObject *w, + int op); + +gboolean pyg_gerror_exception_check(GError **error); + +/* from pygtype.h */ +extern PyTypeObject PyGTypeWrapper_Type; + +PyObject *pyg_type_wrapper_new (GType type); +GType pyg_type_from_object (PyObject *obj); + +gint pyg_enum_get_value (GType enum_type, PyObject *obj, gint *val); +gint pyg_flags_get_value (GType flag_type, PyObject *obj, gint *val); +int pyg_pyobj_to_unichar_conv (PyObject* py_obj, void* ptr); + +typedef PyObject *(* fromvaluefunc)(const GValue *value); +typedef int (*tovaluefunc)(GValue *value, PyObject *obj); + +void pyg_register_gtype_custom(GType gtype, + fromvaluefunc from_func, + tovaluefunc to_func); +int pyg_value_from_pyobject(GValue *value, PyObject *obj); +PyObject *pyg_value_as_pyobject(const GValue *value, gboolean copy_boxed); +int pyg_param_gvalue_from_pyobject(GValue* value, + PyObject* py_obj, + const GParamSpec* pspec); +PyObject *pyg_param_gvalue_as_pyobject(const GValue* gvalue, + gboolean copy_boxed, + const GParamSpec* pspec); + +GClosure *pyg_closure_new(PyObject *callback, PyObject *extra_args, PyObject *swap_data); +void pyg_closure_set_exception_handler(GClosure *closure, + PyClosureExceptionHandler handler); +GClosure *pyg_signal_class_closure_get(void); +GClosure *gclosure_from_pyfunc(PyGObject *object, PyObject *func); + +PyObject *pyg_object_descr_doc_get(void); +void pygobject_object_register_types(PyObject *d); + +extern PyTypeObject *PyGObject_MetaType; + +/* from pygobject.h */ +extern PyTypeObject PyGObject_Type; +extern PyTypeObject PyGProps_Type; +extern PyTypeObject PyGPropsDescr_Type; +extern PyTypeObject PyGPropsIter_Type; + + /* Data that belongs to the GObject instance, not the Python wrapper */ +struct _PyGObjectData { + PyTypeObject *type; /* wrapper type for this instance */ + GSList *closures; +}; + +void pygobject_register_class (PyObject *dict, + const gchar *type_name, + GType gtype, PyTypeObject *type, + PyObject *bases); +void pygobject_register_wrapper (PyObject *self); +PyObject * pygobject_new (GObject *obj); +PyObject * pygobject_new_full (GObject *obj, gboolean sink, gpointer g_class); +void pygobject_sink (GObject *obj); +PyTypeObject *pygobject_lookup_class (GType gtype); +void pygobject_watch_closure (PyObject *self, GClosure *closure); +void pygobject_register_sinkfunc(GType type, + void (* sinkfunc)(GObject *object)); +int pyg_type_register (PyTypeObject *class, + const gchar *type_name); + +/* from pygboxed.c */ +extern PyTypeObject PyGBoxed_Type; + +void pyg_register_boxed (PyObject *dict, const gchar *class_name, + GType boxed_type, PyTypeObject *type); +PyObject * pyg_boxed_new (GType boxed_type, gpointer boxed, + gboolean copy_boxed, gboolean own_ref); + +extern PyTypeObject PyGPointer_Type; + +void pyg_register_pointer (PyObject *dict, const gchar *class_name, + GType pointer_type, PyTypeObject *type); +PyObject * pyg_pointer_new (GType pointer_type, gpointer pointer); + +const gchar * pyg_constant_strip_prefix(const gchar *name, const gchar *strip_prefix); + +/* pygflags */ +typedef struct { + _PyLongObject parent; + GType gtype; +} PyGFlags; + +extern PyTypeObject PyGFlags_Type; + +#define PyGFlags_Check(x) (g_type_is_a(((PyGFlags*)x)->gtype, G_TYPE_FLAGS)) + +extern PyObject * pyg_flags_add (PyObject * module, + const char * type_name, + const char * strip_prefix, + GType gtype); +extern PyObject * pyg_flags_from_gtype (GType gtype, + int value); + +/* pygenum */ +#define PyGEnum_Check(x) (g_type_is_a(((PyGFlags*)x)->gtype, G_TYPE_ENUM)) + +typedef struct { + _PyLongObject parent; + GType gtype; +} PyGEnum; + +extern PyTypeObject PyGEnum_Type; + +extern PyObject * pyg_enum_add (PyObject * module, + const char * type_name, + const char * strip_prefix, + GType gtype); +extern PyObject * pyg_enum_from_gtype (GType gtype, + int value); + +/* pygtype.c */ +extern GHashTable *custom_type_registration; +void pyg_type_register_custom_callback(const gchar *type_name, + PyGTypeRegistrationFunction callback, + gpointer data); +PyTypeObject * pyg_type_get_custom(const gchar *name); +GType _pyg_type_from_name(const gchar *name); + +/* pygobject.c */ +extern PyTypeObject PyGObjectWeakRef_Type; + +static inline PyGObjectData * +pyg_object_peek_inst_data(GObject *obj) +{ + return ((PyGObjectData *) + g_object_get_qdata(obj, pygobject_instance_data_key)); +} + + +#endif |