1import xcffib
2import struct
3import six
4MAJOR_VERSION = 1
5MINOR_VERSION = 2
6key = xcffib.ExtensionKey("Present")
7_events = {}
8_errors = {}
9from . import xproto
10from . import randr
11from . import xfixes
12from . import sync
13class Event:
14    ConfigureNotify = 0
15    CompleteNotify = 1
16    IdleNotify = 2
17    RedirectNotify = 3
18class EventMask:
19    NoEvent = 0
20    ConfigureNotify = 1 << 0
21    CompleteNotify = 1 << 1
22    IdleNotify = 1 << 2
23    RedirectNotify = 1 << 3
24class Option:
25    _None = 0
26    Async = 1 << 0
27    Copy = 1 << 1
28    UST = 1 << 2
29    Suboptimal = 1 << 3
30class Capability:
31    _None = 0
32    Async = 1 << 0
33    Fence = 1 << 1
34    UST = 1 << 2
35class CompleteKind:
36    Pixmap = 0
37    NotifyMSC = 1
38class CompleteMode:
39    Copy = 0
40    Flip = 1
41    Skip = 2
42    SuboptimalCopy = 3
43class Notify(xcffib.Struct):
44    def __init__(self, unpacker):
45        if isinstance(unpacker, xcffib.Protobj):
46            unpacker = xcffib.MemoryUnpacker(unpacker.pack())
47        xcffib.Struct.__init__(self, unpacker)
48        base = unpacker.offset
49        self.window, self.serial = unpacker.unpack("II")
50        self.bufsize = unpacker.offset - base
51    def pack(self):
52        buf = six.BytesIO()
53        buf.write(struct.pack("=II", self.window, self.serial))
54        return buf.getvalue()
55    fixed_size = 8
56    @classmethod
57    def synthetic(cls, window, serial):
58        self = cls.__new__(cls)
59        self.window = window
60        self.serial = serial
61        return self
62class QueryVersionReply(xcffib.Reply):
63    def __init__(self, unpacker):
64        if isinstance(unpacker, xcffib.Protobj):
65            unpacker = xcffib.MemoryUnpacker(unpacker.pack())
66        xcffib.Reply.__init__(self, unpacker)
67        base = unpacker.offset
68        self.major_version, self.minor_version = unpacker.unpack("xx2x4xII")
69        self.bufsize = unpacker.offset - base
70class QueryVersionCookie(xcffib.Cookie):
71    reply_type = QueryVersionReply
72class QueryCapabilitiesReply(xcffib.Reply):
73    def __init__(self, unpacker):
74        if isinstance(unpacker, xcffib.Protobj):
75            unpacker = xcffib.MemoryUnpacker(unpacker.pack())
76        xcffib.Reply.__init__(self, unpacker)
77        base = unpacker.offset
78        self.capabilities, = unpacker.unpack("xx2x4xI")
79        self.bufsize = unpacker.offset - base
80class QueryCapabilitiesCookie(xcffib.Cookie):
81    reply_type = QueryCapabilitiesReply
82class GenericEvent(xcffib.Event):
83    def __init__(self, unpacker):
84        if isinstance(unpacker, xcffib.Protobj):
85            unpacker = xcffib.MemoryUnpacker(unpacker.pack())
86        xcffib.Event.__init__(self, unpacker)
87        base = unpacker.offset
88        self.extension, self.length, self.evtype, self.event = unpacker.unpack("xB2xIH2xI")
89        self.bufsize = unpacker.offset - base
90    def pack(self):
91        buf = six.BytesIO()
92        buf.write(struct.pack("=B", 0))
93        buf.write(struct.pack("=B2xIH2xI", self.extension, self.length, self.evtype, self.event))
94        buf_len = len(buf.getvalue())
95        if buf_len < 32:
96            buf.write(struct.pack("x" * (32 - buf_len)))
97        return buf.getvalue()
98    @classmethod
99    def synthetic(cls, extension, length, evtype, event):
100        self = cls.__new__(cls)
101        self.extension = extension
102        self.length = length
103        self.evtype = evtype
104        self.event = event
105        return self
106_events[0] = GenericEvent
107class ConfigureNotifyEvent(xcffib.Event):
108    def __init__(self, unpacker):
109        if isinstance(unpacker, xcffib.Protobj):
110            unpacker = xcffib.MemoryUnpacker(unpacker.pack())
111        xcffib.Event.__init__(self, unpacker)
112        base = unpacker.offset
113        self.event, self.window, self.x, self.y, self.width, self.height, self.off_x, self.off_y, self.pixmap_width, self.pixmap_height, self.pixmap_flags = unpacker.unpack("xx2x2xIIhhHHhhHHI")
114        self.bufsize = unpacker.offset - base
115    def pack(self):
116        buf = six.BytesIO()
117        buf.write(struct.pack("=B", 0))
118        buf.write(struct.pack("=x2x2xIIhhHHhhHHI", self.event, self.window, self.x, self.y, self.width, self.height, self.off_x, self.off_y, self.pixmap_width, self.pixmap_height, self.pixmap_flags))
119        buf_len = len(buf.getvalue())
120        if buf_len < 32:
121            buf.write(struct.pack("x" * (32 - buf_len)))
122        return buf.getvalue()
123    @classmethod
124    def synthetic(cls, event, window, x, y, width, height, off_x, off_y, pixmap_width, pixmap_height, pixmap_flags):
125        self = cls.__new__(cls)
126        self.event = event
127        self.window = window
128        self.x = x
129        self.y = y
130        self.width = width
131        self.height = height
132        self.off_x = off_x
133        self.off_y = off_y
134        self.pixmap_width = pixmap_width
135        self.pixmap_height = pixmap_height
136        self.pixmap_flags = pixmap_flags
137        return self
138_events[0] = ConfigureNotifyEvent
139class IdleNotifyEvent(xcffib.Event):
140    def __init__(self, unpacker):
141        if isinstance(unpacker, xcffib.Protobj):
142            unpacker = xcffib.MemoryUnpacker(unpacker.pack())
143        xcffib.Event.__init__(self, unpacker)
144        base = unpacker.offset
145        self.event, self.window, self.serial, self.pixmap, self.idle_fence = unpacker.unpack("xx2x2xIIIII")
146        self.bufsize = unpacker.offset - base
147    def pack(self):
148        buf = six.BytesIO()
149        buf.write(struct.pack("=B", 2))
150        buf.write(struct.pack("=x2x2xIIIII", self.event, self.window, self.serial, self.pixmap, self.idle_fence))
151        buf_len = len(buf.getvalue())
152        if buf_len < 32:
153            buf.write(struct.pack("x" * (32 - buf_len)))
154        return buf.getvalue()
155    @classmethod
156    def synthetic(cls, event, window, serial, pixmap, idle_fence):
157        self = cls.__new__(cls)
158        self.event = event
159        self.window = window
160        self.serial = serial
161        self.pixmap = pixmap
162        self.idle_fence = idle_fence
163        return self
164_events[2] = IdleNotifyEvent
165class presentExtension(xcffib.Extension):
166    def QueryVersion(self, major_version, minor_version, is_checked=True):
167        buf = six.BytesIO()
168        buf.write(struct.pack("=xx2xII", major_version, minor_version))
169        return self.send_request(0, buf, QueryVersionCookie, is_checked=is_checked)
170    def SelectInput(self, eid, window, event_mask, is_checked=False):
171        buf = six.BytesIO()
172        buf.write(struct.pack("=xx2xIII", eid, window, event_mask))
173        return self.send_request(3, buf, is_checked=is_checked)
174    def QueryCapabilities(self, target, is_checked=True):
175        buf = six.BytesIO()
176        buf.write(struct.pack("=xx2xI", target))
177        return self.send_request(4, buf, QueryCapabilitiesCookie, is_checked=is_checked)
178xcffib._add_ext(key, presentExtension, _events, _errors)
179