# HG changeset patch # User John Tsiombikas # Date 1454552115 -7200 # Node ID cb636a23f4f28d1cfac119af7889842d6ab214f5 # Parent be18500d76d1af9cd12c54db985b6c494ad4301e lifted X error reporting from Xlib diff -r be18500d76d1 -r cb636a23f4f2 src/main.cc --- a/src/main.cc Wed Feb 03 03:55:52 2016 +0200 +++ b/src/main.cc Thu Feb 04 04:15:15 2016 +0200 @@ -237,6 +237,8 @@ push_xerr_handler(xerr_debug); XDamageSubtract(dpy, cwin->damage, None, region); pop_xerr_handler(); + + XFixesDestroyRegion(dpy, region); } static void redraw() diff -r be18500d76d1 -r cb636a23f4f2 src/xerr.cc --- a/src/xerr.cc Wed Feb 03 03:55:52 2016 +0200 +++ b/src/xerr.cc Thu Feb 04 04:15:15 2016 +0200 @@ -1,7 +1,13 @@ +#include +#include #include +#include +#include #include "xerr.h" #include "logger.h" +static int _XPrintDefaultError( Display *dpy, XErrorEvent *event, FILE *fp); + static std::stack func_stack; void push_xerr_handler(xerr_handler_type func) @@ -23,12 +29,7 @@ int xerr_debug(Display *dpy, XErrorEvent *err) { - char errstr[512]; - XGetErrorText(dpy, err->error_code, errstr, sizeof errstr); - printf("X error caught: \n%s (code: %u)\n", errstr, err->error_code); - printf(" Failed request number: %lu (%u,%u)\n", err->serial, - (unsigned int)err->request_code, (unsigned int)err->minor_code); - printf(" Resource: %lx\n", err->resourceid); + _XPrintDefaultError(dpy, err, stderr); return 0; } @@ -36,3 +37,115 @@ { return 0; } + +typedef struct _XExten _XExtension; + +static int _XPrintDefaultError( Display *dpy, XErrorEvent *event, FILE *fp) +{ + char buffer[BUFSIZ]; + char mesg[BUFSIZ]; + char number[32]; + const char *mtype = "XlibMessage"; + _XExtension *ext = (_XExtension *)NULL; + _XExtension *bext = (_XExtension *)NULL; + + XGetErrorText(dpy, event->error_code, buffer, BUFSIZ); + XGetErrorDatabaseText(dpy, mtype, "XError", "X Error", mesg, BUFSIZ); + (void) fprintf(fp, "%s: %s\n ", mesg, buffer); + XGetErrorDatabaseText(dpy, mtype, "MajorCode", "Request Major code %d", + mesg, BUFSIZ); + (void) fprintf(fp, mesg, event->request_code); + if (event->request_code < 128) { + sprintf(number, "%d", event->request_code); + XGetErrorDatabaseText(dpy, "XRequest", number, "", buffer, BUFSIZ); + } else { + for (ext = dpy->ext_procs; + ext && (ext->codes.major_opcode != event->request_code); + ext = ext->next) + ; + if (ext) { + strncpy(buffer, ext->name, BUFSIZ); + buffer[BUFSIZ - 1] = '\0'; + } else + buffer[0] = '\0'; + } + (void) fprintf(fp, " (%s)\n", buffer); + if (event->request_code >= 128) { + XGetErrorDatabaseText(dpy, mtype, "MinorCode", "Request Minor code %d", + mesg, BUFSIZ); + fputs(" ", fp); + (void) fprintf(fp, mesg, event->minor_code); + if (ext) { + sprintf(mesg, "%s.%d", ext->name, event->minor_code); + XGetErrorDatabaseText(dpy, "XRequest", mesg, "", buffer, BUFSIZ); + (void) fprintf(fp, " (%s)", buffer); + } + fputs("\n", fp); + } + if (event->error_code >= 128) { + /* kludge, try to find the extension that caused it */ + buffer[0] = '\0'; + for (ext = dpy->ext_procs; ext; ext = ext->next) { + if (ext->error_string) + (*ext->error_string)(dpy, event->error_code, &ext->codes, + buffer, BUFSIZ); + if (buffer[0]) { + bext = ext; + break; + } + if (ext->codes.first_error && + ext->codes.first_error < (int)event->error_code && + (!bext || ext->codes.first_error > bext->codes.first_error)) + bext = ext; + } + if (bext) + sprintf(buffer, "%s.%d", bext->name, + event->error_code - bext->codes.first_error); + else + strcpy(buffer, "Value"); + XGetErrorDatabaseText(dpy, mtype, buffer, "", mesg, BUFSIZ); + if (mesg[0]) { + fputs(" ", fp); + (void) fprintf(fp, mesg, event->resourceid); + fputs("\n", fp); + } + /* let extensions try to print the values */ + for (ext = dpy->ext_procs; ext; ext = ext->next) { + if (ext->error_values) + (*ext->error_values)(dpy, event, fp); + } + } else if ((event->error_code == BadWindow) || + (event->error_code == BadPixmap) || + (event->error_code == BadCursor) || + (event->error_code == BadFont) || + (event->error_code == BadDrawable) || + (event->error_code == BadColor) || + (event->error_code == BadGC) || + (event->error_code == BadIDChoice) || + (event->error_code == BadValue) || + (event->error_code == BadAtom)) { + if (event->error_code == BadValue) + XGetErrorDatabaseText(dpy, mtype, "Value", "Value 0x%x", + mesg, BUFSIZ); + else if (event->error_code == BadAtom) + XGetErrorDatabaseText(dpy, mtype, "AtomID", "AtomID 0x%x", + mesg, BUFSIZ); + else + XGetErrorDatabaseText(dpy, mtype, "ResourceID", "ResourceID 0x%x", + mesg, BUFSIZ); + fputs(" ", fp); + (void) fprintf(fp, mesg, event->resourceid); + fputs("\n", fp); + } + XGetErrorDatabaseText(dpy, mtype, "ErrorSerial", "Error Serial #%d", + mesg, BUFSIZ); + fputs(" ", fp); + (void) fprintf(fp, mesg, event->serial); + XGetErrorDatabaseText(dpy, mtype, "CurrentSerial", "Current Serial #%d", + mesg, BUFSIZ); + fputs("\n ", fp); + (void) fprintf(fp, mesg, dpy->request); + fputs("\n", fp); + if (event->error_code == BadImplementation) return 0; + return 1; +}