Skip to content

Commit 26a8f8f

Browse files
committed
partially reapply "don't use __getattr__for Checked reasoning"
This reverts commit 4c8b80d. ...with the exception that now we generate *both* method variants always, since Qtile seems to have relied on their existence. I also added a test for one of the variants Qtile uses that was non-default, so we ensure it stays working. Signed-off-by: Tycho Andersen <[email protected]>
1 parent 758754b commit 26a8f8f

File tree

10 files changed

+69
-29
lines changed

10 files changed

+69
-29
lines changed

generator/Data/XCB/Python/Parse.hs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,9 @@ xform = map buildPython . dependencyOrder
9696
globals = [mkDict "_events", mkDict "_errors"]
9797
name = xheader_header header
9898
add = [mkAddExt header]
99-
parts <- mapM (processXDecl name) $ xheader_decls header
100-
let (requests, decls) = collectBindings parts
99+
partsList <- mapM (processXDecl name) $ xheader_decls header
100+
let parts = concat partsList
101+
(requests, decls) = collectBindings parts
101102
ext = if length requests > 0
102103
then [mkClass (name ++ "Extension") "xcffib.Extension" requests]
103104
else []
@@ -674,18 +675,18 @@ mkSyntheticMethod membs = do
674675

675676
processXDecl :: String
676677
-> XDecl
677-
-> State TypeInfoMap BindingPart
678+
-> State TypeInfoMap [BindingPart]
678679
processXDecl ext (XTypeDef name typ) =
679680
do modify $ \m -> mkModify ext name (m M.! typ) m
680-
return Noop
681+
return [Noop]
681682
processXDecl ext (XidType name) =
682683
-- http://www.markwitmer.com/guile-xcb/doc/guile-xcb/XIDs.html
683684
do modify $ mkModify ext name (BaseType "I")
684-
return Noop
685+
return [Noop]
685686
processXDecl _ (XImport n) =
686-
return $ Declaration [ mkRelImport n]
687+
return [Declaration [ mkRelImport n]]
687688
processXDecl _ (XEnum name membs) =
688-
return $ Declaration [mkEnum name $ xEnumElemsToPyEnum id membs]
689+
return [Declaration [mkEnum name $ xEnumElemsToPyEnum id membs]]
689690
processXDecl ext (XStruct n _ membs) = do
690691
m <- get
691692
let (statements, len) = mkStructStyleUnpack "" ext m membs
@@ -696,7 +697,7 @@ processXDecl ext (XStruct n _ membs) = do
696697
let rhs = Int theLen
697698
return $ mkAssign "fixed_size" rhs
698699
modify $ mkModify ext n (CompositeType ext n)
699-
return $ Declaration [mkXClass n "xcffib.Struct" False statements (pack : fixedLength ++ synthetic)]
700+
return [Declaration [mkXClass n "xcffib.Struct" False statements (pack : fixedLength ++ synthetic)]]
700701
processXDecl ext (XEvent name opcode _ xge membs noSequence) = do
701702
m <- get
702703
let cname = name ++ "Event"
@@ -707,9 +708,9 @@ processXDecl ext (XEvent name opcode _ xge membs noSequence) = do
707708
eventsUpd = mkDictUpdate "_events" opcode cname
708709
isxge = fromMaybe False xge
709710
-- xgeexp = mkAssign "xge" (if fromMaybe False xge then (mkName "True") else (mkName "False"))
710-
return $ Declaration [ mkXClass cname "xcffib.Event" isxge statements (pack : synthetic)
711+
return [Declaration [ mkXClass cname "xcffib.Event" isxge statements (pack : synthetic)
711712
, eventsUpd
712-
]
713+
]]
713714
processXDecl ext (XError name opcode _ membs) = do
714715
m <- get
715716
let cname = name ++ "Error"
@@ -718,10 +719,10 @@ processXDecl ext (XError name opcode _ membs) = do
718719
(statements, _) = mkStructStyleUnpack prefix ext m membs
719720
errorsUpd = mkDictUpdate "_errors" opcode cname
720721
alias = mkAssign ("Bad" ++ name) (mkName cname)
721-
return $ Declaration [ mkXClass cname "xcffib.Error" False statements [pack]
722+
return [Declaration [ mkXClass cname "xcffib.Error" False statements [pack]
722723
, alias
723724
, errorsUpd
724-
]
725+
]]
725726
processXDecl ext (XRequest name opcode _ membs reply) = do
726727
m <- get
727728
let
@@ -756,7 +757,13 @@ processXDecl ext (XRequest name opcode _ membs reply) = do
756757
++ [argChecked])
757758
requestBody = buf ++ packStmts ++ [ret]
758759
request = mkMethod name allArgs requestBody
759-
return $ Request request replyDecl
760+
baseArgs = ("self" : (filter (not . null) args))
761+
checkedMethod = mkMethod (name ++ "Checked") baseArgs
762+
[mkReturn $ mkCall ("self." ++ name) (map mkName (tail baseArgs) ++ [mkName "is_checked=True"])]
763+
uncheckedMethod = mkMethod (name ++ "Unchecked") baseArgs
764+
[mkReturn $ mkCall ("self." ++ name) (map mkName (tail baseArgs) ++ [mkName "is_checked=False"])]
765+
766+
return [Request request replyDecl, Request checkedMethod [], Request uncheckedMethod []]
760767
processXDecl ext (XUnion name _ membs) = do
761768
m <- get
762769
let unpackF = structElemToPyUnpack unpackerCopy ext m
@@ -772,7 +779,7 @@ processXDecl ext (XUnion name _ membs) = do
772779
pack = mkPackMethod ext name m Nothing [head membs] Nothing
773780
decl = [mkXClass name "xcffib.Union" False initMethodStmts [pack]]
774781
modify $ mkModify ext name (CompositeType ext name)
775-
return $ Declaration decl
782+
return [Declaration decl]
776783
where
777784
unpackerCopy = mkCall "unpacker.copy" []
778785
mkUnionUnpack :: (Maybe String, String)
@@ -788,7 +795,7 @@ processXDecl ext (XUnion name _ membs) = do
788795
processXDecl ext (XidUnion name _) =
789796
-- These are always unions of only XIDs.
790797
do modify $ mkModify ext name (BaseType "I")
791-
return Noop
798+
return [Noop]
792799

