#include #include #include int main() { xcb_connection_t *connection = xcb_connect(NULL, NULL); xcb_xkb_use_extension_unchecked(connection, XCB_XKB_MAJOR_VERSION, XCB_XKB_MINOR_VERSION); xcb_xkb_get_map_cookie_t map_cookie; xcb_xkb_get_map_reply_t *map_reply; xcb_generic_error_t *map_error = 0; map_cookie = xcb_xkb_get_map(connection, XCB_XKB_ID_USE_CORE_KBD, XCB_XKB_MAP_PART_VIRTUAL_MOD_MAP | XCB_XKB_MAP_PART_KEY_TYPES | XCB_XKB_MAP_PART_KEY_SYMS | XCB_XKB_MAP_PART_EXPLICIT_COMPONENTS | XCB_XKB_MAP_PART_KEY_ACTIONS | XCB_XKB_MAP_PART_KEY_BEHAVIORS | XCB_XKB_MAP_PART_VIRTUAL_MODS | XCB_XKB_MAP_PART_MODIFIER_MAP, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); // hmm map_reply = xcb_xkb_get_map_reply(connection, map_cookie, &map_error); if (map_error) { free(map_error); return -1; } const xcb_xkb_get_map_map_t *map = (xcb_xkb_get_map_map_t *)xcb_xkb_get_map_map(map_reply); xcb_xkb_key_v_mod_map_iterator_t iter = xcb_xkb_get_map_map_vmodmap_rtrn_iterator(map_reply, map); printf("reply %p, map %p, iter %p\n", map_reply, map, iter.data); xcb_keycode_t key = 0; while (iter.rem) { printf("iter.data %p\n", iter.data); if (iter.data) { key = iter.data->keycode; // <----- CRASH xcb_xkb_key_v_mod_map_next(&iter); } } return key; }