int main(int argc, char *argv[]) { X11Data x11data = create_default_x11data(); for(;;) { if (x11data.window == None) handle_focus(&x11data); else handle_event(&x11data, argv[1]); } return 0; }
// Handle X event on queue. Return true if event was handled. bool jbxvt_handle_xevents(xcb_connection_t * xc) { jb_check_x(xc); static bool init; if (!init) { // Set up the wm_del_win property here. wm_del_win(xc); } xcb_generic_event_t * event = xcb_poll_for_event(xc); if (!event) // nothing to process return false; bool ret = true; switch (event->response_type & ~0x80) { // Put things to ignore here: case 0: // Unimplemented, undefined, no event case 150: // Undefined case XCB_KEY_RELEASE: // Unimplemented case XCB_MAP_NOTIFY: case XCB_NO_EXPOSURE: // Unimplemented case XCB_REPARENT_NOTIFY: // handle here to ensure cursor filled. ret = false; break; case XCB_CONFIGURE_NOTIFY: jbxvt_resize_window(xc); break; case XCB_KEY_PRESS: key_press(xc, event); break; case XCB_CLIENT_MESSAGE: handle_client_message(xc, (xcb_client_message_event_t *)event); break; case XCB_EXPOSE: case XCB_GRAPHICS_EXPOSURE: handle_expose(xc, (xcb_expose_event_t *)event); break; case XCB_ENTER_NOTIFY: case XCB_FOCUS_IN: handle_focus(true); break; case XCB_LEAVE_NOTIFY: case XCB_FOCUS_OUT: handle_focus(false); break; case XCB_SELECTION_CLEAR: jbxvt_clear_selection(); break; case XCB_SELECTION_NOTIFY: handle_selection_notify(xc, (xcb_selection_notify_event_t *)event); break; case XCB_SELECTION_REQUEST: handle_selection_request(xc, (xcb_selection_request_event_t *)event); break; case XCB_BUTTON_PRESS: jbxvt_handle_button_press_event(xc, (xcb_button_press_event_t *)event); break; case XCB_BUTTON_RELEASE: jbxvt_handle_button_release_event(xc, (xcb_button_release_event_t *)event); break; case XCB_MOTION_NOTIFY: handle_motion_notify(xc, (xcb_motion_notify_event_t *)event); break; default: LOG("Unhandled event %d", event->response_type); } free(event); return ret; }