/* Handle a single event executing the handlers within its queue. * Prints an event dumb in case of empty queue. */ static void _handle(xcb_generic_event_t *e) { uint8_t sendEvent; uint16_t seq_num; fwm_eq_node_t *next_node; uint8_t response_type; fwm_eq_head_t *head; xcb_generic_error_t *er; /* Iterate queued handlers, if any. */ response_type = XCB_EVENT_RESPONSE_TYPE(e); if (response_type) { head = _this.evenths_queue[response_type - 2]; if (head != NULL) { next_node = head->first; while (next_node != NULL) { ((fwm_event_handler_t) (next_node->handler))(e); next_node = next_node->next; } } } else { /* Or format event if not to be handled. */ sendEvent = response_type ? 1 : 0; seq_num = *((uint16_t *) e + 1); switch (response_type) { case 0: er = (xcb_generic_error_t *) e; printf("Error (%s) on sequence number %d.\n", xcb_event_get_error_label(er->error_code), seq_num); break; default: printf("Unhandler event (%s) following seqnum %d.\n", xcb_event_get_label(response_type), seq_num); break; } fflush(stdout); } }
void print_x_event(xcb_generic_event_t *event) { uint8_t event_type = XCB_EVENT_RESPONSE_TYPE(event); const char *label = xcb_event_get_label(event_type); fprintf(stderr, "X event %d : %s\n", event_type, label); }