xserver/hw/xnest/xkb.c

91 lines
2.9 KiB
C

#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stddef.h> /* for offsetof() */
#include <xcb/xcbext.h>
#include <xcb/xkb.h>
#include <xcb/xproto.h>
#include "xnest-xkb.h"
xcb_xkb_get_kbd_by_name_cookie_t
xcb_xkb_get_kbd_by_name_2 (xcb_connection_t *c,
xcb_xkb_device_spec_t deviceSpec,
uint16_t need,
uint16_t want,
uint8_t load,
uint32_t data_len,
const uint8_t *data)
{
static const xcb_protocol_request_t xcb_req = {
.count = 4,
.ext = &xcb_xkb_id,
.opcode = XCB_XKB_GET_KBD_BY_NAME,
.isvoid = 0
};
struct iovec xcb_parts[6];
xcb_xkb_get_kbd_by_name_cookie_t xcb_ret;
xcb_xkb_get_kbd_by_name_request_t xcb_out;
xcb_out.deviceSpec = deviceSpec;
xcb_out.need = need;
xcb_out.want = want;
xcb_out.load = load;
xcb_out.pad0 = 0;
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;
/* uint8_t data */
xcb_parts[4].iov_base = (char *) data;
xcb_parts[4].iov_len = data_len * sizeof(uint8_t);
xcb_parts[5].iov_base = 0;
xcb_parts[5].iov_len = -xcb_parts[4].iov_len & 3;
xcb_ret.sequence = xcb_send_request(c, XCB_REQUEST_CHECKED, xcb_parts + 2, &xcb_req);
return xcb_ret;
}
xcb_xkb_get_kbd_by_name_cookie_t
xcb_xkb_get_kbd_by_name_2_unchecked (xcb_connection_t *c,
xcb_xkb_device_spec_t deviceSpec,
uint16_t need,
uint16_t want,
uint8_t load,
uint32_t data_len,
const uint8_t *data)
{
static const xcb_protocol_request_t xcb_req = {
.count = 4,
.ext = &xcb_xkb_id,
.opcode = XCB_XKB_GET_KBD_BY_NAME,
.isvoid = 0
};
struct iovec xcb_parts[6];
xcb_xkb_get_kbd_by_name_cookie_t xcb_ret;
xcb_xkb_get_kbd_by_name_request_t xcb_out;
xcb_out.deviceSpec = deviceSpec;
xcb_out.need = need;
xcb_out.want = want;
xcb_out.load = load;
xcb_out.pad0 = 0;
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;
/* uint8_t data */
xcb_parts[4].iov_base = (char *) data;
xcb_parts[4].iov_len = data_len * sizeof(uint8_t);
xcb_parts[5].iov_base = 0;
xcb_parts[5].iov_len = -xcb_parts[4].iov_len & 3;
xcb_ret.sequence = xcb_send_request(c, 0, xcb_parts + 2, &xcb_req);
return xcb_ret;
}