---

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
@@ -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
@@ -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 {
@@ -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;
@@ -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);
 
@@ -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);
@@ -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;
                }
        }
@@ -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.5


Reply via email to