From 2b3a1c27c9837b0463695433009dfbd7ddb2456a Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Tue, 13 Aug 2024 17:14:46 +0200 Subject: [PATCH] Xnest: fetch keyboard mapping via xcb Signed-off-by: Enrico Weigelt, metux IT consult --- hw/xnest/Keyboard.c | 45 ++++++++++++++++---------------------------- hw/xnest/xcb.c | 19 +++++++++++++++++++ hw/xnest/xnest-xcb.h | 4 ++++ 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/hw/xnest/Keyboard.c b/hw/xnest/Keyboard.c index 1a770d363..2c574beaa 100644 --- a/hw/xnest/Keyboard.c +++ b/hw/xnest/Keyboard.c @@ -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; } diff --git a/hw/xnest/xcb.c b/hw/xnest/xcb.c index 38675db80..f02f1a17d 100644 --- a/hw/xnest/xcb.c +++ b/hw/xnest/xcb.c @@ -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; +} diff --git a/hw/xnest/xnest-xcb.h b/hw/xnest/xnest-xcb.h index 301aca981..bf2c80203 100644 --- a/hw/xnest/xnest-xcb.h +++ b/hw/xnest/xnest-xcb.h @@ -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 */