--- Heyho, here is my atempt to Christophs proposal. There are a few rough edges though: * On my mouse buttons 8 and 9 are used for the prev/next navigation. I thought 4 and 5 would be standard, but could not test with another mouse. I forgot to remove the printf statement in buttonrelease(), so you can still test your mouse buttons. * The differentiation between embedding or not embedding is kind of ugly with two very similar functions. * The passing of the link url to the handler function is also very hacky. If you have suggestions, revise the patch or let me know. --Markus config.def.h | 10 ++++++++++ surf.c | 46 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/config.def.h b/config.def.h index e3b9881..a1ab211 100644 --- a/config.def.h +++ b/config.def.h _AT_@ -127,3 +127,13 @@ static Key keys[] = { { MODKEY|GDK_SHIFT_MASK,GDK_g, togglegeolocation, { 0 } }, }; +/* button definitions */ +/* click can be ClkDoc, ClkLink, ClkImg, ClkMedia, ClkSel, ClkEdit, ClkAny */ +static Button buttons[] = { + /* click event mask button function argument */ + { ClkLink, 0, 2, linkopenembed, { 0 } }, + { ClkLink, MODKEY, 2, linkopen, { 0 } }, + { ClkLink, MODKEY, 1, linkopen, { 0 } }, + { ClkAny, 0, 8, navigate, { .i = -1 } }, + { ClkAny, 0, 9, navigate, { .i = +1 } }, +}; diff --git a/surf.c b/surf.c index 48f6b39..b67a73a 100644 --- a/surf.c +++ b/surf.c _AT_@ -35,6 +35,15 @@ char *argv0; #define COOKIEJAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COOKIEJAR_TYPE, CookieJar)) enum { AtomFind, AtomGo, AtomUri, AtomLast }; +enum { + ClkDoc = WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT, + ClkLink = WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK, + ClkImg = WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE, + ClkMedia = WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA, + ClkSel = WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION, + ClkEdit = WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE, + ClkAny = ClkDoc | ClkLink | ClkImg | ClkMedia | ClkSel | ClkEdit, +}; typedef union Arg Arg; union Arg { _AT_@ -62,6 +71,14 @@ typedef struct { } Key; typedef struct { + unsigned int click; + unsigned int mask; + guint button; + void (*func)(Client *c, const Arg *arg); + const Arg arg; +} Button; + +typedef struct { SoupCookieJarText parent_instance; int lock; } CookieJar; _AT_@ -97,8 +114,7 @@ static void beforerequest(WebKitWebView *w, WebKitWebFrame *f, WebKitWebResource *r, WebKitNetworkRequest *req, WebKitNetworkResponse *resp, Client *c); static char *buildpath(const char *path); -static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, - GList *gl); +static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, Client *c); static void cleanup(void); static void clipboard(Client *c, const Arg *arg); _AT_@ -168,6 +184,8 @@ static void print(Client *c, const Arg *arg); static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event, gpointer d); static void progresschange(WebKitWebView *view, GParamSpec *pspec, Client *c); +static void linkopen(Client *c, const Arg *arg); +static void linkopenembed(Client *c, const Arg *arg); static void reload(Client *c, const Arg *arg); static void scroll_h(Client *c, const Arg *arg); static void scroll_v(Client *c, const Arg *arg); _AT_@ -272,18 +290,20 @@ buildpath(const char *path) { } static gboolean -buttonrelease(WebKitWebView *web, GdkEventButton *e, GList *gl) { +buttonrelease(WebKitWebView *web, GdkEventButton *e, Client *c) { WebKitHitTestResultContext context; WebKitHitTestResult *result = webkit_web_view_get_hit_test_result(web, e); Arg arg; + unsigned int i; g_object_get(result, "context", &context, NULL); - if(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) { - if(e->button == 2 || - (e->button == 1 && CLEANMASK(e->state) == CLEANMASK(MODKEY))) { - g_object_get(result, "link-uri", &arg.v, NULL); - newwindow(NULL, &arg, e->state & GDK_CONTROL_MASK); + g_object_get(result, "link-uri", &arg.v, NULL); + printf("%d %d\n", context, e->button); + for(i = 0; i < LENGTH(buttons); i++) { + if(context & buttons[i].click && e->button == buttons[i].button && + CLEANMASK(e->state) == CLEANMASK(buttons[i].mask) && buttons[i].func) { + buttons[i].func(c, buttons[i].click == ClkLink && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); return true; } } _AT_@ -1115,6 +1135,16 @@ progresschange(WebKitWebView *view, GParamSpec *pspec, Client *c) { } static void +linkopen(Client *c, const Arg *arg) { + newwindow(NULL, arg, 1); +} + +static void +linkopenembed(Client *c, const Arg *arg) { + newwindow(NULL, arg, 0); +} + +static void reload(Client *c, const Arg *arg) { gboolean nocache = *(gboolean *)arg; if(nocache) { -- 2.0.5Received on Wed Jan 28 2015 - 21:01:55 CET
This archive was generated by hypermail 2.3.0 : Wed Jan 28 2015 - 21:12:07 CET