Replace linkhover() with mousetargetchanged()
authorQuentin Rameau <quinq@fifth.space>
Wed, 18 Nov 2015 16:59:50 +0000 (17:59 +0100)
committerQuentin Rameau <quinq@fifth.space>
Thu, 19 Nov 2015 23:34:20 +0000 (00:34 +0100)
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.

surf.c

diff --git a/surf.c b/surf.c
index 22a3e8a..af994bb 100644 (file)
--- a/surf.c
+++ b/surf.c
@@ -59,7 +59,8 @@ typedef struct Client {
        Window xid;
        WebKitWebView *view;
        WebKitWebInspector *inspector;
        Window xid;
        WebKitWebView *view;
        WebKitWebInspector *inspector;
-       const char *title, *linkhover;
+       WebKitHitTestResult *mousepos;
+       const char *title, *targeturi;
        const char *needle;
        gint progress;
        struct Client *next;
        const char *needle;
        gint progress;
        struct Client *next;
@@ -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 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);
 static void loadstatuschange(WebKitWebView *view, GParamSpec *pspec,
                              Client *c);
 static void loaduri(Client *c, const Arg *arg);
@@ -691,14 +692,24 @@ keypress(GtkAccelGroup *group, GObject *obj, guint key, GdkModifierType mods,
 }
 
 void
 }
 
 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);
 }
 
        updatetitle(c);
 }
 
@@ -869,8 +880,8 @@ newview(Client *c, WebKitWebView *rv)
                         "notify::title",
                         G_CALLBACK(titlechanged), c);
        g_signal_connect(G_OBJECT(v),
                         "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);
        g_signal_connect(G_OBJECT(v),
                         "geolocation-policy-decision-requested",
                         G_CALLBACK(geopolicyrequested), c);