Adding middle-click behaviour to open a tab when embedded or a window when

not. Thanks to Carlos Pita <carlosjosepita@gmail.com>!
This commit is contained in:
Christoph Lohmann 2012-10-13 07:16:08 +02:00
parent 23def74c98
commit 2e92060efc

29
surf.c
View file

@ -66,6 +66,7 @@ static char *progname;
static gboolean loadimage = 1, plugin = 1, script = 1; static gboolean loadimage = 1, plugin = 1, script = 1;
static char *buildpath(const char *path); static char *buildpath(const char *path);
static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, GList *gl);
static void cleanup(void); static void cleanup(void);
static void clipboard(Client *c, const Arg *arg); static void clipboard(Client *c, const Arg *arg);
static char *copystr(char **str, const char *src); 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 loaduri(Client *c, const Arg *arg);
static void navigate(Client *c, const Arg *arg); static void navigate(Client *c, const Arg *arg);
static Client *newclient(void); 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 newrequest(SoupSession *s, SoupMessage *msg, gpointer v);
static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d); static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d);
static void print(Client *c, const Arg *arg); static void print(Client *c, const Arg *arg);
@ -141,6 +142,23 @@ buildpath(const char *path) {
return apath; 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 void
cleanup(void) { cleanup(void) {
while(clients) 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) { if(webkit_web_navigation_action_get_reason(n) == WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED) {
webkit_web_policy_decision_ignore(p); webkit_web_policy_decision_ignore(p);
arg.v = (void *)webkit_network_request_get_uri(r); arg.v = (void *)webkit_network_request_get_uri(r);
newwindow(NULL, &arg); newwindow(NULL, &arg, 0);
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
@ -404,7 +422,7 @@ loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c) {
setatom(c, AtomUri, uri); setatom(c, AtomUri, uri);
break; break;
case WEBKIT_LOAD_FINISHED: case WEBKIT_LOAD_FINISHED:
c->progress = 0; c->progress = 100;
update(c); update(c);
break; break;
default: 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::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), "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), "download-requested", G_CALLBACK(initdownload), c);
g_signal_connect(G_OBJECT(c->view), "button-release-event", G_CALLBACK(buttonrelease), c);
/* Indicator */ /* Indicator */
c->indicator = gtk_drawing_area_new(); c->indicator = gtk_drawing_area_new();
@ -568,14 +587,14 @@ newrequest(SoupSession *s, SoupMessage *msg, gpointer v) {
} }
void void
newwindow(Client *c, const Arg *arg) { newwindow(Client *c, const Arg *arg, gboolean noembed) {
guint i = 0; guint i = 0;
const char *cmd[10], *uri; const char *cmd[10], *uri;
const Arg a = { .v = (void *)cmd }; const Arg a = { .v = (void *)cmd };
char tmp[64]; char tmp[64];
cmd[i++] = progname; cmd[i++] = progname;
if(embed) { if(embed && !noembed) {
cmd[i++] = "-e"; cmd[i++] = "-e";
snprintf(tmp, LENGTH(tmp), "%u\n", (int)embed); snprintf(tmp, LENGTH(tmp), "%u\n", (int)embed);
cmd[i++] = tmp; cmd[i++] = tmp;