[evince] libview: Emit accessible focused-changed signals for form fields



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]