comparison pidgin/gtkmedia.c @ 26159:46a6ba93c376

Implement an X error handler to prevent Pidgin from crashing on BadWindow and related errors.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Mon, 02 Feb 2009 10:24:55 +0000
parents bb8d4ff8276a
children 27b553a07800
comparison
equal deleted inserted replaced
26158:bb8d4ff8276a 26159:46a6ba93c376
182 if (media->priv->media) 182 if (media->priv->media)
183 purple_media_hangup(media->priv->media); 183 purple_media_hangup(media->priv->media);
184 return FALSE; 184 return FALSE;
185 } 185 }
186 186
187 static int
188 pidgin_x_error_handler(Display *display, XErrorEvent *event)
189 {
190 const gchar *error_type;
191 switch (event->error_code) {
192 #define XERRORCASE(type) case type: error_type = #type; break
193 XERRORCASE(BadAccess);
194 XERRORCASE(BadAlloc);
195 XERRORCASE(BadAtom);
196 XERRORCASE(BadColor);
197 XERRORCASE(BadCursor);
198 XERRORCASE(BadDrawable);
199 XERRORCASE(BadFont);
200 XERRORCASE(BadGC);
201 XERRORCASE(BadIDChoice);
202 XERRORCASE(BadImplementation);
203 XERRORCASE(BadLength);
204 XERRORCASE(BadMatch);
205 XERRORCASE(BadName);
206 XERRORCASE(BadPixmap);
207 XERRORCASE(BadRequest);
208 XERRORCASE(BadValue);
209 XERRORCASE(BadWindow);
210 #undef XERRORCASE
211 default:
212 error_type = "unknown";
213 break;
214 }
215 purple_debug_error("media", "A %s Xlib error has occurred. "
216 "The program would normally crash now.\n",
217 error_type);
218 return 0;
219 }
220
187 static void 221 static void
188 pidgin_media_init (PidginMedia *media) 222 pidgin_media_init (PidginMedia *media)
189 { 223 {
190 GtkWidget *vbox, *hbox; 224 GtkWidget *vbox, *hbox;
191 media->priv = PIDGIN_MEDIA_GET_PRIVATE(media); 225 media->priv = PIDGIN_MEDIA_GET_PRIVATE(media);
226
227 XSetErrorHandler(pidgin_x_error_handler);
192 228
193 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 229 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
194 gtk_container_add(GTK_CONTAINER(media), vbox); 230 gtk_container_add(GTK_CONTAINER(media), vbox);
195 231
196 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 232 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);