compositor-x11: Clean up event handling.
diff --git a/src/compositor-x11.c b/src/compositor-x11.c
index c7db401..2349936 100644
--- a/src/compositor-x11.c
+++ b/src/compositor-x11.c
@@ -25,6 +25,7 @@
#include <config.h>
#endif
+#include <assert.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
@@ -823,18 +824,21 @@
xcb_atom_t atom;
uint32_t *k;
uint32_t i, set;
+ uint8_t response_type;
int count;
prev = NULL;
count = 0;
while (x11_compositor_next_event(c, &event, mask)) {
+ response_type = event->response_type & ~0x80;
+
switch (prev ? prev->response_type & ~0x80 : 0x80) {
case XCB_KEY_RELEASE:
/* Suppress key repeat events; this is only used if we
* don't have XCB XKB support. */
key_release = (xcb_key_press_event_t *) prev;
key_press = (xcb_key_press_event_t *) event;
- if ((event->response_type & ~0x80) == XCB_KEY_PRESS &&
+ if (response_type == XCB_KEY_PRESS &&
key_release->time == key_press->time &&
key_release->detail == key_press->detail) {
/* Don't deliver the held key release
@@ -859,8 +863,7 @@
}
case XCB_FOCUS_IN:
- /* assert event is keymap_notify */
- focus_in = (xcb_focus_in_event_t *) prev;
+ assert(response_type == XCB_KEYMAP_NOTIFY);
keymap_notify = (xcb_keymap_notify_event_t *) event;
c->keys.size = 0;
for (i = 0; i < ARRAY_LENGTH(keymap_notify->keys) * 8; i++) {
@@ -872,7 +875,6 @@
}
}
- output = x11_compositor_find_output(c, focus_in->event);
/* Unfortunately the state only comes with the enter
* event, rather than with the focus event. I'm not
* sure of the exact semantics around it and whether
@@ -889,7 +891,7 @@
break;
}
- switch (event->response_type & ~0x80) {
+ switch (response_type) {
case XCB_KEY_PRESS:
key_press = (xcb_key_press_event_t *) event;
if (!c->has_xkb)
@@ -941,7 +943,6 @@
break;
if (!c->has_xkb)
update_xkb_state_from_core(c, enter_notify->state);
- output = x11_compositor_find_output(c, enter_notify->event);
notify_pointer_focus(&c->core_seat, NULL, 0, 0);
break;
@@ -974,7 +975,7 @@
#ifdef HAVE_XCB_XKB
if (c->has_xkb &&
- (event->response_type & ~0x80) == c->xkb_event_base) {
+ response_type == c->xkb_event_base) {
xcb_xkb_state_notify_event_t *state =
(xcb_xkb_state_notify_event_t *) event;
if (state->xkbType == XCB_XKB_STATE_NOTIFY)