uri = webkit_download_get_destination(download);
filename = g_filename_from_uri(uri, NULL, NULL);
- if (filename == NULL) {
- /* This really should not happen because WebKit uses that URI
- * to write to a file... */
- fprintf(stderr, __NAME__ ": Could not construct file name from URI!\n");
- t = g_strdup_printf("%s (%.0f%% of %.1f MB)",
- webkit_uri_response_get_uri(resp), p, size_mb);
- } else {
- base = g_path_get_basename(filename);
- t = g_strdup_printf("%s (%.0f%% of %.1f MB)", base, p, size_mb);
- g_free(filename);
- g_free(base);
- }
+ base = g_path_get_basename(filename);
+ t = g_strdup_printf("%s (%.0f%% of %.1f MB)", base, p, size_mb);
+ g_free(filename);
+ g_free(base);
gtk_tool_button_set_label(GTK_TOOL_BUTTON(tb), t);
g_free(t);
}
gboolean
download_handle(WebKitDownload *download, gchar *suggested_filename,
gpointer data) {
- gchar *sug_clean, *path, *path2 = NULL, *uri;
+ gchar *uri;
GtkToolItem *tb;
- int suffix = 1;
- size_t i;
- sug_clean = g_strdup(suggested_filename);
- for (i = 0; i < strlen(sug_clean); i++)
- if (sug_clean[i] == G_DIR_SEPARATOR)
- sug_clean[i] = '_';
+ GtkWidget *chooser = gtk_file_chooser_dialog_new(
+ "Choose download location", GTK_WINDOW(dm.win),
+ GTK_FILE_CHOOSER_ACTION_SAVE, "Save file", GTK_RESPONSE_ACCEPT,
+ "Cancel", GTK_RESPONSE_CANCEL, NULL);
+ gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(chooser),
+ (char *)data);
+ gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(chooser),
+ suggested_filename);
+ gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(chooser),
+ TRUE);
+ gint res = gtk_dialog_run(GTK_DIALOG(chooser));
+
+ switch (res) {
+ case GTK_RESPONSE_ACCEPT:
+ uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(chooser));
+ webkit_download_set_destination(
+ download, gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(chooser)));
+ break;
+ case GTK_RESPONSE_CANCEL:
+ return FALSE;
+ default:
+ return FALSE;
+ }
- path = g_build_filename((char *)data, sug_clean, NULL);
- path2 = g_strdup(path);
- while (g_file_test(path2, G_FILE_TEST_EXISTS) && suffix < 1000) {
- g_free(path2);
+ gtk_widget_destroy(chooser);
- path2 = g_strdup_printf("%s.%d", path, suffix);
- suffix++;
- }
+ remove(uri + 7);
+ tb = gtk_tool_button_new(NULL, NULL);
+ gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(tb), "network-receive");
+ gtk_tool_button_set_label(GTK_TOOL_BUTTON(tb), uri);
+ gtk_toolbar_insert(GTK_TOOLBAR(dm.toolbar), tb, 0);
+ gtk_widget_show_all(dm.win);
- if (suffix == 1000) {
- fprintf(stderr, __NAME__ ": Suffix reached limit for download.\n");
- webkit_download_cancel(download);
- } else {
- uri = g_filename_to_uri(path2, NULL, NULL);
- webkit_download_set_destination(download, uri);
- g_free(uri);
-
- tb = gtk_tool_button_new(NULL, NULL);
- gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(tb), "network-receive");
- gtk_tool_button_set_label(GTK_TOOL_BUTTON(tb), sug_clean);
- gtk_toolbar_insert(GTK_TOOLBAR(dm.toolbar), tb, 0);
- gtk_widget_show_all(dm.win);
-
- g_signal_connect(G_OBJECT(download), "notify::estimated-progress",
- G_CALLBACK(changed_download_progress), tb);
-
- downloads++;
- g_signal_connect(G_OBJECT(download), "finished",
- G_CALLBACK(download_finished), tb);
-
- g_object_ref(download);
-
- struct DownloadItem *payload = malloc(sizeof(*payload));
- payload->tb = (GtkToolButton *)tb;
- payload->download = download;
- g_signal_connect(G_OBJECT(tb), "clicked", G_CALLBACK(download_click),
- payload);
- g_signal_connect(G_OBJECT(tb), "failed", G_CALLBACK(download_cancel),
- payload);
- g_signal_connect(G_OBJECT(tb), "destroy_event", G_CALLBACK(g_free),
- payload);
- }
+ g_signal_connect(G_OBJECT(download), "notify::estimated-progress",
+ G_CALLBACK(changed_download_progress), tb);
+
+ downloads++;
+ g_signal_connect(G_OBJECT(download), "finished",
+ G_CALLBACK(download_finished), tb);
+
+ g_object_ref(download);
- g_free(sug_clean);
- g_free(path);
- g_free(path2);
+ struct DownloadItem *payload = malloc(sizeof(*payload));
+ payload->tb = (GtkToolButton *)tb;
+ payload->download = download;
+ g_signal_connect(G_OBJECT(tb), "clicked", G_CALLBACK(download_click),
+ payload);
+ g_signal_connect(G_OBJECT(tb), "failed", G_CALLBACK(download_cancel),
+ payload);
+ g_signal_connect(G_OBJECT(tb), "destroy_event", G_CALLBACK(g_free),
+ payload);
// Propagate -- to whom it may concern.
return FALSE;
strlen(path) - 7); // Offset by 7 to remove "file://"
}
+void
+download_xdg_open(GtkMenuItem *tb, gpointer data) {
+ struct DownloadItem *payload = data;
+ const gchar *path = webkit_download_get_destination(payload->download);
+ char *cmd = malloc(strlen(path) + 9);
+ sprintf(cmd, "xdg-open %s", path);
+ system(cmd);
+}
+
void
download_click(GtkToolButton *tb, gpointer data) {
GtkWidget *pmenu = gtk_menu_new();
option = gtk_menu_item_new_with_label("Cancel download");
g_signal_connect(G_OBJECT(option), "activate",
G_CALLBACK(download_cancel), data);
+ gtk_widget_show(option);
+ gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), option);
} else {
option = gtk_menu_item_new_with_label("Remove download");
g_signal_connect(G_OBJECT(option), "activate",
G_CALLBACK(download_remove), data);
+ gtk_widget_show(option);
+ gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), option);
+
+ option = gtk_menu_item_new_with_label("Open file with xdg-open");
+ gtk_widget_show(option);
+ gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), option);
+ g_signal_connect(G_OBJECT(option), "activate",
+ G_CALLBACK(download_xdg_open), data);
}
- gtk_widget_show(option);
- gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), option);
option = gtk_menu_item_new_with_label("Copy download URL");
gtk_widget_show(option);