diff options
| author | Christoph Lohmann <20h@r-36.net> | 2012-10-13 07:16:08 +0200 | 
|---|---|---|
| committer | Christoph Lohmann <20h@r-36.net> | 2012-10-13 07:16:08 +0200 | 
| commit | 2e92060efcb672e44dfd3424a9dadffcdf9aa770 (patch) | |
| tree | 1c8fa802bc873c262f2917d1e54d8ec2756a5907 | |
| parent | 23def74c9814c1db25081965febd8424c3207e2c (diff) | |
| download | surf-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>!
| -rw-r--r-- | surf.c | 29 | 
1 files changed, 24 insertions, 5 deletions
@@ -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;  | 
