Xnest: fetch keyboard mapping via xcb

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-08-13 17:14:46 +02:00
parent 170124c148
commit 2b3a1c27c9
3 changed files with 39 additions and 29 deletions

View File

@ -98,9 +98,6 @@ int
xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
{
XModifierKeymap *modifier_keymap;
KeySym *keymap;
int mapWidth;
KeySymsRec keySyms;
CARD8 modmap[MAP_LENGTH];
int i, j;
XKeyboardState values;
@ -112,27 +109,22 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
const int max_keycode = xnestUpstreamInfo.setup->max_keycode;
const int num_keycode = max_keycode - min_keycode + 1;
#ifdef _XSERVER64
{
KeySym64 *keymap64;
int len;
xcb_get_keyboard_mapping_reply_t * keymap_reply = xnest_get_keyboard_mapping(
xnestUpstreamInfo.conn,
min_keycode,
num_keycode);
keymap64 = XGetKeyboardMapping(xnestDisplay,
min_keycode,
num_keycode,
&mapWidth);
len = (max_keycode - min_keycode + 1) * mapWidth;
if (!(keymap = calloc(len, sizeof(KeySym))))
goto XkbError;
for (i = 0; i < len; ++i)
keymap[i] = keymap64[i];
XFree(keymap64);
if (!keymap_reply) {
ErrorF("Couldn't get keyboard mappings: no reply");
goto XkbError;
}
#else
keymap = XGetKeyboardMapping(xnestDisplay,
min_keycode,
num_keycode, &mapWidth);
#endif
KeySymsRec keySyms = {
.minKeyCode = min_keycode,
.maxKeyCode = max_keycode,
.mapWidth = keymap_reply->keysyms_per_keycode,
.map = xcb_get_keyboard_mapping_keysyms(keymap_reply),
};
memset(modmap, 0, sizeof(modmap));
modifier_keymap = XGetModifierMapping(xnestDisplay);
@ -148,11 +140,6 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
}
XFreeModifiermap(modifier_keymap);
keySyms.minKeyCode = min_keycode;
keySyms.maxKeyCode = max_keycode;
keySyms.mapWidth = mapWidth;
keySyms.map = keymap;
InitKeyboardDeviceStruct(pDev, NULL,
xnestBell, xnestChangeKeyboardControl);
@ -160,6 +147,8 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
keySyms.maxKeyCode - keySyms.minKeyCode + 1,
modmap, serverClient);
free(keymap_reply);
xnest_xkb_init(xnestUpstreamInfo.conn);
int device_id = xnest_xkb_device_id(xnestUpstreamInfo.conn);
@ -215,7 +204,6 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
memcpy(&ctrls.per_key_repeat, reply->perKeyRepeat, sizeof(ctrls.per_key_repeat));
XkbDDXChangeControls(pDev, &ctrls, &ctrls);
free(keymap);
break;
}
case DEVICE_ON:
@ -245,7 +233,6 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
(char *) values.auto_repeats, sizeof(values.auto_repeats));
InitKeyboardDeviceStruct(pDev, NULL, xnestBell, xnestChangeKeyboardControl);
free(keymap);
return Success;
}

View File

@ -245,3 +245,22 @@ int xnest_xkb_device_id(xcb_connection_t *conn)
free(reply);
return device_id;
}
xcb_get_keyboard_mapping_reply_t *xnest_get_keyboard_mapping(
xcb_connection_t *conn,
int min_keycode,
int count
) {
xcb_generic_error_t *err= NULL;
xcb_get_keyboard_mapping_reply_t * reply = xcb_get_keyboard_mapping_reply(
xnestUpstreamInfo.conn,
xcb_get_keyboard_mapping(conn, min_keycode, count),
&err);
if (err) {
ErrorF("Couldn't get keyboard mapping: %d\n", err->error_code);
free(err);
}
return reply;
}

View File

@ -37,4 +37,8 @@ void xnest_set_command(xcb_connection_t *conn, xcb_window_t window, char ** argv
void xnest_xkb_init(xcb_connection_t *conn);
int xnest_xkb_device_id(xcb_connection_t *conn);
xcb_get_keyboard_mapping_reply_t *xnest_get_keyboard_mapping(xcb_connection_t *conn,
int min_keycode,
int count);
#endif /* __XNEST__XCB_H */