/*
 * This file generated automatically from shm.xml by c_client.py.
 * Edit at your peril.
 */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stddef.h>  /* for offsetof() */
#include "xcbext.h"
#include "shm.h"

#define ALIGNOF(type) offsetof(struct { char dummy; type member; }, member)
#include "xproto.h"

xcb_extension_t xcb_shm_id = { "MIT-SHM", 0 };


/*****************************************************************************
 **
 ** void xcb_shm_seg_next
 ** 
 ** @param xcb_shm_seg_iterator_t *i
 ** @returns void
 **
 *****************************************************************************/
 
void
xcb_shm_seg_next (xcb_shm_seg_iterator_t *i  /**< */)
{
    --i->rem;
    ++i->data;
    i->index += sizeof(xcb_shm_seg_t);
}


/*****************************************************************************
 **
 ** xcb_generic_iterator_t xcb_shm_seg_end
 ** 
 ** @param xcb_shm_seg_iterator_t i
 ** @returns xcb_generic_iterator_t
 **
 *****************************************************************************/
 
xcb_generic_iterator_t
xcb_shm_seg_end (xcb_shm_seg_iterator_t i  /**< */)
{
    xcb_generic_iterator_t ret;
    ret.data = i.data + i.rem;
    ret.index = i.index + ((char *) ret.data - (char *) i.data);
    ret.rem = 0;
    return ret;
}


/*****************************************************************************
 **
 ** xcb_shm_query_version_cookie_t xcb_shm_query_version
 ** 
 ** @param xcb_connection_t *c
 ** @returns xcb_shm_query_version_cookie_t
 **
 *****************************************************************************/
 
xcb_shm_query_version_cookie_t
xcb_shm_query_version (xcb_connection_t *c  /**< */)
{
    static const xcb_protocol_request_t xcb_req = {
        /* count */ 2,
        /* ext */ &xcb_shm_id,
        /* opcode */ XCB_SHM_QUERY_VERSION,
        /* isvoid */ 0
    };
    
    struct iovec xcb_parts[4];
    xcb_shm_query_version_cookie_t xcb_ret;
    xcb_shm_query_version_request_t xcb_out;
    
    
    xcb_parts[2].iov_base = (char *) &xcb_out;
    xcb_parts[2].iov_len = sizeof(xcb_out);
    xcb_parts[3].iov_base = 0;
    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
    
    xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
    return xcb_ret;
}


/*****************************************************************************
 **
 ** xcb_shm_query_version_cookie_t xcb_shm_query_version_unchecked
 ** 
 ** @param xcb_connection_t *c
 ** @returns xcb_shm_query_version_cookie_t
 **
 *****************************************************************************/
 
xcb_shm_query_version_cookie_t
xcb_shm_query_version_unchecked (xcb_connection_t *c  /**< */)
{
    static const xcb_protocol_request_t xcb_req = {
        /* count */ 2,
        /* ext */ &xcb_shm_id,
        /* opcode */ XCB_SHM_QUERY_VERSION,
        /* isvoid */ 0
    };
    
    struct iovec xcb_parts[4];
    xcb_shm_query_version_cookie_t xcb_ret;
    xcb_shm_query_version_request_t xcb_out;
    
    
    xcb_parts[2].iov_base = (char *) &xcb_out;
    xcb_parts[2].iov_len = sizeof(xcb_out);
    xcb_parts[3].iov_base = 0;
    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
    
    xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
    return xcb_ret;
}


/*****************************************************************************
 **
 ** xcb_shm_query_version_reply_t * xcb_shm_query_version_reply
 ** 
 ** @param xcb_connection_t                *c
 ** @param xcb_shm_query_version_cookie_t   cookie
 ** @param xcb_generic_error_t            **e
 ** @returns xcb_shm_query_version_reply_t *
 **
 *****************************************************************************/
 
xcb_shm_query_version_reply_t *
xcb_shm_query_version_reply (xcb_connection_t                *c  /**< */,
                             xcb_shm_query_version_cookie_t   cookie  /**< */,
                             xcb_generic_error_t            **e  /**< */)
{
    return (xcb_shm_query_version_reply_t *) xcb_wait_for_reply(c, cookie.sequence, e);
}


