Mercurial > pidgin.yaz
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); |