Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Xlib/protocol/display.py
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ def get_resource_class(self, class_name, default = None):
CLASS_NAME, or DEFAULT if no such class is set.
"""

return self.resource_classes.get(class_name, default)
return getattr(self, 'resource_classes', {}).get(class_name, default)

def set_extension_major(self, extname, major):
self.extension_major_opcodes[extname] = major
Expand Down
46 changes: 46 additions & 0 deletions test/test_protocol_display.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#!/usr/bin/env python

import sys
import os
import unittest

sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

import Xlib.protocol.display
import Xlib.protocol.rq


class TestResourceClasses(unittest.TestCase):
"""get_resource_class on a bare protocol display.

The resource class table is populated by Xlib.display.Display
(xobject layer). A display opened at the protocol level, as the
examples do, has no such table; lookups must fall back to the
default so resource-typed reply fields decode to raw XIDs
instead of raising AttributeError (issue #281).
"""

def setUp(self):
self.disp = Xlib.protocol.display.Display.__new__(
Xlib.protocol.display.Display)

def test_missing_table_returns_default(self):
self.assertIsNone(self.disp.get_resource_class('window'))
self.assertIs(self.disp.get_resource_class('window', int), int)

def test_populated_table_lookup(self):
class FakeWindow(object):
pass

self.disp.resource_classes = {'window': FakeWindow}
self.assertIs(self.disp.get_resource_class('window'), FakeWindow)
self.assertIsNone(self.disp.get_resource_class('pixmap'))

def test_resource_field_decodes_to_xid(self):
field = Xlib.protocol.rq.Window('wnd')
xid = 0x034000fc
self.assertEqual(field.parse_value(xid, self.disp), xid)


if __name__ == '__main__':
unittest.main()