/*****************************************************************************
 **
 ** xcb_void_cookie_t xcb_shm_attach_checked
 ** 
 ** @param xcb_connection_t *c
 ** @param xcb_shm_seg_t     shmseg
 ** @param uint32_t          shmid
 ** @param uint8_t           read_only
 ** @returns xcb_void_cookie_t
 **
 *****************************************************************************/
 
xcb_void_cookie_t
xcb_shm_attach_checked (xcb_connection_t *c  /**< */,
                        xcb_shm_seg_t     shmseg  /**< */,
                        uint32_t          shmid  /**< */,
                        uint8_t           read_only  /**< */)
{
    static const xcb_protocol_request_t xcb_req = {
        /* count */ 2,
        /* ext */ &xcb_shm_id,
        /* opcode */ XCB_SHM_ATTACH,
        /* isvoid */ 1
    };
    
    struct iovec xcb_parts[4];
    xcb_void_cookie_t xcb_ret;
    xcb_shm_attach_request_t xcb_out;
    
    xcb_out.shmseg = shmseg;
    xcb_out.shmid = shmid;
    xcb_out.read_only = read_only;
    memset(xcb_out.pad0, 0, 3);
    
    xcb_parts[2].iov_base = (char *) &xcb_out;
    xcb_parts[2].iov_len = sizeof(xcb_out);
    xcb_parts[3].iov_base = 0;
    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
    
    xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
    return xcb_ret;
}


/*****************************************************************************
 **
 ** xcb_void_cookie_t xcb_shm_attach
 ** 
 ** @param xcb_connection_t *c
 ** @param xcb_shm_seg_t     shmseg
 ** @param uint32_t          shmid
 ** @param uint8_t           read_only
 ** @returns xcb_void_cookie_t
 **
 *****************************************************************************/
 
xcb_void_cookie_t
xcb_shm_attach (xcb_connection_t *c  /**< */,
                xcb_shm_seg_t     shmseg  /**< */,
                uint32_t          shmid  /**< */,
                uint8_t           read_only  /**< */)
{
    static const xcb_protocol_request_t xcb_req = {
        /* count */ 2,
        /* ext */ &xcb_shm_id,
        /* opcode */ XCB_SHM_ATTACH,
        /* isvoid */ 1
    };
    
    struct iovec xcb_parts[4];
    xcb_void_cookie_t xcb_ret;
    xcb_shm_attach_request_t xcb_out;
    
    xcb_out.shmseg = shmseg;
    xcb_out.shmid = shmid;
    xcb_out.read_only = read_only;
    memset(xcb_out.pad0, 0, 3);
    
    xcb_parts[2].iov_base = (char *) &xcb_out;
    xcb_parts[2].iov_len = sizeof(xcb_out);
    xcb_parts[3].iov_base = 0;
    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
    
    xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
    return xcb_ret;
}


/*****************************************************************************
 **
 ** xcb_void_cookie_t xcb_shm_detach_checked
 ** 
 ** @param xcb_connection_t *c
 ** @param xcb_shm_seg_t     shmseg
 ** @returns xcb_void_cookie_t
 **
 *****************************************************************************/
 
xcb_void_cookie_t
xcb_shm_detach_checked (xcb_connection_t *c  /**< */,
                        xcb_shm_seg_t     shmseg  /**< */)
{
    static const xcb_protocol_request_t xcb_req = {
        /* count */ 2,
        /* ext */ &xcb_shm_id,
        /* opcode */ XCB_SHM_DETACH,
        /* isvoid */ 1
    };
    
    struct iovec xcb_parts[4];
    xcb_void_cookie_t xcb_ret;
    xcb_shm_detach_request_t xcb_out;
    
    xcb_out.shmseg = shmseg;
    
    xcb_parts[2].iov_base = (char *) &xcb_out;
    xcb_parts[2].iov_len = sizeof(xcb_out);
    xcb_parts[3].iov_base = 0;
    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
    
    xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
    return xcb_ret;
}


