diff options
author | James Henstridge <james@daa.com.au> | 2001-06-29 15:07:35 +0000 |
---|---|---|
committer | James Henstridge <jamesh@src.gnome.org> | 2001-06-29 15:07:35 +0000 |
commit | 12580df967e44849f6a8cf1de81ff988a2f8f03a (patch) | |
tree | 15a56d2ce590e07d08e61494ee29248bc7afca87 | |
parent | 0fae0ecd4c47b0d6612ec4cb97c82540d11cb34e (diff) | |
download | pygtk-12580df967e44849f6a8cf1de81ff988a2f8f03a.tar.gz |
add code to allow overriding the getter for a single attribute.
2001-06-29 James Henstridge <james@daa.com.au>
* codegen/codegen.py (write_getattr): add code to allow overriding
the getter for a single attribute.
(write_boxed_getattr): same here.
* codegen/override.py (Overrides): add code to handle
"override_attr" statements in an overrides file.
* codegen/codegen.py (write_getattr): add support for overriding
the complete getattr method for a GObject class.
(write_boxed_getattr): similar change here.
* configure.in: require 1.3.7 versions of glib and gtk+.
(AC_ARG_ENABLE): fix --disable-thread argument. It was actually
looking for --disable-numpy, which causes all kinds of weirdness.
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | codegen/codegen.py | 39 | ||||
-rw-r--r-- | codegen/override.py | 8 | ||||
-rw-r--r-- | configure.in | 6 |
4 files changed, 60 insertions, 8 deletions
@@ -1,5 +1,20 @@ 2001-06-29 James Henstridge <james@daa.com.au> + * codegen/codegen.py (write_getattr): add code to allow overriding + the getter for a single attribute. + (write_boxed_getattr): same here. + + * codegen/override.py (Overrides): add code to handle + "override_attr" statements in an overrides file. + + * codegen/codegen.py (write_getattr): add support for overriding + the complete getattr method for a GObject class. + (write_boxed_getattr): similar change here. + + * configure.in: require 1.3.7 versions of glib and gtk+. + (AC_ARG_ENABLE): fix --disable-thread argument. It was actually + looking for --disable-numpy, which causes all kinds of weirdness. + * gtk/gtk.override (_wrap_gdk_cursor_new): constructor for GdkCursor that handles both the standard and pixmap cases for cursors. diff --git a/codegen/codegen.py b/codegen/codegen.py index cec3a3b6..bbc765c9 100644 --- a/codegen/codegen.py +++ b/codegen/codegen.py @@ -321,10 +321,25 @@ def write_constructor(objname, funcobj, fp=sys.stdout): dict['arglist'] = string.join(arglist, ', ') fp.write(consttmpl % dict) -def write_getattr(parser, objobj, fp=sys.stdout): +def write_getattr(parser, objobj, overrides, fp=sys.stdout): uline = argtypes._to_upper_str(objobj.c_name)[1:] + funcname = '_wrap_' + string.lower(uline) + '_getattr' + + if overrides.is_overriden(funcname[6:]): + fp.write(overrides.override(funcname[6:])) + fp.write('\n\n') + return funcname + attrchecks = '' for ftype, fname in objobj.fields: + attrname = objobj.c_name + '.' + fname + if overrides.attr_is_overriden(attrname): + code = overrides.attr_override(attrname) + code = ' ' + string.replace(code, '\n', '\n ') + attrchecks = attrchecks + attrchecktmpl % { 'attr': fixname(fname), + 'varlist': '', + 'code': code } + continue try: varlist = argtypes.VarList() handler = argtypes.matcher.get(ftype) @@ -340,7 +355,6 @@ def write_getattr(parser, objobj, fp=sys.stdout): sys.stderr.write("couldn't write check for " + objobj.c_name + '.' + fname + '\n') #traceback.print_exc() - funcname = '_wrap_' + string.lower(uline) + '_getattr' fp.write(getattrtmpl % {'getattr': funcname, 'attrchecks': attrchecks }) return funcname @@ -415,7 +429,7 @@ def write_class(parser, objobj, overrides, fp=sys.stdout): # write the type template dict = { 'class': objobj.c_name } if objobj.fields: - dict['getattr'] = write_getattr(parser, objobj, fp) + dict['getattr'] = write_getattr(parser, objobj, overrides, fp) else: dict['getattr'] = '0' dict['methods'] = 'METHOD_CHAIN(_Py' + dict['class'] + '_methods)' @@ -534,11 +548,26 @@ def write_boxed_constructor(objname, funcobj, fp=sys.stdout): dict['arglist'] = string.join(arglist, ', ') fp.write(boxedconsttmpl % dict) -def write_boxed_getattr(parser, boxedobj, fp=sys.stdout): +def write_boxed_getattr(parser, boxedobj, overrides, fp=sys.stdout): typecode = argtypes._enum_name(boxedobj.c_name) uline = argtypes._to_upper_str(boxedobj.c_name)[1:] + funcname = '_wrap_' + string.lower(uline) + '_getattr' + + if overrides.is_overriden(funcname[6:]): + fp.write(overrides.override(funcname[6:])) + fp.write('\n\n') + return funcname + attrchecks = '' for ftype, fname in boxedobj.fields: + attrname = boxedobj.c_name + '.' + fname + if overrides.attr_is_overriden(attrname): + code = overrides.attr_override(attrname) + code = ' ' + string.replace(code, '\n', '\n ') + attrchecks = attrchecks + attrchecktmpl % { 'attr': fixname(fname), + 'varlist': '', + 'code': code } + continue try: varlist = argtypes.VarList() handler = argtypes.matcher.get(ftype) @@ -612,7 +641,7 @@ def write_boxed(parser, boxedobj, overrides, fp=sys.stdout): # write the type template dict = { 'typename': boxedobj.c_name } if boxedobj.fields: - dict['getattr'] = write_boxed_getattr(parser, boxedobj, fp) + dict['getattr'] = write_boxed_getattr(parser, boxedobj, overrides, fp) else: dict['getattr'] = '0' dict['methods'] = 'METHOD_CHAIN(_Py' + dict['typename'] + '_methods)' diff --git a/codegen/override.py b/codegen/override.py index d8fc0c17..2d5d0005 100644 --- a/codegen/override.py +++ b/codegen/override.py @@ -12,6 +12,7 @@ class Overrides: self.glob_ignores = [] self.overrides = {} self.kwargs = {} + self.override_attrs = {} self.headers = '' self.init = '' if fp == None: return @@ -40,6 +41,9 @@ class Overrides: if 'kwargs' in words[1:]: self.kwargs[func] = 1 self.overrides[func] = rest + elif words[0] == 'override_attr': + attr = words[1] + self.override_attrs[attr] = rest elif words[0] == 'headers': self.headers = self.headers + '\n' + rest elif words[0] == 'init': @@ -58,6 +62,10 @@ class Overrides: return self.overrides[name] def wants_kwargs(self, name): return self.kwargs.has_key(name) + def attr_is_overriden(self, attr): + return self.override_attrs.has_key(attr) + def attr_override(self, attr): + return self.override_attrs[attr] def get_headers(self): return self.headers def get_init(self): diff --git a/configure.in b/configure.in index 127b9750..b5517083 100644 --- a/configure.in +++ b/configure.in @@ -12,7 +12,7 @@ AC_PROG_LIBTOOL AM_PATH_PYTHON(2.0) AM_CHECK_PYTHON_HEADERS(,[AC_MSG_ERROR(could not find Python headers)]) -AC_ARG_ENABLE(numpy, +AC_ARG_ENABLE(thread, [ --disable-thread Disable pygtk threading support],, enable_thread=no) @@ -28,8 +28,8 @@ else AC_MSG_RESULT(no) fi -AM_PATH_GLIB_2_0(1.3.6,,[AC_MSG_ERROR(maybe you want the gtk-gnome-1-2 branch?)],gobject) -AM_PATH_GTK_2_0(1.3.6,,[AC_MSG_ERROR(maybe you want the gtk-gnome-1-2 branch?)],$extra_mods) +AM_PATH_GLIB_2_0(1.3.7,,[AC_MSG_ERROR(maybe you want the gtk-gnome-1-2 branch?)],gobject) +AM_PATH_GTK_2_0(1.3.7,,[AC_MSG_ERROR(maybe you want the gtk-gnome-1-2 branch?)],$extra_mods) dnl AM_PATH_GDK_IMLIB(1.8, build_imlib=true, build_imlib=false) dnl AM_CONDITIONAL(BUILD_IMLIB, $build_imlib) |