Skip to content

Commit 2d3cba9

Browse files
committed
display: Python 3 support
1 parent b4a94dc commit 2d3cba9

1 file changed

Lines changed: 21 additions & 31 deletions

File tree

Xlib/display.py

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
# Python modules
2020
import types
2121

22+
# Python 2/3 compatibility.
23+
from six import create_unbound_method
24+
2225
# Xlib modules
2326
from . import error
2427
from . 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

Comments
 (0)