diff -r dbb565b8d61c surf.c --- a/surf.c Fri Jun 25 09:42:58 2010 +0200 +++ b/surf.c Sun Jul 25 14:56:13 2010 +0100 @@ -110,6 +118,7 @@ static void usage(void); static void windowobjectcleared(GtkWidget *w, WebKitWebFrame *frame, JSContextRef js, JSObjectRef win, Client *c); static void zoom(Client *c, const Arg *arg); +static int xerrorhandler(Display *display, XErrorEvent *event); /* configuration, allows nested code to access above variables */ #include "config.h" @@ -207,10 +216,22 @@ return FALSE; } + +static int xerrorhandler(Display *display, XErrorEvent *event) +{ + /* prevent segfault #2 */ + if(event->error_code == BadWindow) + fputs("xerrorhandler: got BadWindow\n", stderr); + return 0; /* ignored, apparently */ +} + void destroyclient(Client *c) { Client *p; + /* prevent segfault #1 - We don't want signals to pop up while we are in mid-destruction */ + g_signal_handlers_disconnect_matched(GTK_WIDGET(c->view), G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, c); + gtk_widget_destroy(c->indicator); gtk_widget_destroy(GTK_WIDGET(c->view)); gtk_widget_destroy(c->scroll); @@ -454,6 +496,7 @@ /* Webview */ c->view = WEBKIT_WEB_VIEW(webkit_web_view_new()); + g_signal_connect(G_OBJECT(c->view), "button-press-event", G_CALLBACK(buttonevent), c); g_signal_connect(G_OBJECT(c->view), "title-changed", G_CALLBACK(titlechange), c); g_signal_connect(G_OBJECT(c->view), "hovering-over-link", G_CALLBACK(linkhover), c); g_signal_connect(G_OBJECT(c->view), "create-web-view", G_CALLBACK(createwindow), c); @@ -707,6 +750,9 @@ soup_uri_free(puri); g_free(new_proxy); } + + + XSetErrorHandler(&xerrorhandler); } void