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)
|
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,
|
|
||||||
&mapWidth);
|
|
||||||
len = (max_keycode - min_keycode + 1) * mapWidth;
|
|
||||||
if (!(keymap = calloc(len, sizeof(KeySym))))
|
|
||||||
goto XkbError;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue