[evince] ev-view-accessible: Clear the cached data when the current page or document is updated.
- From: Carlos Garcia Campos <carlosgc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evince] ev-view-accessible: Clear the cached data when the current page or document is updated.
- Date: Tue, 30 Jul 2013 17:26:23 +0000 (UTC)
commit d71e0d73247528af809df8c5ba4c4390b688b201
Author: Antia Puentes <apuentes igalia com>
Date: Tue Jul 30 19:09:52 2013 +0200
ev-view-accessible: Clear the cached data when the current page or document is updated.
https://bugzilla.gnome.org/show_bug.cgi?id=704621
libview/ev-view-accessible.c | 89 ++++++++++++++++++++++++++++++++---------
libview/ev-view-accessible.h | 7 ++-
libview/ev-view.c | 4 ++
3 files changed, 78 insertions(+), 22 deletions(-)
---
diff --git a/libview/ev-view-accessible.c b/libview/ev-view-accessible.c
index bf9cbc8..c7965b6 100644
--- a/libview/ev-view-accessible.c
+++ b/libview/ev-view-accessible.c
@@ -55,7 +55,7 @@ static const gchar *const ev_view_accessible_action_descriptions[] =
};
struct _EvViewAccessiblePrivate {
- guint current_page;
+ EvDocumentModel *model;
/* AtkAction */
gchar *action_descriptions[LAST_ACTION];
@@ -76,19 +76,30 @@ G_DEFINE_TYPE_WITH_CODE (EvViewAccessible, ev_view_accessible, GTK_TYPE_CONTAINE
)
static void
+clear_cache (EvViewAccessible *accessible)
+{
+ EvViewAccessiblePrivate* priv = accessible->priv;
+
+ g_clear_object (&priv->buffer);
+ g_clear_pointer (&priv->links, (GDestroyNotify)g_hash_table_destroy);
+}
+
+static void
ev_view_accessible_finalize (GObject *object)
{
EvViewAccessiblePrivate *priv = EV_VIEW_ACCESSIBLE (object)->priv;
int i;
+ if (priv->model) {
+ g_signal_handlers_disconnect_by_data (priv->model, object);
+ g_object_unref (priv->model);
+ priv->model = NULL;
+ }
if (priv->action_idle_handler)
g_source_remove (priv->action_idle_handler);
for (i = 0; i < LAST_ACTION; i++)
g_free (priv->action_descriptions [i]);
- if (priv->buffer)
- g_object_unref (priv->buffer);
- if (priv->links)
- g_hash_table_destroy (priv->links);
+ clear_cache (EV_VIEW_ACCESSIBLE (object));
G_OBJECT_CLASS (ev_view_accessible_parent_class)->finalize (object);
}
@@ -131,21 +142,16 @@ ev_view_accessible_get_text_buffer (EvViewAccessible *accessible, EvView *view)
const gchar *retval = NULL;
EvViewAccessiblePrivate* priv = accessible->priv;
- page_cache = view->page_cache;
- if (!page_cache) {
- return NULL;
- }
-
- if (view->current_page == priv->current_page && priv->buffer) {
+ if (priv->buffer) {
return priv->buffer;
}
- priv->current_page = view->current_page;
-
- if (!priv->buffer) {
- priv->buffer = gtk_text_buffer_new (NULL);
+ page_cache = view->page_cache;
+ if (!page_cache) {
+ return NULL;
}
+ priv->buffer = gtk_text_buffer_new (NULL);
retval = ev_page_cache_get_text (page_cache, view->current_page);
if (retval)
gtk_text_buffer_set_text (priv->buffer, retval, -1);
@@ -970,13 +976,9 @@ ev_view_accessible_get_links (EvViewAccessible *accessible,
{
EvViewAccessiblePrivate* priv = accessible->priv;
- if (view->current_page == priv->current_page && priv->links)
+ if (priv->links)
return priv->links;
- priv->current_page = view->current_page;
-
- if (priv->links)
- g_hash_table_destroy (priv->links);
priv->links = g_hash_table_new_full (g_direct_hash,
g_direct_equal,
NULL,
@@ -1091,10 +1093,52 @@ ev_view_accessible_selection_changed (EvView *view,
g_signal_emit_by_name (accessible, "text-selection-changed");
}
+static void
+page_changed_cb (EvDocumentModel *model,
+ gint old_page,
+ gint new_page,
+ EvViewAccessible *accessible)
+{
+ clear_cache (accessible);
+}
+
+static void
+document_changed_cb (EvDocumentModel *model,
+ GParamSpec *pspec,
+ EvViewAccessible *accessible)
+{
+ clear_cache (accessible);
+}
+
+void
+ev_view_accessible_set_model (EvViewAccessible *accessible,
+ EvDocumentModel *model)
+{
+ EvViewAccessiblePrivate* priv = accessible->priv;
+
+ if (priv->model == model)
+ return;
+
+ if (priv->model) {
+ g_signal_handlers_disconnect_by_data (priv->model, accessible);
+ g_object_unref (priv->model);
+ }
+
+ priv->model = g_object_ref (model);
+
+ g_signal_connect (priv->model, "page-changed",
+ G_CALLBACK (page_changed_cb),
+ accessible);
+ g_signal_connect (priv->model, "notify::document",
+ G_CALLBACK (document_changed_cb),
+ accessible);
+}
+
AtkObject *
ev_view_accessible_new (GtkWidget *widget)
{
AtkObject *accessible;
+ EvView *view;
g_return_val_if_fail (EV_IS_VIEW (widget), NULL);
@@ -1108,6 +1152,11 @@ ev_view_accessible_new (GtkWidget *widget)
G_CALLBACK (ev_view_accessible_selection_changed),
accessible);
+ view = EV_VIEW (widget);
+ if (view->model)
+ ev_view_accessible_set_model (EV_VIEW_ACCESSIBLE (accessible),
+ view->model);
+
return accessible;
}
diff --git a/libview/ev-view-accessible.h b/libview/ev-view-accessible.h
index 7272c6f..5bd5e53 100644
--- a/libview/ev-view-accessible.h
+++ b/libview/ev-view-accessible.h
@@ -26,6 +26,7 @@
#define __EV_VIEW_ACCESSIBLE_H__
#include <gtk/gtk-a11y.h>
+#include "ev-document-model.h"
#define EV_TYPE_VIEW_ACCESSIBLE (ev_view_accessible_get_type ())
#define EV_VIEW_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EV_TYPE_VIEW_ACCESSIBLE,
EvViewAccessible))
@@ -47,8 +48,10 @@ struct _EvViewAccessibleClass
GtkContainerAccessibleClass parent_class;
};
-GType ev_view_accessible_get_type (void);
-AtkObject *ev_view_accessible_new (GtkWidget *widget);
+GType ev_view_accessible_get_type (void);
+AtkObject *ev_view_accessible_new (GtkWidget *widget);
+void ev_view_accessible_set_model (EvViewAccessible *accessible,
+ EvDocumentModel *model);
#endif /* __EV_VIEW_ACCESSIBLE_H__ */
diff --git a/libview/ev-view.c b/libview/ev-view.c
index b07db15..57afdb5 100644
--- a/libview/ev-view.c
+++ b/libview/ev-view.c
@@ -6925,6 +6925,10 @@ ev_view_set_model (EvView *view,
g_signal_connect (view->model, "page-changed",
G_CALLBACK (ev_view_page_changed_cb),
view);
+
+ if (view->accessible)
+ ev_view_accessible_set_model (EV_VIEW_ACCESSIBLE (view->accessible),
+ view->model);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]