--- rxvt-unicode/src/main.C 2012/12/30 11:34:43 1.385 +++ rxvt-unicode/src/main.C 2014/12/13 12:06:38 1.396 @@ -13,11 +13,11 @@ * Copyright (c) 1997,1998 Oezguer Kesim * Copyright (c) 1998-2001 Geoff Wing * - extensive modifications - * Copyright (c) 2003-2010 Marc Lehmann + * Copyright (c) 2003-2014 Marc Lehmann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -241,9 +241,12 @@ im_destroy (); #endif scrollBar.destroy (); - if (gc) XFreeGC (dpy, gc); + + if (gc) + XFreeGC (dpy, gc); delete drawable; + // destroy all windows if (parent) XDestroyWindow (dpy, parent); @@ -253,7 +256,8 @@ { pix_colors_focused [i].free (this); #if OFF_FOCUS_FADING - pix_colors_unfocused [i].free (this); + if (rs[Rs_fade]) + pix_colors_unfocused [i].free (this); #endif } @@ -276,6 +280,11 @@ delete selection_req; + if (env && memcmp (env, envv->begin (), envv->size () * sizeof (char *))) + rxvt_warn ("env has been modified, probably as a result of a lib calling setenv.\n"); + + delete env; + delete envv; delete argv; @@ -285,6 +294,8 @@ #ifndef NO_RESOURCES XrmDestroyDatabase (option_db); #endif + + SET_R ((rxvt_term *)0); } // child has exited, usually destroys @@ -382,97 +393,97 @@ static void ecb_cold print_x_error (Display *dpy, XErrorEvent *event) { - char buffer[BUFSIZ]; - char mesg[BUFSIZ]; - char number[32]; + char buffer[BUFSIZ]; + char mesg[BUFSIZ]; + char number[32]; - rxvt_warn ("An X Error occurred, trying to continue after report.\n"); + rxvt_warn ("An X Error occurred, trying to continue after report.\n"); - XGetErrorDatabaseText (dpy, "XlibMessage", "ErrorSerial", "Error Serial #%d", mesg, BUFSIZ); - snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->serial); + XGetErrorDatabaseText (dpy, "XlibMessage", "ErrorSerial", "Error Serial #%d", mesg, BUFSIZ); + snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->serial); - XGetErrorText (dpy, event->error_code, buffer, BUFSIZ); - XGetErrorDatabaseText (dpy, "XlibMessage", "XError", "X Error", mesg, BUFSIZ); - rxvt_warn ("+ %s: %s\n", mesg, buffer); + XGetErrorText (dpy, event->error_code, buffer, BUFSIZ); + XGetErrorDatabaseText (dpy, "XlibMessage", "XError", "X Error", mesg, BUFSIZ); + rxvt_warn ("+ %s: %s\n", mesg, buffer); - XGetErrorDatabaseText (dpy, "XlibMessage", "MajorCode", "Request Major code %d", mesg, BUFSIZ); - snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->request_code); + XGetErrorDatabaseText (dpy, "XlibMessage", "MajorCode", "Request Major code %d", mesg, BUFSIZ); + snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->request_code); - if (event->request_code >= 128) - { + if (event->request_code >= 128) + { #if 0 - /* XListExtensions and probably query extensions hangs when there are multiple queues errors */ - int nexts; - char **exts = XListExtensions (dpy, &nexts); + /* XListExtensions and probably query extensions hangs when there are multiple queues errors */ + int nexts; + char **exts = XListExtensions (dpy, &nexts); - while (nexts) - { - char *extname = exts [nexts - 1]; - int major, first_event, first_error; + while (nexts) + { + char *extname = exts [nexts - 1]; + int major, first_event, first_error; - if (XQueryExtension (dpy, extname, &major, &first_event, &first_error) && major == event->request_code) - { - XGetErrorDatabaseText (dpy, "XlibMessage", "MinorCode", "Request Minor code %d", mesg, BUFSIZ); - rxvt_warn ("+ (which is extension %s minor code %d)\n", extname, event->minor_code); + if (XQueryExtension (dpy, extname, &major, &first_event, &first_error) && major == event->request_code) + { + XGetErrorDatabaseText (dpy, "XlibMessage", "MinorCode", "Request Minor code %d", mesg, BUFSIZ); + rxvt_warn ("+ (which is extension %s minor code %d)\n", extname, event->minor_code); - snprintf (buffer, BUFSIZ, "%s.%d", extname, event->minor_code); - XGetErrorDatabaseText (dpy, "XRequest", buffer, "an unregistered minor code", buffer, BUFSIZ); - rxvt_warn ("+ (which is %s)\n", buffer); + snprintf (buffer, BUFSIZ, "%s.%d", extname, event->minor_code); + XGetErrorDatabaseText (dpy, "XRequest", buffer, "an unregistered minor code", buffer, BUFSIZ); + rxvt_warn ("+ (which is %s)\n", buffer); - break; - } + break; + } - printf ("nextss %d %s\n", nexts, extname);//D - --nexts; - ++exts; - } + printf ("nextss %d %s\n", nexts, extname);//D + --nexts; + ++exts; + } #else - int nexts = 0; - char **exts = 0; + int nexts = 0; + char **exts = 0; #endif - if (!nexts) - { - rxvt_warn ("+ (which is an unknown extension)\n", buffer); + if (!nexts) + { + rxvt_warn ("+ (which is an unknown extension)\n", buffer); - XGetErrorDatabaseText (dpy, "XlibMessage", "MinorCode", "Request Minor code %d", mesg, BUFSIZ); - snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->minor_code); + XGetErrorDatabaseText (dpy, "XlibMessage", "MinorCode", "Request Minor code %d", mesg, BUFSIZ); + snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->minor_code); #if 0 - sprintf (number, "RENDER.%d", event->minor_code); - XGetErrorDatabaseText (dpy, "XRequest", number, "", buffer, BUFSIZ); - rxvt_warn ("+ (which is %s)\n", buffer); + sprintf (number, "RENDER.%d", event->minor_code); + XGetErrorDatabaseText (dpy, "XRequest", number, "", buffer, BUFSIZ); + rxvt_warn ("+ (which is %s)\n", buffer); #endif - } - - XFreeExtensionList (exts); - } - else - { - sprintf (number, "%d", event->request_code); - XGetErrorDatabaseText (dpy, "XRequest", number, "", buffer, BUFSIZ); - rxvt_warn ("+ (which is %s)\n", buffer); - } + } - 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, "XlibMessage", "Value", "Value 0x%x", mesg, BUFSIZ); - else if (event->error_code == BadAtom) - XGetErrorDatabaseText (dpy, "XlibMessage", "AtomID", "AtomID 0x%x", mesg, BUFSIZ); - else - XGetErrorDatabaseText (dpy, "XlibMessage", "ResourceID", "ResourceID 0x%x", mesg, BUFSIZ); + XFreeExtensionList (exts); + } + else + { + sprintf (number, "%d", event->request_code); + XGetErrorDatabaseText (dpy, "XRequest", number, "", buffer, BUFSIZ); + rxvt_warn ("+ (which is %s)\n", buffer); + } + + 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, "XlibMessage", "Value", "Value 0x%x", mesg, BUFSIZ); + else if (event->error_code == BadAtom) + XGetErrorDatabaseText (dpy, "XlibMessage", "AtomID", "AtomID 0x%x", mesg, BUFSIZ); + else + XGetErrorDatabaseText (dpy, "XlibMessage", "ResourceID", "ResourceID 0x%x", mesg, BUFSIZ); - snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->resourceid); + snprintf (buffer, BUFSIZ, "+ %s\n", mesg); rxvt_warn (buffer, event->resourceid); } } #endif @@ -480,7 +491,7 @@ int ecb_cold rxvt_xerror_handler (Display *display, XErrorEvent *event) { - if (GET_R->allowedxerror == -1) + if (GET_R && GET_R->allowedxerror == -1) GET_R->allowedxerror = event->error_code; else { @@ -1046,6 +1057,7 @@ void rxvt_term::alias_color (int dst, int src) { + pix_colors[dst].free (this); pix_colors[dst].set (this, rs[Rs_color + dst] = rs[Rs_color + src]); } @@ -1369,9 +1381,9 @@ char **s; XIMStyles *xim_styles; - set_environ (envv); + set_environ (env); - if (! ((p = XSetLocaleModifiers (modifiers)) && *p)) + if (!((p = XSetLocaleModifiers (modifiers)) && *p)) return false; input_method = display->get_xim (locale, modifiers); @@ -1689,11 +1701,6 @@ if (update_background_ev.is_active ()) return; - bg_invalidate (); - - if (!mapped) - return; - ev_tstamp to_wait = 0.5 - (ev::now () - bg_valid_since); if (to_wait <= 0.)