diff options
author | Claudio Saavedra <csaavedra@igalia.com> | 2012-09-07 15:13:24 +0800 |
---|---|---|
committer | Claudio Saavedra <csaavedra@igalia.com> | 2012-09-10 13:14:27 +0800 |
commit | 399c91bc8724e0ca26370d7552b841c0669be87d (patch) | |
tree | 56bf496ead7c4df2cc358e70a0bd3decd83e8b4e | |
parent | a3361d48035eb48c49aff443dff634105a6bb6c7 (diff) | |
download | gsoc2013-epiphany-399c91bc8724e0ca26370d7552b841c0669be87d.tar.gz gsoc2013-epiphany-399c91bc8724e0ca26370d7552b841c0669be87d.tar.zst gsoc2013-epiphany-399c91bc8724e0ca26370d7552b841c0669be87d.zip |
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
-rw-r--r-- | lib/history/ephy-history-service-private.h | 1 | ||||
-rw-r--r-- | 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 4235e9d93..7fb96bdc2 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 3d7a2fdbf..bfbe34823 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), |