} 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 {
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);
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, ...);
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);
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);
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)
{
}
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
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)
;
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
}
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);
}
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;
}
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)
{