| tReplace linkhover() with mousetargetchanged() - surf - customized build of sur… | |
| git clone git://src.adamsgaard.dk/surf | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 42c6c90366b7ce7708b13037a6ba819b08fbb20e | |
| parent b9530ad5d1cd29e176c9f16b92f1983993b22049 | |
| Author: Quentin Rameau <[email protected]> | |
| 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(-) | |
| --- | |
| 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, Clie… | |
| 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, … | |
| } | |
| 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); |