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
39 changes: 23 additions & 16 deletions generator/Data/XCB/Python/Parse.hs
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,9 @@ xform = map buildPython . dependencyOrder
globals = [mkDict "_events", mkDict "_errors"]
name = xheader_header header
add = [mkAddExt header]
parts <- mapM (processXDecl name) $ xheader_decls header
let (requests, decls) = collectBindings parts
partsList <- mapM (processXDecl name) $ xheader_decls header
let parts = concat partsList
(requests, decls) = collectBindings parts
ext = if length requests > 0
then [mkClass (name ++ "Extension") "xcffib.Extension" requests]
else []
Expand Down Expand Up @@ -674,18 +675,18 @@ mkSyntheticMethod membs = do

processXDecl :: String
-> XDecl
-> State TypeInfoMap BindingPart
-> State TypeInfoMap [BindingPart]
processXDecl ext (XTypeDef name typ) =
do modify $ \m -> mkModify ext name (m M.! typ) m
return Noop
return [Noop]
processXDecl ext (XidType name) =
-- http://www.markwitmer.com/guile-xcb/doc/guile-xcb/XIDs.html
do modify $ mkModify ext name (BaseType "I")
return Noop
return [Noop]
processXDecl _ (XImport n) =
return $ Declaration [ mkRelImport n]
return [Declaration [ mkRelImport n]]
processXDecl _ (XEnum name membs) =
return $ Declaration [mkEnum name $ xEnumElemsToPyEnum id membs]
return [Declaration [mkEnum name $ xEnumElemsToPyEnum id membs]]
processXDecl ext (XStruct n _ membs) = do
m <- get
let (statements, len) = mkStructStyleUnpack "" ext m membs
Expand All @@ -696,7 +697,7 @@ processXDecl ext (XStruct n _ membs) = do
let rhs = Int theLen
return $ mkAssign "fixed_size" rhs
modify $ mkModify ext n (CompositeType ext n)
return $ Declaration [mkXClass n "xcffib.Struct" False statements (pack : fixedLength ++ synthetic)]
return [Declaration [mkXClass n "xcffib.Struct" False statements (pack : fixedLength ++ synthetic)]]
processXDecl ext (XEvent name opcode _ xge membs noSequence) = do
m <- get
let cname = name ++ "Event"
Expand All @@ -707,9 +708,9 @@ processXDecl ext (XEvent name opcode _ xge membs noSequence) = do
eventsUpd = mkDictUpdate "_events" opcode cname
isxge = fromMaybe False xge
-- xgeexp = mkAssign "xge" (if fromMaybe False xge then (mkName "True") else (mkName "False"))
return $ Declaration [ mkXClass cname "xcffib.Event" isxge statements (pack : synthetic)
return [Declaration [ mkXClass cname "xcffib.Event" isxge statements (pack : synthetic)
, eventsUpd
]
]]
processXDecl ext (XError name opcode _ membs) = do
m <- get
let cname = name ++ "Error"
Expand All @@ -718,10 +719,10 @@ processXDecl ext (XError name opcode _ membs) = do
(statements, _) = mkStructStyleUnpack prefix ext m membs
errorsUpd = mkDictUpdate "_errors" opcode cname
alias = mkAssign ("Bad" ++ name) (mkName cname)
return $ Declaration [ mkXClass cname "xcffib.Error" False statements [pack]
return [Declaration [ mkXClass cname "xcffib.Error" False statements [pack]
, alias
, errorsUpd
]
]]
processXDecl ext (XRequest name opcode _ membs reply) = do
m <- get
let
Expand Down Expand Up @@ -756,7 +757,13 @@ processXDecl ext (XRequest name opcode _ membs reply) = do
++ [argChecked])
requestBody = buf ++ packStmts ++ [ret]
request = mkMethod name allArgs requestBody
return $ Request request replyDecl
baseArgs = ("self" : (filter (not . null) args))
checkedMethod = mkMethod (name ++ "Checked") baseArgs
[mkReturn $ mkCall ("self." ++ name) (map mkName (tail baseArgs) ++ [mkName "is_checked=True"])]
uncheckedMethod = mkMethod (name ++ "Unchecked") baseArgs
[mkReturn $ mkCall ("self." ++ name) (map mkName (tail baseArgs) ++ [mkName "is_checked=False"])]

