X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=src%2Fdownloads.c;h=db7aaf8550b960c8e9c5d74d32a0de8eed099903;hb=e46f96f17208fd8905a1a2c2f2d448eaf9acc84f;hp=6e92a2b27840472d9727c3e3d2413d50399fdf18;hpb=9bcac0044a4f4c8c67a3b60fcada63b315c3c384;p=chorizo.git diff --git a/src/downloads.c b/src/downloads.c index 6e92a2b..db7aaf8 100644 --- a/src/downloads.c +++ b/src/downloads.c @@ -54,18 +54,10 @@ changed_download_progress(GObject *obj, GParamSpec *pspec, gpointer data) { 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); } @@ -89,62 +81,60 @@ download_start(WebKitWebView *web_view, WebKitDownload *download, 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; @@ -181,6 +171,15 @@ download_copy_path(GtkMenuItem *tb, gpointer data) { 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(); @@ -191,13 +190,21 @@ download_click(GtkToolButton *tb, gpointer data) { 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);