mirror of
https://gitlab.freedesktop.org/xorg/lib/libxcb-errors.git
synced 2026-05-18 02:18:09 +02:00
Ignore "event sent" flag in event codes
The highest bit of an event code shows if the event was generated by the X11 server or via the SendEvent request. Ignore this bit in all places that handle event codes. Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
parent
0095e43185
commit
54e2145e11
2 changed files with 17 additions and 3 deletions
|
|
@ -178,6 +178,7 @@ const char *xcb_errors_get_name_for_core_event(xcb_errors_context_t *ctx,
|
|||
struct extension_info_t *best = NULL;
|
||||
struct extension_info_t *next;
|
||||
|
||||
event_code &= 0x7f;
|
||||
if (extension)
|
||||
*extension = NULL;
|
||||
|
||||
|
|
@ -250,6 +251,7 @@ 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;
|
||||
uint8_t response_type;
|
||||
|
||||
if (extension)
|
||||
*extension = NULL;
|
||||
|
|
@ -261,7 +263,8 @@ const char *xcb_errors_get_name_for_xcb_event(xcb_errors_context_t *ctx,
|
|||
while (xkb != NULL && strcmp(xkb->static_info->name, "xkb") != 0)
|
||||
xkb = xkb->next;
|
||||
|
||||
if (event->response_type == XCB_GE_GENERIC) {
|
||||
response_type = event->response_type & 0x7f;
|
||||
if (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)
|
||||
|
|
@ -271,7 +274,7 @@ const char *xcb_errors_get_name_for_xcb_event(xcb_errors_context_t *ctx,
|
|||
ge->extension, ge->event_type);
|
||||
}
|
||||
if (xkb != NULL && xkb->first_event != 0
|
||||
&& event->response_type == xkb->first_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.
|
||||
|
|
@ -282,5 +285,5 @@ const char *xcb_errors_get_name_for_xcb_event(xcb_errors_context_t *ctx,
|
|||
xkb->major_opcode, event->pad0);
|
||||
}
|
||||
/* Generic case, decide only based on the response_type. */
|
||||
return xcb_errors_get_name_for_core_event(ctx, event->response_type, extension);
|
||||
return xcb_errors_get_name_for_core_event(ctx, response_type, extension);
|
||||
}
|
||||
|
|
|
|||
11
tests/test.c
11
tests/test.c
|
|
@ -103,6 +103,11 @@ static int check_event(xcb_errors_context_t *ctx, uint8_t event,
|
|||
"For event %d: Passing NULL made a difference: %s vs %s\n",
|
||||
event, actual, tmp);
|
||||
|
||||
tmp = xcb_errors_get_name_for_core_event(ctx, event | 0x80, NULL);
|
||||
ret |= check_strings(expected, tmp,
|
||||
"For event %d|0x80: Expected %s, got %s\n",
|
||||
event, expected, tmp);
|
||||
|
||||
/* The wire_event we construct isn't a proper GE event */
|
||||
if (event != XCB_GE_GENERIC) {
|
||||
xcb_generic_event_t wire_event = {
|
||||
|
|
@ -121,6 +126,12 @@ static int check_event(xcb_errors_context_t *ctx, uint8_t event,
|
|||
ret |= check_strings(actual, tmp,
|
||||
"For xcb wire event %d: Passing NULL made a difference: %s vs %s\n",
|
||||
event, actual, tmp);
|
||||
|
||||
wire_event.response_type |= 0x80;
|
||||
tmp = xcb_errors_get_name_for_xcb_event(ctx, &wire_event, NULL);
|
||||
ret |= check_strings(expected, tmp,
|
||||
"For xcb wire event %d|0x80: Expected %s, got %s\n",
|
||||
event, expected, tmp);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue