X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=c9a036a46bd58d22499bd8627948a9a5ecd4a8d9;hb=92d7ba7ed8cf4cb7ffa839596fca58032e2c4dd3;hp=79a71fe5bd8059d34425d0b9db11347c1fe91f6a;hpb=0f3e3bf66986b0a9613b03c43ff204b1c009f6bc;p=surf.git diff --git a/surf.c b/surf.c index 79a71fe..c9a036a 100644 --- a/surf.c +++ b/surf.c @@ -35,14 +35,16 @@ char *argv0; #define CLEANMASK(mask) (mask & (MODKEY|GDK_SHIFT_MASK)) enum { AtomFind, AtomGo, AtomUri, AtomLast }; + enum { - ClkDoc = WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT, - ClkLink = WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK, - ClkImg = WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE, - ClkMedia = WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA, - ClkSel = WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION, - ClkEdit = WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE, - ClkAny = ClkDoc | ClkLink | ClkImg | ClkMedia | ClkSel | ClkEdit, + OnDoc = WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT, + OnLink = WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK, + OnImg = WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE, + OnMedia = WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA, + OnEdit = WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE, + OnBar = WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR, + OnSel = WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION, + OnAny = OnDoc | OnLink | OnImg | OnMedia | OnEdit | OnBar | OnSel, }; typedef union Arg Arg; @@ -57,7 +59,8 @@ typedef struct Client { Window xid; WebKitWebView *view; WebKitWebInspector *inspector; - char *title, *linkhover; + WebKitHitTestResult *mousepos; + const char *title, *targeturi; const char *needle; gint progress; struct Client *next; @@ -127,8 +130,8 @@ static void die(const char *errstr, ...); static void eval(Client *c, const Arg *arg); static void find(Client *c, const Arg *arg); static void fullscreen(Client *c, const Arg *arg); -static void geopolicyrequested(WebKitWebView *v, WebKitWebFrame *f, - WebKitGeolocationPolicyDecision *d, Client *c); +static gboolean permissionrequested(WebKitWebView *v, + WebKitPermissionRequest *r, Client *c); static const char *getatom(Client *c, int a); static void gettogglestat(Client *c); static void getpagestat(Client *c); @@ -149,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); @@ -179,7 +182,7 @@ static void setup(void); static void sigchld(int unused); static void spawn(Client *c, const Arg *arg); static void stop(Client *c, const Arg *arg); -static void titlechange(WebKitWebView *view, GParamSpec *pspec, Client *c); +static void titlechanged(WebKitWebView *view, GParamSpec *ps, Client *c); static void titlechangeleave(void *a, void *b, Client *c); static void toggle(Client *c, const Arg *arg); static void togglecookiepolicy(Client *c, const Arg *arg); @@ -524,14 +527,18 @@ fullscreen(Client *c, const Arg *arg) c->fullscreen = !c->fullscreen; } -void -geopolicyrequested(WebKitWebView *v, WebKitWebFrame *f, - WebKitGeolocationPolicyDecision *d, Client *c) +gboolean +permissionrequested(WebKitWebView *v, WebKitPermissionRequest *r, Client *c) { - if (allowgeolocation) - webkit_geolocation_policy_allow(d); - else - webkit_geolocation_policy_deny(d); + if (WEBKIT_IS_GEOLOCATION_PERMISSION_REQUEST(r)) { + if (allowgeolocation) + webkit_permission_request_allow(r); + else + webkit_permission_request_deny(r); + return TRUE; + } + + return FALSE; } const char * @@ -689,14 +696,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); } @@ -865,13 +882,13 @@ newview(Client *c, WebKitWebView *rv) g_signal_connect(G_OBJECT(v), "notify::title", - G_CALLBACK(titlechange), c); + 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); + "permission-request", + G_CALLBACK(permissionrequested), c); g_signal_connect(G_OBJECT(v), "create-web-view", G_CALLBACK(createwindow), c); @@ -1277,13 +1294,10 @@ stop(Client *c, const Arg *arg) } void -titlechange(WebKitWebView *view, GParamSpec *pspec, Client *c) +titlechanged(WebKitWebView *view, GParamSpec *ps, Client *c) { - const gchar *t = webkit_web_view_get_title(view); - if (t) { - c->title = copystr(&c->title, t); - updatetitle(c); - } + c->title = webkit_web_view_get_title(c->view); + updatetitle(c); } void