aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--embed/downloader-view.c134
1 files changed, 69 insertions, 65 deletions
diff --git a/embed/downloader-view.c b/embed/downloader-view.c
index db4e8eec9..c5ec5c4ad 100644
--- a/embed/downloader-view.c
+++ b/embed/downloader-view.c
@@ -71,10 +71,6 @@ struct _DownloaderViewPrivate
GtkStatusIcon *status_icon;
gboolean ownref;
-#ifdef HAVE_LIBNOTIFY
- NotifyNotification *notification;
-#endif
-
guint source_id;
};
@@ -120,11 +116,6 @@ download_dialog_delete_event_cb (GtkWidget *window,
GdkEventAny *event,
DownloaderView *dv);
-#ifdef HAVE_LIBNOTIFY
-static void
-show_notification_window (DownloaderView *dv);
-#endif
-
static void
download_progress_cb (WebKitDownload *download,
GParamSpec *pspec,
@@ -193,10 +184,6 @@ show_status_icon (DownloaderView *dv)
priv->status_icon = gtk_status_icon_new_from_stock (STOCK_DOWNLOAD);
-#ifdef HAVE_LIBNOTIFY
- notify_notification_attach_to_status_icon (priv->notification, priv->status_icon);
-#endif
-
g_signal_connect_swapped (priv->status_icon, "activate",
G_CALLBACK (show_downloader_cb), dv);
g_signal_connect (priv->status_icon, "popup-menu",
@@ -309,6 +296,65 @@ downloader_view_new (void)
NULL));
}
+#ifdef HAVE_LIBNOTIFY
+static void
+notification_closed_cb (NotifyNotification *notification,
+ DownloaderView *dv)
+{
+ g_object_unref (dv);
+}
+
+static gboolean
+show_notification_cb (NotifyNotification *notification)
+{
+ DownloaderView *dv;
+ GError *error = NULL;
+
+ dv = g_object_get_data (G_OBJECT (notification), "dv");
+ notify_notification_show (notification, &error);
+
+ if (error)
+ {
+ /* notification_closed_cb () will never be called. */
+ g_warning ("Error showing download notification: %s",
+ error->message);
+ g_object_unref (dv);
+ g_error_free (error);
+ }
+
+ return FALSE;
+}
+
+static void
+show_notification (DownloaderView *dv, const char *title, const char *msg)
+{
+ NotifyNotification *notification;
+ GtkStatusIcon *status_icon;
+
+ status_icon = dv->priv->status_icon;
+
+ /* We keep the DownloaderView alive until the notification is gone. */
+ g_object_ref (dv);
+
+ notification = notify_notification_new (title, msg,
+ GTK_STOCK_INFO, NULL);
+
+ g_signal_connect_after (notification, "closed",
+ G_CALLBACK (notification_closed_cb), dv);
+ g_object_set_data (G_OBJECT (notification), "dv", dv);
+
+ notify_notification_set_timeout (notification, NOTIFY_EXPIRES_DEFAULT);
+ notify_notification_set_urgency (notification, NOTIFY_URGENCY_LOW);
+
+ notify_notification_attach_to_status_icon (notification, status_icon);
+
+ /* There are some visual glitches when the notification is shown and
+ * the GtkStatusIcon is still not visible. To avoid that, we delay the
+ * popup a bit. */
+ g_timeout_add (500, (GSourceFunc) show_notification_cb, notification);
+}
+#endif
+
static char *
format_interval (gdouble interval)
{
@@ -528,15 +574,8 @@ update_download_row (DownloaderView *dv, WebKitDownload *download)
}
#ifdef HAVE_LIBNOTIFY
- downloaded = g_strdup_printf (_("The file “%s” has been downloaded."),
- name);
- notify_notification_update (dv->priv->notification,
- _("Download finished"),
- downloaded,
- GTK_STOCK_INFO);
-
- show_notification_window (dv);
-
+ downloaded = g_strdup_printf (_("The file “%s” has been downloaded."), name);
+ show_notification (dv, _("Download finished"), downloaded);
g_free (downloaded);
#endif
downloader_view_remove_download (dv, download);
@@ -645,27 +684,6 @@ update_buttons_timeout_cb (DownloaderView *dv)
return FALSE;
}
-#ifdef HAVE_LIBNOTIFY
-static void
-show_notification_window (DownloaderView *dv)
-{
- if (gtk_status_icon_is_embedded (dv->priv->status_icon))
- {
- notify_notification_attach_to_status_icon
- (dv->priv->notification,
- dv->priv->status_icon);
- }
- else
- {
- notify_notification_attach_to_status_icon
- (dv->priv->notification,
- NULL);
- }
-
- notify_notification_show (dv->priv->notification, NULL);
-}
-#endif
-
void
downloader_view_add_download (DownloaderView *dv,
WebKitDownload *download)
@@ -683,13 +701,9 @@ downloader_view_add_download (DownloaderView *dv,
#endif
gboolean visible = FALSE;
-#ifdef HAVE_LIBNOTIFY
- char *downloading;
-#endif
-
/* dv may be unrefed inside update_download_row if the file
* downloaded completely while the user was choosing where to
- * put it, so we need to protect it
+ * put it, so we need to protect it.
*/
g_object_ref (dv);
g_object_ref (download);
@@ -740,19 +754,16 @@ downloader_view_add_download (DownloaderView *dv,
if (eel_gconf_get_boolean (CONF_DOWNLOADS_HIDDEN) && !visible)
{
-
#ifdef HAVE_LIBNOTIFY
- char *name = ephy_download_get_name (download);
- downloading = g_strdup_printf(_("The file “%s” has been added to the downloads queue."),
- name);
- g_free (name);
- notify_notification_update (dv->priv->notification,
- _("Download started"),
- downloading,
- GTK_STOCK_INFO);
+ char *name;
+ char *downloading;
+
+ name = ephy_download_get_name (download);
+ downloading = g_strdup_printf(_("The file “%s” has been added to the downloads queue."), name);
- show_notification_window (dv);
+ show_notification (dv, _("Download started"), downloading);
+ g_free (name);
g_free (downloading);
#endif
@@ -941,13 +952,6 @@ downloader_view_build_ui (DownloaderView *dv)
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
g_signal_connect (selection, "changed", G_CALLBACK (selection_changed), dv);
-
-#ifdef HAVE_LIBNOTIFY
- priv->notification = notify_notification_new (" ", " ", GTK_STOCK_INFO, NULL);
- notify_notification_set_timeout (priv->notification, NOTIFY_EXPIRES_DEFAULT);
- notify_notification_set_urgency (priv->notification, NOTIFY_URGENCY_LOW);
-#endif
-
}
static void