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
