about summary refs log tree commit diff
path: root/surf.c
diff options
context:
space:
mode:
authorChristoph Lohmann <20h@r-36.net>2012-10-13 07:16:08 +0200
committerChristoph Lohmann <20h@r-36.net>2012-10-13 07:16:08 +0200
commit2e92060efcb672e44dfd3424a9dadffcdf9aa770 (patch)
tree1c8fa802bc873c262f2917d1e54d8ec2756a5907 /surf.c
parentFixing the shift key mask and cleaning up the scrolling code. (diff)
downloadsurf-2e92060efcb672e44dfd3424a9dadffcdf9aa770.tar.gz
surf-2e92060efcb672e44dfd3424a9dadffcdf9aa770.tar.bz2
surf-2e92060efcb672e44dfd3424a9dadffcdf9aa770.zip
Adding middle-click behaviour to open a tab when embedded or a window when
not. Thanks to Carlos Pita <carlosjosepita@gmail.com>!
Diffstat (limited to 'surf.c')
-rw-r--r--surf.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/surf.c b/surf.c
index f7d9f3c..097ecc9 100644
--- a/surf.c
+++ b/surf.c
@@ -66,6 +66,7 @@ static char *progname;
 static gboolean loadimage = 1, plugin = 1, script = 1;
 
 static char *buildpath(const char *path);
+static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, GList *gl);
 static void cleanup(void);
 static void clipboard(Client *c, const Arg *arg);
 static char *copystr(char **str, const char *src);
@@ -89,7 +90,7 @@ static void loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c);
 static void loaduri(Client *c, const Arg *arg);
 static void navigate(Client *c, const Arg *arg);
 static Client *newclient(void);
-static void newwindow(Client *c, const Arg *arg);
+static void newwindow(Client *c, const Arg *arg, gboolean noembed);
 static void newrequest(SoupSession *s, SoupMessage *msg, gpointer v);
 static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d);
 static void print(Client *c, const Arg *arg);
@@ -141,6 +142,23 @@ buildpath(const char *path) {
 	return apath;
 }
 
+static gboolean
+buttonrelease(WebKitWebView *web, GdkEventButton *e, GList *gl) {
+	WebKitHitTestResultContext context;
+	WebKitHitTestResult *result = webkit_web_view_get_hit_test_result(web, e);
+	Arg arg;
+
+	g_object_get(result, "context", &context, NULL);
+	if(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) {
+		if(e->button == 2) {
+			g_object_get(result, "link-uri", &arg.v, NULL);
+			newwindow(NULL, &arg, e->state & GDK_CONTROL_MASK);
+			return true;
+		}
+	}
+	return false;
+}
+
 void
 cleanup(void) {
 	while(clients)
@@ -216,7 +234,7 @@ decidewindow(WebKitWebView *view, WebKitWebFrame *f, WebKitNetworkRequest *r, We
 	if(webkit_web_navigation_action_get_reason(n) == WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED) {
 		webkit_web_policy_decision_ignore(p);
 		arg.v = (void *)webkit_network_request_get_uri(r);
-		newwindow(NULL, &arg);
+		newwindow(NULL, &arg, 0);
 		return TRUE;
 	}
 	return FALSE;
@@ -404,7 +422,7 @@ loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c) {
 		setatom(c, AtomUri, uri);
 		break;
 	case WEBKIT_LOAD_FINISHED:
-		c->progress = 0;
+		c->progress = 100;
 		update(c);
 		break;
 	default:
@@ -494,6 +512,7 @@ newclient(void) {
 	g_signal_connect(G_OBJECT(c->view), "notify::load-status", G_CALLBACK(loadstatuschange), c);
 	g_signal_connect(G_OBJECT(c->view), "notify::progress", G_CALLBACK(progresschange), c);
 	g_signal_connect(G_OBJECT(c->view), "download-requested", G_CALLBACK(initdownload), c);
+	g_signal_connect(G_OBJECT(c->view), "button-release-event", G_CALLBACK(buttonrelease), c);
 
 	/* Indicator */
 	c->indicator = gtk_drawing_area_new();
@@ -568,14 +587,14 @@ newrequest(SoupSession *s, SoupMessage *msg, gpointer v) {
 }
 
 void
-newwindow(Client *c, const Arg *arg) {
+newwindow(Client *c, const Arg *arg, gboolean noembed) {
 	guint i = 0;
 	const char *cmd[10], *uri;
 	const Arg a = { .v = (void *)cmd };
 	char tmp[64];
 
 	cmd[i++] = progname;
-	if(embed) {
+	if(embed && !noembed) {
 		cmd[i++] = "-e";
 		snprintf(tmp, LENGTH(tmp), "%u\n", (int)embed);
 		cmd[i++] = tmp;