def __init__(self, display=None, fd=-1, auth=None): if auth is not None: [name, data] = auth.split(six.b(':')) c_auth = ffi.new("xcb_auth_info_t *") c_auth.name = ffi.new('char[]', name) c_auth.namelen = len(name) c_auth.data = ffi.new('char[]', data) c_auth.datalen = len(data) else: c_auth = ffi.NULL if display is None: display = ffi.NULL else: display = display.encode('latin1') i = ffi.new("int *") if fd > 0: self._conn = lib.xcb_connect_to_fd(fd, c_auth) elif c_auth != ffi.NULL: self._conn = lib.xcb_connect_to_display_with_auth_info(display, c_auth, i) else: self._conn = lib.xcb_connect(display, i) self.pref_screen = i[0] self.invalid() self._init_x()
def __init__(self, display=None, fd=-1, auth=None): if auth is not None: [name, data] = auth.split(six.b(':')) c_auth = ffi.new("xcb_auth_info_t *") c_auth.name = ffi.new('char[]', name) c_auth.namelen = len(name) c_auth.data = ffi.new('char[]', data) c_auth.datalen = len(data) else: c_auth = ffi.NULL if display is None: display = ffi.NULL else: display = display.encode('latin1') i = ffi.new("int *") if fd > 0: self._conn = lib.xcb_connect_to_fd(fd, c_auth) elif c_auth != ffi.NULL: self._conn = lib.xcb_connect_to_display_with_auth_info( display, c_auth, i) else: self._conn = lib.xcb_connect(display, i) self.pref_screen = i[0] self.invalid() self._init_x()
def send_request(self, opcode, data, cookie=VoidCookie, reply=None, is_checked=False): data = data.getvalue() assert len(data) > 3, "xcb_send_request data must be ast least 4 bytes" xcb_req = ffi.new("xcb_protocol_request_t *") xcb_req.count = 2 xcb_req.ext = self.c_key xcb_req.opcode = opcode xcb_req.isvoid = issubclass(cookie, VoidCookie) # XXX: send_request here will use the memory *before* the passed in # xcb_parts pointer in some cases, so we need to allocate some for it # to use, although we don't use it ourselves. # # http://lists.freedesktop.org/archives/xcb/2014-February/009307.html xcb_parts = ffi.new("struct iovec[4]") # Here we need this iov_base to keep this memory alive until the end of # the function. xcb_parts[2].iov_base = iov_base = ffi.new('char[]', data) # noqa xcb_parts[2].iov_len = len(data) xcb_parts[3].iov_base = ffi.NULL xcb_parts[3].iov_len = -len(data) & 3 # is this really necessary? flags = lib.XCB_REQUEST_CHECKED if is_checked else 0 seq = self.conn.send_request(flags, xcb_parts + 2, xcb_req) return cookie(self.conn, seq, is_checked)
def to_cffi(self): c_key = ffi.new("struct xcb_extension_t *") c_key.name = name = ffi.new('char[]', self.name.encode()) cffi_explicit_lifetimes[c_key] = name # xpyb doesn't ever set global_id, which seems wrong, but whatever. c_key.global_id = 0 return c_key
def visualtype_to_c_struct(vt): # let ffi be a kwarg so cairocffi can pass in its ffi # cfficairo needs an xcb_visualtype_t s = ffi.new("struct xcb_visualtype_t *") s.visual_id = vt.visual_id s._class = vt._class s.bits_per_rgb_value = vt.bits_per_rgb_value s.colormap_entries = vt.colormap_entries s.red_mask = vt.red_mask s.green_mask = vt.green_mask s.blue_mask = vt.blue_mask return s
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 request_check(self, sequence): cookie = ffi.new("xcb_void_cookie_t [1]") cookie[0].sequence = sequence err = lib.xcb_request_check(self._conn, cookie[0]) self._process_error(err)