def wrap(ptr): c_conn = ffi.cast('xcb_connection_t *', ptr) conn = Connection.__new__(Connection) conn._conn = c_conn conn._init_x() conn.invalid() # ptr owns the memory for c_conn, even after the cast # we should keep it alive cffi_explicit_lifetimes[conn] = ptr return conn
def hoist_event(self, e): """ Hoist an xcb_generic_event_t to the right xcffib structure. """ if e.response_type == 0: return self._process_error(ffi.cast("xcb_generic_error_t *", e)) # We mask off the high bit here because events sent with SendEvent have # this bit set. We don't actually care where the event came from, so we # just throw this away. Maybe we could expose this, if anyone actually # cares about it. event = self._event_offsets[e.response_type & 0x7f] buf = CffiUnpacker(e) return event(buf)
def wait_for_reply(self, sequence): error_p = ffi.new("xcb_generic_error_t **") data = lib.xcb_wait_for_reply(self._conn, sequence, error_p) data = ffi.gc(data, lib.free) try: self._process_error(error_p[0]) finally: if error_p[0] != ffi.NULL: lib.free(error_p[0]) if data == ffi.NULL: # No data and no error => bad sequence number raise XcffibException("Bad sequence number %d" % sequence) reply = ffi.cast("xcb_generic_reply_t *", data) # why is this 32 and not sizeof(xcb_generic_reply_t) == 8? return CffiUnpacker(data, known_max=32 + reply.length * 4)
def wait_for_reply(self, sequence): error_p = ffi.new("xcb_generic_error_t **") data = lib.xcb_wait_for_reply(self._conn, sequence, error_p) data = ffi.gc(data, lib.free) try: self._process_error(error_p[0]) finally: if error_p[0] != ffi.NULL: lib.free(error_p[0]) if data == ffi.NULL: # No data and no error => bad sequence number raise XcffibException("Bad sequence number %d" % sequence) reply = ffi.cast("xcb_generic_reply_t *", data) # this is 32 and not `sizeof(xcb_generic_reply_t) == 8` because, # according to the X11 protocol specs: "Every reply consists of 32 bytes # followed by zero or more additional bytes of data, as specified in the # length field." return CffiUnpacker(data, known_max=32 + reply.length * 4)
def cast(self, typ): assert self.offset == 0 return ffi.cast(typ, self.cdata)