From 9f50058f505b32bdd1925b4d206c2ac5600ca824 Mon Sep 17 00:00:00 2001 From: Armaan Bhojwani Date: Mon, 7 Jun 2021 11:08:57 -0400 Subject: [PATCH] Split download manager into seperate file --- Makefile | 6 +- browser.c => src/browser.c | 288 ++----------------------------------- src/downloads.c | 266 ++++++++++++++++++++++++++++++++++ src/downloads.h | 6 + 4 files changed, 285 insertions(+), 281 deletions(-) rename browser.c => src/browser.c (81%) create mode 100644 src/downloads.c create mode 100644 src/downloads.h diff --git a/Makefile b/Makefile index f0e15d2..1efcf02 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ datarootdir = $(prefix)/share mandir = $(datarootdir)/man/ datadir = $(prefix)/share -.PHONY: clean uninstall install +.PHONY: man clean uninstall install all: man lariza extensions darkreader @@ -18,11 +18,11 @@ man: scdoc < $$i > $$(echo "$$i" | rev | cut -f 2- -d '.' | rev); \ done -lariza: browser.c +lariza: $(CC) $(CFLAGS) $(LDFLAGS) \ -D__NAME__=\"lariza\" \ -D__NAME_UPPERCASE__=\"LARIZA\" \ - -o $@ $< \ + -o lariza src/*.c \ `pkg-config --cflags --libs gtk+-3.0 glib-2.0 webkit2gtk-4.0` extensions: diff --git a/browser.c b/src/browser.c similarity index 81% rename from browser.c rename to src/browser.c index 37ffdb5..05a05ea 100644 --- a/browser.c +++ b/src/browser.c @@ -1,25 +1,16 @@ #include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include #include +#include "downloads.h" + void client_destroy(GtkWidget *, gpointer); WebKitWebView *client_new(const gchar *, WebKitWebView *, gboolean, gboolean); WebKitWebView *client_new_request(WebKitWebView *, WebKitNavigationAction *, gpointer); void cooperation_setup(void); -void changed_download_progress(GObject *, GParamSpec *, gpointer); void changed_load_progress(GObject *, GParamSpec *, gpointer); void changed_favicon(GObject *, GParamSpec *, gpointer); void changed_title(GObject *, GParamSpec *, gpointer); @@ -27,12 +18,6 @@ void changed_uri(GObject *, GParamSpec *, gpointer); gboolean crashed_web_view(WebKitWebView *, gpointer); gboolean decide_policy(WebKitWebView *, WebKitPolicyDecision *, WebKitPolicyDecisionType, gpointer); -gboolean download_handle(WebKitDownload *, gchar *, gpointer); -void download_click(GtkToolButton *, gpointer); -void download_start(WebKitWebView *, WebKitDownload *, gpointer); -void download_cancel(GtkMenuItem *, gpointer); -gboolean downloadmanager_delete(GtkWidget *, gpointer); -void downloadmanager_setup(void); gchar *ensure_uri_scheme(const gchar *); void grab_environment_configuration(void); void grab_feeds_finished(GObject *, GAsyncResult *, gpointer); @@ -40,14 +25,12 @@ void hover_web_view(WebKitWebView *, WebKitHitTestResult *, guint, gpointer); void icon_location(GtkEntry *, GtkEntryIconPosition, GdkEvent *, gpointer); void init_default_web_context(void); gboolean key_common(GtkWidget *, GdkEvent *, gpointer); -gboolean key_downloadmanager(GtkWidget *, GdkEvent *, gpointer); gboolean key_location(GtkWidget *, GdkEvent *, gpointer); gboolean key_tablabel(GtkWidget *, GdkEvent *, gpointer); gboolean key_web_view(GtkWidget *, GdkEvent *, gpointer); void mainwindow_setup(void); void mainwindow_title(gint); void notebook_switch_page(GtkNotebook *, GtkWidget *, guint, gpointer); -gboolean quit_if_nothing_active(void); gboolean remote_msg(GIOChannel *, GIOCondition, gpointer); void run_user_scripts(WebKitWebView *); void search(gpointer, gint); @@ -69,19 +52,6 @@ struct Client gboolean focus_new_tab; }; -struct MainWindow -{ - GtkWidget *win; - GtkWidget *notebook; -} mw; - -struct DownloadManager -{ - GtkWidget *scroll; - GtkWidget *toolbar; - GtkWidget *win; -} dm; - struct Configuration { WebKitCookieAcceptPolicy cookie_policy; @@ -102,13 +72,13 @@ struct Configuration gint tab_width_chars; } cfg; -struct DownloadItem +struct MainWindow { - GtkToolButton *tb; - WebKitDownload *download; -}; + GtkWidget *win; + GtkWidget *notebook; +} mw; -gint clients = 0, downloads = 0; +gint clients = 0; int cooperative_pipe_fp = 0; gchar *search_text; @@ -308,41 +278,6 @@ cooperation_setup(void) g_free(fifopath); } -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); -} - void changed_load_progress(GObject *obj, GParamSpec *pspec, gpointer data) { @@ -506,192 +441,6 @@ decide_policy(WebKitWebView *web_view, WebKitPolicyDecision *decision, return TRUE; } -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--; -} - -void -download_start(WebKitWebView *web_view, WebKitDownload *download, - 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(cfg.download_dir, 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); -} - -void -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)); -} - -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://" -} - -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); -} - -gboolean -downloadmanager_delete(GtkWidget *obj, gpointer data) -{ - if (!quit_if_nothing_active()) - gtk_widget_hide(dm.win); - - 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); -} - gchar * ensure_uri_scheme(const gchar *t) { @@ -916,7 +665,7 @@ init_default_web_context(void) webkit_web_context_set_preferred_languages(wc, cfg.accepted_language); g_signal_connect(G_OBJECT(wc), "download-started", - G_CALLBACK(download_start), NULL); + G_CALLBACK(download_start), &cfg); trust_user_certs(wc); @@ -1001,7 +750,7 @@ key_common(GtkWidget *widget, GdkEvent *event, gpointer data) gboolean js = webkit_settings_get_enable_javascript(settings); int key = ((GdkEventKey *)event)->keyval; if (def_key("download_manager", GDK_KEY_y) == key) { - gtk_widget_show_all(dm.win); + downloadmanager_show(); return TRUE; } else if (def_key("history_back", GDK_KEY_h) == key) { webkit_web_view_go_back(WEBKIT_WEB_VIEW(c->web_view)); @@ -1131,23 +880,6 @@ key_common(GtkWidget *widget, GdkEvent *event, gpointer data) return FALSE; } -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; -} - gboolean key_location(GtkWidget *widget, GdkEvent *event, gpointer data) { @@ -1310,7 +1042,7 @@ quit_if_nothing_active(void) gtk_main_quit(); return TRUE; } else { - gtk_widget_show_all(dm.win); + downloadmanager_show(); } } diff --git a/src/downloads.c b/src/downloads.c new file mode 100644 index 0000000..c09bda8 --- /dev/null +++ b/src/downloads.c @@ -0,0 +1,266 @@ +#include + +#include "downloads.h" + +gboolean download_handle(WebKitDownload *, gchar *, gpointer); +void download_click(GtkToolButton *, gpointer); +void download_cancel(GtkMenuItem *, gpointer); +gboolean downloadmanager_delete(GtkWidget *, gpointer); + +struct DownloadManager +{ + GtkWidget *scroll; + GtkWidget *toolbar; + GtkWidget *win; +} dm; + +gint downloads = 0; + +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; +} + +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); +} +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--; +} + +void +download_start(WebKitWebView *web_view, WebKitDownload *download, + 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; +} + +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); +} + +void +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)); +} + +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://" +} + +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); +} + +gboolean +downloadmanager_delete(GtkWidget *obj, gpointer data) +{ + if (!quit_if_nothing_active()) + gtk_widget_hide(dm.win); + + 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); +} + +void +downloadmanager_show(void) +{ + gtk_widget_show_all(dm.win); +} diff --git a/src/downloads.h b/src/downloads.h new file mode 100644 index 0000000..cd80b9b --- /dev/null +++ b/src/downloads.h @@ -0,0 +1,6 @@ +extern int downloads; +gboolean quit_if_nothing_active(void); +int def_key(char *, unsigned int); +void download_start(WebKitWebView *, WebKitDownload *, gpointer); +void downloadmanager_setup(void); +void downloadmanager_show(void); -- 2.39.2