17
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
from Xlib import error, ext, X
27
25
# Xlib.protocol modules
28
import protocol.display
29
from protocol import request, event, rq
26
from Xlib.protocol import display, request, event, rq
31
28
# Xlib.xobjects modules
32
import xobject.resource
33
import xobject.drawable
34
import xobject.fontable
35
import xobject.colormap
29
import Xlib.xobject.resource
30
import Xlib.xobject.drawable
31
import Xlib.xobject.fontable
32
import Xlib.xobject.colormap
33
import Xlib.xobject.cursor
38
35
_resource_baseclasses = {
39
'resource': xobject.resource.Resource,
40
'drawable': xobject.drawable.Drawable,
41
'window': xobject.drawable.Window,
42
'pixmap': xobject.drawable.Pixmap,
43
'fontable': xobject.fontable.Fontable,
44
'font': xobject.fontable.Font,
45
'gc': xobject.fontable.GC,
46
'colormap': xobject.colormap.Colormap,
47
'cursor': xobject.cursor.Cursor,
36
'resource': Xlib.xobject.resource.Resource,
37
'drawable': Xlib.xobject.drawable.Drawable,
38
'window': Xlib.xobject.drawable.Window,
39
'pixmap': Xlib.xobject.drawable.Pixmap,
40
'fontable': Xlib.xobject.fontable.Fontable,
41
'font': Xlib.xobject.fontable.Font,
42
'gc': Xlib.xobject.fontable.GC,
43
'colormap': Xlib.xobject.colormap.Colormap,
44
'cursor': Xlib.xobject.cursor.Cursor,
50
47
_resource_hierarchy = {
55
52
'fontable': ('font', 'gc')
58
class _BaseDisplay(protocol.display.Display):
55
class _BaseDisplay(display.Display):
59
56
resource_classes = _resource_baseclasses.copy()
61
58
# Implement a cache of atom names, used by Window objects when
62
59
# dealing with some ICCCM properties not defined in Xlib.Xatom
64
61
def __init__(self, *args, **keys):
65
apply(protocol.display.Display.__init__, (self, ) + args, keys)
62
display.Display.__init__(*(self, ) + args, **keys)
66
63
self._atom_cache = {}
68
65
def get_atom(self, atomname, only_if_exists=0):
69
if self._atom_cache.has_key(atomname):
66
if atomname in self._atom_cache:
70
67
return self._atom_cache[atomname]
72
69
r = request.InternAtom(display = self, name = atomname, only_if_exists = only_if_exists)
121
118
# Finalize extensions by creating new classes
122
for type, dict in self.class_extension_dicts.items():
123
origcls = self.display.resource_classes[type]
124
self.display.resource_classes[type] = new.classobj(origcls.__name__,
119
for type_, dict in self.class_extension_dicts.items():
120
origcls = self.display.resource_classes[type_]
121
self.display.resource_classes[type_] = type(origcls.__name__,
128
125
# Problem: we have already created some objects without the
129
126
# extensions: the screen roots and default colormaps.
211
208
def __getattr__(self, attr):
213
210
function = self.display_extension_methods[attr]
214
return new.instancemethod(function, self, self.__class__)
211
return types.MethodType(function, self)
216
213
raise AttributeError(attr)
272
269
if hasattr(cls, name):
273
270
raise error.MethodOverrideError('attempting to replace %s method: %s' % (type, name))
275
method = new.instancemethod(function, None, cls)
277
272
# Maybe should check extension overrides too
279
self.class_extension_dicts[type][name] = method
274
self.class_extension_dicts[type][name] = function
281
self.class_extension_dicts[type] = { name: method }
276
self.class_extension_dicts[type] = { name: function }
283
278
def extension_add_event(self, code, evt, name = None):
284
279
"""extension_add_event(code, evt, [name])
295
newevt = new.classobj(evt.__name__, evt.__bases__,
290
newevt = type(evt.__name__, evt.__bases__,
297
292
newevt._code = code
299
294
self.display.add_extension_event(code, newevt)
595
590
self.display.free_resource_id(fid)
598
cls = self.display.get_resource_class('font', xobject.fontable.Font)
593
cls = self.display.get_resource_class('font', Xlib.xobject.fontable.Font)
599
594
return cls(self.display, fid, owner = 1)
601
596
def list_fonts(self, pattern, max_names):