summaryrefslogtreecommitdiff
path: root/vcl/unx/gtk3
diff options
context:
space:
mode:
authorNoel Grandin <noelgrandin@gmail.com>2022-07-03 20:29:28 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2022-07-08 10:10:11 +0200
commit8d8e6c84e512c1a8b33aac75965b84481d1a1d13 (patch)
tree9ed209d057081d4283eb44b51c0d9af18f976eab /vcl/unx/gtk3
parent911ac42485b690df5cbbff6e3c04b111c1723aca (diff)
[API CHANGE] Drop css::accessibility::XAccessibleStateSet
which is internal API, unused (as far as I can tell) by external users. This state is purely a bitset (as implemented by utl::AccessibleStateSetHelper) so we can just return it as a 64-bit value. This shaves significant time off the performance profiles of code that loads very complex shapes, because this state is frequently used, and we no longer need to allocate a return value on the heap for every call. Change-Id: Icf1b3bd367c256646ae9015f9127025f59459c2c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136786 Reviewed-by: Michael Weghorn <m.weghorn@posteo.de> Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'vcl/unx/gtk3')
-rw-r--r--vcl/unx/gtk3/a11y/atklistener.cxx11
-rw-r--r--vcl/unx/gtk3/a11y/atkutil.cxx35
-rw-r--r--vcl/unx/gtk3/a11y/atkwrapper.cxx19
-rw-r--r--vcl/unx/gtk3/a11y/atkwrapper.hxx2
4 files changed, 27 insertions, 40 deletions
diff --git a/vcl/unx/gtk3/a11y/atklistener.cxx b/vcl/unx/gtk3/a11y/atklistener.cxx
index f0c2504c9acf..0c6842ab130c 100644
--- a/vcl/unx/gtk3/a11y/atklistener.cxx
+++ b/vcl/unx/gtk3/a11y/atklistener.cxx
@@ -67,7 +67,7 @@ AtkListener::~AtkListener()
static AtkStateType mapState( const uno::Any &rAny )
{
- sal_Int16 nState = accessibility::AccessibleStateType::INVALID;
+ sal_Int64 nState = accessibility::AccessibleStateType::INVALID;
rAny >>= nState;
return mapAtkState( nState );
}
@@ -133,10 +133,9 @@ void AtkListener::updateChildList(
{
m_aChildList.clear();
- uno::Reference< accessibility::XAccessibleStateSet > xStateSet = pContext->getAccessibleStateSet();
- if( !xStateSet.is()
- || xStateSet->contains(accessibility::AccessibleStateType::DEFUNC)
- || xStateSet->contains(accessibility::AccessibleStateType::MANAGES_DESCENDANTS) )
+ sal_Int64 nStateSet = pContext->getAccessibleStateSet();
+ if( (nStateSet & accessibility::AccessibleStateType::DEFUNC)
+ || (nStateSet & accessibility::AccessibleStateType::MANAGES_DESCENDANTS) )
return;
css::uno::Reference<css::accessibility::XAccessibleContext3> xContext3(pContext, css::uno::UNO_QUERY);
@@ -395,7 +394,7 @@ void printNotifyEvent( const accessibility::AccessibleEventObject& rEvent )
{
case accessibility::AccessibleEventId::STATE_CHANGED:
{
- sal_Int16 nState;
+ sal_Int64 nState;
if (rEvent.OldValue >>= nState)
os << " * old state = " << getOrUnknown(aStates, nState);
if (rEvent.NewValue >>= nState)
diff --git a/vcl/unx/gtk3/a11y/atkutil.cxx b/vcl/unx/gtk3/a11y/atkutil.cxx
index a2c8b46b470d..ed93b842a9c8 100644
--- a/vcl/unx/gtk3/a11y/atkutil.cxx
+++ b/vcl/unx/gtk3/a11y/atkutil.cxx
@@ -146,7 +146,7 @@ void DocumentFocusListener::notifyEvent( const accessibility::AccessibleEventObj
{
case accessibility::AccessibleEventId::STATE_CHANGED:
{
- sal_Int16 nState = accessibility::AccessibleStateType::INVALID;
+ sal_Int64 nState = accessibility::AccessibleStateType::INVALID;
aEvent.NewValue >>= nState;
if( accessibility::AccessibleStateType::FOCUSED == nState )
@@ -228,11 +228,8 @@ void DocumentFocusListener::attachRecursive(
const uno::Reference< accessibility::XAccessibleContext >& xContext
)
{
- uno::Reference< accessibility::XAccessibleStateSet > xStateSet =
- xContext->getAccessibleStateSet();
-
- if( xStateSet.is() )
- attachRecursive(xAccessible, xContext, xStateSet);
+ sal_Int64 nStateSet = xContext->getAccessibleStateSet();
+ attachRecursive(xAccessible, xContext, nStateSet);
}
/*****************************************************************************/
@@ -240,10 +237,10 @@ void DocumentFocusListener::attachRecursive(
void DocumentFocusListener::attachRecursive(
const uno::Reference< accessibility::XAccessible >& xAccessible,
const uno::Reference< accessibility::XAccessibleContext >& xContext,
- const uno::Reference< accessibility::XAccessibleStateSet >& xStateSet
+ sal_Int64 nStateSet
)
{
- if( xStateSet->contains(accessibility::AccessibleStateType::FOCUSED ) )
+ if( nStateSet & accessibility::AccessibleStateType::FOCUSED )
atk_wrapper_focus_tracker_notify_when_idle( xAccessible );
uno::Reference< accessibility::XAccessibleEventBroadcaster > xBroadcaster(xContext, uno::UNO_QUERY);
@@ -258,7 +255,7 @@ void DocumentFocusListener::attachRecursive(
xBroadcaster->addAccessibleEventListener(static_cast< accessibility::XAccessibleEventListener *>(this));
- if( ! xStateSet->contains(accessibility::AccessibleStateType::MANAGES_DESCENDANTS ) )
+ if( ! (nStateSet & accessibility::AccessibleStateType::MANAGES_DESCENDANTS) )
{
sal_Int32 n, nmax = xContext->getAccessibleChildCount();
for( n = 0; n < nmax; n++ )
@@ -290,18 +287,16 @@ void DocumentFocusListener::detachRecursive(
const uno::Reference< accessibility::XAccessibleContext >& xContext
)
{
- uno::Reference< accessibility::XAccessibleStateSet > xStateSet =
- xContext->getAccessibleStateSet();
+ sal_Int64 nStateSet = xContext->getAccessibleStateSet();
- if( xStateSet.is() )
- detachRecursive(xContext, xStateSet);
+ detachRecursive(xContext, nStateSet);
}
/*****************************************************************************/
void DocumentFocusListener::detachRecursive(
const uno::Reference< accessibility::XAccessibleContext >& xContext,
- const uno::Reference< accessibility::XAccessibleStateSet >& xStateSet
+ sal_Int64 nStateSet
)
{
uno::Reference< accessibility::XAccessibleEventBroadcaster > xBroadcaster(xContext, uno::UNO_QUERY);
@@ -311,7 +306,7 @@ void DocumentFocusListener::detachRecursive(
xBroadcaster->removeAccessibleEventListener(static_cast< accessibility::XAccessibleEventListener *>(this));
- if( ! xStateSet->contains(accessibility::AccessibleStateType::MANAGES_DESCENDANTS ) )
+ if( ! (nStateSet & accessibility::AccessibleStateType::MANAGES_DESCENDANTS) )
{
sal_Int32 n, nmax = xContext->getAccessibleChildCount();
for( n = 0; n < nmax; n++ )
@@ -489,16 +484,12 @@ static void handle_get_focus(::VclWindowEvent const * pEvent)
if( ! xContext.is() )
return;
- uno::Reference< accessibility::XAccessibleStateSet > xStateSet =
- xContext->getAccessibleStateSet();
-
- if( ! xStateSet.is() )
- return;
+ sal_Int64 nStateSet = xContext->getAccessibleStateSet();
/* the UNO ToolBox wrapper does not (yet?) support XAccessibleSelection, so we
* need to add listeners to the children instead of re-using the tabpage stuff
*/
- if( xStateSet->contains(accessibility::AccessibleStateType::FOCUSED) &&
+ if( (nStateSet & accessibility::AccessibleStateType::FOCUSED) &&
( pWindow->GetType() != WindowType::TREELISTBOX ) )
{
atk_wrapper_focus_tracker_notify_when_idle( xAccessible );
@@ -509,7 +500,7 @@ static void handle_get_focus(::VclWindowEvent const * pEvent)
{
try
{
- rDocumentFocusListener.attachRecursive(xAccessible, xContext, xStateSet);
+ rDocumentFocusListener.attachRecursive(xAccessible, xContext, nStateSet);
}
catch (const uno::Exception&)
{
diff --git a/vcl/unx/gtk3/a11y/atkwrapper.cxx b/vcl/unx/gtk3/a11y/atkwrapper.cxx
index d23f384e26fc..735b53c3edbe 100644
--- a/vcl/unx/gtk3/a11y/atkwrapper.cxx
+++ b/vcl/unx/gtk3/a11y/atkwrapper.cxx
@@ -32,7 +32,6 @@
#include <com/sun/star/accessibility/XAccessibleContext2.hpp>
#include <com/sun/star/accessibility/XAccessibleComponent.hpp>
#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
-#include <com/sun/star/accessibility/XAccessibleStateSet.hpp>
#include <com/sun/star/accessibility/XAccessibleRelationSet.hpp>
#include <com/sun/star/accessibility/XAccessibleTable.hpp>
#include <com/sun/star/accessibility/XAccessibleEditableText.hpp>
@@ -110,7 +109,7 @@ static AtkRelationType mapRelationType( sal_Int16 nRelation )
return type;
}
-AtkStateType mapAtkState( sal_Int16 nState )
+AtkStateType mapAtkState( sal_Int64 nState )
{
AtkStateType type = ATK_STATE_INVALID;
@@ -592,18 +591,16 @@ wrapper_ref_state_set( AtkObject *atk_obj )
if( obj->mpContext.is() )
{
try {
- uno::Reference< accessibility::XAccessibleStateSet > xStateSet(
- obj->mpContext->getAccessibleStateSet());
+ sal_Int64 nStateSet = obj->mpContext->getAccessibleStateSet();
- if( xStateSet.is() )
+ if( nStateSet )
{
- uno::Sequence< sal_Int16 > aStates = xStateSet->getStates();
-
- for( const auto nState : aStates )
+ for (int i=0; i<63; ++i)
{
// ATK_STATE_LAST_DEFINED is used to check if the state
// is unmapped, do not report it to Atk
- if ( mapAtkState( nState ) != ATK_STATE_LAST_DEFINED )
+ sal_Int64 nState = sal_Int64(1) << i;
+ if ( (nStateSet & nState) && mapAtkState( nState ) != ATK_STATE_LAST_DEFINED )
atk_state_set_add_state( pSet, mapAtkState( nState ) );
}
@@ -896,8 +893,8 @@ atk_object_wrapper_new( const css::uno::Reference< css::accessibility::XAccessib
}
// Attach a listener to the UNO object if it's not TRANSIENT
- uno::Reference< accessibility::XAccessibleStateSet > xStateSet( xContext->getAccessibleStateSet() );
- if( xStateSet.is() && ! xStateSet->contains( accessibility::AccessibleStateType::TRANSIENT ) )
+ sal_Int64 nStateSet( xContext->getAccessibleStateSet() );
+ if( ! (nStateSet & accessibility::AccessibleStateType::TRANSIENT ) )
{
uno::Reference< accessibility::XAccessibleEventBroadcaster > xBroadcaster(xContext, uno::UNO_QUERY);
if( xBroadcaster.is() )
diff --git a/vcl/unx/gtk3/a11y/atkwrapper.hxx b/vcl/unx/gtk3/a11y/atkwrapper.hxx
index 0b5f64726bba..d67ea2480e4d 100644
--- a/vcl/unx/gtk3/a11y/atkwrapper.hxx
+++ b/vcl/unx/gtk3/a11y/atkwrapper.hxx
@@ -94,7 +94,7 @@ void atk_object_wrapper_set_role(AtkObjectWrapper* wrapper, sa
void atk_object_wrapper_dispose(AtkObjectWrapper* wrapper);
-AtkStateType mapAtkState( sal_Int16 nState );
+AtkStateType mapAtkState( sal_Int64 nState );
AtkRelation* atk_object_wrapper_relation_new(const css::accessibility::AccessibleRelation& rRelation);