From 90b30fef647bbcb52d92de89679a0a8fba41c398 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 | 44 ++++++++++++++++---------------------------- hw/xnest/xcb.c | 19 +++++++++++++++++++ hw/xnest/xnest-xcb.h | 6 ++++++ 3 files changed, 41 insertions(+), 28 deletions(-) diff --git a/hw/xnest/Keyboard.c b/hw/xnest/Keyboard.c index 8217fe865..bcc9dc485 100644 --- a/hw/xnest/Keyboard.c +++ b/hw/xnest/Keyboard.c @@ -102,9 +102,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; @@ -116,26 +113,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 = xnestGetKeyboardMapping( + xnestUpstreamInfo.conn, + min_keycode, + num_keycode); - keymap64 = XGetKeyboardMapping(xnestDisplay, - min_keycode, - num_keycode, - &mapWidth); - len = (max_keycode - min_keycode + 1) * mapWidth; - keymap = xallocarray(len, sizeof(KeySym)); - 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); @@ -151,11 +144,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); @@ -163,6 +151,8 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff) keySyms.maxKeyCode - keySyms.minKeyCode + 1, modmap, serverClient); + free(keymap_reply); + xnestXkbInit(xnestUpstreamInfo.conn); int device_id = xnestXkbDeviceId(xnestUpstreamInfo.conn); @@ -218,7 +208,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: @@ -248,7 +237,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 17f17d1f7..d995dcd21 100644 --- a/hw/xnest/xcb.c +++ b/hw/xnest/xcb.c @@ -345,3 +345,22 @@ int xnestXkbDeviceId(xcb_connection_t *conn) free(reply); return device_id; } + +xcb_get_keyboard_mapping_reply_t *xnestGetKeyboardMapping( + 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 fb8e89909..b60fd9f1a 100644 --- a/hw/xnest/xnest-xcb.h +++ b/hw/xnest/xnest-xcb.h @@ -109,4 +109,10 @@ void xnestSetCommand(xcb_connection_t *conn, xcb_window_t window, char ** argv, void xnestXkbInit(xcb_connection_t *conn); int xnestXkbDeviceId(xcb_connection_t *conn); +xcb_get_keyboard_mapping_reply_t *xnestGetKeyboardMapping( + xcb_connection_t *conn, + int min_keycode, + int count +); + #endif /* __XNEST__XCB_H */