/*****************************************************************************
 **
 ** xcb_void_cookie_t xcb_shm_detach
 ** 
 ** @param xcb_connection_t *c
 ** @param xcb_shm_seg_t     shmseg
 ** @returns xcb_void_cookie_t
 **
 *****************************************************************************/
 
xcb_void_cookie_t
xcb_shm_detach (xcb_connection_t *c  /**< */,
                xcb_shm_seg_t     shmseg  /**< */)
{
    static const xcb_protocol_request_t xcb_req = {
        /* count */ 2,
        /* ext */ &xcb_shm_id,
        /* opcode */ XCB_SHM_DETACH,
        /* isvoid */ 1
    };
    
    struct iovec xcb_parts[4];
    xcb_void_cookie_t xcb_ret;
    xcb_shm_detach_request_t xcb_out;
    
    xcb_out.shmseg = shmseg;
    
    xcb_parts[2].iov_base = (char *) &xcb_out;
    xcb_parts[2].iov_len = sizeof(xcb_out);
    xcb_parts[3].iov_base = 0;
    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
    
    xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
    return xcb_ret;
}


/*****************************************************************************
 **
 ** xcb_void_cookie_t xcb_shm_put_image_checked
 ** 
 ** @param xcb_connection_t *c
 ** @param xcb_drawable_t    drawable
 ** @param xcb_gcontext_t    gc
 ** @param uint16_t          total_width
 ** @param uint16_t          total_height
 ** @param uint16_t          src_x
 ** @param uint16_t          src_y
 ** @param uint16_t          src_width
 ** @param uint16_t          src_height
 ** @param int16_t           dst_x
 ** @param int16_t           dst_y
 ** @param uint8_t           depth
 ** @param uint8_t           format
 ** @param uint8_t           send_event
 ** @param xcb_shm_seg_t     shmseg
 ** @param uint32_t          offset
 ** @returns xcb_void_cookie_t
 **
 *****************************************************************************/
 
xcb_void_cookie_t
xcb_shm_put_image_checked (xcb_connection_t *c  /**< */,
                           xcb_drawable_t    drawable  /**< */,
                           xcb_gcontext_t    gc  /**< */,
                           uint16_t          total_width  /**< */,
                           uint16_t          total_height  /**< */,
                           uint16_t          src_x  /**< */,
                           uint16_t          src_y  /**< */,
                           uint16_t          src_width  /**< */,
                           uint16_t          src_height  /**< */,
                           int16_t           dst_x  /**< */,
                           int16_t           dst_y  /**< */,
                           uint8_t           depth  /**< */,
                           uint8_t           format  /**< */,
                           uint8_t           send_event  /**< */,
                           xcb_shm_seg_t     shmseg  /**< */,
                           uint32_t          offset  /**< */)
{
    static const xcb_protocol_request_t xcb_req = {
        /* count */ 2,
        /* ext */ &xcb_shm_id,
        /* opcode */ XCB_SHM_PUT_IMAGE,
        /* isvoid */ 1
    };
    
    struct iovec xcb_parts[4];
    xcb_void_cookie_t xcb_ret;
    xcb_shm_put_image_request_t xcb_out;
    
    xcb_out.drawable = drawable;
    xcb_out.gc = gc;
    xcb_out.total_width = total_width;
    xcb_out.total_height = total_height;
    xcb_out.src_x = src_x;
    xcb_out.src_y = src_y;
    xcb_out.src_width = src_width;
    xcb_out.src_height = src_height;
    xcb_out.dst_x = dst_x;
    xcb_out.dst_y = dst_y;
    xcb_out.depth = depth;
    xcb_out.format = format;
    xcb_out.send_event = send_event;
    xcb_out.pad0 = 0;
    xcb_out.shmseg = shmseg;
    xcb_out.offset = offset;
    
    xcb_parts[2].iov_base = (char *) &xcb_out;
    xcb_parts[2].iov_len = sizeof(xcb_out);
    xcb_parts[3].iov_base = 0;
    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
    
    xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
    return xcb_ret;
}


