Skip to content

Commit

Permalink
libview: Emit accessible state-changed signals for form fields
Browse files Browse the repository at this point in the history
  • Loading branch information
Joanmarie Diggs committed Aug 4, 2014
1 parent 2188332 commit 4599025
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 0 deletions.
32 changes: 32 additions & 0 deletions libview/ev-form-field-accessible.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ struct _EvFormFieldAccessiblePrivate {
gchar *name;
gint start_index;
gint end_index;

AtkStateSet *saved_states;
};

static void ev_form_field_accessible_component_iface_init (AtkComponentIface *iface);
Expand Down Expand Up @@ -308,13 +310,41 @@ ev_form_field_accessible_ref_state_set (AtkObject *atk_object)
return copy_set;
}

void
ev_form_field_accessible_update_state (EvFormFieldAccessible *accessible)
{
AtkObject *atk_object;
AtkStateSet *states;
AtkStateSet *changed_states;
gint i;

atk_object = ATK_OBJECT (accessible);
states = ev_form_field_accessible_ref_state_set (atk_object);
changed_states = atk_state_set_xor_sets (accessible->priv->saved_states, states);
if (changed_states && !atk_state_set_is_empty (accessible->priv->saved_states)) {
for (i = 0; i < ATK_STATE_LAST_DEFINED; i++) {
if (atk_state_set_contains_state (changed_states, i))
atk_object_notify_state_change (atk_object, i, atk_state_set_contains_state (states, i));
}
}

g_object_unref (accessible->priv->saved_states);

atk_state_set_clear_states (changed_states);
accessible->priv->saved_states = atk_state_set_or_sets (changed_states, states);

g_object_unref (changed_states);
g_object_unref (states);
}

static void
ev_form_field_accessible_finalize (GObject *object)
{
EvFormFieldAccessiblePrivate *priv = EV_FORM_FIELD_ACCESSIBLE (object)->priv;

g_object_unref (priv->form_field);
g_free (priv->name);
g_object_unref (priv->saved_states);

G_OBJECT_CLASS (ev_form_field_accessible_parent_class)->finalize (object);
}
Expand Down Expand Up @@ -353,6 +383,8 @@ ev_form_field_accessible_new (EvPageAccessible *page,
atk_form_field->priv->page = page;
atk_form_field->priv->form_field = g_object_ref (form_field);
atk_form_field->priv->area = *area;
atk_form_field->priv->saved_states = atk_state_set_new ();
ev_form_field_accessible_update_state (atk_form_field);

return EV_FORM_FIELD_ACCESSIBLE (atk_form_field);
}
Expand Down
1 change: 1 addition & 0 deletions libview/ev-form-field-accessible.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,6 @@ EvFormFieldAccessible *ev_form_field_accessible_new (EvPageAccessible *page,
EvFormField *form_field,
EvRectangle *area);
EvFormField *ev_form_field_accessible_get_field (EvFormFieldAccessible *accessible);
void ev_form_field_accessible_update_state (EvFormFieldAccessible *accessible);

#endif /* __EV_FORM_FIELD_ACCESSIBLE_H__ */
14 changes: 14 additions & 0 deletions libview/ev-page-accessible.c
Original file line number Diff line number Diff line change
Expand Up @@ -1245,3 +1245,17 @@ ev_page_accessible_get_accessible_for_mapping (EvPageAccessible *page_accessible

return NULL;
}

void
ev_page_accessible_update_element_state (EvPageAccessible *page_accessible,
EvMapping *mapping)
{
AtkObject *child;

child = ev_page_accessible_get_accessible_for_mapping (page_accessible, mapping);
if (!child)
return;

if (EV_IS_FORM_FIELD_ACCESSIBLE (child))
ev_form_field_accessible_update_state (EV_FORM_FIELD_ACCESSIBLE (child));
}
2 changes: 2 additions & 0 deletions libview/ev-page-accessible.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ EvViewAccessible *ev_page_accessible_get_view_accessible (EvPageAccessible *page
EvView *ev_page_accessible_get_view (EvPageAccessible *page_accessible);
AtkObject *ev_page_accessible_get_accessible_for_mapping (EvPageAccessible *page_accessible,
EvMapping *mapping);
void ev_page_accessible_update_element_state (EvPageAccessible *page_accessible,
EvMapping *mapping);

#endif /* __EV_PAGE_ACCESSIBLE_H__ */

11 changes: 11 additions & 0 deletions libview/ev-view-accessible.c
Original file line number Diff line number Diff line change
Expand Up @@ -615,3 +615,14 @@ ev_view_accessible_set_focused_element (EvViewAccessible *accessible,
if (accessible->priv->focused_element)
atk_object_notify_state_change (accessible->priv->focused_element, ATK_STATE_FOCUSED, TRUE);
}

void
ev_view_accessible_update_element_state (EvViewAccessible *accessible,
EvMapping *element,
gint element_page)
{
EvPageAccessible *page;

page = g_ptr_array_index (accessible->priv->children, element_page);
ev_page_accessible_update_element_state (page, element);
}
3 changes: 3 additions & 0 deletions libview/ev-view-accessible.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ gboolean ev_view_accessible_is_doc_rect_showing (EvViewAccessible *accessible,
void ev_view_accessible_set_focused_element (EvViewAccessible *accessible,
EvMapping *new_focus,
gint new_focus_page);
void ev_view_accessible_update_element_state (EvViewAccessible *accessible,
EvMapping *element,
gint element_page);

#endif /* __EV_VIEW_ACCESSIBLE_H__ */

5 changes: 5 additions & 0 deletions libview/ev-view.c
Original file line number Diff line number Diff line change
Expand Up @@ -2304,6 +2304,11 @@ ev_view_form_field_button_toggle (EvView *view,
!state);
field_button->state = !state;

if (view->accessible)
ev_view_accessible_update_element_state (EV_VIEW_ACCESSIBLE (view->accessible),
ev_mapping_list_find (forms_mapping, field),
field->page->index);

ev_view_reload_page (view, field->page->index, region);
cairo_region_destroy (region);
}
Expand Down

0 comments on commit 4599025

Please sign in to comment.