summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README3
-rw-r--r--browser.c83
2 files changed, 45 insertions, 41 deletions
diff --git a/README b/README
index add1d40..c328716 100644
--- a/README
+++ b/README
@@ -12,7 +12,7 @@ Features:
- An input box to change the current URL
- Global content zoom
- Pluggability into suckless' tabbed
- - Downloading files using wget
+ - Built-in downloads
- vi-like scrolling (modified by CTRL)
- Searching the current page for a word
- Adblock
@@ -21,6 +21,7 @@ Features:
Planned features:
+ - Monitoring and canceling downloads
- Keyword based searching (opening "wi foo" will search wikipedia)
diff --git a/browser.c b/browser.c
index c8b9353..199ea22 100644
--- a/browser.c
+++ b/browser.c
@@ -25,10 +25,10 @@ static void changed_load_status(GObject *obj, GParamSpec *pspec,
gpointer data);
static void changed_title(GObject *, GParamSpec *, gpointer);
static void changed_uri(GObject *, GParamSpec *, gpointer);
+static gboolean download_handle(WebKitWebView *, WebKitDownload *, gpointer);
static gboolean download_request(WebKitWebView *, WebKitWebFrame *,
WebKitNetworkRequest *, gchar *,
WebKitWebPolicyDecision *, gpointer);
-static gboolean download_wget(WebKitWebView *, WebKitDownload *, gpointer);
static gchar *ensure_url_scheme(const gchar *);
static void grab_environment_configuration(void);
static void hover_web_view(WebKitWebView *, gchar *, gchar *, gpointer);
@@ -232,7 +232,7 @@ client_new(const gchar *uri)
"mime-type-policy-decision-requested",
G_CALLBACK(download_request), NULL);
g_signal_connect(G_OBJECT(c->web_view), "download-requested",
- G_CALLBACK(download_wget), NULL);
+ G_CALLBACK(download_handle), NULL);
g_signal_connect(G_OBJECT(c->web_view), "key-press-event",
G_CALLBACK(key_web_view), c);
g_signal_connect(G_OBJECT(c->web_view), "button-press-event",
@@ -375,57 +375,60 @@ changed_uri(GObject *obj, GParamSpec *pspec, gpointer data)
}
gboolean
-download_request(WebKitWebView *web_view, WebKitWebFrame *frame,
- WebKitNetworkRequest *request, gchar *mime_type,
- WebKitWebPolicyDecision *policy_decision, gpointer data)
+download_handle(WebKitWebView *web_view, WebKitDownload *download, gpointer data)
{
- (void)frame;
- (void)request;
+ gchar *path, *path2 = NULL, *uri;
+ gboolean ret;
+ int suffix = 1;
+
+ (void)web_view;
(void)data;
- if (!webkit_web_view_can_show_mime_type(web_view, mime_type))
+ path = g_build_filename(download_dir,
+ webkit_download_get_suggested_filename(download),
+ NULL);
+ path2 = g_strdup(path);
+ while (g_file_test(path2, G_FILE_TEST_EXISTS) && suffix < 1000)
{
- webkit_web_policy_decision_download(policy_decision);
- return TRUE;
+ g_free(path2);
+
+ path2 = g_strdup_printf("%s.%d", path, suffix);
+ suffix++;
}
- return FALSE;
+
+ if (suffix == 1000)
+ {
+ fprintf(stderr, __NAME__": Suffix reached limit for download.\n");
+ ret = FALSE;
+ }
+ else
+ {
+ uri = g_filename_to_uri(path2, NULL, NULL);
+ webkit_download_set_destination_uri(download, uri);
+ ret = TRUE;
+ g_free(uri);
+ }
+
+ g_free(path);
+ g_free(path2);
+
+ return ret;
}
gboolean
-download_wget(WebKitWebView *web_view, WebKitDownload *download, gpointer data)
+download_request(WebKitWebView *web_view, WebKitWebFrame *frame,
+ WebKitNetworkRequest *request, gchar *mime_type,
+ WebKitWebPolicyDecision *policy_decision, gpointer data)
{
- const gchar *uri;
- char id[16] = "";
- gint ret;
-
- (void)web_view;
+ (void)frame;
+ (void)request;
(void)data;
- uri = webkit_download_get_uri(download);
- if (fork() == 0)
+ if (!webkit_web_view_can_show_mime_type(web_view, mime_type))
{
- chdir(download_dir);
- if (embed == 0)
- ret = execlp("xterm", "xterm", "-hold", "-e", "wget", uri, NULL);
- else
- {
- if (snprintf(id, 16, "%ld", embed) >= 16)
- {
- fprintf(stderr, __NAME__": id for xterm embed truncated!\n");
- exit(EXIT_FAILURE);
- }
- ret = execlp("xterm", "xterm", "-hold", "-into", id, "-e", "wget",
- uri, NULL);
- }
-
- if (ret == -1)
- {
- fprintf(stderr, __NAME__": exec'ing xterm for download");
- perror(" failed");
- exit(EXIT_FAILURE);
- }
+ webkit_web_policy_decision_download(policy_decision);
+ return TRUE;
}
-
return FALSE;
}