1919# Python modules
2020import types
2121
22+ # Python 2/3 compatibility.
23+ from six import create_unbound_method
24+
2225# Xlib modules
2326from . import error
2427from . import ext
@@ -62,7 +65,7 @@ class _BaseDisplay(protocol_display.Display):
6265 # dealing with some ICCCM properties not defined in Xlib.Xatom
6366
6467 def __init__ (self , * args , ** keys ):
65- protocol_display .Display .__init__ (* ( self , ) + args , ** keys )
68+ protocol_display .Display .__init__ (self , * args , ** keys )
6669 self ._atom_cache = {}
6770
6871 def get_atom (self , atomname , only_if_exists = 0 ):
@@ -124,16 +127,11 @@ def __init__(self, display = None):
124127
125128
126129 # Finalize extensions by creating new classes
127- for type , dict in self .class_extension_dicts .items ():
128- origcls = self .display .resource_classes [type ]
129- if hasattr (types , 'ClassType' ):
130- self .display .resource_classes [type ] = types .ClassType (origcls .__name__ ,
131- (origcls ,),
132- dict )
133- else :
134- self .display .resource_classes [type ] = types .new_class (origcls .__name__ ,
135- (origcls ,),
136- dict )
130+ for class_name , dictionary in self .class_extension_dicts .items ():
131+ origcls = self .display .resource_classes [class_name ]
132+ self .display .resource_classes [class_name ] = type (origcls .__name__ ,
133+ (origcls ,),
134+ dictionary )
137135
138136 # Problem: we have already created some objects without the
139137 # extensions: the screen roots and default colormaps.
@@ -221,7 +219,7 @@ class directly, since any X extensions dynamically added by the
221219 def __getattr__ (self , attr ):
222220 try :
223221 function = self .display_extension_methods [attr ]
224- return types .MethodType (function , self , self . __class__ )
222+ return types .MethodType (function , self )
225223 except KeyError :
226224 raise AttributeError (attr )
227225
@@ -276,19 +274,19 @@ def extension_add_method(self, object, name, function):
276274 self .display_extension_methods [name ] = function
277275
278276 else :
279- types_ = (object , ) + _resource_hierarchy .get (object , ())
280- for type in types_ :
281- cls = _resource_baseclasses [type ]
277+ class_list = (object , ) + _resource_hierarchy .get (object , ())
278+ for class_name in class_list :
279+ cls = _resource_baseclasses [class_name ]
282280 if hasattr (cls , name ):
283- raise AssertionError ('attempting to replace %s method: %s' % (type , name ))
281+ raise AssertionError ('attempting to replace %s method: %s' % (class_name , name ))
284282
285- method = types . MethodType (function , None , cls )
283+ method = create_unbound_method (function , cls )
286284
287285 # Maybe should check extension overrides too
288286 try :
289- self .class_extension_dicts [type ][name ] = method
287+ self .class_extension_dicts [class_name ][name ] = method
290288 except KeyError :
291- self .class_extension_dicts [type ] = { name : method }
289+ self .class_extension_dicts [class_name ] = { name : method }
292290
293291 def extension_add_event (self , code , evt , name = None ):
294292 """extension_add_event(code, evt, [name])
@@ -302,12 +300,8 @@ def extension_add_event(self, code, evt, name = None):
302300 extension_event.
303301 """
304302
305- if hasattr (types , 'ClassType' ):
306- newevt = types .ClassType (evt .__name__ , evt .__bases__ ,
307- evt .__dict__ .copy ())
308- else :
309- newevt = types .new_class (evt .__name__ , evt .__bases__ ,
310- evt .__dict__ .copy ())
303+ newevt = type (evt .__name__ , evt .__bases__ ,
304+ evt .__dict__ .copy ())
311305 newevt ._code = code
312306
313307 self .display .add_extension_event (code , newevt )
@@ -330,12 +324,8 @@ def extension_add_subevent(self, code, subcode, evt, name = None):
330324 extension_event.
331325 """
332326
333- if hasattr (types , 'ClassType' ):
334- newevt = types .ClassType (evt .__name__ , evt .__bases__ ,
335- evt .__dict__ .copy ())
336- else :
337- newevt = types .new_class (evt .__name__ , evt .__bases__ ,
338- evt .__dict__ .copy ())
327+ newevt = type (evt .__name__ , evt .__bases__ ,
328+ evt .__dict__ .copy ())
339329 newevt ._code = code
340330
341331 self .display .add_extension_event (code , newevt , subcode )
0 commit comments