return [Request request replyDecl, Request checkedMethod [], Request uncheckedMethod []]
processXDecl ext (XUnion name _ membs) = do
m <- get
let unpackF = structElemToPyUnpack unpackerCopy ext m
Expand All @@ -772,7 +779,7 @@ processXDecl ext (XUnion name _ membs) = do
pack = mkPackMethod ext name m Nothing [head membs] Nothing
decl = [mkXClass name "xcffib.Union" False initMethodStmts [pack]]
modify $ mkModify ext name (CompositeType ext name)
return $ Declaration decl
return [Declaration decl]
where
unpackerCopy = mkCall "unpacker.copy" []
mkUnionUnpack :: (Maybe String, String)
Expand All @@ -788,7 +795,7 @@ processXDecl ext (XUnion name _ membs) = do
processXDecl ext (XidUnion name _) =
-- These are always unions of only XIDs.
do modify $ mkModify ext name (BaseType "I")
return Noop
return [Noop]

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

mkVersion :: XHeader -> Suite
mkVersion header =
Expand Down
13 changes: 0 additions & 13 deletions module/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -399,19 +399,6 @@ def send_request(

return cookie(self.conn, seq, is_checked)

def __getattr__(self, name):
if name.endswith("Checked"):
real = name[: -len("Checked")]
is_checked = True
elif name.endswith("Unchecked"):
real = name[: -len("Unchecked")]
is_checked = False
else:
raise AttributeError(name)

real = getattr(self, real)

return functools.partial(real, is_checked=is_checked)


class List(Protobj):
Expand Down
4 changes: 4 additions & 0 deletions test/generator/eventstruct.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,8 @@ def SendExtensionEvent(self, device_id, propagate, num_classes, num_events, even
buf.write(xcffib.pack_list(events, EventForSend))
buf.write(xcffib.pack_list(classes, "B"))
return self.send_request(31, buf, is_checked=is_checked)
def SendExtensionEventChecked(self, device_id, propagate, num_classes, num_events, events, classes):
return self.SendExtensionEvent(device_id, propagate, num_classes, num_events, events, classes, is_checked=True)
def SendExtensionEventUnchecked(self, device_id, propagate, num_classes, num_events, events, classes):
return self.SendExtensionEvent(device_id, propagate, num_classes, num_events, events, classes, is_checked=False)
xcffib._add_ext(key, eventstructExtension, _events, _errors)
4 changes: 4 additions & 0 deletions test/generator/randr.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,8 @@ def GetCrtcTransform(self, crtc, is_checked=True):
buf = io.BytesIO()
buf.write(struct.pack("=xx2xI", crtc))
return self.send_request(27, buf, GetCrtcTransformCookie, is_checked=is_checked)
def GetCrtcTransformChecked(self, crtc):
return self.GetCrtcTransform(crtc, is_checked=True)
def GetCrtcTransformUnchecked(self, crtc):
return self.GetCrtcTransform(crtc, is_checked=False)
xcffib._add_ext(key, randrExtension, _events, _errors)
4 changes: 4 additions & 0 deletions test/generator/render.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,4 +57,8 @@ def FillRectangles(self, op, dst, color, rects_len, rects, is_checked=False):
buf.write(color.pack() if hasattr(color, "pack") else COLOR.synthetic(*color).pack())
buf.write(xcffib.pack_list(rects, RECTANGLE))
return self.send_request(26, buf, is_checked=is_checked)
def FillRectanglesChecked(self, op, dst, color, rects_len, rects):
return self.FillRectangles(op, dst, color, rects_len, rects, is_checked=True)
def FillRectanglesUnchecked(self, op, dst, color, rects_len, rects):
return self.FillRectangles(op, dst, color, rects_len, rects, is_checked=False)
xcffib._add_ext(key, renderExtension, _events, _errors)
4 changes: 4 additions & 0 deletions test/generator/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,8 @@ def CreateWindow(self, depth, wid, parent, x, y, width, height, border_width, _c
buf.write(struct.pack("=I", value_mask))
buf.write(xcffib.pack_list(value_list, "I"))
return self.send_request(1, buf, is_checked=is_checked)
def CreateWindowChecked(self, depth, wid, parent, x, y, width, height, border_width, _class, visual, value_mask, value_list):
return self.CreateWindow(depth, wid, parent, x, y, width, height, border_width, _class, visual, value_mask, value_list, is_checked=True)
def CreateWindowUnchecked(self, depth, wid, parent, x, y, width, height, border_width, _class, visual, value_mask, value_list):
return self.CreateWindow(depth, wid, parent, x, y, width, height, border_width, _class, visual, value_mask, value_list, is_checked=False)
xcffib._add_ext(key, requestExtension, _events, _errors)
4 changes: 4 additions & 0 deletions test/generator/request_reply.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,8 @@ def ListExtensions(self, is_checked=True):
buf = io.BytesIO()
buf.write(struct.pack("=xx2x"))
return self.send_request(99, buf, ListExtensionsCookie, is_checked=is_checked)
def ListExtensionsChecked(self):
return self.ListExtensions(is_checked=True)
def ListExtensionsUnchecked(self):
return self.ListExtensions(is_checked=False)
xcffib._add_ext(key, request_replyExtension, _events, _errors)
8 changes: 8 additions & 0 deletions test/generator/switch.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,16 @@ def GetProperty(self, value_mask, items, is_checked=True):
events = items.pop(0)
buf.write(struct.pack("=I", events))
return self.send_request(59, buf, GetPropertyCookie, is_checked=is_checked)
def GetPropertyChecked(self, value_mask, items):
return self.GetProperty(value_mask, items, is_checked=True)
def GetPropertyUnchecked(self, value_mask, items):
return self.GetProperty(value_mask, items, is_checked=False)
def GetPropertyWithPad(self, is_checked=True):
buf = io.BytesIO()
buf.write(struct.pack("=xx2x"))
return self.send_request(60, buf, GetPropertyWithPadCookie, is_checked=is_checked)
def GetPropertyWithPadChecked(self):
return self.GetPropertyWithPad(is_checked=True)
def GetPropertyWithPadUnchecked(self):
return self.GetPropertyWithPad(is_checked=False)
xcffib._add_ext(key, switchExtension, _events, _errors)
4 changes: 4 additions & 0 deletions test/generator/type_pad.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,8 @@ def ListFontsWithInfo(self, max_names, pattern_len, pattern, is_checked=True):
buf.write(struct.pack("=xx2xxHH", max_names, pattern_len))
buf.write(xcffib.pack_list(pattern, "c"))
return self.send_request(50, buf, ListFontsWithInfoCookie, is_checked=is_checked)
def ListFontsWithInfoChecked(self, max_names, pattern_len, pattern):
return self.ListFontsWithInfo(max_names, pattern_len, pattern, is_checked=True)
def ListFontsWithInfoUnchecked(self, max_names, pattern_len, pattern):
return self.ListFontsWithInfo(max_names, pattern_len, pattern, is_checked=False)
xcffib._add_ext(key, type_padExtension, _events, _errors)
14 changes: 14 additions & 0 deletions test/test_connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -315,3 +315,17 @@ def test_wrap(self, xproto_test):
c2 = xcffib.wrap(xcffib.ffi.cast("long", c._conn))
c2.invalid()
c2.disconnect()

def test_unmap_window_unchecked(self, xproto_test):
wid = xproto_test.conn.generate_id()
xproto_test.create_window(wid=wid)
reply = xproto_test.xproto.QueryTree(xproto_test.default_screen.root).reply()
assert wid in reply.children

cookie = xproto_test.xproto.UnmapWindowUnchecked(wid)
with pytest.raises(AssertionError):
cookie.check()

xproto_test.conn.flush()
reply = xproto_test.xproto.QueryTree(xproto_test.default_screen.root).reply()
assert wid in reply.children