[epiphany] ephy-history-service: add urls-visited signal



commit 399c91bc8724e0ca26370d7552b841c0669be87d
Author: Claudio Saavedra <csaavedra igalia com>
Date:   Fri Sep 7 10:13:24 2012 +0300

    ephy-history-service: add urls-visited signal
    
    This signal is emitted in bulks and is intended for clients that are
    not interested in every single URL that is visited but only to know
    that visits have happened.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=683550

 lib/history/ephy-history-service-private.h |    1 +
 lib/history/ephy-history-service.c         |   53 ++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+), 0 deletions(-)
---
diff --git a/lib/history/ephy-history-service-private.h b/lib/history/ephy-history-service-private.h
index 4235e9d..7fb96bd 100644
--- a/lib/history/ephy-history-service-private.h
+++ b/lib/history/ephy-history-service-private.h
@@ -29,6 +29,7 @@ struct _EphyHistoryServicePrivate {
   GAsyncQueue *queue;
   gboolean scheduled_to_quit;
   gboolean scheduled_to_commit;
+  int queue_urls_visited_id;
 };
 
 void                     ephy_history_service_schedule_commit         (EphyHistoryService *self); 
diff --git a/lib/history/ephy-history-service.c b/lib/history/ephy-history-service.c
index 3d7a2fd..bfbe348 100644
--- a/lib/history/ephy-history-service.c
+++ b/lib/history/ephy-history-service.c
@@ -50,6 +50,7 @@ typedef enum {
 
 enum {
   VISIT_URL,
+  URLS_VISITED,
   CLEARED,
   URL_TITLE_CHANGED,
   URL_DELETED,
@@ -130,6 +131,36 @@ ephy_history_service_finalize (GObject *self)
   G_OBJECT_CLASS (ephy_history_service_parent_class)->finalize (self);
 }
 
+static void
+ephy_history_service_dispose (GObject *self)
+{
+  EphyHistoryServicePrivate *priv = EPHY_HISTORY_SERVICE (self)->priv;
+
+  if (priv->queue_urls_visited_id) {
+    g_source_remove (priv->queue_urls_visited_id);
+    priv->queue_urls_visited_id = 0;
+  }
+}
+
+static gboolean
+emit_urls_visited (EphyHistoryService *self)
+{
+  g_signal_emit (self, signals[URLS_VISITED], 0);
+  self->priv->queue_urls_visited_id = 0;
+
+  return FALSE;
+}
+
+static void
+ephy_history_service_queue_urls_visited (EphyHistoryService *self)
+{
+  if (self->priv->queue_urls_visited_id)
+    return;
+
+  self->priv->queue_urls_visited_id =
+    g_idle_add_full (G_PRIORITY_LOW, (GSourceFunc)emit_urls_visited, self, NULL);
+}
+
 static gboolean
 impl_visit_url (EphyHistoryService *self, const char *url, EphyHistoryPageVisitType visit_type)
 {
@@ -142,6 +173,8 @@ impl_visit_url (EphyHistoryService *self, const char *url, EphyHistoryPageVisitT
                                   visit, NULL, NULL, NULL);
   ephy_history_page_visit_free (visit);
 
+  ephy_history_service_queue_urls_visited (self);
+
   return FALSE;
 }
 
@@ -151,6 +184,7 @@ ephy_history_service_class_init (EphyHistoryServiceClass *klass)
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 
   gobject_class->finalize = ephy_history_service_finalize;
+  gobject_class->dispose  = ephy_history_service_dispose;
   gobject_class->get_property = ephy_history_service_get_property;
   gobject_class->set_property = ephy_history_service_set_property;
 
@@ -168,6 +202,25 @@ ephy_history_service_class_init (EphyHistoryServiceClass *klass)
                   G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE,
                   EPHY_TYPE_HISTORY_PAGE_VISIT_TYPE);
 
+/**
+ * EphyHistoryService::urls-visited:
+ * @service: the #EphyHistoryService that received the signal
+ *
+ * The ::urls-visited signal is emitted after one or more visits to
+ * URLS have taken place. This signal is intended for use-cases when
+ * precise information of the actual URLS visited is not important and
+ * there is only interest in the fact that there have been changes in
+ * the history. For more precise information, you can use ::visit-url
+ **/
+  signals[URLS_VISITED] =
+    g_signal_new ("urls-visited",
+                  G_OBJECT_CLASS_TYPE (gobject_class),
+                  G_SIGNAL_RUN_LAST,
+                  0, NULL, NULL,
+                  g_cclosure_marshal_VOID__VOID,
+                  G_TYPE_NONE,
+                  0);
+
   signals[CLEARED] =
     g_signal_new ("cleared",
                   G_OBJECT_CLASS_TYPE (gobject_class),



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]