Skip to content
Merged
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
40 changes: 32 additions & 8 deletions Xlib/protocol/display.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,36 @@
from . import event

if PY3:
def buffer(object, offset=None, size=None):
if offset is None:
offset = 0

class bytesview(object):

def __init__(self, data, offset=0, size=None):
if size is None:
size = len(data)-offset
if isinstance(data, bytes):
view = memoryview(data)
elif isinstance(data, bytesview):
view = data.view
else:
raise TypeError('unsupported type: {}'.format(type(data)))
self.view = view[offset:offset+size]

def __len__(self):
return len(self.view)

def __getitem__(self, key):
if isinstance(key, slice):
return bytes(self.view[key])
return self.view[key]

else:

def bytesview(data, offset=0, size=None):
if not isinstance(data, (bytes, buffer)):
raise TypeError('unsupported type: {}'.format(type(data)))
if size is None:
size = len(object)-offset
return memoryview(object)[offset:offset+size]
size = len(data)-offset
return buffer(data, offset, size)


class Display(object):
Expand Down Expand Up @@ -706,7 +730,7 @@ def parse_error_response(self, request):
estruct = self.error_classes.get(code, error.XError)

e = estruct(self, self.data_recv[:32])
self.data_recv = buffer(self.data_recv, 32)
self.data_recv = bytesview(self.data_recv, 32)

# print 'recv Error:', e

Expand Down Expand Up @@ -760,7 +784,7 @@ def parse_request_response(self, request):
req._parse_response(self.data_recv[:self.recv_packet_len])
# print 'recv Request:', req

self.data_recv = buffer(self.data_recv, self.recv_packet_len)
self.data_recv = bytesview(self.data_recv, self.recv_packet_len)
self.recv_packet_len = 0


Expand Down Expand Up @@ -797,7 +821,7 @@ def parse_event_response(self, etype):
if etype == ge.GenericEventCode:
self.recv_packet_len = 0

self.data_recv = buffer(self.data_recv, length)
self.data_recv = bytesview(self.data_recv, length)

# Drop all requests having an error handler,
# but which obviously succeded.
Expand Down
27 changes: 27 additions & 0 deletions test/test_bytesview.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@

import unittest

# Python 2/3 compatibility.
from six import indexbytes, text_type

from Xlib.protocol.display import bytesview


class BytesViewTest(unittest.TestCase):

def test(self):
with self.assertRaises(TypeError):
bytesview(text_type('foobar'))
data = b'0123456789ABCDEF'
view = bytesview(data)
self.assertEqual(len(view), 16)
self.assertEqual(view[:], data)
self.assertIsInstance(view[:], bytes)
self.assertEqual(view[5:-6], b'56789')
self.assertEqual(indexbytes(view, 7), ord('7'))
view = bytesview(view, 5)
self.assertEqual(view[:], b'56789ABCDEF')
self.assertEqual(indexbytes(view, 4), ord('9'))
view = bytesview(view, 0, 5)
self.assertEqual(view[:], b'56789')
self.assertEqual(indexbytes(view, 1), ord('6'))