(!1654) Xnest: add own copy of fixed xcb_xkb_get_kbd_by_name()
This is a temporary measure, until xcbproto / libxcb is fixed: keep an own copy of the fixed xcb_xkb_get_kbd_by_name(), renamed as xcb_xkb_get_kbd_by_name_1(). Once xcbproto/libxcb is fixed (and new xcb release is out), this commit can be reverted. Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
		
							parent
							
								
									8d367e1f48
								
							
						
					
					
						commit
						b95ed60be0
					
				| 
						 | 
					@ -18,6 +18,7 @@ srcs = [
 | 
				
			||||||
    '../../mi/miinitext.c',
 | 
					    '../../mi/miinitext.c',
 | 
				
			||||||
    '../../mi/miinitext.h',
 | 
					    '../../mi/miinitext.h',
 | 
				
			||||||
    'xcb.c',
 | 
					    'xcb.c',
 | 
				
			||||||
 | 
					    'xkb.c',
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
x11_xcb_dep = dependency('x11-xcb', required: true)
 | 
					x11_xcb_dep = dependency('x11-xcb', required: true)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "Xnest.h"
 | 
					#include "Xnest.h"
 | 
				
			||||||
#include "xnest-xcb.h"
 | 
					#include "xnest-xcb.h"
 | 
				
			||||||
 | 
					#include "xnest-xkb.h"
 | 
				
			||||||
#include "XNGC.h"
 | 
					#include "XNGC.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "Display.h"
 | 
					#include "Display.h"
 | 
				
			||||||
| 
						 | 
					@ -219,7 +220,7 @@ int xnest_xkb_device_id(xcb_connection_t *conn)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    xcb_xkb_get_kbd_by_name_reply_t *reply = xcb_xkb_get_kbd_by_name_reply(
 | 
					    xcb_xkb_get_kbd_by_name_reply_t *reply = xcb_xkb_get_kbd_by_name_reply(
 | 
				
			||||||
        xnestUpstreamInfo.conn,
 | 
					        xnestUpstreamInfo.conn,
 | 
				
			||||||
        xcb_xkb_get_kbd_by_name(
 | 
					        xcb_xkb_get_kbd_by_name_2(
 | 
				
			||||||
            xnestUpstreamInfo.conn,
 | 
					            xnestUpstreamInfo.conn,
 | 
				
			||||||
            XCB_XKB_ID_USE_CORE_KBD,
 | 
					            XCB_XKB_ID_USE_CORE_KBD,
 | 
				
			||||||
            XkbGBN_AllComponentsMask_2,
 | 
					            XkbGBN_AllComponentsMask_2,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,90 @@
 | 
				
			||||||
 | 
					#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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					/* SPDX-License-Identifier: MIT OR X11
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright © 2024 Enrico Weigelt, metux IT consult <info@metux.net>
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#ifndef __XNEST__XKB_H
 | 
				
			||||||
 | 
					#define __XNEST__XKB_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <xcb/xcb.h>
 | 
				
			||||||
 | 
					#include <xcb/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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* __XNEST__XKB_H */
 | 
				
			||||||
		Loading…
	
		Reference in New Issue