/*****************************************************************************
 **
 ** xcb_void_cookie_t xcb_shm_put_image
 ** 
 ** @param xcb_connection_t *c
 ** @param xcb_drawable_t    drawable
 ** @param xcb_gcontext_t    gc
 ** @param uint16_t          total_width
 ** @param uint16_t          total_height
 ** @param uint16_t          src_x
 ** @param uint16_t          src_y
 ** @param uint16_t          src_width
 ** @param uint16_t          src_height
 ** @param int16_t           dst_x
 ** @param int16_t           dst_y
 ** @param uint8_t           depth
 ** @param uint8_t           format
 ** @param uint8_t           send_event
 ** @param xcb_shm_seg_t     shmseg
 ** @param uint32_t          offset
 ** @returns xcb_void_cookie_t
 **
 *****************************************************************************/
 
xcb_void_cookie_t
xcb_shm_put_image (xcb_connection_t *c  /**< */,
                   xcb_drawable_t    drawable  /**< */,
                   xcb_gcontext_t    gc  /**< */,
                   uint16_t          total_width  /**< */,
                   uint16_t          total_height  /**< */,
                   uint16_t          src_x  /**< */,
                   uint16_t          src_y  /**< */,
                   uint16_t          src_width  /**< */,
                   uint16_t          src_height  /**< */,
                   int16_t           dst_x  /**< */,
                   int16_t           dst_y  /**< */,
                   uint8_t           depth  /**< */,
                   uint8_t           format  /**< */,
                   uint8_t           send_event  /**< */,
                   xcb_shm_seg_t     shmseg  /**< */,
                   uint32_t          offset  /**< */)
{
    static const xcb_protocol_request_t xcb_req = {
        /* count */ 2,
        /* ext */ &xcb_shm_id,
        /* opcode */ XCB_SHM_PUT_IMAGE,
        /* isvoid */ 1
    };
    
    struct iovec xcb_parts[4];
    xcb_void_cookie_t xcb_ret;
    xcb_shm_put_image_request_t xcb_out;
    
    xcb_out.drawable = drawable;
    xcb_out.gc = gc;
    xcb_out.total_width = total_width;
    xcb_out.total_height = total_height;
    xcb_out.src_x = src_x;
    xcb_out.src_y = src_y;
    xcb_out.src_width = src_width;
    xcb_out.src_height = src_height;
    xcb_out.dst_x = dst_x;
    xcb_out.dst_y = dst_y;
    xcb_out.depth = depth;
    xcb_out.format = format;
    xcb_out.send_event = send_event;
    xcb_out.pad0 = 0;
    xcb_out.shmseg = shmseg;
    xcb_out.offset = offset;
    
    xcb_parts[2].iov_base = (char *) &xcb_out;
    xcb_parts[2].iov_len = sizeof(xcb_out);
    xcb_parts[3].iov_base = 0;
    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
    
    xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
    return xcb_ret;
}


/*****************************************************************************
 **
 ** xcb_shm_get_image_cookie_t xcb_shm_get_image
 ** 
 ** @param xcb_connection_t *c
 ** @param xcb_drawable_t    drawable
 ** @param int16_t           x
 ** @param int16_t           y
 ** @param uint16_t          width
 ** @param uint16_t          height
 ** @param uint32_t          plane_mask
 ** @param uint8_t           format
 ** @param xcb_shm_seg_t     shmseg
 ** @param uint32_t          offset
 ** @returns xcb_shm_get_image_cookie_t
 **
 *****************************************************************************/
 
