[epiphany/downloads: 12/12] e-d-widget: new widget
- From: Diego Escalante Urrelo <diegoe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany/downloads: 12/12] e-d-widget: new widget
- Date: Mon, 31 Jan 2011 02:47:15 +0000 (UTC)
commit 94d7b0e4a79135f99b2deed968f3197150404aa3
Author: Diego Escalante Urrelo <descalante igalia com>
Date: Wed Jan 26 16:01:43 2011 -0500
e-d-widget: new widget
lib/widgets/Makefile.am | 3 +
lib/widgets/ephy-download-widget.c | 530 ++++++++++++++++++++++++++++++++++++
lib/widgets/ephy-download-widget.h | 85 ++++++
3 files changed, 618 insertions(+), 0 deletions(-)
---
diff --git a/lib/widgets/Makefile.am b/lib/widgets/Makefile.am
index 237d0f4..46f0493 100644
--- a/lib/widgets/Makefile.am
+++ b/lib/widgets/Makefile.am
@@ -1,6 +1,8 @@
noinst_LTLIBRARIES = libephywidgets.la
libephywidgets_la_SOURCES = \
+ ephy-download-widget.c \
+ ephy-download-widget.h \
ephy-location-entry.c \
ephy-location-entry.h \
ephy-node-view.c \
@@ -21,6 +23,7 @@ libephywidgets_la_SOURCES = \
libephywidgets_la_CPPFLAGS = \
-I$(top_builddir)/lib \
-I$(top_srcdir)/lib \
+ -I$(top_srcdir)/embed \
-I$(top_srcdir)/lib/egg \
-DSHARE_DIR=\"$(pkgdatadir)\" \
$(AM_CPPFLAGS)
diff --git a/lib/widgets/ephy-download-widget.c b/lib/widgets/ephy-download-widget.c
new file mode 100644
index 0000000..6a687af
--- /dev/null
+++ b/lib/widgets/ephy-download-widget.c
@@ -0,0 +1,530 @@
+/* vim: set foldmethod=marker sw=2 ts=2 sts=2 et: */
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * ephy-download.c
+ * This file is part of Epiphany
+ *
+ * Copyright © 2011 - Igalia S.L.
+ *
+ * Epiphany is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Epiphany is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Epiphany; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "ephy-download-widget.h"
+
+#include "ephy-debug.h"
+#include "ephy-embed-shell.h"
+#include "ephy-download.h"
+#include "totem-glow-button.h"
+
+#include <glib/gi18n.h>
+#include <webkit/webkit.h>
+
+G_DEFINE_TYPE (EphyDownloadWidget, ephy_download_widget, GTK_TYPE_HBOX)
+
+#define DOWNLOAD_WIDGET_PRIVATE(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), EPHY_TYPE_DOWNLOAD_WIDGET, EphyDownloadWidgetPrivate))
+
+struct _EphyDownloadWidgetPrivate
+{
+ EphyDownload *download;
+
+ GtkWidget *remaining;
+ GtkWidget *button;
+ GtkWidget *menu;
+};
+
+static void
+widget_progress_cb (GObject *object,
+ GParamSpec *pspec,
+ EphyDownloadWidget *widget);
+static void
+widget_status_cb (GObject *object,
+ GParamSpec *pspec,
+ EphyDownloadWidget *widget);
+
+/* GObject boilerplate {{{*/
+enum
+{
+ PROP_0,
+ PROP_DOWNLOAD
+};
+
+static void
+ephy_download_widget_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ EphyDownloadWidget *widget;
+
+ widget = EPHY_DOWNLOAD_WIDGET (object);
+
+ switch (property_id)
+ {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ case PROP_DOWNLOAD:
+ g_value_set_object (value, ephy_download_widget_get_download (widget));
+ break;
+ }
+}
+
+static void
+ephy_download_widget_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ EphyDownloadWidget *widget;
+ widget = EPHY_DOWNLOAD_WIDGET (object);
+
+ switch (property_id)
+ {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ case PROP_DOWNLOAD:
+ ephy_download_widget_set_download (widget, g_value_get_object (value));
+ break;
+ }
+}
+
+static void
+ephy_download_widget_dispose (GObject *object)
+{
+ EphyDownloadWidget *widget;
+ WebKitDownload *w_download;
+
+ LOG ("EphyDownloadWidget %p dispose", object);
+
+ widget = EPHY_DOWNLOAD_WIDGET (object);
+ w_download = ephy_download_get_webkit_download (widget->priv->download);
+
+ g_signal_handlers_disconnect_by_func (w_download, widget_progress_cb, widget);
+ g_signal_handlers_disconnect_by_func (w_download, widget_status_cb, widget);
+
+ ephy_download_set_widget (widget->priv->download, NULL);
+
+ G_OBJECT_CLASS (ephy_download_widget_parent_class)->dispose (object);
+}
+
+static void
+ephy_download_widget_finalize (GObject *object)
+{
+ EphyDownloadWidget *widget;
+
+ LOG ("EphyDownloadWidget %p finalized", object);
+
+ widget = EPHY_DOWNLOAD_WIDGET (object);
+
+ if (widget->priv->download)
+ g_object_unref (widget->priv->download);
+
+ G_OBJECT_CLASS (ephy_download_widget_parent_class)->finalize (object);
+}
+
+static void
+ephy_download_widget_class_init (EphyDownloadWidgetClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (EphyDownloadWidgetPrivate));
+
+ object_class->get_property = ephy_download_widget_get_property;
+ object_class->set_property = ephy_download_widget_set_property;
+ object_class->dispose = ephy_download_widget_dispose;
+ object_class->finalize = ephy_download_widget_finalize;
+
+ /**
+ * EphyDownloadWidget::download:
+ *
+ * The EphyDownload that this widget is showing.
+ */
+ g_object_class_install_property (object_class, PROP_DOWNLOAD,
+ g_param_spec_object ("download",
+ "An EphyDownload object",
+ "The EphyDownload shown by this widget",
+ G_TYPE_OBJECT,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_NAME |
+ G_PARAM_STATIC_NICK |
+ G_PARAM_STATIC_BLURB));
+}
+
+static void
+ephy_download_widget_init (EphyDownloadWidget *self)
+{
+ self->priv = DOWNLOAD_WIDGET_PRIVATE (self);
+}
+/*}}}*/
+
+/* Utility functions {{{*/
+static GdkPixbuf *
+get_icon_from_download (WebKitDownload *download)
+{
+ WebKitNetworkResponse *response;
+ SoupMessage *message;
+ const char *content_type;
+
+ GIcon *gicon;
+ GtkIconInfo *icon_info;
+ GdkPixbuf *icon = NULL;
+
+ response = webkit_download_get_network_response (download);
+ message = webkit_network_response_get_message (response);
+ content_type = soup_message_headers_get_content_type (message->response_headers, NULL);
+
+ if (content_type != NULL) {
+ gicon = g_content_type_get_icon (content_type);
+ } else {
+ gicon = g_icon_new_for_string ("package-x-generic", NULL);
+ }
+
+ icon_info = gtk_icon_theme_lookup_by_gicon (gtk_icon_theme_get_default (),
+ gicon, 32,
+ GTK_ICON_LOOKUP_GENERIC_FALLBACK);
+
+ if (icon_info == NULL)
+ icon_info = gtk_icon_theme_lookup_icon (gtk_icon_theme_get_default (),
+ "package-x-generic", 32,
+ GTK_ICON_LOOKUP_GENERIC_FALLBACK);
+
+ icon = gtk_icon_info_load_icon (icon_info, NULL);
+
+ return icon;
+}
+
+static char *
+format_interval (gdouble interval)
+{
+ int hours, mins, secs;
+
+ hours = (int) (interval / 3600);
+ interval -= hours * 3600;
+ mins = (int) (interval / 60);
+ interval -= mins * 60;
+ secs = (int) interval;
+
+ if (hours > 0) {
+ if (mins > 0)
+ return g_strdup_printf (ngettext ("%u:%02u hour left", "%u:%02u hours left", hours), hours, mins);
+ else
+ return g_strdup_printf (ngettext ("%u hour left", "%u hours left", hours), hours);
+ } else {
+ if (mins > 0)
+ return g_strdup_printf (ngettext ("%u:%02u minute left", "%u:%02u minutes left", mins), mins, secs);
+ else
+ return g_strdup_printf (ngettext ("%u second left", "%u seconds left", secs), secs);
+ }
+}
+
+static gdouble
+get_remaining_time (WebKitDownload *download)
+{
+ gint64 total, cur;
+ gdouble elapsed_time;
+ gdouble remaining_time;
+ gdouble per_byte_time;
+
+ total = webkit_download_get_total_size (download);
+ cur = webkit_download_get_current_size (download);
+ elapsed_time = webkit_download_get_elapsed_time (download);
+
+ if (cur <= 0)
+ return -1.0;
+
+ per_byte_time = elapsed_time / cur;
+ remaining_time = per_byte_time * (total - cur);
+
+ return remaining_time;
+}
+/*}}}*/
+
+/* Widget callbacks {{{*/
+static void
+download_clicked_cb (GtkButton *button,
+ EphyDownloadWidget *widget)
+{
+ WebKitDownloadStatus status;
+ EphyDownload *download;
+
+ download = widget->priv->download;
+ status = webkit_download_get_status (ephy_download_get_webkit_download (download));
+
+ if (status != WEBKIT_DOWNLOAD_STATUS_FINISHED)
+ return;
+
+ ephy_download_do_download_action (download, EPHY_DOWNLOAD_ACTION_AUTO);
+
+ gtk_widget_destroy (GTK_WIDGET (widget));
+}
+
+static void
+widget_progress_cb (GObject *object,
+ GParamSpec *pspec,
+ EphyDownloadWidget *widget)
+{
+ WebKitDownload *download;
+ char *destination;
+ gdouble time;
+ char *remaining;
+ int progress;
+ char *remaining_label;
+ char *remaining_tooltip;
+
+ download = WEBKIT_DOWNLOAD (object);
+ destination = g_filename_display_basename (webkit_download_get_destination_uri (download));
+ progress = webkit_download_get_progress (download) * 100;
+
+ time = get_remaining_time (download);
+
+ if (time > 0)
+ remaining = format_interval (time);
+ else
+ remaining = g_strdup (_("Finished"));
+
+ remaining_label = g_strdup_printf ("%d%% (%s)", progress, remaining);
+ remaining_tooltip = g_strdup_printf ("%s\n%s", destination, remaining_label);
+
+ gtk_label_set_text (GTK_LABEL (widget->priv->remaining), remaining_label);
+ gtk_widget_set_tooltip_text (GTK_WIDGET (widget), remaining_tooltip);
+
+ g_free (destination);
+ g_free (remaining);
+ g_free (remaining_label);
+ g_free (remaining_tooltip);
+}
+
+static void
+widget_status_cb (GObject *object,
+ GParamSpec *pspec,
+ EphyDownloadWidget *widget)
+{
+ WebKitDownloadStatus status;
+
+ status = webkit_download_get_status (WEBKIT_DOWNLOAD (object));
+
+ if ((status == WEBKIT_DOWNLOAD_STATUS_FINISHED))
+ totem_glow_button_set_glow (TOTEM_GLOW_BUTTON (widget->priv->button), TRUE);
+}
+
+static void
+open_activate_cb (GtkMenuItem *item, EphyDownloadWidget *widget)
+{
+ ephy_download_do_download_action (widget->priv->download, EPHY_DOWNLOAD_ACTION_OPEN);
+ gtk_widget_destroy (GTK_WIDGET (widget));
+}
+static void
+folder_activate_cb (GtkMenuItem *item, EphyDownloadWidget *widget)
+{
+ ephy_download_do_download_action (widget->priv->download, EPHY_DOWNLOAD_ACTION_BROWSE_TO);
+ gtk_widget_destroy (GTK_WIDGET (widget));
+}
+static void
+cancel_activate_cb (GtkMenuItem *item, EphyDownloadWidget *widget)
+{
+ ephy_download_cancel (widget->priv->download);
+ gtk_widget_destroy (GTK_WIDGET (widget));
+}
+
+static void
+download_menu_clicked_cb (GtkWidget *button,
+ GdkEventButton *event,
+ EphyDownloadWidget *widget)
+{
+ WebKitDownloadStatus status;
+ gboolean finished;
+ GtkWidget *item;
+ GtkWidget *menu;
+ GtkWidget *box;
+ GList *children = NULL;
+ char *basename;
+
+ WebKitDownload *w_download;
+
+ w_download = ephy_download_get_webkit_download (widget->priv->download);
+
+ status = webkit_download_get_status (w_download);
+ finished = (status == WEBKIT_DOWNLOAD_STATUS_FINISHED);
+ basename = g_filename_display_basename (webkit_download_get_destination_uri (w_download));
+
+ box = gtk_widget_get_parent (button);
+ children = gtk_container_get_children (GTK_CONTAINER (box));
+ totem_glow_button_set_glow (TOTEM_GLOW_BUTTON (children->data), FALSE);
+ g_list_free (children);
+
+ menu = gtk_menu_new ();
+
+ item = gtk_menu_item_new_with_label (basename);
+ gtk_widget_set_sensitive (item, FALSE);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ g_free (basename);
+
+ item = gtk_separator_menu_item_new ();
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+
+ item = gtk_menu_item_new_with_label (_("Open"));
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_set_sensitive (item, finished);
+ g_signal_connect (item, "activate",
+ G_CALLBACK (open_activate_cb), widget);
+
+ item = gtk_menu_item_new_with_label (_("Show in folder"));
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_set_sensitive (item, finished);
+ g_signal_connect (item, "activate",
+ G_CALLBACK (folder_activate_cb), widget);
+
+ item = gtk_separator_menu_item_new ();
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+
+ item = gtk_menu_item_new_with_label (_("Cancel"));
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_set_sensitive (item, !finished);
+ g_signal_connect (item, "activate",
+ G_CALLBACK (cancel_activate_cb), widget);
+
+ gtk_widget_show_all (menu);
+
+ gtk_menu_attach_to_widget (GTK_MENU (menu), button, NULL);
+ gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
+ event->button, event->time);
+}
+/*}}}*/
+
+/**
+ * ephy_download_widget_get_download:
+ * @widget: an #EphyDownloadWidget
+ *
+ * Gets the #EphyDownload that @widget is showing.
+ *
+ * Returns: (transfer none): an #EphyDownload.
+ **/
+EphyDownload *
+ephy_download_widget_get_download (EphyDownloadWidget *widget)
+{
+ return widget->priv->download;
+}
+
+/**
+ * ephy_download_widget_set_download:
+ * @widget: an #EphyDownloadWidget
+ * @download: the #EphyDownload that @widget is wrapping
+ *
+ * Sets @widget to wrap @download.
+ **/
+void
+ephy_download_widget_set_download (EphyDownloadWidget *widget,
+ EphyDownload *download)
+{
+ widget->priv->download = download;
+
+ if (download != NULL)
+ g_object_add_weak_pointer (G_OBJECT (download), (gpointer *) &widget->priv->download);
+
+ g_object_notify (G_OBJECT (widget), "download");
+}
+
+/**
+ * ephy_download_widget_new:
+ * @e_download: the #EphyDownload that @widget is wrapping
+ *
+ * Creates an #EphyDownloadWidget to wrap @e_download. It also associates
+ * @e_download to it.
+ *
+ * Returns: a new #EphyDownloadWidget
+ **/
+GtkWidget *
+ephy_download_widget_new (EphyDownload *e_download)
+{
+ EphyDownloadWidget *widget;
+
+ GtkWidget *grid;
+ GtkWidget *icon;
+ GtkWidget *text;
+ GtkWidget *button;
+ GtkWidget *menu;
+ GtkWidget *remain;
+
+ char *dest;
+ GdkPixbuf *pixbuf = NULL;
+ WebKitDownload *w_download;
+
+ widget = g_object_new (EPHY_TYPE_DOWNLOAD_WIDGET, NULL);
+ w_download = ephy_download_get_webkit_download (e_download);
+
+ ephy_download_widget_set_download (widget, e_download);
+
+ pixbuf = get_icon_from_download (w_download);
+ dest = g_filename_display_basename (webkit_download_get_destination_uri (w_download));
+
+ grid = gtk_grid_new ();
+
+ button = totem_glow_button_new ();
+ menu = gtk_button_new ();
+
+ icon = gtk_image_new_from_pixbuf (pixbuf);
+ text = gtk_label_new (dest);
+ gtk_misc_set_alignment (GTK_MISC (text), 0, 0.5);
+ gtk_label_set_ellipsize (GTK_LABEL (text), PANGO_ELLIPSIZE_END);
+
+ remain = gtk_label_new (_("Startingâ?¦"));
+ gtk_misc_set_alignment (GTK_MISC (remain), 0, 0.5);
+ gtk_label_set_ellipsize (GTK_LABEL (remain), PANGO_ELLIPSIZE_END);
+
+ gtk_grid_attach (GTK_GRID (grid), icon, 0, 0, 1, 2);
+ gtk_grid_attach (GTK_GRID (grid), text, 1, 0, 1, 1);
+ gtk_grid_attach (GTK_GRID (grid), remain, 1, 1, 1, 1);
+
+ gtk_widget_set_tooltip_text (GTK_WIDGET (widget), dest);
+
+ if (pixbuf)
+ g_object_unref (pixbuf);
+ g_free (dest);
+
+ widget->priv->button = button;
+ widget->priv->remaining = remain;
+ widget->priv->menu = menu;
+
+ g_signal_connect (w_download, "notify::progress",
+ G_CALLBACK (widget_progress_cb), widget);
+ g_signal_connect (w_download, "notify::status",
+ G_CALLBACK (widget_status_cb), widget);
+
+ gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
+ gtk_button_set_relief (GTK_BUTTON (menu), GTK_RELIEF_NONE);
+
+ gtk_container_add (GTK_CONTAINER (button), grid);
+ gtk_container_add (GTK_CONTAINER (menu),
+ gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE));
+
+ gtk_box_pack_start (GTK_BOX (widget), button, FALSE, FALSE, 0);
+ gtk_box_pack_end (GTK_BOX (widget), menu, FALSE, FALSE, 0);
+
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (download_clicked_cb), widget);
+ g_signal_connect (menu, "button-press-event",
+ G_CALLBACK (download_menu_clicked_cb), widget);
+
+ gtk_widget_show_all (button);
+ gtk_widget_show_all (menu);
+
+ ephy_download_set_widget (e_download, GTK_WIDGET (widget));
+
+ return GTK_WIDGET (widget);
+}
diff --git a/lib/widgets/ephy-download-widget.h b/lib/widgets/ephy-download-widget.h
new file mode 100644
index 0000000..e0b5203
--- /dev/null
+++ b/lib/widgets/ephy-download-widget.h
@@ -0,0 +1,85 @@
+/* vim: set foldmethod=marker sw=2 ts=2 sts=2 et: */
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/*
+ * ephy-download.c
+ * This file is part of Epiphany
+ *
+ * Copyright © 2011 - Igalia S.L.
+ *
+ * Epiphany is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Epiphany is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Epiphany; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ */
+
+#if !defined (__EPHY_EPIPHANY_H_INSIDE__) && !defined (EPIPHANY_COMPILATION)
+#error "Only <epiphany/epiphany.h> can be included directly."
+#endif
+
+#ifndef _EPHY_DOWNLOAD_WIDGET_H
+#define _EPHY_DOWNLOAD_WIDGET_H
+
+#include <glib-object.h>
+#include "ephy-download.h"
+
+G_BEGIN_DECLS
+
+#define EPHY_TYPE_DOWNLOAD_WIDGET ephy_download_widget_get_type()
+
+#define EPHY_DOWNLOAD_WIDGET(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ EPHY_TYPE_DOWNLOAD_WIDGET, EphyDownloadWidget))
+
+#define EPHY_DOWNLOAD_WIDGET_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), \
+ EPHY_TYPE_DOWNLOAD_WIDGET, EphyDownloadWidgetClass))
+
+#define EPHY_IS_DOWNLOAD_WIDGET(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ EPHY_TYPE_DOWNLOAD_WIDGET))
+
+#define EPHY_IS_DOWNLOAD_WIDGET_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+ EPHY_TYPE_DOWNLOAD_WIDGET))
+
+#define EPHY_DOWNLOAD_WIDGET_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ EPHY_TYPE_DOWNLOAD_WIDGET, EphyDownloadWidgetClass))
+
+typedef struct _EphyDownloadWidget EphyDownloadWidget;
+typedef struct _EphyDownloadWidgetClass EphyDownloadWidgetClass;
+typedef struct _EphyDownloadWidgetPrivate EphyDownloadWidgetPrivate;
+
+struct _EphyDownloadWidget
+{
+ GtkHBox parent;
+
+ EphyDownloadWidgetPrivate *priv;
+};
+
+struct _EphyDownloadWidgetClass
+{
+ GtkHBoxClass parent_class;
+};
+
+GType ephy_download_widget_get_type (void) G_GNUC_CONST;
+
+GtkWidget *ephy_download_widget_new (EphyDownload *e_download);
+
+EphyDownload *ephy_download_widget_get_download (EphyDownloadWidget *widget);
+void ephy_download_widget_set_download (EphyDownloadWidget *widget,
+ EphyDownload *download);
+
+G_END_DECLS
+
+#endif /* _EPHY_DOWNLOAD_WIDGET_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]