[evince] libview: Emit accessible focused-changed signals for form fields
- From: Joanmarie Diggs <joanied src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evince] libview: Emit accessible focused-changed signals for form fields
- Date: Thu, 24 Jul 2014 15:27:15 +0000 (UTC)
commit 8246fa2bf0bbcd1114686b4695c75cdfcedf7aba
Author: Joanmarie Diggs <jdiggs igalia com>
Date: Thu Jul 24 13:42:01 2014 +0200
libview: Emit accessible focused-changed signals for form fields
https://bugzilla.gnome.org/show_bug.cgi?id=733662
libview/ev-form-field-accessible.c | 6 ++++++
libview/ev-form-field-accessible.h | 1 +
libview/ev-page-accessible.c | 22 ++++++++++++++++++++++
libview/ev-page-accessible.h | 2 ++
libview/ev-view-accessible.c | 22 ++++++++++++++++++++++
libview/ev-view-accessible.h | 3 +++
libview/ev-view.c | 7 +++++++
7 files changed, 63 insertions(+), 0 deletions(-)
---
diff --git a/libview/ev-form-field-accessible.c b/libview/ev-form-field-accessible.c
index d6f4b42..715ef01 100644
--- a/libview/ev-form-field-accessible.c
+++ b/libview/ev-form-field-accessible.c
@@ -239,3 +239,9 @@ ev_form_field_accessible_new (EvPageAccessible *page,
return EV_FORM_FIELD_ACCESSIBLE (atk_form_field);
}
+
+EvFormField *
+ev_form_field_accessible_get_field (EvFormFieldAccessible *accessible)
+{
+ return accessible->priv->form_field;
+}
diff --git a/libview/ev-form-field-accessible.h b/libview/ev-form-field-accessible.h
index 0469e7e..d60a9c8 100644
--- a/libview/ev-form-field-accessible.h
+++ b/libview/ev-form-field-accessible.h
@@ -51,5 +51,6 @@ GType ev_form_field_accessible_get_type (void);
EvFormFieldAccessible *ev_form_field_accessible_new (EvPageAccessible *page,
EvFormField *form_field,
EvRectangle *area);
+EvFormField *ev_form_field_accessible_get_field (EvFormFieldAccessible *accessible);
#endif /* __EV_FORM_FIELD_ACCESSIBLE_H__ */
diff --git a/libview/ev-page-accessible.c b/libview/ev-page-accessible.c
index 454bae6..eeed659 100644
--- a/libview/ev-page-accessible.c
+++ b/libview/ev-page-accessible.c
@@ -1223,3 +1223,25 @@ ev_page_accessible_new (EvViewAccessible *view_accessible,
return EV_PAGE_ACCESSIBLE (atk_page);
}
+
+AtkObject *
+ev_page_accessible_get_accessible_for_mapping (EvPageAccessible *page_accessible,
+ EvMapping *mapping)
+{
+ gint i;
+
+ ev_page_accessible_initialize_children (page_accessible);
+ if (!mapping || !page_accessible->priv->children)
+ return NULL;
+
+ for (i = 0; i < page_accessible->priv->children->len; i++) {
+ AtkObject *child;
+
+ child = g_ptr_array_index (page_accessible->priv->children, i);
+ if (EV_IS_FORM_FIELD_ACCESSIBLE (child) &&
+ ev_form_field_accessible_get_field (EV_FORM_FIELD_ACCESSIBLE (child)) == mapping->data)
+ return child;
+ }
+
+ return NULL;
+}
diff --git a/libview/ev-page-accessible.h b/libview/ev-page-accessible.h
index 33161f8..2c0e242 100644
--- a/libview/ev-page-accessible.h
+++ b/libview/ev-page-accessible.h
@@ -51,6 +51,8 @@ EvPageAccessible *ev_page_accessible_new (EvViewAccessible *view
gint ev_page_accessible_get_page (EvPageAccessible *page_accessible);
EvViewAccessible *ev_page_accessible_get_view_accessible (EvPageAccessible *page_accessible);
EvView *ev_page_accessible_get_view (EvPageAccessible *page_accessible);
+AtkObject *ev_page_accessible_get_accessible_for_mapping (EvPageAccessible *page_accessible,
+ EvMapping *mapping);
#endif /* __EV_PAGE_ACCESSIBLE_H__ */
diff --git a/libview/ev-view-accessible.c b/libview/ev-view-accessible.c
index 1d9c320..c7288b4 100644
--- a/libview/ev-view-accessible.c
+++ b/libview/ev-view-accessible.c
@@ -63,6 +63,7 @@ struct _EvViewAccessiblePrivate {
gint previous_cursor_page;
gint start_page;
gint end_page;
+ AtkObject *focused_element;
GPtrArray *children;
};
@@ -593,3 +594,24 @@ ev_view_accessible_set_page_range (EvViewAccessible *accessible,
accessible->priv->start_page = start;
accessible->priv->end_page = end;
}
+
+void
+ev_view_accessible_set_focused_element (EvViewAccessible *accessible,
+ EvMapping *new_focus,
+ gint new_focus_page)
+{
+ EvPageAccessible *page;
+
+ if (accessible->priv->focused_element) {
+ atk_object_notify_state_change (accessible->priv->focused_element, ATK_STATE_FOCUSED, FALSE);
+ accessible->priv->focused_element = NULL;
+ }
+
+ if (!new_focus || new_focus_page == -1)
+ return;
+
+ page = g_ptr_array_index (accessible->priv->children, new_focus_page);
+ accessible->priv->focused_element = ev_page_accessible_get_accessible_for_mapping (page, new_focus);
+ if (accessible->priv->focused_element)
+ atk_object_notify_state_change (accessible->priv->focused_element, ATK_STATE_FOCUSED, TRUE);
+}
diff --git a/libview/ev-view-accessible.h b/libview/ev-view-accessible.h
index bb10d10..d61540e 100644
--- a/libview/ev-view-accessible.h
+++ b/libview/ev-view-accessible.h
@@ -65,6 +65,9 @@ void _transform_doc_rect_to_atk_rect (EvViewAccessible *accessible,
gboolean ev_view_accessible_is_doc_rect_showing (EvViewAccessible *accessible,
gint page,
EvRectangle *doc_rect);
+void ev_view_accessible_set_focused_element (EvViewAccessible *accessible,
+ EvMapping *new_focus,
+ gint new_focus_page);
#endif /* __EV_VIEW_ACCESSIBLE_H__ */
diff --git a/libview/ev-view.c b/libview/ev-view.c
index 62f6a09..3c5eea6 100644
--- a/libview/ev-view.c
+++ b/libview/ev-view.c
@@ -2156,6 +2156,9 @@ _ev_view_set_focused_element (EvView *view,
if (view->focused_element == element_mapping)
return;
+ if (view->accessible)
+ ev_view_accessible_set_focused_element (EV_VIEW_ACCESSIBLE (view->accessible),
element_mapping, page);
+
if (ev_view_get_focused_area (view, &view_rect))
region = cairo_region_create_rectangle (&view_rect);
@@ -2312,6 +2315,10 @@ ev_view_form_field_button_create_widget (EvView *view,
EvMappingList *form_mapping;
EvMapping *mapping;
+ /* We need to do this focus grab prior to setting the focused element for accessibility */
+ if (!gtk_widget_has_focus (GTK_WIDGET (view)))
+ gtk_widget_grab_focus (GTK_WIDGET (view));
+
form_mapping = ev_page_cache_get_form_field_mapping (view->page_cache,
field->page->index);
mapping = ev_mapping_list_find (form_mapping, field);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]