diff options
-rw-r--r-- | ChangeLog | 34 | ||||
-rw-r--r-- | atk.override | 1 | ||||
-rw-r--r-- | codegen/argtypes.py | 18 | ||||
-rw-r--r-- | codegen/codegen.py | 215 | ||||
-rw-r--r-- | codegen/override.py | 9 | ||||
-rw-r--r-- | gtk/gdk.override | 4 | ||||
-rw-r--r-- | gtk/gtk-types.defs | 4 | ||||
-rw-r--r-- | gtk/gtk.override | 20 |
8 files changed, 196 insertions, 109 deletions
@@ -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", |