Kaydet (Commit) c1d69c0e authored tarafından Jacobo Aragunde Pérez's avatar Jacobo Aragunde Pérez Kaydeden (comit) Caolán McNamara

fdo#35105: notify role change through a new UNO a11y event

A new UNO accessibility event called ROLE_CHANGED has been created.
It should be triggered when an accessible object changes its role and
every accessibility toolkit should use its own methods to make that
change effective.

Code to support the event in ATK has been added.

Change-Id: I132e303bdb148967231334458c3cfa369c36ec8f
Reviewed-on: https://gerrit.libreoffice.org/7853Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst f5c7e770
......@@ -380,6 +380,13 @@ constants AccessibleEventId
const short PAGE_CHANGED =38;
const short SECTION_CHANGED =39;
const short COLUMN_CHANGED =40;
/** Constant used to indicate that the role of an accessible object has
changed.
@since LibreOffice 4.3
*/
const short ROLE_CHANGED =41;
};
}; }; }; };
......
......@@ -437,7 +437,16 @@ void SwAccessibleParagraph::_InvalidateContent( sal_Bool bVisibleDataFired )
bIsHeading = bNewIsHeading;
}
if( bNewIsHeading != bOldIsHeading || rText != sOldText )
if( bNewIsHeading != bOldIsHeading )
{
// The role has changed
AccessibleEventObject aEvent;
aEvent.EventId = AccessibleEventId::ROLE_CHANGED;
FireAccessibleEvent( aEvent );
}
if( rText != sOldText )
{
OUString sNewDesc( GetDescription() );
OUString sOldDesc;
......
......@@ -549,6 +549,14 @@ void AtkListener::notifyEvent( const accessibility::AccessibleEventObject& aEven
g_signal_emit_by_name( G_OBJECT( atk_obj ), "property_change::accessible-hypertext-offset");
break;
case accessibility::AccessibleEventId::ROLE_CHANGED:
{
uno::Reference< accessibility::XAccessibleContext > xContext;
xContext = getAccessibleContextFromSource( aEvent.Source );
atk_object_wrapper_set_role( mpWrapper, xContext->getAccessibleRole() );
break;
}
default:
g_warning( "Unknown event notification %d", aEvent.EventId );
break;
......
......@@ -876,6 +876,14 @@ void atk_object_wrapper_remove_child(AtkObjectWrapper* wrapper, AtkObject *child
/*****************************************************************************/
void atk_object_wrapper_set_role(AtkObjectWrapper* wrapper, sal_Int16 role)
{
AtkObject *atk_obj = ATK_OBJECT( wrapper );
atk_object_set_role( atk_obj, mapToAtkRole( role ) );
}
/*****************************************************************************/
#define RELEASE(i) if( i ) { i->release(); i = NULL; }
void atk_object_wrapper_dispose(AtkObjectWrapper* wrapper)
......
......@@ -84,6 +84,7 @@ AtkObject * atk_object_wrapper_new(
void atk_object_wrapper_add_child(AtkObjectWrapper* wrapper, AtkObject *child, gint index);
void atk_object_wrapper_remove_child(AtkObjectWrapper* wrapper, AtkObject *child, gint index);
void atk_object_wrapper_set_role(AtkObjectWrapper* wrapper, sal_Int16 role);
void atk_object_wrapper_dispose(AtkObjectWrapper* wrapper);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment