]> git.armaanb.net Git - chorizo.git/commitdiff
Download Manager
authorPeter Hofmann <scm@uninformativ.de>
Thu, 19 Jun 2014 05:25:31 +0000 (07:25 +0200)
committerPeter Hofmann <scm@uninformativ.de>
Thu, 19 Jun 2014 05:31:57 +0000 (07:31 +0200)
Hit ^D to open it.

According to sloccount, we have reached 731 lines of code now.

README
browser.c

diff --git a/README b/README
index c32871663e7a4c0b7cba8e00addc18a36338ae72..f92c08552fecf1cbfd50081c2540d9cdce82c5b7 100644 (file)
--- a/README
+++ b/README
@@ -21,7 +21,6 @@ Features:
 
 Planned features:
 
-       - Monitoring and canceling downloads
        - Keyword based searching (opening "wi foo" will search wikipedia)
 
 
index 7ad931c4822ba9835bfb4064b69ca7a612a7d114..96df09a0db8caef055788637cc41f75d53428369 100644 (file)
--- a/browser.c
+++ b/browser.c
@@ -30,6 +30,10 @@ static gboolean download_reset_indicator(gpointer);
 static gboolean download_request(WebKitWebView *, WebKitWebFrame *,
                                  WebKitNetworkRequest *, gchar *,
                                  WebKitWebPolicyDecision *, gpointer);
+static void downloadmanager_cancel(GtkToolButton *, gpointer data);
+static void downloadmanager_progress(GObject *obj, GParamSpec *pspec,
+                                     gpointer data);
+static void downloadmanager_setup(void);
 static gchar *ensure_url_scheme(const gchar *);
 static void grab_environment_configuration(void);
 static void hover_web_view(WebKitWebView *, gchar *, gchar *, gpointer);
@@ -54,6 +58,13 @@ struct Client
        GtkWidget *win;
 };
 
+struct DownloadManager
+{
+       GtkWidget *scroll;
+       GtkWidget *toolbar;
+       GtkWidget *win;
+} dm;
+
 
 static gchar *accepted_language = "en-US";
 static GSList *adblock_patterns = NULL;
@@ -383,6 +394,7 @@ download_handle(WebKitWebView *web_view, WebKitDownload *download, gpointer data
 {
        struct Client *c = (struct Client *)data;
        gchar *path, *path2 = NULL, *uri;
+       GtkToolItem *tb;
        gboolean ret;
        int suffix = 1;
 
@@ -416,6 +428,19 @@ download_handle(WebKitWebView *web_view, WebKitDownload *download, gpointer data
                gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(c->status), 1);
                downloads_indicated++;
                g_timeout_add(500, download_reset_indicator, c);
+
+               tb = gtk_tool_button_new_from_stock(GTK_STOCK_DELETE);
+               gtk_tool_button_set_label(GTK_TOOL_BUTTON(tb),
+                                         webkit_download_get_suggested_filename(download));
+               gtk_toolbar_insert(GTK_TOOLBAR(dm.toolbar), tb, 0);
+               gtk_widget_show_all(dm.toolbar);
+
+               g_signal_connect(G_OBJECT(download), "notify::progress",
+                                G_CALLBACK(downloadmanager_progress), tb);
+
+               g_object_ref(download);
+               g_signal_connect(G_OBJECT(tb), "clicked",
+                                G_CALLBACK(downloadmanager_cancel), download);
        }
 
        g_free(path);
@@ -453,6 +478,60 @@ download_request(WebKitWebView *web_view, WebKitWebFrame *frame,
        return FALSE;
 }
 
+void
+downloadmanager_cancel(GtkToolButton *tb, gpointer data)
+{
+       WebKitDownload *download = WEBKIT_DOWNLOAD(data);
+
+       webkit_download_cancel(download);
+       g_object_unref(download);
+
+       gtk_widget_destroy(GTK_WIDGET(tb));
+}
+
+void
+downloadmanager_progress(GObject *obj, GParamSpec *pspec, gpointer data)
+{
+       WebKitDownload *download = WEBKIT_DOWNLOAD(obj);
+       GtkToolItem *tb = GTK_TOOL_ITEM(data);
+       gdouble p;
+       gchar *t;
+
+       (void)pspec;
+
+       p = webkit_download_get_progress(download) * 100;
+       t = g_strdup_printf("%s (%.0f%%)",
+                           webkit_download_get_suggested_filename(download),
+                                               p);
+       gtk_tool_button_set_label(GTK_TOOL_BUTTON(tb), t);
+       g_free(t);
+}
+
+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(gtk_widget_hide_on_delete), 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_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(dm.scroll),
+                                             dm.toolbar);
+
+       gtk_container_add(GTK_CONTAINER(dm.win), dm.scroll);
+}
+
 gchar *
 ensure_url_scheme(const gchar *t)
 {
@@ -545,6 +624,14 @@ key_location(GtkWidget *widget, GdkEvent *event, gpointer data)
                                gtk_entry_set_text(GTK_ENTRY(c->location),
                                                   (t == NULL ? __NAME__ : t));
                                return TRUE;
+                       case GDK_KEY_d:
+                               if (((GdkEventKey *)event)->state & GDK_CONTROL_MASK)
+                               {
+                                       gtk_widget_show_all(dm.win);
+                                       return TRUE;
+                               }
+                               else
+                                       return FALSE;
                }
        }
 
@@ -607,6 +694,9 @@ key_web_view(GtkWidget *widget, GdkEvent *event, gpointer data)
                                        webkit_web_view_load_uri(WEBKIT_WEB_VIEW(c->web_view), f);
                                        g_free(f);
                                        return TRUE;
+                               case GDK_KEY_d:
+                                       gtk_widget_show_all(dm.win);
+                                       return TRUE;
                        }
                }
                else if (((GdkEventKey *)event)->keyval == GDK_KEY_Escape)
@@ -770,6 +860,7 @@ main(int argc, char **argv)
 
        adblock_load();
        cooperation_setup();
+       downloadmanager_setup();
 
        if (tabbed_automagic && !(cooperative_instances && !cooperative_alone))
                embed = tabbed_launch();