xcb_shm_get_image_cookie_t
xcb_shm_get_image (xcb_connection_t *c  /**< */,
                   xcb_drawable_t    drawable  /**< */,
                   int16_t           x  /**< */,
                   int16_t           y  /**< */,
                   uint16_t          width  /**< */,
                   uint16_t          height  /**< */,
                   uint32_t          plane_mask  /**< */,
                   uint8_t           format  /**< */,
                   xcb_shm_seg_t     shmseg  /**< */,
                   uint32_t          offset  /**< */)
{
    static const xcb_protocol_request_t xcb_req = {
        /* count */ 2,
        /* ext */ &xcb_shm_id,
        /* opcode */ XCB_SHM_GET_IMAGE,
        /* isvoid */ 0
    };
    
    struct iovec xcb_parts[4];
    xcb_shm_get_image_cookie_t xcb_ret;
    xcb_shm_get_image_request_t xcb_out;
    
    xcb_out.drawable = drawable;
    xcb_out.x = x;
    xcb_out.y = y;
    xcb_out.width = width;
    xcb_out.height = height;
    xcb_out.plane_mask = plane_mask;
    xcb_out.format = format;
    memset(xcb_out.pad0, 0, 3);
    xcb_out.shmseg = shmseg;
    xcb_out.offset = offset;
    
    xcb_parts[2].iov_base = (char *) &xcb_out;
    xcb_parts[2].iov_len = sizeof(xcb_out);
    xcb_parts[3].iov_base = 0;
    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
    
    xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
    return xcb_ret;
}


/*****************************************************************************
 **
 ** xcb_shm_get_image_cookie_t xcb_shm_get_image_unchecked
 ** 
 ** @param xcb_connection_t *c
 ** @param xcb_drawable_t    drawable
 ** @param int16_t           x
 ** @param int16_t           y
 ** @param uint16_t          width
 ** @param uint16_t          height
 ** @param uint32_t          plane_mask
 ** @param uint8_t           format
 ** @param xcb_shm_seg_t     shmseg
 ** @param uint32_t          offset
 ** @returns xcb_shm_get_image_cookie_t
 **
 *****************************************************************************/
 
xcb_shm_get_image_cookie_t
xcb_shm_get_image_unchecked (xcb_connection_t *c  /**< */,
                             xcb_drawable_t    drawable  /**< */,
                             int16_t           x  /**< */,
                             int16_t           y  /**< */,
                             uint16_t          width  /**< */,
                             uint16_t          height  /**< */,
                             uint32_t          plane_mask  /**< */,
                             uint8_t           format  /**< */,
                             xcb_shm_seg_t     shmseg  /**< */,
                             uint32_t          offset  /**< */)
{
    static const xcb_protocol_request_t xcb_req = {
        /* count */ 2,
        /* ext */ &xcb_shm_id,
        /* opcode */ XCB_SHM_GET_IMAGE,
        /* isvoid */ 0
    };
    
    struct iovec xcb_parts[4];
    xcb_shm_get_image_cookie_t xcb_ret;
    xcb_shm_get_image_request_t xcb_out;
    
    xcb_out.drawable = drawable;
    xcb_out.x = x;
    xcb_out.y = y;
    xcb_out.width = width;
    xcb_out.height = height;
    xcb_out.plane_mask = plane_mask;
    xcb_out.format = format;
    memset(xcb_out.pad0, 0, 3);
    xcb_out.shmseg = shmseg;
    xcb_out.offset = offset;
    
    xcb_parts[2].iov_base = (char *) &xcb_out;
    xcb_parts[2].iov_len = sizeof(xcb_out);
    xcb_parts[3].iov_base = 0;
    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
    
    xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
    return xcb_ret;
}


/*****************************************************************************
 **
 ** xcb_shm_get_image_reply_t * xcb_shm_get_image_reply
 ** 
 ** @param xcb_connection_t            *c
 ** @param xcb_shm_get_image_cookie_t   cookie
 ** @param xcb_generic_error_t        **e
 ** @returns xcb_shm_get_image_reply_t *
 **
 *****************************************************************************/
 
xcb_shm_get_image_reply_t *
xcb_shm_get_image_reply (xcb_connection_t            *c  /**< */,
                         xcb_shm_get_image_cookie_t   cookie  /**< */,
                         xcb_generic_error_t        **e  /**< */)
{
    return (xcb_shm_get_image_reply_t *) xcb_wait_for_reply(c, cookie.sequence, e);
}


