(!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
							
								
									78b6f4be97
								
							
						
					
					
						commit
						682a4805e0
					
				|  | @ -18,6 +18,7 @@ srcs = [ | |||
|     '../../mi/miinitext.c', | ||||
|     '../../mi/miinitext.h', | ||||
|     'xcb.c', | ||||
|     'xkb.c', | ||||
| ] | ||||
| 
 | ||||
| x11_xcb_dep = dependency('x11-xcb', required: true) | ||||
|  |  | |||
|  | @ -18,6 +18,7 @@ | |||
| 
 | ||||
| #include "Xnest.h" | ||||
| #include "xnest-xcb.h" | ||||
| #include "xnest-xkb.h" | ||||
| #include "XNGC.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( | ||||
|         xnestUpstreamInfo.conn, | ||||
|         xcb_xkb_get_kbd_by_name( | ||||
|         xcb_xkb_get_kbd_by_name_2( | ||||
|             xnestUpstreamInfo.conn, | ||||
|             XCB_XKB_ID_USE_CORE_KBD, | ||||
|             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