summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog34
-rw-r--r--atk.override1
-rw-r--r--codegen/argtypes.py18
-rw-r--r--codegen/codegen.py215
-rw-r--r--codegen/override.py9
-rw-r--r--gtk/gdk.override4
-rw-r--r--gtk/gtk-types.defs4
-rw-r--r--gtk/gtk.override20
8 files changed, 196 insertions, 109 deletions
diff --git a/ChangeLog b/ChangeLog
index fa7fe438..d7bee3cc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,37 @@
+2002-03-16 James Henstridge <james@daa.com.au>
+
+ * atk.override (_wrap_atk_relation_new): remove unused variable.
+
+ * gtk/gtk-types.defs (Window): transient_parent field is a
+ GtkWindow, rather than a GtkWidget.
+
+ * gtk/gtk.override (_wrap_gtk_ctree_node_tp_getattr): same here.
+
+ * gtk/gdk.override (_wrap_gdk_event_tp_getattr): change to
+ "override-slot".
+
+ * codegen/codegen.py (slots_list): a list of slots that we allow
+ overriding of.
+ (typetmpl): add extra substs for some slots.
+ (write_class): add code that sets up the slot substitutions.
+ (interfacetypetmpl): add slot substitutions.
+ (boxedtmpl): add slot substitutions.
+ (write_interface): add code to set slots.
+ (write_interface): add code to set slots, and get rid of the old
+ getattr handling.
+
+ * codegen/override.py (Overrides.__parse_override): add support
+ for an "override-slot" section to overrides file for overriding a
+ slot in the PyTypeObject vtable.
+
+ * gtk/gtk.override (_wrap_gtk_selection_data_get_text): add an
+ override for this -- it was the only one correctly making use of
+
+ * codegen/argtypes.py (UCharArg.write_param): unimplement.
+ (guchar *) does not mean unicode, and often uchar returns are just
+ date (eg. pixbuf data). gtk_selection_data_get_text is the
+ exception.
+
2002-03-15 James Henstridge <james@daa.com.au>
* gtk/gdk.override (_wrap_gdk_colormap_alloc_color): new function
diff --git a/atk.override b/atk.override
index bd2e7008..47aff34b 100644
--- a/atk.override
+++ b/atk.override
@@ -19,7 +19,6 @@ _wrap_atk_relation_new (PyGObject *self, PyObject *args, PyObject *kwargs)
{
static char *kwlist[] = { "targets", "relationship", NULL };
AtkObject **targets;
- AtkRelation *ret;
int relationship, count, i;
PyObject *py_targets;
diff --git a/codegen/argtypes.py b/codegen/argtypes.py
index e0ea23d3..d6de0222 100644
--- a/codegen/argtypes.py
+++ b/codegen/argtypes.py
@@ -128,24 +128,6 @@ class UCharArg(ArgType):
info.add_parselist('s#', ['&' + pname, '&' + pname + '_len'],
[pname])
- def write_return(self, ptype, info):
- if ptype.startswith('const-'):
- info.varlist.add('const guchar', '*ret')
- info.codeafter.append(' if (ret)\n' +
- ' return PyUnicode_DeviceUTF8(ret, strlen(ret), "strict");\n'+
- ' Py_INCREF(Py_None);\n' +
- ' return Py_None;')
- else:
- # have to free result ...
- info.varlist.add('guchar', '*ret')
- info.codeafter.append(' if (ret) {\n' +
- ' PyObject *py_ret = PyUnicode_DecodeUTF8(ret, strlen(ret), "strict");\n' +
- ' g_free(ret);\n' +
- ' return py_ret;\n' +
- ' }\n' +
- ' Py_INCREF(Py_None);\n' +
- ' return Py_None;')
-
class CharArg(ArgType):
def write_param(self, ptype, pname, pdflt, pnull, info):
if pdflt:
diff --git a/codegen/codegen.py b/codegen/codegen.py
index 4c803bff..685658d9 100644
--- a/codegen/codegen.py
+++ b/codegen/codegen.py
@@ -49,6 +49,12 @@ class FileOutput:
'''resets line numbering to the original file'''
self.setline(self.lineno + 1, self.filename)
+# list of slots that we will override
+slots_list = ['tp_getattr', 'tp_setattr', 'tp_compare', 'tp_repr',
+ 'tp_as_number', 'tp_as_sequence', 'tp_as_mapping', 'tp_hash',
+ 'tp_call', 'tp_str', 'tp_richcompare', 'tp_iter',
+ 'tp_iternext', 'tp_descr_get', 'tp_descr_set']
+
# have to do return type processing
functmpl = ('static PyObject *\n'
'_wrap_%(cname)s(PyObject *self%(extraparams)s)\n'
@@ -124,16 +130,16 @@ typetmpl = """PyTypeObject Py%(class)s_Type = {
/* methods */
(destructor)0, /* tp_dealloc */
(printfunc)0, /* tp_print */
- (getattrfunc)0, /* tp_getattr */
- (setattrfunc)0, /* tp_setattr */
- (cmpfunc)0, /* tp_compare */
- (reprfunc)0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- (hashfunc)0, /* tp_hash */
- (ternaryfunc)0, /* tp_call */
- (reprfunc)0, /* tp_str */
+ (getattrfunc)%(tp_getattr)s, /* tp_getattr */
+ (setattrfunc)%(tp_setattr)s, /* tp_setattr */
+ (cmpfunc)%(tp_compare)s, /* tp_compare */
+ (reprfunc)%(tp_repr)s, /* tp_repr */
+ %(tp_as_number)s, /* tp_as_number */
+ %(tp_as_sequence)s, /* tp_as_sequence */
+ %(tp_as_mapping)s, /* tp_as_mapping */
+ (hashfunc)%(tp_hash)s, /* tp_hash */
+ (ternaryfunc)%(tp_call)s, /* tp_call */
+ (reprfunc)%(tp_str)s, /* tp_str */
(getattrofunc)0, /* tp_getattro */
(setattrofunc)0, /* tp_setattro */
0, /* tp_as_buffer */
@@ -141,17 +147,17 @@ typetmpl = """PyTypeObject Py%(class)s_Type = {
NULL, /* Documentation string */
(traverseproc)0, /* tp_traverse */
(inquiry)0, /* tp_clear */
- (richcmpfunc)0, /* tp_richcompare */
+ (richcmpfunc)%(tp_richcompare)s, /* tp_richcompare */
offsetof(PyGObject, weakreflist), /* tp_weaklistoffset */
- (getiterfunc)0, /* tp_iter */
- (iternextfunc)0, /* tp_iternext */
+ (getiterfunc)%(tp_iter)s, /* tp_iter */
+ (iternextfunc)%(tp_iternext)s, /* tp_iternext */
%(methods)s, /* tp_methods */
0, /* tp_members */
%(getsets)s, /* tp_getset */
NULL, /* tp_base */
NULL, /* tp_dict */
- (descrgetfunc)0, /* tp_descr_get */
- (descrsetfunc)0, /* tp_descr_set */
+ (descrgetfunc)%(tp_descr_get)s, /* tp_descr_get */
+ (descrsetfunc)%(tp_descr_set)s, /* tp_descr_set */
offsetof(PyGObject, inst_dict), /* tp_dictoffset */
(initproc)%(initfunc)s, /* tp_init */
};\n\n"""
@@ -165,16 +171,16 @@ interfacetypetmpl = """PyTypeObject Py%(class)s_Type = {
/* methods */
(destructor)0, /* tp_dealloc */
(printfunc)0, /* tp_print */
- (getattrfunc)0, /* tp_getattr */
- (setattrfunc)0, /* tp_setattr */
- (cmpfunc)0, /* tp_compare */
- (reprfunc)0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- (hashfunc)0, /* tp_hash */
- (ternaryfunc)0, /* tp_call */
- (reprfunc)0, /* tp_str */
+ (getattrfunc)%(tp_getattr)s, /* tp_getattr */
+ (setattrfunc)%(tp_setattr)s, /* tp_setattr */
+ (cmpfunc)%(tp_compare)s, /* tp_compare */
+ (reprfunc)%(tp_repr)s, /* tp_repr */
+ %(tp_as_number)s, /* tp_as_number */
+ %(tp_as_sequence)s, /* tp_as_sequence */
+ %(tp_as_mapping)s, /* tp_as_mapping */
+ (hashfunc)%(tp_hash)s, /* tp_hash */
+ (ternaryfunc)%(tp_call)s, /* tp_call */
+ (reprfunc)%(tp_str)s, /* tp_str */
(getattrofunc)0, /* tp_getattro */
(setattrofunc)0, /* tp_setattro */
0, /* tp_as_buffer */
@@ -182,17 +188,17 @@ interfacetypetmpl = """PyTypeObject Py%(class)s_Type = {
NULL, /* Documentation string */
(traverseproc)0, /* tp_traverse */
(inquiry)0, /* tp_clear */
- (richcmpfunc)0, /* tp_richcompare */
+ (richcmpfunc)%(tp_richcompare)s, /* tp_richcompare */
0, /* tp_weaklistoffset */
- (getiterfunc)0, /* tp_iter */
- (iternextfunc)0, /* tp_iternext */
+ (getiterfunc)%(tp_iter)s, /* tp_iter */
+ (iternextfunc)%(tp_iternext)s, /* tp_iternext */
%(methods)s, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
NULL, /* tp_base */
NULL, /* tp_dict */
- (descrgetfunc)0, /* tp_descr_get */
- (descrsetfunc)0, /* tp_descr_set */
+ (descrgetfunc)%(tp_descr_get)s, /* tp_descr_get */
+ (descrsetfunc)%(tp_descr_set)s, /* tp_descr_set */
0, /* tp_dictoffset */
(initproc)0, /* tp_init */
};\n\n"""
@@ -246,16 +252,16 @@ boxedtmpl = """PyTypeObject Py%(typename)s_Type = {
/* methods */
(destructor)0, /* tp_dealloc */
(printfunc)0, /* tp_print */
- (getattrfunc)%(getattr)s, /* tp_getattr */
- (setattrfunc)0, /* tp_setattr */
- (cmpfunc)0, /* tp_compare */
- (reprfunc)0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- (hashfunc)0, /* tp_hash */
- (ternaryfunc)0, /* tp_call */
- (reprfunc)0, /* tp_str */
+ (getattrfunc)%(tp_getattr)s, /* tp_getattr */
+ (setattrfunc)%(tp_setattr)s, /* tp_setattr */
+ (cmpfunc)%(tp_compare)s, /* tp_compare */
+ (reprfunc)%(tp_repr)s, /* tp_repr */
+ %(tp_as_number)s, /* tp_as_number */
+ %(tp_as_sequence)s, /* tp_as_sequence */
+ %(tp_as_mapping)s, /* tp_as_mapping */
+ (hashfunc)%(tp_hash)s, /* tp_hash */
+ (ternaryfunc)%(tp_call)s, /* tp_call */
+ (reprfunc)%(tp_str)s, /* tp_str */
(getattrofunc)0, /* tp_getattro */
(setattrofunc)0, /* tp_setattro */
0, /* tp_as_buffer */
@@ -263,17 +269,17 @@ boxedtmpl = """PyTypeObject Py%(typename)s_Type = {
NULL, /* Documentation string */
(traverseproc)0, /* tp_traverse */
(inquiry)0, /* tp_clear */
- (richcmpfunc)0, /* tp_richcompare */
+ (richcmpfunc)%(tp_richcompare)s, /* tp_richcompare */
0, /* tp_weaklistoffset */
- (getiterfunc)0, /* tp_iter */
- (iternextfunc)0, /* tp_iternext */
+ (getiterfunc)%(tp_iter)s, /* tp_iter */
+ (iternextfunc)%(tp_iternext)s, /* tp_iternext */
%(methods)s, /* tp_methods */
0, /* tp_members */
%(getsets)s, /* tp_getset */
NULL, /* tp_base */
NULL, /* tp_dict */
- (descrgetfunc)0, /* tp_descr_get */
- (descrsetfunc)0, /* tp_descr_set */
+ (descrgetfunc)%(tp_descr_get)s, /* tp_descr_get */
+ (descrsetfunc)%(tp_descr_set)s, /* tp_descr_set */
0, /* tp_dictoffset */
(initproc)%(initfunc)s, /* tp_init */
};\n\n"""
@@ -306,16 +312,16 @@ pointertmpl = """PyTypeObject Py%(typename)s_Type = {
/* methods */
(destructor)0, /* tp_dealloc */
(printfunc)0, /* tp_print */
- (getattrfunc)%(getattr)s, /* tp_getattr */
- (setattrfunc)0, /* tp_setattr */
- (cmpfunc)0, /* tp_compare */
- (reprfunc)0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- (hashfunc)0, /* tp_hash */
- (ternaryfunc)0, /* tp_call */
- (reprfunc)0, /* tp_str */
+ (getattrfunc)%(tp_getattr)s, /* tp_getattr */
+ (setattrfunc)%(tp_setattr)s, /* tp_setattr */
+ (cmpfunc)%(tp_compare)s, /* tp_compare */
+ (reprfunc)%(tp_repr)s, /* tp_repr */
+ %(tp_as_number)s, /* tp_as_number */
+ %(tp_as_sequence)s, /* tp_as_sequence */
+ %(tp_as_mapping)s, /* tp_as_mapping */
+ (hashfunc)%(tp_hash)s, /* tp_hash */
+ (ternaryfunc)%(tp_call)s, /* tp_call */
+ (reprfunc)%(tp_str)s, /* tp_str */
(getattrofunc)0, /* tp_getattro */
(setattrofunc)0, /* tp_setattro */
0, /* tp_as_buffer */
@@ -323,17 +329,17 @@ pointertmpl = """PyTypeObject Py%(typename)s_Type = {
NULL, /* Documentation string */
(traverseproc)0, /* tp_traverse */
(inquiry)0, /* tp_clear */
- (richcmpfunc)0, /* tp_richcompare */
+ (richcmpfunc)%(tp_richcompare)s, /* tp_richcompare */
0, /* tp_weaklistoffset */
- (getiterfunc)0, /* tp_iter */
- (iternextfunc)0, /* tp_iternext */
+ (getiterfunc)%(tp_iter)s, /* tp_iter */
+ (iternextfunc)%(tp_iternext)s, /* tp_iternext */
%(methods)s, /* tp_methods */
0, /* tp_members */
%(getsets)s, /* tp_getset */
NULL, /* tp_base */
NULL, /* tp_dict */
- (descrgetfunc)0, /* tp_descr_get */
- (descrsetfunc)0, /* tp_descr_set */
+ (descrgetfunc)%(tp_descr_get)s, /* tp_descr_get */
+ (descrsetfunc)%(tp_descr_set)s, /* tp_descr_set */
0, /* tp_dictoffset */
(initproc)%(initfunc)s, /* tp_init */
};\n\n"""
@@ -608,6 +614,21 @@ def write_class(parser, objobj, overrides, fp=sys.stdout):
}
dict['getsets'] = write_getsets(parser, objobj, castmacro, overrides, fp)
dict['methods'] = '_Py' + dict['class'] + '_methods'
+
+ # handle slots ...
+ for slot in slots_list:
+ slotname = '%s.%s' % (objobj.c_name, slot)
+ slotfunc = '_wrap_%s_%s' % (string.lower(castmacro), slot)
+ if overrides.slot_is_overriden(slotname):
+ lineno, filename = overrides.getstartline(slotname)
+ fp.setline(lineno, filename)
+ fp.write(overrides.slot_override(slotname))
+ fp.resetline()
+ fp.write('\n\n')
+ dict[slot] = slotfunc
+ else:
+ dict[slot] = '0'
+
fp.write(typetmpl % dict)
def write_interface(parser, interface, overrides, fp=sys.stdout):
@@ -645,9 +666,23 @@ def write_interface(parser, interface, overrides, fp=sys.stdout):
fp.write('};\n\n')
# write the type template
- dict = { 'class': interface.c_name, 'classname': interface.name,
- 'getattr': '0' }
+ dict = { 'class': interface.c_name, 'classname': interface.name }
dict['methods'] = '_Py' + dict['class'] + '_methods'
+
+ # handle slots ...
+ for slot in slots_list:
+ slotname = '%s.%s' % (interface.c_name, slot)
+ slotfunc = '_wrap_%s_%s' % (string.lower(castmacro), slot)
+ if overrides.slot_is_overriden(slotname):
+ lineno, filename = overrides.getstartline(slotname)
+ fp.setline(lineno, filename)
+ fp.write(overrides.slot_override(slotname))
+ fp.resetline()
+ fp.write('\n\n')
+ dict[slot] = slotfunc
+ else:
+ dict[slot] = '0'
+
fp.write(interfacetypetmpl % dict)
## boxed types ...
@@ -834,19 +869,25 @@ def write_boxed(parser, boxedobj, overrides, fp=sys.stdout):
# write the type template
dict = { 'typename': boxedobj.c_name, 'initfunc': initfunc }
- # handle getattr function
- funcname = string.lower(string.replace(boxedobj.typecode,
- '_TYPE_', '_', 1)) + \
- '_getattr'
- if overrides.is_overriden(funcname):
- fp.write(overrides.override(funcname))
- fp.write('\n\n')
- funcname = '_wrap_' + funcname
- else:
- funcname = '0'
- dict['getattr'] = funcname
dict['getsets'] = write_boxed_getsets(parser, boxedobj, overrides, fp)
dict['methods'] = '_Py' + dict['typename'] + '_methods'
+
+ # handle slots ...
+ for slot in slots_list:
+ slotname = '%s.%s' % (boxedobj.c_name, slot)
+ slotfunc = '_wrap_%s_%s' % \
+ (string.lower(string.replace(boxedobj.typecode,
+ '_TYPE_', '_', 1)), slot)
+ if overrides.slot_is_overriden(slotname):
+ lineno, filename = overrides.getstartline(slotname)
+ fp.setline(lineno, filename)
+ fp.write(overrides.slot_override(slotname))
+ fp.resetline()
+ fp.write('\n\n')
+ dict[slot] = slotfunc
+ else:
+ dict[slot] = '0'
+
fp.write(boxedtmpl % dict)
## pointer types ...
@@ -1028,19 +1069,25 @@ def write_pointer(parser, pointerobj, overrides, fp=sys.stdout):
# write the type template
dict = { 'typename': pointerobj.c_name, 'initfunc': initfunc }
- # handle getattr function
- funcname = string.lower(string.replace(pointerobj.typecode,
- '_TYPE_', '_', 1)) + \
- '_getattr'
- if overrides.is_overriden(funcname):
- fp.write(overrides.override(funcname))
- fp.write('\n\n')
- funcname = '_wrap_' + funcname
- else:
- funcname = '0'
- dict['getattr'] = funcname
dict['getsets'] = write_pointer_getsets(parser, pointerobj, overrides, fp)
dict['methods'] = '_Py' + dict['typename'] + '_methods'
+
+ # handle slots ...
+ for slot in slots_list:
+ slotname = '%s.%s' % (pointerobj.c_name, slot)
+ slotfunc = '_wrap_%s_%s' % \
+ (string.lower(string.replace(pointerobj.typecode,
+ '_TYPE_', '_', 1)), slot)
+ if overrides.slot_is_overriden(slotname):
+ lineno, filename = overrides.getstartline(slotname)
+ fp.setline(lineno, filename)
+ fp.write(overrides.slot_override(slotname))
+ fp.resetline()
+ fp.write('\n\n')
+ dict[slot] = slotfunc
+ else:
+ dict[slot] = '0'
+
fp.write(pointertmpl % dict)
diff --git a/codegen/override.py b/codegen/override.py
index e56d56cd..88b3a730 100644
--- a/codegen/override.py
+++ b/codegen/override.py
@@ -18,6 +18,7 @@ class Overrides:
self.noargs = {}
self.startlines = {}
self.override_attrs = {}
+ self.override_slots = {}
self.headers = ''
self.init = ''
self.imports = []
@@ -75,6 +76,10 @@ class Overrides:
attr = words[1]
self.override_attrs[attr] = rest
self.startlines[attr] = (startline + 1, filename)
+ elif words[0] == 'override-slot':
+ slot = words[1]
+ self.override_slots[slot] = rest
+ self.startlines[slot] = (startline + 1, filename)
elif words[0] == 'headers':
self.headers = '%s\n#line %d "%s"\n%s' % \
(self.headers, startline + 1, filename, rest)
@@ -108,6 +113,10 @@ class Overrides:
return self.override_attrs.has_key(attr)
def attr_override(self, attr):
return self.override_attrs[attr]
+ def slot_is_overriden(self, slot):
+ return self.override_slots.has_key(slot)
+ def slot_override(self, slot):
+ return self.override_slots[slot]
def get_headers(self):
return self.headers
def get_init(self):
diff --git a/gtk/gdk.override b/gtk/gdk.override
index b6ba77c1..f3dbd53f 100644
--- a/gtk/gdk.override
+++ b/gtk/gdk.override
@@ -650,9 +650,9 @@ _wrap_gdk_cursor_new(PyGBoxed *self, PyObject *args, PyObject *kwargs)
return 0;
}
%%
-override gdk_event_getattr
+override-slot GdkEvent.tp_getattr
PyObject *
-_wrap_gdk_event_getattr(PyObject *self, char *attr)
+_wrap_gdk_event_tp_getattr(PyObject *self, char *attr)
{
GdkEvent *event = pyg_boxed_get(self, GdkEvent);
guint i;
diff --git a/gtk/gtk-types.defs b/gtk/gtk-types.defs
index cd8035e7..12d12a41 100644
--- a/gtk/gtk-types.defs
+++ b/gtk/gtk-types.defs
@@ -900,10 +900,10 @@
'("gchar*" "wm_role")
'("GtkWidget*" "focus_widget")
'("GtkWidget*" "default_widget")
- '("GtkWidget*" "transient_parent")
+ '("GtkWindow*" "transient_parent")
; '("GtkWindowGeometryInfo* "geometry_info")
'("GdkWindow*" "frame")
-; '("GtkWindowGroup*" "group")
+ '("GtkWindowGroup*" "group")
'("guint16" "configure_request_count")
'("guint" "allow_shrink")
'("guint" "allow_grow")
diff --git a/gtk/gtk.override b/gtk/gtk.override
index 61905e42..390a4e78 100644
--- a/gtk/gtk.override
+++ b/gtk/gtk.override
@@ -302,6 +302,22 @@ _wrap_gtk_selection_data_set(PyGBoxed *self, PyObject *args, PyObject *kwargs)
return Py_None;
}
%%
+override gtk_selection_data_get_text noargs
+static PyObject *
+_wrap_gtk_selection_data_get_text(PyObject *self)
+{
+ guchar *ret;
+
+ ret = gtk_selection_data_get_text(pyg_boxed_get(self, GtkSelectionData));
+ if (ret) {
+ PyObject *py_ret = PyUnicode_DecodeUTF8(ret, strlen(ret), "strict");
+ g_free(ret);
+ return py_ret;
+ }
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+%%
override gtk_widget_draw kwargs
static PyObject *
_wrap_gtk_widget_draw(PyGObject *self, PyObject *args, PyObject *kwargs)
@@ -3328,9 +3344,9 @@ _wrap_gtk_ctree_node_get_row_data(PyGObject *self, PyObject *args,
return data;
}
%%
-override gtk_ctree_node_getattr
+override-slot GtkCTreeNode.tp_getattr
static PyObject *
-_wrap_gtk_ctree_node_getattr(PyGBoxed *self, char *attr)
+_wrap_gtk_ctree_node_tp_getattr(PyGPointer *self, char *attr)
{
if (!strcmp(attr, "__members__"))
return Py_BuildValue("[ssssss]", "children", "expanded", "is_leaf",