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
e5eec08f33
commit
170124c148
|
@ -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