/*****************************************************************************
 **
 ** xcb_void_cookie_t xcb_shm_create_pixmap_checked
 ** 
 ** @param xcb_connection_t *c
 ** @param xcb_pixmap_t      pid
 ** @param xcb_drawable_t    drawable
 ** @param uint16_t          width
 ** @param uint16_t          height
 ** @param uint8_t           depth
 ** @param xcb_shm_seg_t     shmseg
 ** @param uint32_t          offset
 ** @returns xcb_void_cookie_t
 **
 *****************************************************************************/
 
xcb_void_cookie_t
xcb_shm_create_pixmap_checked (xcb_connection_t *c  /**< */,
                               xcb_pixmap_t      pid  /**< */,
                               xcb_drawable_t    drawable  /**< */,
                               uint16_t          width  /**< */,
                               uint16_t          height  /**< */,
                               uint8_t           depth  /**< */,
                               xcb_shm_seg_t     shmseg  /**< */,
                               uint32_t          offset  /**< */)
{
    static const xcb_protocol_request_t xcb_req = {
        /* count */ 2,
        /* ext */ &xcb_shm_id,
        /* opcode */ XCB_SHM_CREATE_PIXMAP,
        /* isvoid */ 1
    };
    
    struct iovec xcb_parts[4];
    xcb_void_cookie_t xcb_ret;
    xcb_shm_create_pixmap_request_t xcb_out;
    
    xcb_out.pid = pid;
    xcb_out.drawable = drawable;
    xcb_out.width = width;
    xcb_out.height = height;
    xcb_out.depth = depth;
    memset(xcb_out.pad0, 0, 3);
    xcb_out.shmseg = shmseg;
    xcb_out.offset = offset;
    
    xcb_parts[2].iov_base = (char *) &xcb_out;
    xcb_parts[2].iov_len = sizeof(xcb_out);
    xcb_parts[3].iov_base = 0;
    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
    
    xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
    return xcb_ret;
}


/*****************************************************************************
 **
 ** xcb_void_cookie_t xcb_shm_create_pixmap
 ** 
 ** @param xcb_connection_t *c
 ** @param xcb_pixmap_t      pid
 ** @param xcb_drawable_t    drawable
 ** @param uint16_t          width
 ** @param uint16_t          height
 ** @param uint8_t           depth
 ** @param xcb_shm_seg_t     shmseg
 ** @param uint32_t          offset
 ** @returns xcb_void_cookie_t
 **
 *****************************************************************************/
 
xcb_void_cookie_t
xcb_shm_create_pixmap (xcb_connection_t *c  /**< */,
                       xcb_pixmap_t      pid  /**< */,
                       xcb_drawable_t    drawable  /**< */,
                       uint16_t          width  /**< */,
                       uint16_t          height  /**< */,
                       uint8_t           depth  /**< */,
                       xcb_shm_seg_t     shmseg  /**< */,
                       uint32_t          offset  /**< */)
{
    static const xcb_protocol_request_t xcb_req = {
        /* count */ 2,
        /* ext */ &xcb_shm_id,
        /* opcode */ XCB_SHM_CREATE_PIXMAP,
        /* isvoid */ 1
    };
    
    struct iovec xcb_parts[4];
    xcb_void_cookie_t xcb_ret;
    xcb_shm_create_pixmap_request_t xcb_out;
    
    xcb_out.pid = pid;
    xcb_out.drawable = drawable;
    xcb_out.width = width;
    xcb_out.height = height;
    xcb_out.depth = depth;
    memset(xcb_out.pad0, 0, 3);
    xcb_out.shmseg = shmseg;
    xcb_out.offset = offset;
    
    xcb_parts[2].iov_base = (char *) &xcb_out;
    xcb_parts[2].iov_len = sizeof(xcb_out);
    xcb_parts[3].iov_base = 0;
    xcb_parts[3].iov_len = -xcb_parts[2].iov_len & 3;
    
    xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
    return xcb_ret;
}

