(!1654) Xnest: fetch keyboard mapping via xcb
Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
		
							parent
							
								
									b95ed60be0
								
							
						
					
					
						commit
						ea0605d28e
					
				| 
						 | 
				
			
			@ -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))))
 | 
			
		||||
        if (!keymap_reply) {
 | 
			
		||||
            ErrorF("Couldn't get keyboard mappings: no reply");
 | 
			
		||||
            goto XkbError;
 | 
			
		||||
            for (i = 0; i < len; ++i)
 | 
			
		||||
                keymap[i] = keymap64[i];
 | 
			
		||||
            XFree(keymap64);
 | 
			
		||||
        }
 | 
			
		||||
#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