Skip to content

Commit 62a37ad

Browse files
Fix ord() usage, make more accurate bytes->str transformations.
1 parent f959838 commit 62a37ad

File tree

1 file changed

+24
-14
lines changed

1 file changed

+24
-14
lines changed

Xlib/protocol/rq.py

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,15 @@ def _method(func, instance):
6767
else:
6868
return types.MethodType(func, instance, type(instance))
6969

70+
def _to_ord(ch):
71+
"""Get char code in a cross-Python way"""
72+
if isinstance(ch, int):
73+
# Python 3: bytes char is already an integer, no need to call ord()
74+
return ch
75+
else:
76+
# Python 2: string char required to call ord()
77+
return ord(ch)
78+
7079

7180
class Field(object):
7281
"""Field objects represent the data fields of a Struct.
@@ -387,23 +396,24 @@ def __init__(self, name, pad = 1):
387396
self.pad = pad
388397

389398
def pack_value(self, val):
390-
slen = len(val)
399+
val_bytes = val.encode()
400+
slen = len(val_bytes)
391401

392402
if self.pad:
393-
return val + b'\0' * ((4 - slen % 4) % 4), slen, None
403+
return val_bytes + b'\0' * ((4 - slen % 4) % 4), slen, None
394404
else:
395-
return val, slen, None
405+
return val_bytes, slen, None
396406

397407
def parse_binary_value(self, data, display, length, format):
398408
if length is None:
399-
return str(data), ''
409+
return data.decode(), b''
400410

401411
if self.pad:
402412
slen = length + ((4 - length % 4) % 4)
403413
else:
404414
slen = length
405415

406-
return str(data[:length]), data[slen:]
416+
return data[:length].decode(), data[slen:]
407417

408418

409419
class String16(ValueField):
@@ -621,11 +631,11 @@ def parse_binary_value(self, data, display, length, format):
621631
data = data[length + ((4 - length % 4) % 4):]
622632

623633
elif format == 16:
624-
ret = (16, array(array_unsigned_codes[2], str(data[:2 * length]).encode()))
634+
ret = (16, array(array_unsigned_codes[2], data[:2 * length].decode().encode()))
625635
data = data[2 * (length + length % 2):]
626636

627637
elif format == 32:
628-
ret = (32, array(array_unsigned_codes[4], str(data[:4 * length]).encode()))
638+
ret = (32, array(array_unsigned_codes[4], data[:4 * length].decode().encode()))
629639
data = data[4 * length:]
630640

631641
return ret, data
@@ -780,7 +790,7 @@ class ModifierMapping(ValueField):
780790
structcode = None
781791

782792
def parse_binary_value(self, data, display, length, format):
783-
a = array(array_unsigned_codes[1], str(data[:8 * format]))
793+
a = array(array_unsigned_codes[1], data[:8 * format])
784794

785795
ret = []
786796
for i in range(0, 8):
@@ -818,10 +828,10 @@ def pack_value(self, value):
818828
def parse_binary_value(self, data, display, length, format):
819829
from . import event
820830

821-
estruct = display.event_classes.get(ord(data[0]) & 0x7f, event.AnyEvent)
831+
estruct = display.event_classes.get(_to_ord(data[0]) & 0x7f, event.AnyEvent)
822832
if type(estruct) == dict:
823833
# this etype refers to a set of sub-events with individual subcodes
824-
estruct = estruct[ord(data[1])]
834+
estruct = estruct[_to_ord(data[1])]
825835

826836
return estruct(display = display, binarydata = data[:32]), data[32:]
827837

@@ -869,7 +879,7 @@ def pack_value(self, val):
869879
return chr(len(val)) + val
870880

871881
def parse_binary(self, data, display):
872-
slen = ord(data[0]) + 1
882+
slen = _to_ord(data[0]) + 1
873883
return data[1:slen], data[slen:]
874884

875885
Str = StrClass()
@@ -1222,12 +1232,12 @@ def parse_binary_value(self, data, display, length, format):
12221232
break
12231233

12241234
# font change
1225-
if ord(data[0]) == 255:
1226-
values.append(struct.unpack('>L', str(data[1:5]).encode())[0])
1235+
if _to_ord(data[0]) == 255:
1236+
values.append(struct.unpack('>L', data[1:5].decode().encode())[0])
12271237
data = data[5:]
12281238

12291239
# skip null strings
1230-
elif ord(data[0]) == 0 and ord(data[1]) == 0:
1240+
elif _to_ord(data[0]) == 0 and _to_ord(data[1]) == 0:
12311241
data = data[2:]
12321242

12331243
# string with delta

0 commit comments

Comments
 (0)