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

View File

@ -245,3 +245,22 @@ int xnest_xkb_device_id(xcb_connection_t *conn)
free(reply); free(reply);
return device_id; 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); void xnest_xkb_init(xcb_connection_t *conn);
int xnest_xkb_device_id(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 */ #endif /* __XNEST__XCB_H */