summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Henstridge <james@daa.com.au>2001-06-23 10:15:48 +0000
committerJames Henstridge <jamesh@src.gnome.org>2001-06-23 10:15:48 +0000
commitab2a613ead9844b28a47157f50823f9bfab00321 (patch)
treecb34512dd883d8ae8549b4a9324c478668957bfc
parent0612a60ce2a068bebd5d28908aa9fb5959d7d410 (diff)
downloadpygtk-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--ChangeLog20
-rw-r--r--codegen/argtypes.py93
-rw-r--r--examples/pygtk-demo/demos/buttonbox.py4
-rw-r--r--examples/pygtk-demo/pygtk-demo.py6
-rw-r--r--gobject/gobjectmodule.c12
-rw-r--r--gobject/pygobject.h5
-rw-r--r--gobjectmodule.c12
-rw-r--r--gtk/gtk.override37
-rw-r--r--gtk/gtkmodule.c1
-rw-r--r--gtk/gtkobject-support.c22
-rw-r--r--gtk/pygtk.h7
-rw-r--r--pygobject.h5
12 files changed, 129 insertions, 95 deletions
diff --git a/ChangeLog b/ChangeLog
index 92e93dfc..ecae0861 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)