diff options
| author | James Henstridge <james@daa.com.au> | 2001-06-23 10:15:48 +0000 |
|---|---|---|
| committer | James Henstridge <jamesh@src.gnome.org> | 2001-06-23 10:15:48 +0000 |
| commit | ab2a613ead9844b28a47157f50823f9bfab00321 (patch) | |
| tree | cb34512dd883d8ae8549b4a9324c478668957bfc | |
| parent | 0612a60ce2a068bebd5d28908aa9fb5959d7d410 (diff) | |
| download | pygtk-ab2a613ead9844b28a47157f50823f9bfab00321.tar.gz | |
more fixups to use pyg_type_from_object.
2001-06-23 James Henstridge <james@daa.com.au>
* gobjectmodule.c (pyg_signal_new): more fixups to use
pyg_type_from_object.
* gtk/gtk.override (_wrap_gtk_accel_group_new): don't use
PyGtkAccelGroup_New (not sure why I am fixing this -- will change
soon anyway).
(_wrap_gtk_tree_store_set_value): use pyg_type_from_object here.
(_wrap_gtk_list_store_set_value): same here.
* codegen/argtypes.py (CustomBoxedArg): rename from BoxedArg.
(BoxedArg): new code for standardised PyGBoxed handling.
(ArgMatcher.register_custom_boxed): rename from register_boxed
(ArgMatcher.register_boxed): new function for PyGBoxed types.
(arg): use ArgMatcher.register_boxed to register GtkAccelGroup.
* pygobject.h (pyg_boxed_check): change macro to check against the
typecode, rather than python wrapper type.
| -rw-r--r-- | ChangeLog | 20 | ||||
| -rw-r--r-- | codegen/argtypes.py | 93 | ||||
| -rw-r--r-- | examples/pygtk-demo/demos/buttonbox.py | 4 | ||||
| -rw-r--r-- | examples/pygtk-demo/pygtk-demo.py | 6 | ||||
| -rw-r--r-- | gobject/gobjectmodule.c | 12 | ||||
| -rw-r--r-- | gobject/pygobject.h | 5 | ||||
| -rw-r--r-- | gobjectmodule.c | 12 | ||||
| -rw-r--r-- | gtk/gtk.override | 37 | ||||
| -rw-r--r-- | gtk/gtkmodule.c | 1 | ||||
| -rw-r--r-- | gtk/gtkobject-support.c | 22 | ||||
| -rw-r--r-- | gtk/pygtk.h | 7 | ||||
| -rw-r--r-- | pygobject.h | 5 |
12 files changed, 129 insertions, 95 deletions
@@ -1,3 +1,23 @@ +2001-06-23 James Henstridge <james@daa.com.au> + + * gobjectmodule.c (pyg_signal_new): more fixups to use + pyg_type_from_object. + + * gtk/gtk.override (_wrap_gtk_accel_group_new): don't use + PyGtkAccelGroup_New (not sure why I am fixing this -- will change + soon anyway). + (_wrap_gtk_tree_store_set_value): use pyg_type_from_object here. + (_wrap_gtk_list_store_set_value): same here. + + * codegen/argtypes.py (CustomBoxedArg): rename from BoxedArg. + (BoxedArg): new code for standardised PyGBoxed handling. + (ArgMatcher.register_custom_boxed): rename from register_boxed + (ArgMatcher.register_boxed): new function for PyGBoxed types. + (arg): use ArgMatcher.register_boxed to register GtkAccelGroup. + + * pygobject.h (pyg_boxed_check): change macro to check against the + typecode, rather than python wrapper type. + 2001-06-22 James Henstridge <james@daa.com.au> * codegen/argtypes.py (GTypeArg.write_param): new arg type for diff --git a/codegen/argtypes.py b/codegen/argtypes.py index 1d9f9da4..4af40556 100644 --- a/codegen/argtypes.py +++ b/codegen/argtypes.py @@ -348,11 +348,52 @@ class ObjectArg(ArgType): arglist.append('%s(%s->obj)' % (self.cast, pname)) return 'O' def write_return(self, ptype, varlist): - return ' /* PyGtk_New handles NULL checking */\n' + \ + return ' /* pygobject_new handles NULL checking */\n' + \ ' return pygobject_new((GObject *)%(func)s);' class BoxedArg(ArgType): # haven't done support for default args. Is it needed? + check = ' if (pyg_boxed_check(py_%(name)s, %(typecode)s))\n' + \ + ' %(name)s = pyg_boxed_get(py_%(name)s, %(typename)s);\n' + \ + ' else {\n' + \ + ' PyErr_SetString(PyExc_TypeError, "%(name)s should be a %(typename)s");\n' + \ + ' return NULL;\n' + \ + ' }\n' + null = ' if (pyg_boxed_check(py_%(name)s, %(typecode)s))\n' + \ + ' %(name)s = pyg_boxed_get(py_%(name)s, %(typename)s);\n' + \ + ' else if (py_%(name)s != Py_None) {\n' + \ + ' PyErr_SetString(PyExc_TypeError, "%(name)s should be a %(typename)s");\n' + \ + ' return NULL;\n' + \ + ' }\n' + def __init__(self, ptype): + self.typename = ptype + self.typecode = _enum_name(ptype) + def write_param(self, ptype, pname, pdflt, pnull, varlist, parselist, + extracode, arglist): + if pnull: + varlist.add(ptype[:-1], '*' + pname + ' = NULL') + varlist.add('PyObject', '*py_' + pname + ' = Py_None') + parselist.append('&py_' + pname) + extracode.append(self.null % {'name': pname, + 'typename': self.typename, + 'typecode': self.typecode}) + arglist.append(pname) + return 'O' + else: + varlist.add(ptype[:-1], '*' + pname + ' = NULL') + varlist.add('PyObject', '*py_' + pname) + parselist.append('&py_' + pname) + extracode.append(self.check % {'name': pname, + 'typename': self.typename, + 'typecode': self.typecode}) + arglist.append(pname) + return 'O' + def write_return(self, ptype, varlist): + return ' /* pyg_boxed_new handles NULL checking */\n' + \ + ' return pyg_boxed_new(' + self.typecode + ', %(func)s, TRUE, TRUE);' + +class CustomBoxedArg(ArgType): + # haven't done support for default args. Is it needed? null = ' if (%(check)s(py_%(name)s))\n' + \ ' %(name)s = %(get)s(py_%(name)s);\n' + \ ' else if (py_%(name)s != Py_None) {\n' + \ @@ -473,8 +514,10 @@ class ArgMatcher: # hack to handle GdkBitmap synonym. self.register('GdkBitmap', oa) self.register('GdkBitmap*', oa) - def register_boxed(self, ptype, pytype, getter, new): - self.register(ptype+'*', BoxedArg(ptype, pytype, getter, new)) + def register_boxed(self, ptype): + self.register(ptype+'*', BoxedArg(ptype)) + def register_custom_boxed(self, ptype, pytype, getter, new): + self.register(ptype+'*', CustomBoxedArg(ptype, pytype, getter, new)) def get(self, ptype): return self.argtypes[ptype] @@ -538,29 +581,29 @@ matcher.register('FILE*', arg) # enums, flags, objects -matcher.register_boxed('GtkAccelGroup', 'PyGtkAccelGroup_Type', - 'PyGtkAccelGroup_Get', 'PyGtkAccelGroup_New') -matcher.register_boxed('GdkFont', 'PyGdkFont_Type', - 'PyGdkFont_Get', 'PyGdkFont_New') -matcher.register_boxed('GdkColor', 'PyGdkColor_Type', - 'PyGdkColor_Get', 'PyGdkColor_New') -matcher.register_boxed('GdkEvent', 'PyGdkEvent_Type', - 'PyGdkEvent_Get', 'PyGdkEvent_New') -matcher.register_boxed('GdkVisual', 'PyGdkVisual_Type', - 'PyGdkVisual_Get', 'PyGdkVisual_New') -matcher.register_boxed('GtkSelectionData', 'PyGtkSelectionData_Type', - 'PyGtkSelectionData_Get', 'PyGtkSelectionData_New') -matcher.register_boxed('GdkCursor', 'PyGdkCursor_Type', - 'PyGdkCursor_Get', 'PyGdkCursor_New') -matcher.register_boxed('GtkCTreeNode', 'PyGtkCTreeNode_Type', - 'PyGtkCTreeNode_Get', 'PyGtkCTreeNode_New') -matcher.register_boxed('GdkDevice', 'PyGdkDevice_Type', - 'PyGdkDevice_Get', 'PyGdkDevice_New') -matcher.register_boxed('GtkTextIter', 'PyGtkTextIter_Type', - 'PyGtkTextIter_Get', 'PyGtkTextIter_New') +matcher.register_boxed('GtkAccelGroup') +matcher.register_custom_boxed('GdkFont', 'PyGdkFont_Type', + 'PyGdkFont_Get', 'PyGdkFont_New') +matcher.register_custom_boxed('GdkColor', 'PyGdkColor_Type', + 'PyGdkColor_Get', 'PyGdkColor_New') +matcher.register_custom_boxed('GdkEvent', 'PyGdkEvent_Type', + 'PyGdkEvent_Get', 'PyGdkEvent_New') +matcher.register_custom_boxed('GdkVisual', 'PyGdkVisual_Type', + 'PyGdkVisual_Get', 'PyGdkVisual_New') +matcher.register_custom_boxed('GtkSelectionData', 'PyGtkSelectionData_Type', + 'PyGtkSelectionData_Get', + 'PyGtkSelectionData_New') +matcher.register_custom_boxed('GdkCursor', 'PyGdkCursor_Type', + 'PyGdkCursor_Get', 'PyGdkCursor_New') +matcher.register_custom_boxed('GtkCTreeNode', 'PyGtkCTreeNode_Type', + 'PyGtkCTreeNode_Get', 'PyGtkCTreeNode_New') +matcher.register_custom_boxed('GdkDevice', 'PyGdkDevice_Type', + 'PyGdkDevice_Get', 'PyGdkDevice_New') +matcher.register_custom_boxed('GtkTextIter', 'PyGtkTextIter_Type', + 'PyGtkTextIter_Get', 'PyGtkTextIter_New') matcher.register('const-GtkTextIter*', matcher.get('GtkTextIter*')) -matcher.register_boxed('GtkTreeIter', 'PyGtkTreeIter_Type', - 'PyGtkTreeIter_Get', 'PyGtkTreeIter_New') +matcher.register_custom_boxed('GtkTreeIter', 'PyGtkTreeIter_Type', + 'PyGtkTreeIter_Get', 'PyGtkTreeIter_New') matcher.register('const-GtkTreeIter*', matcher.get('GtkTreeIter*')) matcher.register('GdkAtom', AtomArg()) diff --git a/examples/pygtk-demo/demos/buttonbox.py b/examples/pygtk-demo/demos/buttonbox.py index 43968270..17cb55b6 100644 --- a/examples/pygtk-demo/demos/buttonbox.py +++ b/examples/pygtk-demo/demos/buttonbox.py @@ -22,10 +22,10 @@ def create_bbox(horizontal=gtk.TRUE, title=None, spacing=0, bbox.set_spacing(spacing) frame.add(bbox) - button = gtk.GtkButton(stock='gtk-button-ok') + button = gtk.GtkButton(stock='gtk-ok') bbox.add(button) - button = gtk.GtkButton(stock='gtk-button-cancel') + button = gtk.GtkButton(stock='gtk-cancel') bbox.add(button) button = gtk.GtkButton(stock='gtk-help') diff --git a/examples/pygtk-demo/pygtk-demo.py b/examples/pygtk-demo/pygtk-demo.py index 45c1bf8b..85193e76 100644 --- a/examples/pygtk-demo/pygtk-demo.py +++ b/examples/pygtk-demo/pygtk-demo.py @@ -117,9 +117,11 @@ def main(): notebook = gtk.GtkNotebook() vbox.pack_start(notebook, expand=gtk.TRUE) scrolled_window, info_buffer = create_text(gtk.FALSE) - notebook.append_page(scrolled_window, gtk.GtkLabel('_Info')) + l = gtk.GtkLabel('') ; l.set_text_with_mnemonic('_Info') + notebook.append_page(scrolled_window, l) scrolled_window, source_buffer = create_text(gtk.TRUE) - notebook.append_page(scrolled_window, gtk.GtkLabel('_Source')) + l = gtk.GtkLabel('') ; l.set_text_with_mnemonic('_Source') + notebook.append_page(scrolled_window, l) tag = info_buffer.create_tag('title') tag.set_property('font', 'Sans 18') diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c index 9e715635..d8ab589f 100644 --- a/gobject/gobjectmodule.c +++ b/gobject/gobjectmodule.c @@ -1897,7 +1897,7 @@ pyg_signal_new(PyObject *self, PyObject *args) PyObject *py_type; GSignalFlags signal_flags; GType return_type; - PyObject *py_param_types; + PyObject *py_return_type, *py_param_types; GType instance_type = 0; guint n_params, i; @@ -1906,12 +1906,15 @@ pyg_signal_new(PyObject *self, PyObject *args) guint signal_id; if (!PyArg_ParseTuple(args, "sOiiO:gobject.signal_new", &signal_name, - &py_type, &signal_flags, &return_type, + &py_type, &signal_flags, &py_return_type, &py_param_types)) return NULL; instance_type = pyg_type_from_object(py_type); if (!instance_type) return NULL; + return_type = pyg_type_from_object(py_return_type); + if (!return_type) + return NULL; if (!PySequence_Check(py_param_types)) { PyErr_SetString(PyExc_TypeError, "argument 5 must be a sequence of GType codes"); @@ -1922,8 +1925,8 @@ pyg_signal_new(PyObject *self, PyObject *args) for (i = 0; i < n_params; i++) { PyObject *item = PySequence_GetItem(py_param_types, i); - param_types[i] = (GType) PyInt_AsLong(item); - if (PyErr_Occurred()) { + param_types[i] = pyg_type_from_object(item); + if (param_types[i] == 0) { PyErr_Clear(); Py_DECREF(item); PyErr_SetString(PyExc_TypeError, @@ -1974,6 +1977,7 @@ static struct _PyGObject_Functions functions = { pyg_register_interface, + &PyGBoxed_Type, pyg_register_boxed, pyg_boxed_new, }; diff --git a/gobject/pygobject.h b/gobject/pygobject.h index 271ba4dc..10a9bf47 100644 --- a/gobject/pygobject.h +++ b/gobject/pygobject.h @@ -26,7 +26,7 @@ typedef struct { } PyGBoxed; #define pyg_boxed_get(v,t) ((t *)((PyGBoxed *)(v))->boxed) -#define pyg_boxed_check(v,base) (ExtensionClassSubclassInstance_Check(v,base)) +#define pyg_boxed_check(v,typecode) (ExtensionClassSubclassInstance_Check(v, &PyGBoxed_Type) && ((PyGBoxed *)(v))->gtype == typecode) struct _PyGObject_Functions { void (* register_class)(PyObject *dict, const gchar *class_name, @@ -43,10 +43,12 @@ struct _PyGObject_Functions { int (* to_func)(GValue *value, PyObject *obj)); int (* value_from_pyobject)(GValue *value, PyObject *obj); PyObject *(* value_as_pyobject)(const GValue *value); + void (* register_interface)(PyObject *dict, const gchar *class_name, GType (* get_type)(void), PyExtensionClass *ec); + PyExtensionClass *boxed_type; void (* register_boxed)(PyObject *dict, const gchar *class_name, GType boxed_type, PyExtensionClass *ec); PyObject *(* boxed_new)(GType boxed_type, gpointer boxed, @@ -72,6 +74,7 @@ struct _PyGObject_Functions *_PyGObject_API; #define pyg_value_from_pyobject (_PyGObject_API->value_from_pyobject) #define pyg_value_as_pyobject (_PyGObject_API->value_as_pyobject) #define pyg_register_interface (_PyGObject_API->register_interface) +#define PyGBoxed_Type (*_PyGObject_API->boxed_type) #define pyg_register_boxed (_PyGObject_API->register_boxed) #define pyg_boxed_new (_PyGObject_API->boxed_new) diff --git a/gobjectmodule.c b/gobjectmodule.c index 9e715635..d8ab589f 100644 --- a/gobjectmodule.c +++ b/gobjectmodule.c @@ -1897,7 +1897,7 @@ pyg_signal_new(PyObject *self, PyObject *args) PyObject *py_type; GSignalFlags signal_flags; GType return_type; - PyObject *py_param_types; + PyObject *py_return_type, *py_param_types; GType instance_type = 0; guint n_params, i; @@ -1906,12 +1906,15 @@ pyg_signal_new(PyObject *self, PyObject *args) guint signal_id; if (!PyArg_ParseTuple(args, "sOiiO:gobject.signal_new", &signal_name, - &py_type, &signal_flags, &return_type, + &py_type, &signal_flags, &py_return_type, &py_param_types)) return NULL; instance_type = pyg_type_from_object(py_type); if (!instance_type) return NULL; + return_type = pyg_type_from_object(py_return_type); + if (!return_type) + return NULL; if (!PySequence_Check(py_param_types)) { PyErr_SetString(PyExc_TypeError, "argument 5 must be a sequence of GType codes"); @@ -1922,8 +1925,8 @@ pyg_signal_new(PyObject *self, PyObject *args) for (i = 0; i < n_params; i++) { PyObject *item = PySequence_GetItem(py_param_types, i); - param_types[i] = (GType) PyInt_AsLong(item); - if (PyErr_Occurred()) { + param_types[i] = pyg_type_from_object(item); + if (param_types[i] == 0) { PyErr_Clear(); Py_DECREF(item); PyErr_SetString(PyExc_TypeError, @@ -1974,6 +1977,7 @@ static struct _PyGObject_Functions functions = { pyg_register_interface, + &PyGBoxed_Type, pyg_register_boxed, pyg_boxed_new, }; diff --git a/gtk/gtk.override b/gtk/gtk.override index bb4843ff..bf35c541 100644 --- a/gtk/gtk.override +++ b/gtk/gtk.override @@ -683,15 +683,12 @@ static PyObject * _wrap_gtk_accel_group_new(PyGObject *self, PyObject *args) { GtkAccelGroup *accel_group; - PyObject *ret; if (!PyArg_ParseTuple(args, ":GtkAccelGroup.__init__")) return NULL; accel_group = gtk_accel_group_new(); - ret = PyGtkAccelGroup_New(accel_group); - gtk_accel_group_unref(accel_group); - return ret; + return pyg_boxed_new(GTK_TYPE_ACCEL_GROUP, accel_group, FALSE, TRUE); } %% override gtk_box_query_child_packing kwargs @@ -1647,20 +1644,10 @@ _wrap_gtk_list_store_new(PyGObject *self, PyObject *args) gtk_list_store_set_n_columns(ls, len); for (i = 0; i < len; i++) { PyObject *item = PyTuple_GetItem(args, i); - gint type; + GType type; - if (PyString_Check(item)) { - type = g_type_from_name(PyString_AsString(item)); - if (type == 0) { - PyErr_SetString(PyExc_TypeError, "GtkListStore.__init__ arguments must be valid type codes"); - g_object_unref(G_OBJECT(ls)); - return NULL; - } - } else - type = PyInt_AsLong(item); - if (PyErr_Occurred()) { - PyErr_Clear(); - PyErr_SetString(PyExc_TypeError, "GtkListStore.__init__ arguments must be valid type codes"); + type = pyg_type_from_object(item); + if (type == 0) { g_object_unref(G_OBJECT(ls)); return NULL; } @@ -1794,20 +1781,10 @@ _wrap_gtk_tree_store_new(PyGObject *self, PyObject *args) gtk_tree_store_set_n_columns(ts, len); for (i = 0; i < len; i++) { PyObject *item = PyTuple_GetItem(args, i); - gint type; + GType type; - if (PyString_Check(item)) { - type = g_type_from_name(PyString_AsString(item)); - if (type == 0) { - PyErr_SetString(PyExc_TypeError, "GtkTreeStore.__init__ arguments must be valid type codes"); - g_object_unref(G_OBJECT(ts)); - return NULL; - } - } else - type = PyInt_AsLong(item); - if (PyErr_Occurred()) { - PyErr_Clear(); - PyErr_SetString(PyExc_TypeError, "GtkTreeStore.__init__ arguments must be valid type codes"); + type = pyg_type_from_object(item); + if (type == 0) { g_object_unref(G_OBJECT(ts)); return NULL; } diff --git a/gtk/gtkmodule.c b/gtk/gtkmodule.c index 4ea30e0f..9c22318f 100644 --- a/gtk/gtkmodule.c +++ b/gtk/gtkmodule.c @@ -34,7 +34,6 @@ static struct _PyGtk_FunctionStruct functions = { pygtk_register_boxed, - &PyGtkAccelGroup_Type, NULL, &PyGdkFont_Type, PyGdkFont_New, &PyGdkColor_Type, PyGdkColor_New, &PyGdkEvent_Type, PyGdkEvent_New, diff --git a/gtk/gtkobject-support.c b/gtk/gtkobject-support.c index e5dc1c70..ba96678b 100644 --- a/gtk/gtkobject-support.c +++ b/gtk/gtkobject-support.c @@ -214,12 +214,7 @@ pygtk_arg_from_pyobject(GtkArg *arg, PyObject *obj) return -1; break; case GTK_TYPE_BOXED: - if (arg->type == GTK_TYPE_ACCEL_GROUP) { - if (PyGtkAccelGroup_Check(obj)) - GTK_VALUE_BOXED(*arg) = PyGtkAccelGroup_Get(obj); - else - return -1; - } else if (arg->type == GDK_TYPE_EVENT) { + if (arg->type == GDK_TYPE_EVENT) { if (PyGdkEvent_Check(obj)) GTK_VALUE_BOXED(*arg) = PyGdkEvent_Get(obj); else @@ -315,9 +310,7 @@ pygtk_arg_as_pyobject(GtkArg *arg) case GTK_TYPE_POINTER: return PyCObject_FromVoidPtr(GTK_VALUE_POINTER(*arg), NULL); case GTK_TYPE_BOXED: - if (arg->type == GTK_TYPE_ACCEL_GROUP) - return PyGtkAccelGroup_New(GTK_VALUE_BOXED(*arg)); - else if (arg->type == GDK_TYPE_EVENT) + if (arg->type == GDK_TYPE_EVENT) return PyGdkEvent_New(GTK_VALUE_BOXED(*arg)); else if (arg->type == GDK_TYPE_FONT) return PyGdkFont_New(GTK_VALUE_BOXED(*arg)); @@ -451,12 +444,7 @@ pygtk_ret_from_pyobject(GtkArg *ret, PyObject *py_ret) *GTK_RETLOC_OBJECT(*ret) = NULL; break; case GTK_TYPE_BOXED: - if (ret->type == GTK_TYPE_ACCEL_GROUP) { - if (PyGtkAccelGroup_Check(py_ret)) - *GTK_RETLOC_BOXED(*ret) = PyGtkAccelGroup_Get(py_ret); - else - *GTK_RETLOC_BOXED(*ret) = NULL; - } else if (ret->type == GDK_TYPE_EVENT) { + if (ret->type == GDK_TYPE_EVENT) { if (PyGdkEvent_Check(py_ret)) *GTK_RETLOC_BOXED(*ret) = PyGdkEvent_Get(py_ret); else @@ -545,9 +533,7 @@ pygtk_ret_as_pyobject(GtkArg *arg) case GTK_TYPE_POINTER: return PyCObject_FromVoidPtr(*GTK_RETLOC_POINTER(*arg), NULL); case GTK_TYPE_BOXED: - if (arg->type == GTK_TYPE_ACCEL_GROUP) - return PyGtkAccelGroup_New(*GTK_RETLOC_BOXED(*arg)); - else if (arg->type == GDK_TYPE_EVENT) + if (arg->type == GDK_TYPE_EVENT) return PyGdkEvent_New(*GTK_RETLOC_BOXED(*arg)); else if (arg->type == GDK_TYPE_FONT) return PyGdkFont_New(*GTK_RETLOC_BOXED(*arg)); diff --git a/gtk/pygtk.h b/gtk/pygtk.h index 32628c71..b985a5f6 100644 --- a/gtk/pygtk.h +++ b/gtk/pygtk.h @@ -29,9 +29,6 @@ struct _PyGtk_FunctionStruct { PyObject *(*from_func)(gpointer boxed), int (*to_func)(gpointer *boxed, PyObject *obj)); - PyTypeObject *gtkAccelGroup_type; - PyObject *(*gtkAccelGroup_new)(GtkAccelGroup *ag); - PyTypeObject *gdkFont_type; PyObject *(* gdkFont_new)(GdkFont *font); @@ -125,7 +122,6 @@ typedef struct { } PyGtkTreeIter_Object; /* routines to get the C object value out of the PyObject wrapper */ -#define PyGtkAccelGroup_Get(v) pyg_boxed_get((v), GtkAccelGroup) #define PyGdkFont_Get(v) (((PyGdkFont_Object *)(v))->obj) #define PyGdkColor_Get(v) (&((PyGdkColor_Object *)(v))->obj) #define PyGdkEvent_Get(v) (((PyGdkEvent_Object *)(v))->obj) @@ -152,7 +148,6 @@ struct _PyGtk_FunctionStruct *_PyGtk_API; #endif /* type objects */ -#define PyGtkAccelGroup_Type *(_PyGtk_API->gtkAccelGroup_type) #define PyGdkFont_Type *(_PyGtk_API->gdkFont_type) #define PyGdkColor_Type *(_PyGtk_API->gdkColor_type) #define PyGdkEvent_Type *(_PyGtk_API->gdkEvent_type) @@ -166,7 +161,6 @@ struct _PyGtk_FunctionStruct *_PyGtk_API; #define PyGtkTreeIter_Type *(_PyGtk_API->gtkTreeIter_type) /* type checking routines */ -#define PyGtkAccelGroup_Check(v) pyg_boxed_check((v), _PyGtk_API->gtkAccelGroup_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) @@ -180,7 +174,6 @@ struct _PyGtk_FunctionStruct *_PyGtk_API; #define PyGtkTreeIter_Check(v) ((v)->ob_type == _PyGtk_API->gtkTreeIter_type) /* type objects */ -#define PyGtkAccelGroup_New(ag) pyg_boxed_new(GTK_TYPE_ACCEL_GROUP, ag, TRUE, TRUE) #define PyGdkFont_New (_PyGtk_API->gdkFont_new) #define PyGdkColor_New (_PyGtk_API->gdkColor_new) #define PyGdkEvent_New (_PyGtk_API->gdkEvent_new) diff --git a/pygobject.h b/pygobject.h index 271ba4dc..10a9bf47 100644 --- a/pygobject.h +++ b/pygobject.h @@ -26,7 +26,7 @@ typedef struct { } PyGBoxed; #define pyg_boxed_get(v,t) ((t *)((PyGBoxed *)(v))->boxed) -#define pyg_boxed_check(v,base) (ExtensionClassSubclassInstance_Check(v,base)) +#define pyg_boxed_check(v,typecode) (ExtensionClassSubclassInstance_Check(v, &PyGBoxed_Type) && ((PyGBoxed *)(v))->gtype == typecode) struct _PyGObject_Functions { void (* register_class)(PyObject *dict, const gchar *class_name, @@ -43,10 +43,12 @@ struct _PyGObject_Functions { int (* to_func)(GValue *value, PyObject *obj)); int (* value_from_pyobject)(GValue *value, PyObject *obj); PyObject *(* value_as_pyobject)(const GValue *value); + void (* register_interface)(PyObject *dict, const gchar *class_name, GType (* get_type)(void), PyExtensionClass *ec); + PyExtensionClass *boxed_type; void (* register_boxed)(PyObject *dict, const gchar *class_name, GType boxed_type, PyExtensionClass *ec); PyObject *(* boxed_new)(GType boxed_type, gpointer boxed, @@ -72,6 +74,7 @@ struct _PyGObject_Functions *_PyGObject_API; #define pyg_value_from_pyobject (_PyGObject_API->value_from_pyobject) #define pyg_value_as_pyobject (_PyGObject_API->value_as_pyobject) #define pyg_register_interface (_PyGObject_API->register_interface) +#define PyGBoxed_Type (*_PyGObject_API->boxed_type) #define pyg_register_boxed (_PyGObject_API->register_boxed) #define pyg_boxed_new (_PyGObject_API->boxed_new) |
