summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Henstridge <james@daa.com.au>2001-06-29 15:07:35 +0000
committerJames Henstridge <jamesh@src.gnome.org>2001-06-29 15:07:35 +0000
commit12580df967e44849f6a8cf1de81ff988a2f8f03a (patch)
tree15a56d2ce590e07d08e61494ee29248bc7afca87
parent0fae0ecd4c47b0d6612ec4cb97c82540d11cb34e (diff)
downloadpygtk-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--ChangeLog15
-rw-r--r--codegen/codegen.py39
-rw-r--r--codegen/override.py8
-rw-r--r--configure.in6
4 files changed, 60 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 037a5260..9e5b329f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)