static Client *clients = NULL;
static GdkNativeWindow embed = 0;
static gboolean showxid = FALSE;
-static gboolean ignore_once = FALSE;
+static int ignorexprop = 0;
static char winid[64];
static char *progname;
static gboolean lockcookie = FALSE;
static void clipboard(Client *c, const Arg *arg);
static void context(WebKitWebView *v, GtkMenu *m, Client *c);
static char *copystr(char **str, const char *src);
+static gboolean decidedownload(WebKitWebView *v, WebKitWebFrame *f, WebKitNetworkRequest *r, gchar *m, WebKitWebPolicyDecision *p, Client *c);
static gboolean decidewindow(WebKitWebView *v, WebKitWebFrame *f, WebKitNetworkRequest *r, WebKitWebNavigationAction *n, WebKitWebPolicyDecision *p, Client *c);
static void destroyclient(Client *c);
static void destroywin(GtkWidget* w, Client *c);
static void die(char *str);
-static void download(WebKitDownload *o, GParamSpec *pspec, Client *c);
+static void download(Client *c, const Arg *arg);
static void drawindicator(Client *c);
static gboolean exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *c);
+static char *geturi(Client *c);
static const char *getatom(Client *c, Atom a);
static gboolean initdownload(WebKitWebView *v, WebKitDownload *o, Client *c);
static void itemclick(GtkMenuItem *mi, Client *c);
static void titlechange(WebKitWebView *v, WebKitWebFrame* frame, const char* title, Client *c);
static void usage(void);
static void update(Client *c);
+static void updatedownload(WebKitDownload *o, GParamSpec *pspec, Client *c);
static void updatewinid(Client *c);
static void windowobjectcleared(GtkWidget *w, WebKitWebFrame *frame, JSContextRef js, JSObjectRef win, Client *c);
static void zoom(Client *c, const Arg *arg);
if(paste)
gtk_clipboard_request_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), pasteuri, c);
else
- gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), webkit_web_view_get_uri(c->view), -1);
+ gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), c->linkhover ? c->linkhover : geturi(c), -1);
}
void
gtk_main_quit();
}
+gboolean
+decidedownload(WebKitWebView *v, WebKitWebFrame *f, WebKitNetworkRequest *r, gchar *m, WebKitWebPolicyDecision *p, Client *c) {
+ if(!webkit_web_view_can_show_mime_type(v, m)) {
+ webkit_web_policy_decision_download(p);
+ return TRUE;
+ }
+ return FALSE;
+}
+
gboolean
decidewindow(WebKitWebView *view, WebKitWebFrame *f, WebKitNetworkRequest *r, WebKitWebNavigationAction *n, WebKitWebPolicyDecision *p, Client *c) {
Arg arg;
+
if(webkit_web_navigation_action_get_reason(n) == WEBKIT_WEB_NAVIGATION_REASON_LINK_CLICKED) {
webkit_web_policy_decision_ignore(p);
arg.v = (void *)webkit_network_request_get_uri(r);
}
void
-download(WebKitDownload *o, GParamSpec *pspec, Client *c) {
- WebKitDownloadStatus status;
+download(Client *c, const Arg *arg) {
+ char *uri;
+ WebKitNetworkRequest *r;
+ WebKitDownload *dl;
- status = webkit_download_get_status(c->download);
- if(status == WEBKIT_DOWNLOAD_STATUS_STARTED || status == WEBKIT_DOWNLOAD_STATUS_CREATED) {
- c->progress = (gint)(webkit_download_get_progress(c->download)*100);
- }
- update(c);
+ if(arg->v)
+ uri = (char *)arg->v;
+ else
+ uri = c->linkhover ? c->linkhover : geturi(c);
+ r = webkit_network_request_new(uri);
+ dl = webkit_download_new(r);
+ initdownload(c->view, dl, c);
}
const char *
stop(c, NULL);
c->download = o;
filename = webkit_download_get_suggested_filename(o);
+ if(!strcmp("", filename))
+ filename = "index.html";
uri = g_strconcat("file://", dldir, "/", filename, NULL);
webkit_download_set_destination_uri(c->download, uri);
c->progress = 0;
html = g_strdup_printf("Download <b>%s</b>...", filename);
webkit_web_view_load_html_string(c->view, html,
webkit_download_get_uri(c->download));
- g_signal_connect(c->download, "notify::progress", G_CALLBACK(download), c);
- g_signal_connect(c->download, "notify::status", G_CALLBACK(download), c);
+ g_signal_connect(c->download, "notify::progress", G_CALLBACK(updatedownload), c);
+ g_signal_connect(c->download, "notify::status", G_CALLBACK(updatedownload), c);
webkit_download_start(c->download);
c->title = copystr(&c->title, filename);
void
loadcommit(WebKitWebView *view, WebKitWebFrame *f, Client *c) {
- setatom(c, uriprop, webkit_web_view_get_uri(c->view));
- reloadcookies();
+ setatom(c, uriprop, geturi(c));
}
void
loadstart(WebKitWebView *view, WebKitWebFrame *f, Client *c) {
c->progress = 0;
update(c);
+ reloadcookies();
}
void
int i;
Client *c;
WebKitWebSettings *settings;
+ GdkGeometry hints = { 1, 1 };
char *uri;
if(!(c = calloc(1, sizeof(Client))))
g_signal_connect(G_OBJECT(c->view), "hovering-over-link", G_CALLBACK(linkhover), c);
g_signal_connect(G_OBJECT(c->view), "create-web-view", G_CALLBACK(createwindow), c);
g_signal_connect(G_OBJECT(c->view), "new-window-policy-decision-requested", G_CALLBACK(decidewindow), c);
+ g_signal_connect(G_OBJECT(c->view), "mime-type-policy-decision-requested", G_CALLBACK(decidedownload), c);
g_signal_connect(G_OBJECT(c->view), "download-requested", G_CALLBACK(initdownload), c);
g_signal_connect(G_OBJECT(c->view), "window-object-cleared", G_CALLBACK(windowobjectcleared), c);
g_signal_connect(G_OBJECT(c->view), "populate-popup", G_CALLBACK(context), c);
gtk_widget_show(c->scroll);
gtk_widget_show(GTK_WIDGET(c->view));
gtk_widget_show(c->win);
+ gtk_window_set_geometry_hints(GTK_WINDOW(c->win), NULL, &hints, GDK_HINT_MIN_SIZE);
gdk_window_set_events(GTK_WIDGET(c->win)->window, GDK_ALL_EVENTS_MASK);
gdk_window_add_filter(GTK_WIDGET(c->win)->window, processx, c);
webkit_web_view_set_full_content_zoom(c->view, TRUE);
if(((XEvent *)e)->type == PropertyNotify) {
ev = &((XEvent *)e)->xproperty;
- if(ignore_once)
- ignore_once = FALSE;
+ if(ignorexprop)
+ ignorexprop--;
else if(ev->state == PropertyNewValue) {
if(ev->atom == uriprop) {
arg.v = getatom(c, uriprop);
void
setatom(Client *c, Atom a, const char *v) {
XSync(dpy, False);
- ignore_once = TRUE;
+ ignorexprop++;
XChangeProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window), a,
XA_STRING, 8, PropModeReplace, (unsigned char *)v,
strlen(v) + 1);
char *t;
if(c->progress != 100)
- t = g_strdup_printf("%s [%i%%]", c->title, c->progress);
+ t = g_strdup_printf("[%i%%] %s", c->progress, c->title);
else if(c->linkhover)
t = g_strdup(c->linkhover);
else
drawindicator(c);
gtk_window_set_title(GTK_WINDOW(c->win), t);
g_free(t);
+}
+void
+updatedownload(WebKitDownload *o, GParamSpec *pspec, Client *c) {
+ WebKitDownloadStatus status;
+
+ status = webkit_download_get_status(c->download);
+ if(status == WEBKIT_DOWNLOAD_STATUS_STARTED || status == WEBKIT_DOWNLOAD_STATUS_CREATED) {
+ c->progress = (gint)(webkit_download_get_progress(c->download)*100);
+ }
+ update(c);
}
void