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