Xnest: fetch keyboard mapping via xcb
Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
parent
170124c148
commit
2b3a1c27c9
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue