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); |