tReplace linkhover() with mousetargetchanged() - 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 42c6c90366b7ce7708b13037a6ba819b08fbb20e
 (DIR) parent b9530ad5d1cd29e176c9f16b92f1983993b22049
 (HTM) Author: Quentin Rameau <quinq@fifth.space>
       Date:   Wed, 18 Nov 2015 17:59:50 +0100
       
       Replace linkhover() with mousetargetchanged()
       
       The “linkhover” can now be more than a simple link (image, video, etc.).
       As we can't anymore perform a hit test when we want, we have to keep the
       last known hit test to be able to know where the mouse is on the next
       click event.
       
       Diffstat:
         M surf.c                              |      35 ++++++++++++++++++++-----------
       
       1 file changed, 23 insertions(+), 12 deletions(-)
       ---
 (DIR) diff --git a/surf.c b/surf.c
       t@@ -59,7 +59,8 @@ typedef struct Client {
                Window xid;
                WebKitWebView *view;
                WebKitWebInspector *inspector;
       -        const char *title, *linkhover;
       +        WebKitHitTestResult *mousepos;
       +        const char *title, *targeturi;
                const char *needle;
                gint progress;
                struct Client *next;
       t@@ -151,8 +152,8 @@ static void inspector_finished(WebKitWebInspector *i, Client *c);
        
        static gboolean keypress(GtkAccelGroup *group, GObject *obj, guint key,
                                 GdkModifierType mods, Client *c);
       -static void linkhover(WebKitWebView *v, const char* t, const char* l,
       -                      Client *c);
       +static void mousetargetchanged(WebKitWebView *v, WebKitHitTestResult *h,
       +                guint modifiers, Client *c);
        static void loadstatuschange(WebKitWebView *view, GParamSpec *pspec,
                                     Client *c);
        static void loaduri(Client *c, const Arg *arg);
       t@@ -691,14 +692,24 @@ keypress(GtkAccelGroup *group, GObject *obj, guint key, GdkModifierType mods,
        }
        
        void
       -linkhover(WebKitWebView *v, const char* t, const char* l, Client *c)
       +mousetargetchanged(WebKitWebView *v, WebKitHitTestResult *h, guint modifiers,
       +    Client *c)
        {
       -        if (l) {
       -                c->linkhover = copystr(&c->linkhover, l);
       -        } else if (c->linkhover) {
       -                free(c->linkhover);
       -                c->linkhover = NULL;
       -        }
       +        WebKitHitTestResultContext hc;
       +
       +        /* Keep the hit test to know where is the pointer on the next click */
       +        c->mousepos = h;
       +
       +        hc = webkit_hit_test_result_get_context(h);
       +
       +        if (hc & OnLink)
       +                c->targeturi = webkit_hit_test_result_get_link_uri(h);
       +        else if (hc & OnImg)
       +                c->targeturi = webkit_hit_test_result_get_image_uri(h);
       +        else if (hc & OnMedia)
       +                c->targeturi = webkit_hit_test_result_get_media_uri(h);
       +        else
       +                c->targeturi = NULL;
                updatetitle(c);
        }
        
       t@@ -869,8 +880,8 @@ newview(Client *c, WebKitWebView *rv)
                                 "notify::title",
                                 G_CALLBACK(titlechanged), c);
                g_signal_connect(G_OBJECT(v),
       -                         "hovering-over-link",
       -                         G_CALLBACK(linkhover), c);
       +                         "mouse-target-changed",
       +                         G_CALLBACK(mousetargetchanged), c);
                g_signal_connect(G_OBJECT(v),
                                 "geolocation-policy-decision-requested",
                                 G_CALLBACK(geopolicyrequested), c);