diff --git a/CMakeLists.txt b/CMakeLists.txt index 80183ab..7ede29a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,7 @@ set(CMAKE_C_FLAGS "-Wall -Werror ${CMAKE_C_FLAGS}") find_package(Threads REQUIRED) find_package(PkgConfig REQUIRED) -pkg_check_modules(XCB REQUIRED xcb xcb-randr xcb-render xcb-cursor) +pkg_check_modules(XCB REQUIRED xcb xcb-errors xcb-randr xcb-render xcb-cursor) pkg_check_modules(FONTCONFIG REQUIRED fontconfig) pkg_check_modules(CAIRO REQUIRED cairo cairo-xcb cairo-ft) pkg_check_modules(YAML REQUIRED yaml-0.1) diff --git a/bar.c b/bar.c index 4ff03bb..c2c5921 100644 --- a/bar.c +++ b/bar.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -554,6 +555,9 @@ run(struct bar_run_context *run_ctx) LOG_DBG("all modules started"); + xcb_errors_context_t *err_context; + xcb_errors_context_new(bar->conn, &err_context); + int fd = xcb_get_file_descriptor(bar->conn); while (true) { @@ -578,6 +582,24 @@ run(struct bar_run_context *run_ctx) e = xcb_poll_for_event(bar->conn)) { switch (XCB_EVENT_RESPONSE_TYPE(e)) { + case 0: { + const xcb_value_error_t *error = (void *)e; + const char *major = xcb_errors_get_name_for_major_code( + err_context, error->major_opcode); + const char *minor = xcb_errors_get_name_for_minor_code( + err_context, error->major_opcode, error->minor_opcode); + + const char *extension; + const char *name = xcb_errors_get_name_for_error( + err_context, error->error_code, &extension); + + LOG_ERR("XCB error: %s (%s), code %s (%s), sequence %u, value %u", + major, minor != NULL ? minor : "no minor", + name, extension != NULL ? extension : "no extension", + error->sequence, error->bad_value); + break; + } + case XCB_EXPOSE: expose(_bar); break; @@ -683,6 +705,7 @@ run(struct bar_run_context *run_ctx) bar->cursor_name = NULL; } + xcb_errors_context_free(err_context); xcb_free_gc(bar->conn, bar->gc); xcb_free_pixmap(bar->conn, bar->pixmap); xcb_destroy_window(bar->conn, bar->win);