793800
-- EventStruct basically describes a set of possible events that could be
794801
-- represented by this one member. Slated to land in 1.13, it is only used in
@@ -803,7 +810,7 @@ processXDecl ext (XidUnion name _) =
803810
-- again.
804811
processXDecl ext (XEventStruct name _) = do
805812
modify $ mkModify ext name (CompositeType ext name)
806-
return $ Declaration $ [mkXClass name "xcffib.Buffer" False [] []]
813+
return [Declaration $ [mkXClass name "xcffib.Buffer" False [] []]]
807814

808815
mkVersion :: XHeader -> Suite
809816
mkVersion header =

module/__init__.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -399,19 +399,6 @@ def send_request(
399399

400400
return cookie(self.conn, seq, is_checked)
401401

402-
def __getattr__(self, name):
403-
if name.endswith("Checked"):
404-
real = name[: -len("Checked")]
405-
is_checked = True
406-
elif name.endswith("Unchecked"):
407-
real = name[: -len("Unchecked")]
408-
is_checked = False
409-
else:
410-
raise AttributeError(name)
411-
412-
real = getattr(self, real)
413-
414-
return functools.partial(real, is_checked=is_checked)
415402

416403

417404
class List(Protobj):

test/generator/eventstruct.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,8 @@ def SendExtensionEvent(self, device_id, propagate, num_classes, num_events, even
1212
buf.write(xcffib.pack_list(events, EventForSend))
1313
buf.write(xcffib.pack_list(classes, "B"))
1414
return self.send_request(31, buf, is_checked=is_checked)
15+
def SendExtensionEventChecked(self, device_id, propagate, num_classes, num_events, events, classes):
16+
return self.SendExtensionEvent(device_id, propagate, num_classes, num_events, events, classes, is_checked=True)
17+
def SendExtensionEventUnchecked(self, device_id, propagate, num_classes, num_events, events, classes):
18+
return self.SendExtensionEvent(device_id, propagate, num_classes, num_events, events, classes, is_checked=False)
1519
xcffib._add_ext(key, eventstructExtension, _events, _errors)

test/generator/randr.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,8 @@ def GetCrtcTransform(self, crtc, is_checked=True):
6262
buf = io.BytesIO()
6363
buf.write(struct.pack("=xx2xI", crtc))
6464
return self.send_request(27, buf, GetCrtcTransformCookie, is_checked=is_checked)
65+
def GetCrtcTransformChecked(self, crtc):
66+
return self.GetCrtcTransform(crtc, is_checked=True)
67+
def GetCrtcTransformUnchecked(self, crtc):
68+
return self.GetCrtcTransform(crtc, is_checked=False)
6569
xcffib._add_ext(key, randrExtension, _events, _errors)

test/generator/render.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,8 @@ def FillRectangles(self, op, dst, color, rects_len, rects, is_checked=False):
5757
buf.write(color.pack() if hasattr(color, "pack") else COLOR.synthetic(*color).pack())
5858
buf.write(xcffib.pack_list(rects, RECTANGLE))
5959
return self.send_request(26, buf, is_checked=is_checked)
60+
def FillRectanglesChecked(self, op, dst, color, rects_len, rects):
61+
return self.FillRectangles(op, dst, color, rects_len, rects, is_checked=True)
62+
def FillRectanglesUnchecked(self, op, dst, color, rects_len, rects):
63+
return self.FillRectangles(op, dst, color, rects_len, rects, is_checked=False)
6064
xcffib._add_ext(key, renderExtension, _events, _errors)

test/generator/request.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,8 @@ def CreateWindow(self, depth, wid, parent, x, y, width, height, border_width, _c
1010
buf.write(struct.pack("=I", value_mask))
1111
buf.write(xcffib.pack_list(value_list, "I"))
1212
return self.send_request(1, buf, is_checked=is_checked)
13+
def CreateWindowChecked(self, depth, wid, parent, x, y, width, height, border_width, _class, visual, value_mask, value_list):
14+
return self.CreateWindow(depth, wid, parent, x, y, width, height, border_width, _class, visual, value_mask, value_list, is_checked=True)
15+
def CreateWindowUnchecked(self, depth, wid, parent, x, y, width, height, border_width, _class, visual, value_mask, value_list):
16+
return self.CreateWindow(depth, wid, parent, x, y, width, height, border_width, _class, visual, value_mask, value_list, is_checked=False)
1317
xcffib._add_ext(key, requestExtension, _events, _errors)

test/generator/request_reply.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,8 @@ def ListExtensions(self, is_checked=True):
4141
buf = io.BytesIO()
4242
buf.write(struct.pack("=xx2x"))
4343
return self.send_request(99, buf, ListExtensionsCookie, is_checked=is_checked)
44+
def ListExtensionsChecked(self):
45+
return self.ListExtensions(is_checked=True)
46+
def ListExtensionsUnchecked(self):
47+
return self.ListExtensions(is_checked=False)
4448
xcffib._add_ext(key, request_replyExtension, _events, _errors)

test/generator/switch.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,16 @@ def GetProperty(self, value_mask, items, is_checked=True):
7878
events = items.pop(0)
7979
buf.write(struct.pack("=I", events))
8080
return self.send_request(59, buf, GetPropertyCookie, is_checked=is_checked)
81+
def GetPropertyChecked(self, value_mask, items):
82+
return self.GetProperty(value_mask, items, is_checked=True)
83+
def GetPropertyUnchecked(self, value_mask, items):
84+
return self.GetProperty(value_mask, items, is_checked=False)
8185
def GetPropertyWithPad(self, is_checked=True):
8286
buf = io.BytesIO()
8387
buf.write(struct.pack("=xx2x"))
8488
return self.send_request(60, buf, GetPropertyWithPadCookie, is_checked=is_checked)
89+
def GetPropertyWithPadChecked(self):
90+
return self.GetPropertyWithPad(is_checked=True)
91+
def GetPropertyWithPadUnchecked(self):
92+
return self.GetPropertyWithPad(is_checked=False)
8593
xcffib._add_ext(key, switchExtension, _events, _errors)

test/generator/type_pad.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,8 @@ def ListFontsWithInfo(self, max_names, pattern_len, pattern, is_checked=True):
7373
buf.write(struct.pack("=xx2xxHH", max_names, pattern_len))
7474
buf.write(xcffib.pack_list(pattern, "c"))
7575
return self.send_request(50, buf, ListFontsWithInfoCookie, is_checked=is_checked)
76+
def ListFontsWithInfoChecked(self, max_names, pattern_len, pattern):
77+
return self.ListFontsWithInfo(max_names, pattern_len, pattern, is_checked=True)
78+
def ListFontsWithInfoUnchecked(self, max_names, pattern_len, pattern):
79+
return self.ListFontsWithInfo(max_names, pattern_len, pattern, is_checked=False)
7680
xcffib._add_ext(key, type_padExtension, _events, _errors)

test/test_connection.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,3 +315,17 @@ def test_wrap(self, xproto_test):
315315
c2 = xcffib.wrap(xcffib.ffi.cast("long", c._conn))
316316
c2.invalid()
317317
c2.disconnect()
318+
319+
def test_unmap_window_unchecked(self, xproto_test):
320+
wid = xproto_test.conn.generate_id()
321+
xproto_test.create_window(wid=wid)
322+
reply = xproto_test.xproto.QueryTree(xproto_test.default_screen.root).reply()
323+
assert wid in reply.children
324+
325+
cookie = xproto_test.xproto.UnmapWindowUnchecked(wid)
326+
with pytest.raises(AssertionError):
327+
cookie.check()
328+
329+
xproto_test.conn.flush()
330+
reply = xproto_test.xproto.QueryTree(xproto_test.default_screen.root).reply()
331+
assert wid in reply.children

0 commit comments

Comments
 (0)