--- rxvt-unicode/src/main.C 2005/02/04 11:41:23 1.134 +++ rxvt-unicode/src/main.C 2005/02/16 21:37:10 1.139 @@ -32,7 +32,6 @@ #include "../config.h" /* NECESSARY */ #include "rxvt.h" /* NECESSARY */ -#include "main.intpro" /* PROTOS for internal routines */ #include #include @@ -255,7 +254,11 @@ #endif delete TermWin.drawable; // destroy all windows - if (TermWin.parent[0]) + if (TermWin.parent[0] +#if ENABLE_FRILLS + && !rs[Rs_embed] +#endif + ) XDestroyWindow (disp, TermWin.parent[0]); } @@ -364,6 +367,55 @@ (*t)->emergency_cleanup (); } +#if ENABLE_FRILLS +static void +print_x_error (Display *dpy, XErrorEvent *event) +{ + char buffer[BUFSIZ]; + char mesg[BUFSIZ]; + char number[32]; + char *mtype = "XlibMessage"; + XGetErrorText(dpy, event->error_code, buffer, BUFSIZ); + XGetErrorDatabaseText(dpy, mtype, "XError", "X Error", mesg, BUFSIZ); + rxvt_warn ("An X Error occured, trying to continue after report.\n"); + rxvt_warn ("%s: %s\n", mesg, buffer); + XGetErrorDatabaseText(dpy, mtype, "MajorCode", "Request Major code %d", mesg, BUFSIZ); + rxvt_warn (strncat (mesg, "\n", BUFSIZ), event->request_code); + sprintf(number, "%d", event->request_code); + XGetErrorDatabaseText(dpy, "XRequest", number, "", buffer, BUFSIZ); + rxvt_warn ("(which is %s)\n", buffer); + if (event->request_code >= 128) { + XGetErrorDatabaseText(dpy, mtype, "MinorCode", "Request Minor code %d", + mesg, BUFSIZ); + rxvt_warn (strncat (mesg, "\n", BUFSIZ), event->minor_code); + } + 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); + rxvt_warn (strncat (mesg, "\n", BUFSIZ), event->resourceid); + } + XGetErrorDatabaseText(dpy, mtype, "ErrorSerial", "Error Serial #%d", + mesg, BUFSIZ); + rxvt_warn (strncat (mesg, "\n", BUFSIZ), event->serial); +} +#endif + int rxvt_xerror_handler (Display *display, XErrorEvent *event) { @@ -373,8 +425,11 @@ { //TODO: GET_R is most likely not the terminal which caused the error //TODO: maybe just output the error and continue? +#if ENABLE_FRILLS + print_x_error (display, event); +#else old_xerror_handler (display, event); - GET_R->destroy (); +#endif } return 0; @@ -536,7 +591,6 @@ return p; } -/* INTPROTO */ void * rxvt_calloc (size_t number, size_t size) { @@ -548,7 +602,6 @@ return p; } -/* INTPROTO */ void * rxvt_realloc (void *ptr, size_t size) { @@ -662,16 +715,19 @@ parsed_geometry = 1; if (rs[Rs_geometry]) flags = XParseGeometry (rs[Rs_geometry], &x, &y, &w, &h); + if (flags & WidthValue) { TermWin.ncol = BOUND_POSITIVE_INT16 (w); szHint.flags |= USSize; } + if (flags & HeightValue) { TermWin.nrow = BOUND_POSITIVE_INT16 (h); szHint.flags |= USSize; } + if (flags & XValue) { szHint.x = x; @@ -682,6 +738,7 @@ szHint.win_gravity = NorthEastGravity; } } + if (flags & YValue) { szHint.y = y; @@ -1503,6 +1560,8 @@ char **s; char buf[IMBUFSIZ]; + SET_R (this); + im_destroy (); D_MAIN ((stderr, "rxvt_IMInstantiateCallback ()"));