tallow buttonrelease customization in config.h - surf - customized build of surf, the suckless webkit browser
 (HTM) git clone git://src.adamsgaard.dk/surf
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 29c2ab207afe24c48aaadaf3d2b60390eed4ce6a
 (DIR) parent f7e358280cb3bda1f8c46ca021fe94b59a984f5d
 (HTM) Author: Markus Teich <markus.teich@stusta.mhn.de>
       Date:   Wed, 28 Jan 2015 21:01:55 +0100
       
       allow buttonrelease customization in config.h
       
       Signed-off-by: Christoph Lohmann <20h@r-36.net>
       
       Diffstat:
         M config.def.h                        |      10 ++++++++++
         M surf.c                              |      46 +++++++++++++++++++++++++------
       
       2 files changed, 48 insertions(+), 8 deletions(-)
       ---
 (DIR) diff --git a/config.def.h b/config.def.h
       t@@ -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 } },
       +};
 (DIR) diff --git a/surf.c b/surf.c
       t@@ -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 {
       t@@ -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;
       t@@ -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);
        
       t@@ -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);
       t@@ -273,18 +291,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;
                        }
                }
       t@@ -1119,6 +1139,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) {