summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorUli Schlachter <psychon@znc.in>2015-04-05 13:49:07 +0200
committerUli Schlachter <psychon@znc.in>2015-04-05 13:49:07 +0200
commit964a2b53500ed9af63528375d48d6805c5c11998 (patch)
tree02fe66bd363d632ad5947a99eab79fe53c7a1790 /src
parent63ca7f6c8814ee4974a1ae784ab06eca01e6dff2 (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.c33
-rw-r--r--src/xcb_errors.h14
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 ()