#include "xkb_util.h" /* // check compile time library version int xcb_xkb_util_library_version(int *lib_major_in_out, int *lib_minor_in_out) { } */ xcb_xkb_use_extension_reply_t * xcb_xkb_util_query_extension(xcb_connection_t *c, uint16_t wantedMajor, uint16_t wantedMinor, xcb_generic_error_t **error) { xcb_xkb_use_extension_cookie_t use_xkb = xcb_xkb_use_extension(c, wantedMajor, wantedMinor); xcb_flush(c); return xcb_xkb_use_extension_reply (c, use_xkb, error); } xcb_generic_error_t * xcb_xkb_util_select_events(xcb_connection_t *c, xcb_xkb_device_spec_t device_spec, uint16_t event_mask, uint16_t select) { xcb_void_cookie_t void_cookie; uint16_t affectMap = 0; uint16_t map = 0; /* sort out the MapNotify event */ if (event_mask & XCB_XKB_EVENT_TYPE_MAP_NOTIFY) { affectMap = xcb_xkb_util_all_map_parts_mask; if (select & XCB_XKB_EVENT_TYPE_MAP_NOTIFY) map = xcb_xkb_util_all_map_parts_mask; } void_cookie = xcb_xkb_select_events(c, device_spec, event_mask, event_mask & (~select), /* clear */ event_mask & select, /* selectAll */ affectMap, map, NULL); return xcb_request_check(c, void_cookie); } xcb_generic_error_t * xcb_xkb_util_select_event_details(xcb_connection_t *c, xcb_xkb_device_spec_t device_spec, uint16_t event_mask, uint32_t affect, uint32_t details) { xcb_void_cookie_t void_cookie; uint16_t affectMap = 0; uint16_t map = 0; /* for a single event, the switch argument cannot be larger than uint32_t[2] */ union { uint8_t i8[2]; uint16_t i16[2]; uint32_t i32[2]; } buffer = {0, 0}; void *_buffer = 0; /* sort out the MapNotify event */ if (event_mask & XCB_XKB_EVENT_TYPE_MAP_NOTIFY) { affectMap = (uint16_t)affect; map = (uint16_t)details | (xcb_xkb_util_all_client_map_parts_mask & affect); event_mask = XCB_XKB_EVENT_TYPE_MAP_NOTIFY; } else { /* assemble the switch argument manually */ switch(event_mask) { case XCB_XKB_EVENT_TYPE_NEW_KEYBOARD_NOTIFY: case XCB_XKB_EVENT_TYPE_STATE_NOTIFY: case XCB_XKB_EVENT_TYPE_NAMES_NOTIFY: case XCB_XKB_EVENT_TYPE_ACCESS_X_NOTIFY: case XCB_XKB_EVENT_TYPE_EXTENSION_DEVICE_NOTIFY: buffer.i16[0] = (uint16_t)affect; buffer.i16[1] = (uint16_t)details; _buffer = buffer.i16; break; case XCB_XKB_EVENT_TYPE_CONTROLS_NOTIFY: case XCB_XKB_EVENT_TYPE_INDICATOR_STATE_NOTIFY: case XCB_XKB_EVENT_TYPE_INDICATOR_MAP_NOTIFY: buffer.i32[0] = affect; buffer.i32[1] = details; _buffer = buffer.i32; break; case XCB_XKB_EVENT_TYPE_COMPAT_MAP_NOTIFY: case XCB_XKB_EVENT_TYPE_BELL_NOTIFY: case XCB_XKB_EVENT_TYPE_ACTION_MESSAGE: buffer.i8[0] = (uint8_t)affect; buffer.i8[1] = (uint8_t)details; _buffer = buffer.i8; break; } } void_cookie = xcb_xkb_select_events(c, device_spec, event_mask, 0, /* clear */ 0, /* selectAll */ affectMap, map, _buffer); return xcb_request_check(c, void_cookie); } xcb_xkb_get_names_reply_t * xcb_xkb_util_get_names (xcb_connection_t *c, xcb_xkb_device_spec_t device_spec, uint32_t which, xcb_xkb_get_names_value_list_t *_aux, xcb_generic_error_t **e) { xcb_xkb_get_names_cookie_t cookie = xcb_xkb_get_names (c, device_spec, which); xcb_xkb_get_names_reply_t *reply = xcb_xkb_get_names_reply (c, cookie, e); void *buffer; if (!(*e)) { buffer = xcb_xkb_get_names_value_list(reply); xcb_xkb_get_names_value_list_unpack (buffer, reply->nTypes, reply->indicators, reply->virtualMods, reply->groupNames, reply->nKeys, reply->nKeyAliases, reply->nRadioGroups, reply->which, _aux); } return reply; } xcb_xkb_get_state_reply_t * xcb_xkb_util_get_state(xcb_connection_t *c, xcb_xkb_device_spec_t device_spec, xcb_generic_error_t **e) { xcb_xkb_get_state_cookie_t cookie = xcb_xkb_get_state (c, device_spec); return xcb_xkb_get_state_reply (c, cookie, e); } xcb_xkb_get_map_reply_t * xcb_xkb_util_get_map(xcb_connection_t *c, xcb_xkb_device_spec_t device_spec, uint16_t map_components, xcb_xkb_get_map_map_t *_aux, xcb_generic_error_t **e) { xcb_xkb_get_map_cookie_t cookie; xcb_xkb_get_map_reply_t *reply; void *buffer; cookie = xcb_xkb_get_map (c, device_spec, map_components, 0, /* partial */ 0, /* firstType */ 0, /* nTypes */ 0, /* firstKeySym */ 0, /* nKeySyms */ 0, /* firstKeyAction */ 0, /* nKeyActions */ 0, /* firstKeyBehavior */ 0, /* nKeyBehaviors */ 0, /* virtualMods */ 0, /* firstKeyExplicit */ 0, /* nKeyExplicit */ 0, /* firstModMapKey */ 0, /* nModMapKeys */ 0, /* firstVModMapKey */ 0 /* nVModMapKeys */); reply = xcb_xkb_get_map_reply (c, cookie, e); if (!(*e)) { buffer = xcb_xkb_get_map_map(reply); xcb_xkb_get_map_map_unpack (buffer, reply->nTypes, reply->nKeySyms, reply->nKeyActions, reply->totalActions, reply->totalKeyBehaviors, reply->nVModMapKeys, reply->totalKeyExplicit, reply->totalModMapKeys, reply->totalVModMapKeys, reply->present, _aux); } return reply; } xcb_xkb_get_kbd_by_name_reply_t * xcb_xkb_util_get_kbd_by_name (xcb_connection_t *c, xcb_xkb_device_spec_t device_spec, uint16_t need, uint16_t want, xcb_xkb_get_kbd_by_name_replies_t *_aux, xcb_generic_error_t **e) { xcb_xkb_get_kbd_by_name_cookie_t cookie; xcb_xkb_get_kbd_by_name_reply_t *reply; void *buffer; cookie = xcb_xkb_get_kbd_by_name (c, device_spec, need, want, 0, /* load */ 0, /* keymapsSpecLen */ 0, /* keymapsSpec */ 0, /* keycodesSpecLen */ 0, /* keycodesSpec */ 0, /* typesSpecLen */ 0, /* typesSpec */ 0, /* compatMapSpecLen */ 0, /* compatMapSpec */ 0, /* symbolsSpecLen */ 0, /* symbolsSpec */ 0, /* geometrySpecLen */ 0 /* geometrySpec */); reply = xcb_xkb_get_kbd_by_name_reply (c, cookie, e); if (!(*e)) { buffer = xcb_xkb_get_kbd_by_name_replies (reply); xcb_xkb_get_kbd_by_name_replies_unpack (buffer, reply->reported, _aux); } return reply; }