# HG changeset patch # User Mike Ruprecht # Date 1233570295 0 # Node ID 46a6ba93c376e9c4081c23e9408545ea9a434d1a # Parent bb8d4ff8276a76cf2bfe5cfef372858fa0858e52 Implement an X error handler to prevent Pidgin from crashing on BadWindow and related errors. diff -r bb8d4ff8276a -r 46a6ba93c376 pidgin/gtkmedia.c --- a/pidgin/gtkmedia.c Mon Feb 02 10:12:29 2009 +0000 +++ b/pidgin/gtkmedia.c Mon Feb 02 10:24:55 2009 +0000 @@ -184,12 +184,48 @@ return FALSE; } +static int +pidgin_x_error_handler(Display *display, XErrorEvent *event) +{ + const gchar *error_type; + switch (event->error_code) { +#define XERRORCASE(type) case type: error_type = #type; break + XERRORCASE(BadAccess); + XERRORCASE(BadAlloc); + XERRORCASE(BadAtom); + XERRORCASE(BadColor); + XERRORCASE(BadCursor); + XERRORCASE(BadDrawable); + XERRORCASE(BadFont); + XERRORCASE(BadGC); + XERRORCASE(BadIDChoice); + XERRORCASE(BadImplementation); + XERRORCASE(BadLength); + XERRORCASE(BadMatch); + XERRORCASE(BadName); + XERRORCASE(BadPixmap); + XERRORCASE(BadRequest); + XERRORCASE(BadValue); + XERRORCASE(BadWindow); +#undef XERRORCASE + default: + error_type = "unknown"; + break; + } + purple_debug_error("media", "A %s Xlib error has occurred. " + "The program would normally crash now.\n", + error_type); + return 0; +} + static void pidgin_media_init (PidginMedia *media) { GtkWidget *vbox, *hbox; media->priv = PIDGIN_MEDIA_GET_PRIVATE(media); + XSetErrorHandler(pidgin_x_error_handler); + vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); gtk_container_add(GTK_CONTAINER(media), vbox);