X-Git-Url: https://git.armaanb.net/?p=chorizo.git;a=blobdiff_plain;f=src%2Fdownloads.c;h=6e92a2b27840472d9727c3e3d2413d50399fdf18;hp=40994e12b5ab7eed1d35c93a7d11fec378d1daa3;hb=9bcac0044a4f4c8c67a3b60fcada63b315c3c384;hpb=d33c5799d3dcf6b3444eb8632021f56f59d98eb0 diff --git a/src/downloads.c b/src/downloads.c index 40994e1..6e92a2b 100644 --- a/src/downloads.c +++ b/src/downloads.c @@ -7,261 +7,247 @@ void download_click(GtkToolButton *, gpointer); void download_cancel(GtkMenuItem *, gpointer); gboolean downloadmanager_delete(GtkWidget *, gpointer); -struct DownloadManager -{ - GtkWidget *scroll; - GtkWidget *toolbar; - GtkWidget *win; +struct DownloadManager { + GtkWidget *scroll; + GtkWidget *toolbar; + GtkWidget *win; } dm; gint downloads = 0; -struct DownloadItem -{ - GtkToolButton *tb; - WebKitDownload *download; +struct DownloadItem { + GtkToolButton *tb; + WebKitDownload *download; }; gboolean -key_downloadmanager(GtkWidget *widget, GdkEvent *event, gpointer data) -{ - if (event->type == GDK_KEY_PRESS) { - if (((GdkEventKey *)event)->state & GDK_CONTROL_MASK) { - int key = ((GdkEventKey *)event)->keyval; - if ((def_key("close_tab", GDK_KEY_q) == key) || - (def_key("download_manager", GDK_KEY_y) == key)) { - downloadmanager_delete(dm.win, NULL); - return TRUE; - } - } - } - - return FALSE; +key_downloadmanager(GtkWidget *widget, GdkEvent *event, gpointer data) { + if (event->type == GDK_KEY_PRESS) { + if (((GdkEventKey *)event)->state & GDK_CONTROL_MASK) { + int key = ((GdkEventKey *)event)->keyval; + if ((def_key("close_tab", GDK_KEY_q) == key) || + (def_key("download_manager", GDK_KEY_y) == key)) { + downloadmanager_delete(dm.win, NULL); + return TRUE; + } + } + } + + return FALSE; } void -changed_download_progress(GObject *obj, GParamSpec *pspec, gpointer data) -{ - WebKitDownload *download = WEBKIT_DOWNLOAD(obj); - WebKitURIResponse *resp; - GtkToolItem *tb = GTK_TOOL_ITEM(data); - gdouble p, size_mb; - const gchar *uri; - gchar *t, *filename, *base; - - p = webkit_download_get_estimated_progress(download); - p = p > 1 ? 1 : p; - p = p < 0 ? 0 : p; - p *= 100; - resp = webkit_download_get_response(download); - size_mb = webkit_uri_response_get_content_length(resp) / 1e6; - - 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); - } - gtk_tool_button_set_label(GTK_TOOL_BUTTON(tb), t); - g_free(t); +changed_download_progress(GObject *obj, GParamSpec *pspec, gpointer data) { + WebKitDownload *download = WEBKIT_DOWNLOAD(obj); + WebKitURIResponse *resp; + GtkToolItem *tb = GTK_TOOL_ITEM(data); + gdouble p, size_mb; + const gchar *uri; + gchar *t, *filename, *base; + + p = webkit_download_get_estimated_progress(download); + p = p > 1 ? 1 : p; + p = p < 0 ? 0 : p; + p *= 100; + resp = webkit_download_get_response(download); + size_mb = webkit_uri_response_get_content_length(resp) / 1e6; + + 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); + } + gtk_tool_button_set_label(GTK_TOOL_BUTTON(tb), t); + g_free(t); } + void -download_finished(WebKitDownload *download, gpointer data) -{ - if (strcmp(gtk_tool_button_get_icon_name(GTK_TOOL_BUTTON(data)), - "dialog-error") != 0) - gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(data), "emblem-downloads"); - downloads--; +download_finished(WebKitDownload *download, gpointer data) { + if (strcmp(gtk_tool_button_get_icon_name(GTK_TOOL_BUTTON(data)), + "dialog-error") != 0) + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(data), + "emblem-downloads"); + downloads--; } void download_start(WebKitWebView *web_view, WebKitDownload *download, - gpointer data) -{ - g_signal_connect(G_OBJECT(download), "decide-destination", - G_CALLBACK(download_handle), data); + gpointer data) { + g_signal_connect(G_OBJECT(download), "decide-destination", + G_CALLBACK(download_handle), data); } gboolean download_handle(WebKitDownload *download, gchar *suggested_filename, - gpointer data) -{ - gchar *sug_clean, *path, *path2 = NULL, *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] = '_'; - - 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); - - path2 = g_strdup_printf("%s.%d", path, suffix); - suffix++; - } - - 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_free(sug_clean); - g_free(path); - g_free(path2); - - /* Propagate -- to whom it may concern. */ - return FALSE; + gpointer data) { + gchar *sug_clean, *path, *path2 = NULL, *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] = '_'; + + 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); + + path2 = g_strdup_printf("%s.%d", path, suffix); + suffix++; + } + + 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_free(sug_clean); + g_free(path); + g_free(path2); + + // Propagate -- to whom it may concern. + return FALSE; } void -download_cancel(GtkMenuItem *tb, gpointer data) -{ - struct DownloadItem *payload = data; - gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(payload->tb), "dialog-error"); - webkit_download_cancel(payload->download); +download_cancel(GtkMenuItem *tb, gpointer data) { + struct DownloadItem *payload = data; + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(payload->tb), "dialog-error"); + webkit_download_cancel(payload->download); } void -download_remove(GtkMenuItem *tb, gpointer data) -{ - struct DownloadItem *payload = data; - g_object_unref(payload->download); - gtk_widget_destroy(GTK_WIDGET(payload->tb)); +download_remove(GtkMenuItem *tb, gpointer data) { + struct DownloadItem *payload = data; + g_object_unref(payload->download); + gtk_widget_destroy(GTK_WIDGET(payload->tb)); } void -download_copy_url(GtkMenuItem *tb, gpointer data) -{ - struct DownloadItem *payload = data; - WebKitURIRequest *req = webkit_download_get_request(payload->download); - const gchar *uri = webkit_uri_request_get_uri(req); - gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), uri, - strlen(uri)); +download_copy_url(GtkMenuItem *tb, gpointer data) { + struct DownloadItem *payload = data; + WebKitURIRequest *req = webkit_download_get_request(payload->download); + const gchar *uri = webkit_uri_request_get_uri(req); + gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), uri, + strlen(uri)); } void -download_copy_path(GtkMenuItem *tb, gpointer data) -{ - struct DownloadItem *payload = data; - const gchar *path = webkit_download_get_destination(payload->download); - gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), path + 7, - strlen(path) - 7); // Offset by 7 to remove "file://" +download_copy_path(GtkMenuItem *tb, gpointer data) { + struct DownloadItem *payload = data; + const gchar *path = webkit_download_get_destination(payload->download); + gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), path + 7, + strlen(path) - 7); // Offset by 7 to remove "file://" } void -download_click(GtkToolButton *tb, gpointer data) -{ - GtkWidget *pmenu = gtk_menu_new(); - GtkWidget *option; - - if (strcmp(gtk_tool_button_get_icon_name(GTK_TOOL_BUTTON(tb)), - "network-receive") == 0) { - option = gtk_menu_item_new_with_label("Cancel download"); - g_signal_connect(G_OBJECT(option), "activate", - G_CALLBACK(download_cancel), data); - } 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("Copy download URL"); - gtk_widget_show(option); - gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), option); - g_signal_connect(G_OBJECT(option), "activate", - G_CALLBACK(download_copy_url), data); - - option = gtk_menu_item_new_with_label("Copy local path"); - gtk_widget_show(option); - gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), option); - g_signal_connect(G_OBJECT(option), "activate", - G_CALLBACK(download_copy_path), data); - - gtk_menu_popup_at_pointer(GTK_MENU(pmenu), NULL); +download_click(GtkToolButton *tb, gpointer data) { + GtkWidget *pmenu = gtk_menu_new(); + GtkWidget *option; + + if (strcmp(gtk_tool_button_get_icon_name(GTK_TOOL_BUTTON(tb)), + "network-receive") == 0) { + option = gtk_menu_item_new_with_label("Cancel download"); + g_signal_connect(G_OBJECT(option), "activate", + G_CALLBACK(download_cancel), data); + } 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("Copy download URL"); + gtk_widget_show(option); + gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), option); + g_signal_connect(G_OBJECT(option), "activate", + G_CALLBACK(download_copy_url), data); + + option = gtk_menu_item_new_with_label("Copy local path"); + gtk_widget_show(option); + gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), option); + g_signal_connect(G_OBJECT(option), "activate", + G_CALLBACK(download_copy_path), data); + + gtk_menu_popup_at_pointer(GTK_MENU(pmenu), NULL); } gboolean -downloadmanager_delete(GtkWidget *obj, gpointer data) -{ - if (!quit_if_nothing_active()) - gtk_widget_hide(dm.win); +downloadmanager_delete(GtkWidget *obj, gpointer data) { + if (!quit_if_nothing_active()) + gtk_widget_hide(dm.win); - return TRUE; + return TRUE; } void -downloadmanager_setup(void) -{ - dm.win = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_type_hint(GTK_WINDOW(dm.win), GDK_WINDOW_TYPE_HINT_DIALOG); - gtk_window_set_default_size(GTK_WINDOW(dm.win), 500, 250); - gtk_window_set_title(GTK_WINDOW(dm.win), __NAME__" - Download Manager"); - g_signal_connect(G_OBJECT(dm.win), "delete-event", - G_CALLBACK(downloadmanager_delete), NULL); - g_signal_connect(G_OBJECT(dm.win), "key-press-event", - G_CALLBACK(key_downloadmanager), NULL); - - dm.toolbar = gtk_toolbar_new(); - gtk_orientable_set_orientation(GTK_ORIENTABLE(dm.toolbar), - GTK_ORIENTATION_VERTICAL); - gtk_toolbar_set_style(GTK_TOOLBAR(dm.toolbar), GTK_TOOLBAR_BOTH_HORIZ); - gtk_toolbar_set_show_arrow(GTK_TOOLBAR(dm.toolbar), FALSE); - - dm.scroll = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(dm.scroll), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_container_add(GTK_CONTAINER(dm.scroll), dm.toolbar); - - gtk_container_add(GTK_CONTAINER(dm.win), dm.scroll); +downloadmanager_setup(void) { + dm.win = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_type_hint(GTK_WINDOW(dm.win), GDK_WINDOW_TYPE_HINT_DIALOG); + gtk_window_set_default_size(GTK_WINDOW(dm.win), 500, 250); + gtk_window_set_title(GTK_WINDOW(dm.win), __NAME__ " - Download Manager"); + g_signal_connect(G_OBJECT(dm.win), "delete-event", + G_CALLBACK(downloadmanager_delete), NULL); + g_signal_connect(G_OBJECT(dm.win), "key-press-event", + G_CALLBACK(key_downloadmanager), NULL); + + dm.toolbar = gtk_toolbar_new(); + gtk_orientable_set_orientation(GTK_ORIENTABLE(dm.toolbar), + GTK_ORIENTATION_VERTICAL); + gtk_toolbar_set_style(GTK_TOOLBAR(dm.toolbar), GTK_TOOLBAR_BOTH_HORIZ); + gtk_toolbar_set_show_arrow(GTK_TOOLBAR(dm.toolbar), FALSE); + + dm.scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(dm.scroll), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(dm.scroll), dm.toolbar); + + gtk_container_add(GTK_CONTAINER(dm.win), dm.scroll); } void -downloadmanager_show(void) -{ - gtk_widget_show_all(dm.win); +downloadmanager_show(void) { + gtk_widget_show_all(dm.win); }