tAdapted buttonrelease() - 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 f6a35e5fbfb4a5e9f92a126dae0cca103727d9d4
 (DIR) parent 96188f83f0f77f93fc5f4590c1f1c8f13b78e599
 (HTM) Author: Quentin Rameau <quinq@fifth.space>
       Date:   Thu, 19 Nov 2015 13:19:27 +0100
       
       Adapted buttonrelease()
       
       Use the current hit test (c->mousepos) to determine where the mouse
       pointer is.
       It is possible to link an action to a click and still propagate the
       event after that by setting the “stop event” parameter of a Button to 0.
       
       Diffstat:
         M config.def.h                        |       4 ++--
         M surf.c                              |      43 +++++++++++++++----------------
       
       2 files changed, 23 insertions(+), 24 deletions(-)
       ---
 (DIR) diff --git a/config.def.h b/config.def.h
       t@@ -129,9 +129,9 @@ static Key keys[] = {
        };
        
        /* button definitions */
       -/* where can be OnDoc, OnLink, OnImg, OnMedia, OnEdit, OnBar, OnSel, OnAny */
       +/* target can be OnDoc, OnLink, OnImg, OnMedia, OnEdit, OnBar, OnSel, OnAny */
        static Button buttons[] = {
       -        /* where        event mask      button  function        argument        stop event */
       +        /* target       event mask      button  function        argument        stop event */
                { OnLink,       0,              2,      linkopenembed,  { 0 },          1 },
                { OnLink,       MODKEY,         2,      linkopen,       { 0 },          1 },
                { OnLink,       MODKEY,         1,      linkopen,       { 0 },          1 },
 (DIR) diff --git a/surf.c b/surf.c
       t@@ -76,11 +76,12 @@ typedef struct {
        } Key;
        
        typedef struct {
       -        unsigned int click;
       +        unsigned int target;
                unsigned int mask;
                guint button;
       -        void (*func)(Client *c, const Arg *arg);
       +        void (*func)(Client *c, const Arg *a, WebKitHitTestResult *h);
                const Arg arg;
       +        unsigned int stopevent;
        } Button;
        
        typedef struct {
       t@@ -107,7 +108,7 @@ static void beforerequest(WebKitWebView *w, WebKitWebFrame *f,
                                  WebKitNetworkResponse *resp, Client *c);
        static char *buildfile(const char *path);
        static char *buildpath(const char *path);
       -static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, Client *c);
       +static gboolean buttonreleased(GtkWidget *w, GdkEventKey *e, Client *c);
        static void cleanup(void);
        static void clipboard(Client *c, const Arg *arg);
        
       t@@ -308,27 +309,25 @@ buildpath(const char *path)
        }
        
        gboolean
       -buttonrelease(WebKitWebView *web, GdkEventButton *e, Client *c)
       +buttonreleased(GtkWidget *w, GdkEventKey *e, Client *c)
        {
       -        WebKitHitTestResultContext context;
       -        WebKitHitTestResult *result;
       -        Arg arg;
       -        unsigned int i;
       -
       -        result = webkit_web_view_get_hit_test_result(web, e);
       -        g_object_get(result, "context", &context, NULL);
       -        g_object_get(result, "link-uri", &arg.v, NULL);
       -        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;
       +        WebKitHitTestResultContext element;
       +        GdkEventButton *eb = (GdkEventButton*)e;
       +        int i;
       +
       +        element = webkit_hit_test_result_get_context(c->mousepos);
       +
       +        for (i = 0; i < LENGTH(buttons); ++i) {
       +                if (element & buttons[i].target &&
       +                    eb->button == buttons[i].button &&
       +                    CLEANMASK(eb->state) == CLEANMASK(buttons[i].mask) &&
       +                    buttons[i].func) {
       +                        buttons[i].func(c, &buttons[i].arg, c->mousepos);
       +                        return buttons[i].stopevent;
                        }
                }
       -        return false;
       +
       +        return FALSE;
        }
        
        void
       t@@ -1015,7 +1014,7 @@ newview(Client *c, WebKitWebView *rv)
                                 G_CALLBACK(progresschanged), c);
                g_signal_connect(G_OBJECT(v),
                                 "button-release-event",
       -                         G_CALLBACK(buttonrelease), c);
       +                         G_CALLBACK(buttonreleased), c);
                g_signal_connect(G_OBJECT(v),
                                 "context-menu",
                                 G_CALLBACK(contextmenu), c);