diff options
author | Uli Schlachter <psychon@znc.in> | 2015-04-05 13:49:07 +0200 |
---|---|---|
committer | Uli Schlachter <psychon@znc.in> | 2015-04-05 13:49:07 +0200 |
commit | 964a2b53500ed9af63528375d48d6805c5c11998 (patch) | |
tree | 02fe66bd363d632ad5947a99eab79fe53c7a1790 /src | |
parent | 63ca7f6c8814ee4974a1ae784ab06eca01e6dff2 (diff) |
Add a function for figuring out information about an event struct
Signed-off-by: Uli Schlachter <psychon@znc.in>
Diffstat (limited to 'src')
-rw-r--r-- | src/xcb_errors.c | 33 | ||||
-rw-r--r-- | src/xcb_errors.h | 14 |
2 files changed, 47 insertions, 0 deletions
diff --git a/src/xcb_errors.c b/src/xcb_errors.c index 266159d..b796ae4 100644 --- a/src/xcb_errors.c +++ b/src/xcb_errors.c @@ -223,3 +223,36 @@ const char *xcb_errors_get_name_for_error(xcb_errors_context_t *ctx, *extension = best->static_info->name; return get_strings_entry(best->static_info->strings_errors, error_code - best->first_error); } + +const char *xcb_errors_get_name_for_xcb_event(xcb_errors_context_t *ctx, + xcb_generic_event_t *event, const char **extension) +{ + struct extension_info_t *xkb = ctx->extensions; + + /* Find the xkb extension, if present */ + while (xkb != NULL && strcmp(xkb->static_info->name, "xkb") != 0) + xkb = xkb->next; + + if (event->response_type == XCB_GE_GENERIC) { + /* XGE offers extension's major code and event sub-type. */ + xcb_ge_generic_event_t *ge = (void *) event; + if (extension) + *extension = xcb_errors_get_name_for_major_code(ctx, + ge->extension); + return xcb_errors_get_name_for_xge_event(ctx, + ge->extension, ge->event_type); + } + if (xkb != NULL && xkb->first_event != 0 + && event->response_type == xkb->first_event) { + /* There is no nice struct that defines the common fields for + * XKB events, but the event type is always in the second byte. + * In xcb_generic_event_t, this is the pad0 field. + */ + if (extension) + *extension = xkb->static_info->name; + return xcb_errors_get_name_for_xge_event(ctx, + xkb->major_opcode, event->pad0); + } + /* Generic case, decide only based on the response_type. */ + return xcb_errors_get_name_for_event(ctx, event->response_type, extension); +} diff --git a/src/xcb_errors.h b/src/xcb_errors.h index 1c8b66a..378913b 100644 --- a/src/xcb_errors.h +++ b/src/xcb_errors.h @@ -116,6 +116,20 @@ const char *xcb_errors_get_name_for_xge_event(xcb_errors_context_t *ctx, uint8_t major_code, uint16_t event_type); /** + * Get a human printable name describing the type of some event. + * + * @param ctx An errors context, created with @ref xcb_errors_context_new () + * @param event The event to investigate. + * @param extension Will be set to the name of the extension that generated this + * event or NULL for unknown events or core X11 events. This argument may be + * NULL. + * @return A string allocated in static storage that contains a name for this + * event or NULL for unknown event types. + */ +const char *xcb_errors_get_name_for_xcb_event(xcb_errors_context_t *ctx, + xcb_generic_event_t *event, const char **extension); + +/** * Get the name corresponding to some error. * * @param ctx An errors context, created with @ref xcb_errors_context_new () |