91 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			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;
 | |
| }
 |