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);
}