X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=b79438d6d8284153b080a1a541cb309facde6728;hb=f6a35e5fbfb4a5e9f92a126dae0cca103727d9d4;hp=2e8ca70766172fdb7eed7f663ad52b3517314160;hpb=26a2dbac6501d095937568cdb9f00083e0b02146;p=surf.git diff --git a/surf.c b/surf.c index 2e8ca70..b79438d 100644 --- a/surf.c +++ b/surf.c @@ -76,11 +76,12 @@ typedef struct { } Key; typedef struct { - unsigned int click; + unsigned int target; unsigned int mask; guint button; - void (*func)(Client *c, const Arg *arg); + void (*func)(Client *c, const Arg *a, WebKitHitTestResult *h); const Arg arg; + unsigned int stopevent; } Button; typedef struct { @@ -107,7 +108,7 @@ static void beforerequest(WebKitWebView *w, WebKitWebFrame *f, WebKitNetworkResponse *resp, Client *c); static char *buildfile(const char *path); static char *buildpath(const char *path); -static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, Client *c); +static gboolean buttonreleased(GtkWidget *w, GdkEventKey *e, Client *c); static void cleanup(void); static void clipboard(Client *c, const Arg *arg); @@ -141,7 +142,10 @@ static void setstyle(Client *c, const char *style); static void handleplumb(Client *c, WebKitWebView *w, const gchar *uri); -static gboolean initdownload(WebKitWebView *v, WebKitDownload *o, Client *c); +static void downloadstarted(WebKitWebContext *wc, WebKitDownload *d, + Client *c); +static void responsereceived(WebKitDownload *d, GParamSpec *ps, Client *c); +static void download(Client *c, WebKitURIResponse *r); static void inspector(Client *c, const Arg *arg); static WebKitWebView *inspector_new(WebKitWebInspector *i, WebKitWebView *v, @@ -305,27 +309,25 @@ buildpath(const char *path) } gboolean -buttonrelease(WebKitWebView *web, GdkEventButton *e, Client *c) +buttonreleased(GtkWidget *w, GdkEventKey *e, Client *c) { - WebKitHitTestResultContext context; - WebKitHitTestResult *result; - Arg arg; - unsigned int i; - - result = webkit_web_view_get_hit_test_result(web, e); - g_object_get(result, "context", &context, NULL); - g_object_get(result, "link-uri", &arg.v, NULL); - for (i = 0; i < LENGTH(buttons); i++) { - if (context & buttons[i].click - && e->button == buttons[i].button - && CLEANMASK(e->state) == CLEANMASK(buttons[i].mask) - && buttons[i].func) { - buttons[i].func(c, buttons[i].click == ClkLink - && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); - return true; + WebKitHitTestResultContext element; + GdkEventButton *eb = (GdkEventButton*)e; + int i; + + element = webkit_hit_test_result_get_context(c->mousepos); + + for (i = 0; i < LENGTH(buttons); ++i) { + if (element & buttons[i].target && + eb->button == buttons[i].button && + CLEANMASK(eb->state) == CLEANMASK(buttons[i].mask) && + buttons[i].func) { + buttons[i].func(c, &buttons[i].arg, c->mousepos); + return buttons[i].stopevent; } } - return false; + + return FALSE; } void @@ -698,15 +700,27 @@ handleplumb(Client *c, WebKitWebView *w, const gchar *uri) spawn(c, &arg); } -gboolean -initdownload(WebKitWebView *view, WebKitDownload *o, Client *c) +void +downloadstarted(WebKitWebContext *wc, WebKitDownload *d, Client *c) { - Arg arg; + g_signal_connect(G_OBJECT(d), "notify::response", + G_CALLBACK(responsereceived), c); +} - updatewinid(c); - arg = (Arg)DOWNLOAD((char *)webkit_download_get_uri(o), geturi(c)); - spawn(c, &arg); - return FALSE; +void +responsereceived(WebKitDownload *d, GParamSpec *ps, Client *c) +{ + download(c, webkit_download_get_response(d)); + webkit_download_cancel(d); +} + +void +download(Client *c, WebKitURIResponse *r) +{ + Arg a; + + a = (Arg)DOWNLOAD(webkit_uri_response_get_uri(r), geturi(c)); + spawn(c, &a); } void @@ -962,6 +976,9 @@ newview(Client *c, WebKitWebView *rv) webkit_web_context_get_cookie_manager(context), cookiepolicy_get()); + g_signal_connect(G_OBJECT(context), "download-started", + G_CALLBACK(downloadstarted), c); + v = g_object_new(WEBKIT_TYPE_WEB_VIEW, "settings", settings, "user-content-manager", contentmanager, @@ -995,12 +1012,9 @@ newview(Client *c, WebKitWebView *rv) g_signal_connect(G_OBJECT(v), "notify::estimated-load-progress", G_CALLBACK(progresschanged), c); - g_signal_connect(G_OBJECT(v), - "download-requested", - G_CALLBACK(initdownload), c); g_signal_connect(G_OBJECT(v), "button-release-event", - G_CALLBACK(buttonrelease), c); + G_CALLBACK(buttonreleased), c); g_signal_connect(G_OBJECT(v), "context-menu", G_CALLBACK(contextmenu), c);