X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=6bf7989349e74bea03f203fc67b36b9b4d28d69e;hb=2e1fb873613b3917b97c954f0c085ea05016bdce;hp=d893b270d555ddec22ab42bfb6250286eb4e2bec;hpb=96188f83f0f77f93fc5f4590c1f1c8f13b78e599;p=surf.git diff --git a/surf.c b/surf.c index d893b27..6bf7989 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 { @@ -102,12 +103,9 @@ static int cookiepolicy; static char *stylefile = NULL; static void addaccelgroup(Client *c); -static void beforerequest(WebKitWebView *w, WebKitWebFrame *f, - WebKitWebResource *r, WebKitNetworkRequest *req, - 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); @@ -122,8 +120,7 @@ static gboolean decidepolicy(WebKitWebView *v, WebKitPolicyDecision *d, static void decidenavigation(WebKitPolicyDecision *d, Client *c); static void decidenewwindow(WebKitPolicyDecision *d, Client *c); static void decideresource(WebKitPolicyDecision *d, Client *c); -static gboolean deletion_interface(WebKitWebView *view, - WebKitDOMHTMLElement *arg1, Client *c); +static void closeview(WebKitWebView *v, Client *c); static void destroyclient(Client *c); static void destroywin(GtkWidget* w, Client *c); static void die(const char *errstr, ...); @@ -139,7 +136,7 @@ static char *geturi(Client *c); static const gchar *getstyle(const char *uri); static void setstyle(Client *c, const char *style); -static void handleplumb(Client *c, WebKitWebView *w, const gchar *uri); +static void handleplumb(Client *c, const gchar *uri); static void downloadstarted(WebKitWebContext *wc, WebKitDownload *d, Client *c); @@ -165,10 +162,6 @@ static WebKitWebView *newview(Client *c, WebKitWebView *rv); static void showview(WebKitWebView *v, Client *c); static void newwindow(Client *c, const Arg *arg, gboolean noembed); static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d); -static gboolean contextmenu(WebKitWebView *view, GtkWidget *menu, - WebKitHitTestResult *target, gboolean keyboard, - Client *c); -static void menuactivate(GtkMenuItem *item, Client *c); static void print(Client *c, const Arg *arg); static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event, gpointer d); @@ -216,35 +209,6 @@ addaccelgroup(Client *c) gtk_window_add_accel_group(GTK_WINDOW(c->win), group); } -void -beforerequest(WebKitWebView *w, WebKitWebFrame *f, WebKitWebResource *r, - WebKitNetworkRequest *req, WebKitNetworkResponse *resp, - Client *c) -{ - const gchar *uri = webkit_network_request_get_uri(req); - int i, isascii = 1; - - if (g_str_has_suffix(uri, "/favicon.ico")) - webkit_network_request_set_uri(req, "about:blank"); - - if (!g_str_has_prefix(uri, "http://") - && !g_str_has_prefix(uri, "https://") - && !g_str_has_prefix(uri, "about:") - && !g_str_has_prefix(uri, "file://") - && !g_str_has_prefix(uri, "data:") - && !g_str_has_prefix(uri, "blob:") - && strlen(uri) > 0) { - for (i = 0; i < strlen(uri); i++) { - if (!g_ascii_isprint(uri[i])) { - isascii = 0; - break; - } - } - if (isascii) - handleplumb(c, w, uri); - } -} - char * buildfile(const char *path) { @@ -308,27 +272,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 @@ -544,34 +506,55 @@ decidenewwindow(WebKitPolicyDecision *d, Client *c) void decideresource(WebKitPolicyDecision *d, Client *c) { + const gchar *uri; + int i, isascii = 1; WebKitResponsePolicyDecision *r = WEBKIT_RESPONSE_POLICY_DECISION(d); WebKitURIResponse *res; + res = webkit_response_policy_decision_get_response(r); + uri = webkit_uri_response_get_uri(res); + + if (g_str_has_suffix(uri, "/favicon.ico")) + webkit_uri_request_set_uri( + webkit_response_policy_decision_get_request(r), + "about:blank"); + + if (!g_str_has_prefix(uri, "http://") + && !g_str_has_prefix(uri, "https://") + && !g_str_has_prefix(uri, "about:") + && !g_str_has_prefix(uri, "file://") + && !g_str_has_prefix(uri, "data:") + && !g_str_has_prefix(uri, "blob:") + && strlen(uri) > 0) { + for (i = 0; i < strlen(uri); i++) { + if (!g_ascii_isprint(uri[i])) { + isascii = 0; + break; + } + } + if (isascii) { + handleplumb(c, uri); + webkit_policy_decision_ignore(d); + } + } + if (webkit_response_policy_decision_is_mime_type_supported(r)) { webkit_policy_decision_use(d); } else { -res = webkit_response_policy_decision_get_response(r); webkit_policy_decision_ignore(d); download(c, res); } } -gboolean -deletion_interface(WebKitWebView *view, WebKitDOMHTMLElement *arg1, Client *c) -{ - return FALSE; -} - void destroyclient(Client *c) { Client *p; webkit_web_view_stop_loading(c->view); - gtk_widget_destroy(GTK_WIDGET(c->view)); - gtk_widget_destroy(c->scroll); - gtk_widget_destroy(c->vbox); + /* Not needed, has already been called gtk_widget_destroy(c->win); + */ for (p = clients; p && p->next != c; p = p->next) ; @@ -580,14 +563,20 @@ destroyclient(Client *c) else clients = c->next; free(c); - if (clients == NULL) - gtk_main_quit(); +} + +void +closeview(WebKitWebView *v, Client *c) +{ + gtk_widget_destroy(c->win); } void destroywin(GtkWidget* w, Client *c) { destroyclient(c); + if (clients == NULL) + gtk_main_quit(); } void @@ -692,12 +681,11 @@ setstyle(Client *c, const char *style) } void -handleplumb(Client *c, WebKitWebView *w, const gchar *uri) +handleplumb(Client *c, const gchar *uri) { Arg arg; - webkit_web_view_stop_loading(w); - arg = (Arg)PLUMB((char *)uri); + arg = (Arg)PLUMB(uri); spawn(c, &arg); } @@ -1015,16 +1003,9 @@ newview(Client *c, WebKitWebView *rv) G_CALLBACK(progresschanged), c); g_signal_connect(G_OBJECT(v), "button-release-event", - G_CALLBACK(buttonrelease), c); - g_signal_connect(G_OBJECT(v), - "context-menu", - G_CALLBACK(contextmenu), c); - g_signal_connect(G_OBJECT(v), - "resource-request-starting", - G_CALLBACK(beforerequest), c); - g_signal_connect(G_OBJECT(v), - "should-show-delete-interface-for-element", - G_CALLBACK(deletion_interface), c); + G_CALLBACK(buttonreleased), c); + g_signal_connect(G_OBJECT(v), "close", + G_CALLBACK(closeview), c); return v; } @@ -1147,53 +1128,6 @@ newwindow(Client *c, const Arg *arg, gboolean noembed) spawn(NULL, &a); } -gboolean -contextmenu(WebKitWebView *view, GtkWidget *menu, WebKitHitTestResult *target, - gboolean keyboard, Client *c) -{ - GList *items = gtk_container_get_children(GTK_CONTAINER(GTK_MENU(menu))); - - for (GList *l = items; l; l = l->next) - g_signal_connect(l->data, "activate", G_CALLBACK(menuactivate), c); - - g_list_free(items); - return FALSE; -} - -void -menuactivate(GtkMenuItem *item, Client *c) -{ - /* - * context-menu-action-2000 open link - * context-menu-action-1 open link in window - * context-menu-action-2 download linked file - * context-menu-action-3 copy link location - * context-menu-action-7 copy image address - * context-menu-action-13 reload - * context-menu-action-10 back - * context-menu-action-11 forward - * context-menu-action-12 stop - */ - - const gchar *name, *uri; - GtkClipboard *prisel, *clpbrd; - - name = gtk_actionable_get_action_name(GTK_ACTIONABLE(item)); - if (name == NULL) - return; - - if (!g_strcmp0(name, "context-menu-action-3")) { - prisel = gtk_clipboard_get(GDK_SELECTION_PRIMARY); - gtk_clipboard_set_text(prisel, c->linkhover, -1); - } else if (!g_strcmp0(name, "context-menu-action-7")) { - prisel = gtk_clipboard_get(GDK_SELECTION_PRIMARY); - clpbrd = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); - uri = gtk_clipboard_wait_for_text(clpbrd); - if (uri) - gtk_clipboard_set_text(prisel, uri, -1); - } -} - void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d) {