summaryrefslogtreecommitdiff
path: root/libview/ev-view-accessible.c
diff options
context:
space:
mode:
authorAlejandro PiƱeiro <[email protected]>2014-04-07 18:29:30 +0200
committerraveit65 <[email protected]>2017-11-27 10:13:51 +0100
commitce4c2292416969901af2c55735905fae5b7ed594 (patch)
treebce9b5f0283ff6135e3eb7f87af9e302aa7cea38 /libview/ev-view-accessible.c
parent1293be2b6bf28d75b79a88ead39db7e83222f546 (diff)
downloadatril-ce4c2292416969901af2c55735905fae5b7ed594.tar.bz2
atril-ce4c2292416969901af2c55735905fae5b7ed594.tar.xz
a11y: managing atk states on EvPageAccessible
This includes: * Implements ref_state_set on EvPageAccessible * Notify FOCUSED state changes https://bugzilla.gnome.org/show_bug.cgi?id=724965 origin commit: https://git.gnome.org/browse/evince/commit/?h=gnome-3-14&id=c421a90
Diffstat (limited to 'libview/ev-view-accessible.c')
-rw-r--r--libview/ev-view-accessible.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/libview/ev-view-accessible.c b/libview/ev-view-accessible.c
index 3f448379..ae55ddd4 100644
--- a/libview/ev-view-accessible.c
+++ b/libview/ev-view-accessible.c
@@ -310,7 +310,16 @@ ev_view_accessible_cursor_moved (EvView *view,
EvPageAccessible *page_accessible = NULL;
if (priv->previous_cursor_page != page) {
+ AtkObject *previous_page = NULL;
+ AtkObject *current_page = NULL;
+
+ previous_page = g_ptr_array_index (priv->children,
+ priv->previous_cursor_page);
+ atk_object_notify_state_change (previous_page, ATK_STATE_FOCUSED, FALSE);
priv->previous_cursor_page = page;
+ current_page = g_ptr_array_index (priv->children, page);
+ atk_object_notify_state_change (current_page, ATK_STATE_FOCUSED, TRUE);
+
/* +1 as user start to count on 1, but evince starts on 0 */
g_signal_emit_by_name (accessible, "page-changed", page + 1);
}
@@ -410,6 +419,27 @@ ev_view_accessible_set_model (EvViewAccessible *accessible,
accessible);
}
+static gboolean
+ev_view_accessible_focus_changed (GtkWidget *widget,
+ GdkEventFocus *event,
+ EvViewAccessible *self)
+{
+ AtkObject *page_accessible;
+
+ g_return_val_if_fail (EV_IS_VIEW (widget), FALSE);
+ g_return_val_if_fail (EV_IS_VIEW_ACCESSIBLE (self), FALSE);
+
+ if (self->priv->children == NULL)
+ return FALSE;
+
+ page_accessible = g_ptr_array_index (self->priv->children,
+ get_relevant_page (EV_VIEW (widget)));
+ atk_object_notify_state_change (page_accessible,
+ ATK_STATE_FOCUSED, event->in);
+
+ return FALSE;
+}
+
AtkObject *
ev_view_accessible_new (GtkWidget *widget)
{
@@ -427,6 +457,12 @@ ev_view_accessible_new (GtkWidget *widget)
g_signal_connect (widget, "selection-changed",
G_CALLBACK (ev_view_accessible_selection_changed),
accessible);
+ g_signal_connect (widget, "focus-in-event",
+ G_CALLBACK (ev_view_accessible_focus_changed),
+ accessible);
+ g_signal_connect (widget, "focus-out-event",
+ G_CALLBACK (ev_view_accessible_focus_changed),
+ accessible);
view = EV_VIEW (widget);
if (view->model)
@@ -436,3 +472,14 @@ ev_view_accessible_new (GtkWidget *widget)
return accessible;
}
+gint
+ev_view_accessible_get_relevant_page (EvViewAccessible *accessible)
+{
+ EvView *view;
+
+ g_return_val_if_fail (EV_IS_VIEW_ACCESSIBLE (accessible), -1);
+
+ view = EV_VIEW (gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)));
+
+ return get_relevant_page (view);
+}