-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathobject-fix.patch
113 lines (101 loc) · 3.68 KB
/
object-fix.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
diff --git a/Xlib/protocol/rq.py b/Xlib/protocol/rq.py
index 42152fa..4253ab6 100644
--- a/Xlib/protocol/rq.py
+++ b/Xlib/protocol/rq.py
@@ -515,6 +515,8 @@ class List(ValueField):
def pack_value(self, val):
# Single-char values, we'll assume that means integer lists.
if self.type.structcode and len(self.type.structcode) == 1:
+ if self.type.check_value is not None:
+ val = [self.type.check_value(v) for v in val]
data = array(struct_to_array_codes[self.type.structcode],
val).tostring()
else:
@@ -546,8 +548,6 @@ class FixedList(List):
class Object(ValueField):
- structcode = None
-
def __init__(self, name, type, default = None):
ValueField.__init__(self, name, default)
self.type = type
@@ -555,41 +555,30 @@ class Object(ValueField):
self.structvalues = self.type.structvalues
def parse_binary_value(self, data, display, length, format):
- if self.type.structcode is None:
- return self.type.parse_binary(data, display)
-
- else:
- scode = '=' + self.type.structcode
- slen = struct.calcsize(scode)
-
- v = struct.unpack(scode, data[:slen])
- if self.type.structvalues == 1:
- v = v[0]
-
- if self.type.parse_value is not None:
- v = self.type.parse_value(v, display)
-
- return v, buffer(data, slen)
+ return self.type.parse_binary(data, display)
def parse_value(self, val, display):
- if self.type.parse_value is None:
- return val
- else:
- return self.type.parse_value(val, display)
+ return self.type.parse_value(val, display)
def pack_value(self, val):
- # Single-char values, we'll assume that mean an integer
- if self.type.structcode and len(self.type.structcode) == 1:
- return struct.pack('=' + self.type.structcode, val), None, None
- else:
- return self.type.pack_value(val)
+ return self.type.pack_value(val)
def check_value(self, val):
- if self.type.structcode is None:
- return val
-
if type(val) is types.TupleType:
- return val
+ vals = []
+ i = 0
+ for f in self.type.fields:
+ if f.name:
+ if f.check_value is None:
+ v = val[i]
+ else:
+ v = f.check_value(val[i])
+ if f.structvalues == 1:
+ vals.append(v)
+ else:
+ vals.extend(v)
+ i = i + 1
+ return vals
if type(val) is types.DictType:
data = val
@@ -601,7 +590,14 @@ class Object(ValueField):
vals = []
for f in self.type.fields:
if f.name:
- vals.append(data[f.name])
+ if f.check_value is None:
+ v = data[f.name]
+ else:
+ v = f.check_value(data[f.name])
+ if f.structvalues == 1:
+ vals.append(v)
+ else:
+ vals.extend(v)
return vals
@@ -835,6 +831,7 @@ class ScalarObj:
self.structcode = code
self.structvalues = 1
self.parse_value = None
+ self.check_value = None
Card8Obj = ScalarObj('B')
Card16Obj = ScalarObj('H')
@@ -846,6 +843,7 @@ class ResourceObj:
def __init__(self, class_name):
self.class_name = class_name
+ self.check_value = None
def parse_value(self, value, display):
# if not display: