diff options
Diffstat (limited to 'vcl/unx/gtk/a11y/atklistener.cxx')
-rw-r--r-- | vcl/unx/gtk/a11y/atklistener.cxx | 739 |
1 files changed, 0 insertions, 739 deletions
diff --git a/vcl/unx/gtk/a11y/atklistener.cxx b/vcl/unx/gtk/a11y/atklistener.cxx deleted file mode 100644 index c30bc638bced..000000000000 --- a/vcl/unx/gtk/a11y/atklistener.cxx +++ /dev/null @@ -1,739 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#ifdef AIX -#define _LINUX_SOURCE_COMPAT -#include <sys/timer.h> -#undef _LINUX_SOURCE_COMPAT -#endif - -#include <com/sun/star/accessibility/TextSegment.hpp> -#include <com/sun/star/accessibility/AccessibleEventId.hpp> -#include <com/sun/star/accessibility/AccessibleStateType.hpp> -#include <com/sun/star/accessibility/AccessibleTableModelChange.hpp> -#include <com/sun/star/accessibility/AccessibleTableModelChangeType.hpp> -#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp> -#include <com/sun/star/lang/IndexOutOfBoundsException.hpp> - -#include "atklistener.hxx" -#include "atkwrapper.hxx" -#include <vcl/svapp.hxx> - -#include <rtl/ref.hxx> -#include <sal/log.hxx> - -#define DEBUG_ATK_LISTENER 0 - -#if DEBUG_ATK_LISTENER -#include <iostream> -#include <sstream> -#endif - -using namespace com::sun::star; - -AtkListener::AtkListener( AtkObjectWrapper* pWrapper ) : mpWrapper( pWrapper ) -{ - if( mpWrapper ) - { - g_object_ref( mpWrapper ); - updateChildList( mpWrapper->mpContext ); - } -} - -AtkListener::~AtkListener() -{ - if( mpWrapper ) - g_object_unref( mpWrapper ); -} - -/*****************************************************************************/ - -static AtkStateType mapState( const uno::Any &rAny ) -{ - sal_Int16 nState = accessibility::AccessibleStateType::INVALID; - rAny >>= nState; - return mapAtkState( nState ); -} - -/*****************************************************************************/ - -extern "C" { - // rhbz#1001768 - down to horrific problems releasing the solar mutex - // while destroying a Window - which occurs inside these notifications. - static gboolean - idle_defunc_state_change( AtkObject *atk_obj ) - { - SolarMutexGuard aGuard; - - // This is an equivalent to a state change to DEFUNC(T). - atk_object_notify_state_change( atk_obj, ATK_STATE_DEFUNCT, TRUE ); - if( atk_get_focus_object() == atk_obj ) - { - SAL_WNODEPRECATED_DECLARATIONS_PUSH - atk_focus_tracker_notify( nullptr ); - SAL_WNODEPRECATED_DECLARATIONS_POP - } - g_object_unref( G_OBJECT( atk_obj ) ); - return false; - } -} - -// XEventListener implementation -void AtkListener::disposing( const lang::EventObject& ) -{ - if( mpWrapper ) - { - AtkObject *atk_obj = ATK_OBJECT( mpWrapper ); - - // Release all interface references to avoid shutdown problems with - // global mutex - atk_object_wrapper_dispose( mpWrapper ); - - g_idle_add( reinterpret_cast<GSourceFunc>(idle_defunc_state_change), - g_object_ref( G_OBJECT( atk_obj ) ) ); - - // Release the wrapper object so that it can vanish .. - g_object_unref( mpWrapper ); - mpWrapper = nullptr; - } -} - -/*****************************************************************************/ - -static AtkObject *getObjFromAny( const uno::Any &rAny ) -{ - uno::Reference< accessibility::XAccessible > xAccessible; - rAny >>= xAccessible; - return xAccessible.is() ? atk_object_wrapper_ref( xAccessible ) : nullptr; -} - -/*****************************************************************************/ - -// Updates the child list held to provide the old IndexInParent on children_changed::remove -void AtkListener::updateChildList( - css::uno::Reference<css::accessibility::XAccessibleContext> const & - pContext) -{ - 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_Int32 nChildren = pContext->getAccessibleChildCount(); - m_aChildList.resize(nChildren); - for(sal_Int32 n = 0; n < nChildren; n++) - { - try - { - m_aChildList[n] = pContext->getAccessibleChild(n); - } - catch (lang::IndexOutOfBoundsException const&) - { - sal_Int32 nChildren2 = pContext->getAccessibleChildCount(); - assert(nChildren2 <= n && "consistency?"); - m_aChildList.resize(std::min(nChildren2, n)); - break; - } - } - } -} - -/*****************************************************************************/ - -void AtkListener::handleChildAdded( - const uno::Reference< accessibility::XAccessibleContext >& rxParent, - const uno::Reference< accessibility::XAccessible>& rxAccessible) -{ - AtkObject * pChild = rxAccessible.is() ? atk_object_wrapper_ref( rxAccessible ) : nullptr; - - if( pChild ) - { - updateChildList(rxParent); - - atk_object_wrapper_add_child( mpWrapper, pChild, - atk_object_get_index_in_parent( pChild )); - - g_object_unref( pChild ); - } -} - -/*****************************************************************************/ - -void AtkListener::handleChildRemoved( - const uno::Reference< accessibility::XAccessibleContext >& rxParent, - const uno::Reference< accessibility::XAccessible>& rxChild) -{ - sal_Int32 nIndex = -1; - - // Locate the child in the children list - size_t n, nmax = m_aChildList.size(); - for( n = 0; n < nmax; ++n ) - { - if( rxChild == m_aChildList[n] ) - { - nIndex = n; - break; - } - } - - // FIXME: two problems here: - // a) we get child-removed events for objects that are no real children - // in the accessibility hierarchy or have been removed before due to - // some child removing batch. - // b) spi_atk_bridge_signal_listener ignores the given parameters - // for children_changed events and always asks the parent for the - // 0. child, which breaks somehow on vanishing list boxes. - // Ignoring "remove" events for objects not in the m_aChildList - // for now. - if( nIndex >= 0 ) - { - uno::Reference<accessibility::XAccessibleEventBroadcaster> xBroadcaster( - rxChild->getAccessibleContext(), uno::UNO_QUERY); - - if (xBroadcaster.is()) - { - uno::Reference<accessibility::XAccessibleEventListener> xListener(this); - xBroadcaster->removeAccessibleEventListener(xListener); - } - - updateChildList(rxParent); - - AtkObject * pChild = atk_object_wrapper_ref( rxChild, false ); - if( pChild ) - { - atk_object_wrapper_remove_child( mpWrapper, pChild, nIndex ); - g_object_unref( pChild ); - } - } -} - -/*****************************************************************************/ - -void AtkListener::handleInvalidateChildren( - const uno::Reference< accessibility::XAccessibleContext >& rxParent) -{ - // Send notifications for all previous children - size_t n = m_aChildList.size(); - while( n-- > 0 ) - { - if( m_aChildList[n].is() ) - { - AtkObject * pChild = atk_object_wrapper_ref( m_aChildList[n], false ); - if( pChild ) - { - atk_object_wrapper_remove_child( mpWrapper, pChild, n ); - g_object_unref( pChild ); - } - } - } - - updateChildList(rxParent); - - // Send notifications for all new children - size_t nmax = m_aChildList.size(); - for( n = 0; n < nmax; ++n ) - { - if( m_aChildList[n].is() ) - { - AtkObject * pChild = atk_object_wrapper_ref( m_aChildList[n] ); - - if( pChild ) - { - atk_object_wrapper_add_child( mpWrapper, pChild, n ); - g_object_unref( pChild ); - } - } - } -} - -/*****************************************************************************/ - -static uno::Reference< accessibility::XAccessibleContext > -getAccessibleContextFromSource( const uno::Reference< uno::XInterface >& rxSource ) -{ - uno::Reference< accessibility::XAccessibleContext > xContext(rxSource, uno::UNO_QUERY); - if( ! xContext.is() ) - { - g_warning( "ERROR: Event source does not implement XAccessibleContext" ); - - // Second try - query for XAccessible, which should give us access to - // XAccessibleContext. - uno::Reference< accessibility::XAccessible > xAccessible(rxSource, uno::UNO_QUERY); - if( xAccessible.is() ) - xContext = xAccessible->getAccessibleContext(); - } - - return xContext; -} - -#if DEBUG_ATK_LISTENER - -namespace { - -void printNotifyEvent( const accessibility::AccessibleEventObject& rEvent ) -{ - static std::vector<const char*> aLabels = { - 0, - "NAME_CHANGED", // 01 - "DESCRIPTION_CHANGED", // 02 - "ACTION_CHANGED", // 03 - "STATE_CHANGED", // 04 - "ACTIVE_DESCENDANT_CHANGED", // 05 - "BOUNDRECT_CHANGED", // 06 - "CHILD", // 07 - "INVALIDATE_ALL_CHILDREN", // 08 - "SELECTION_CHANGED", // 09 - "VISIBLE_DATA_CHANGED", // 10 - "VALUE_CHANGED", // 11 - "CONTENT_FLOWS_FROM_RELATION_CHANGED", // 12 - "CONTENT_FLOWS_TO_RELATION_CHANGED", // 13 - "CONTROLLED_BY_RELATION_CHANGED", // 14 - "CONTROLLER_FOR_RELATION_CHANGED", // 15 - "LABEL_FOR_RELATION_CHANGED", // 16 - "LABELED_BY_RELATION_CHANGED", // 17 - "MEMBER_OF_RELATION_CHANGED", // 18 - "SUB_WINDOW_OF_RELATION_CHANGED", // 19 - "CARET_CHANGED", // 20 - "TEXT_SELECTION_CHANGED", // 21 - "TEXT_CHANGED", // 22 - "TEXT_ATTRIBUTE_CHANGED", // 23 - "HYPERTEXT_CHANGED", // 24 - "TABLE_CAPTION_CHANGED", // 25 - "TABLE_COLUMN_DESCRIPTION_CHANGED", // 26 - "TABLE_COLUMN_HEADER_CHANGED", // 27 - "TABLE_MODEL_CHANGED", // 28 - "TABLE_ROW_DESCRIPTION_CHANGED", // 29 - "TABLE_ROW_HEADER_CHANGED", // 30 - "TABLE_SUMMARY_CHANGED", // 31 - "LISTBOX_ENTRY_EXPANDED", // 32 - "LISTBOX_ENTRY_COLLAPSED", // 33 - "ACTIVE_DESCENDANT_CHANGED_NOFOCUS", // 34 - "SELECTION_CHANGED_ADD", // 35 - "SELECTION_CHANGED_REMOVE", // 36 - "SELECTION_CHANGED_WITHIN", // 37 - "PAGE_CHANGED", // 38 - "SECTION_CHANGED", // 39 - "COLUMN_CHANGED", // 40 - "ROLE_CHANGED", // 41 - }; - - static std::vector<const char*> aStates = { - "INVALID", // 00 - "ACTIVE", // 01 - "ARMED", // 02 - "BUSY", // 03 - "CHECKED", // 04 - "DEFUNC", // 05 - "EDITABLE", // 06 - "ENABLED", // 07 - "EXPANDABLE", // 08 - "EXPANDED", // 09 - "FOCUSABLE", // 10 - "FOCUSED", // 11 - "HORIZONTAL", // 12 - "ICONIFIED", // 13 - "INDETERMINATE", // 14 - "MANAGES_DESCENDANTS", // 15 - "MODAL", // 16 - "MULTI_LINE", // 17 - "MULTI_SELECTABLE", // 18 - "OPAQUE", // 19 - "PRESSED", // 20 - "RESIZABLE", // 21 - "SELECTABLE", // 22 - "SELECTED", // 23 - "SENSITIVE", // 24 - "SHOWING", // 25 - "SINGLE_LINE", // 26 - "STALE", // 27 - "TRANSIENT", // 28 - "VERTICAL", // 29 - "VISIBLE", // 30 - "MOVEABLE", // 31 - "DEFAULT", // 32 - "OFFSCREEN", // 33 - "COLLAPSE", // 34 - }; - - auto getOrUnknown = [](const std::vector<const char*>& rCont, size_t nIndex) -> std::string - { - return (nIndex < rCont.size()) ? rCont[nIndex] : "<unknown>"; - }; - - std::ostringstream os; - os << "--" << std::endl; - os << "* event = " << getOrUnknown(aLabels, rEvent.EventId) << std::endl; - - switch (rEvent.EventId) - { - case accessibility::AccessibleEventId::STATE_CHANGED: - { - sal_Int16 nState; - if (rEvent.OldValue >>= nState) - os << " * old state = " << getOrUnknown(aStates, nState); - if (rEvent.NewValue >>= nState) - os << " * new state = " << getOrUnknown(aStates, nState); - - os << std::endl; - break; - } - default: - ; - } - - std::cout << os.str(); -} - -} - -#endif - -void AtkListener::notifyEvent( const accessibility::AccessibleEventObject& aEvent ) -{ - if( !mpWrapper ) - return; - - AtkObject *atk_obj = ATK_OBJECT( mpWrapper ); - - switch( aEvent.EventId ) - { - // AtkObject signals: - // Hierarchy signals - case accessibility::AccessibleEventId::CHILD: - { - uno::Reference< accessibility::XAccessibleContext > xParent; - uno::Reference< accessibility::XAccessible > xChild; - - xParent = getAccessibleContextFromSource(aEvent.Source); - g_return_if_fail( xParent.is() ); - - if( aEvent.OldValue >>= xChild ) - handleChildRemoved(xParent, xChild); - - if( aEvent.NewValue >>= xChild ) - handleChildAdded(xParent, xChild); - break; - } - - case accessibility::AccessibleEventId::INVALIDATE_ALL_CHILDREN: - { - uno::Reference< accessibility::XAccessibleContext > xParent = getAccessibleContextFromSource(aEvent.Source); - g_return_if_fail( xParent.is() ); - - handleInvalidateChildren(xParent); - break; - } - - case accessibility::AccessibleEventId::NAME_CHANGED: - { - OUString aName; - if( aEvent.NewValue >>= aName ) - { - atk_object_set_name(atk_obj, - OUStringToOString(aName, RTL_TEXTENCODING_UTF8).getStr()); - } - break; - } - - case accessibility::AccessibleEventId::DESCRIPTION_CHANGED: - { - OUString aDescription; - if( aEvent.NewValue >>= aDescription ) - { - atk_object_set_description(atk_obj, - OUStringToOString(aDescription, RTL_TEXTENCODING_UTF8).getStr()); - } - break; - } - - case accessibility::AccessibleEventId::STATE_CHANGED: - { - AtkStateType eOldState = mapState( aEvent.OldValue ); - AtkStateType eNewState = mapState( aEvent.NewValue ); - - gboolean bState = eNewState != ATK_STATE_INVALID; - AtkStateType eRealState = bState ? eNewState : eOldState; - - atk_object_notify_state_change( atk_obj, eRealState, bState ); - break; - } - - case accessibility::AccessibleEventId::BOUNDRECT_CHANGED: - -#ifdef HAS_ATKRECTANGLE - if( ATK_IS_COMPONENT( atk_obj ) ) - { - AtkRectangle rect; - - atk_component_get_extents( ATK_COMPONENT( atk_obj ), - &rect.x, - &rect.y, - &rect.width, - &rect.height, - ATK_XY_SCREEN ); - - g_signal_emit_by_name( atk_obj, "bounds_changed", &rect ); - } - else - g_warning( "bounds_changed event for object not implementing AtkComponent\n"); -#endif - - break; - - case accessibility::AccessibleEventId::VISIBLE_DATA_CHANGED: - g_signal_emit_by_name( atk_obj, "visible-data-changed" ); - break; - - case accessibility::AccessibleEventId::ACTIVE_DESCENDANT_CHANGED: - { - AtkObject *pChild = getObjFromAny( aEvent.NewValue ); - if( pChild ) - { - g_signal_emit_by_name( atk_obj, "active-descendant-changed", pChild ); - g_object_unref( pChild ); - } - break; - } - - //ACTIVE_DESCENDANT_CHANGED_NOFOCUS (sic) appears to have been added - //as a workaround or an aid for the ia2 winaccessibility implementation - //so ignore it silently without warning here - case accessibility::AccessibleEventId::ACTIVE_DESCENDANT_CHANGED_NOFOCUS: - break; - - // #i92103# - case accessibility::AccessibleEventId::LISTBOX_ENTRY_EXPANDED: - { - AtkObject *pChild = getObjFromAny( aEvent.NewValue ); - if( pChild ) - { - atk_object_notify_state_change( pChild, ATK_STATE_EXPANDED, true ); - g_object_unref( pChild ); - } - break; - } - - case accessibility::AccessibleEventId::LISTBOX_ENTRY_COLLAPSED: - { - AtkObject *pChild = getObjFromAny( aEvent.NewValue ); - if( pChild ) - { - atk_object_notify_state_change( pChild, ATK_STATE_EXPANDED, false ); - g_object_unref( pChild ); - } - break; - } - - // AtkAction signals ... - case accessibility::AccessibleEventId::ACTION_CHANGED: - g_signal_emit_by_name( G_OBJECT( atk_obj ), "property_change::accessible-actions"); - break; - - // AtkText - case accessibility::AccessibleEventId::CARET_CHANGED: - { - sal_Int32 nPos=0; - aEvent.NewValue >>= nPos; - g_signal_emit_by_name( atk_obj, "text_caret_moved", nPos ); - break; - } - case accessibility::AccessibleEventId::TEXT_CHANGED: - { - // TESTME: and remove this comment: - // cf. comphelper/source/misc/accessibletexthelper.cxx (implInitTextChangedEvent) - accessibility::TextSegment aDeletedText; - accessibility::TextSegment aInsertedText; - - // TODO: when GNOME starts to send "update" kind of events, change - // we need to re-think this implementation as well - if( aEvent.OldValue >>= aDeletedText ) - { - /* Remember the text segment here to be able to return removed text in get_text(). - * This is clearly a hack to be used until appropriate API exists in atk to pass - * the string value directly or we find a compelling reason to start caching the - * UTF-8 converted strings in the atk wrapper object. - */ - - g_object_set_data( G_OBJECT(atk_obj), "ooo::text_changed::delete", &aDeletedText); - - g_signal_emit_by_name( atk_obj, "text_changed::delete", - static_cast<gint>(aDeletedText.SegmentStart), - static_cast<gint>( aDeletedText.SegmentEnd - aDeletedText.SegmentStart ) ); - - g_object_steal_data( G_OBJECT(atk_obj), "ooo::text_changed::delete" ); - } - - if( aEvent.NewValue >>= aInsertedText ) - g_signal_emit_by_name( atk_obj, "text_changed::insert", - static_cast<gint>(aInsertedText.SegmentStart), - static_cast<gint>( aInsertedText.SegmentEnd - aInsertedText.SegmentStart ) ); - break; - } - - case accessibility::AccessibleEventId::TEXT_SELECTION_CHANGED: - { - g_signal_emit_by_name( atk_obj, "text-selection-changed" ); - break; - } - - case accessibility::AccessibleEventId::TEXT_ATTRIBUTE_CHANGED: - g_signal_emit_by_name( atk_obj, "text-attributes-changed" ); - break; - - // AtkValue - case accessibility::AccessibleEventId::VALUE_CHANGED: - g_object_notify( G_OBJECT( atk_obj ), "accessible-value" ); - break; - - case accessibility::AccessibleEventId::CONTENT_FLOWS_FROM_RELATION_CHANGED: - case accessibility::AccessibleEventId::CONTENT_FLOWS_TO_RELATION_CHANGED: - case accessibility::AccessibleEventId::CONTROLLED_BY_RELATION_CHANGED: - case accessibility::AccessibleEventId::CONTROLLER_FOR_RELATION_CHANGED: - case accessibility::AccessibleEventId::LABEL_FOR_RELATION_CHANGED: - case accessibility::AccessibleEventId::LABELED_BY_RELATION_CHANGED: - case accessibility::AccessibleEventId::MEMBER_OF_RELATION_CHANGED: - case accessibility::AccessibleEventId::SUB_WINDOW_OF_RELATION_CHANGED: - // FIXME: ask Bill how Atk copes with this little lot ... - break; - - // AtkTable - case accessibility::AccessibleEventId::TABLE_MODEL_CHANGED: - { - accessibility::AccessibleTableModelChange aChange; - aEvent.NewValue >>= aChange; - - sal_Int32 nRowsChanged = aChange.LastRow - aChange.FirstRow + 1; - sal_Int32 nColumnsChanged = aChange.LastColumn - aChange.FirstColumn + 1; - - static const struct { - const char *row; - const char *col; - } aSignalNames[] = - { - { nullptr, nullptr }, // dummy - { "row_inserted", "column_inserted" }, // INSERT = 1 - { "row_deleted", "column_deleted" } // DELETE = 2 - }; - switch( aChange.Type ) - { - case accessibility::AccessibleTableModelChangeType::INSERT: - case accessibility::AccessibleTableModelChangeType::DELETE: - if( nRowsChanged > 0 ) - g_signal_emit_by_name( G_OBJECT( atk_obj ), - aSignalNames[aChange.Type].row, - aChange.FirstRow, nRowsChanged ); - if( nColumnsChanged > 0 ) - g_signal_emit_by_name( G_OBJECT( atk_obj ), - aSignalNames[aChange.Type].col, - aChange.FirstColumn, nColumnsChanged ); - break; - - case accessibility::AccessibleTableModelChangeType::UPDATE: - // This is not really a model change, is it ? - break; - default: - g_warning( "TESTME: unusual table model change %d\n", aChange.Type ); - break; - } - g_signal_emit_by_name( G_OBJECT( atk_obj ), "model-changed" ); - break; - } - - case accessibility::AccessibleEventId::TABLE_COLUMN_HEADER_CHANGED: - { - accessibility::AccessibleTableModelChange aChange; - aEvent.NewValue >>= aChange; - - AtkPropertyValues values; - memset(&values, 0, sizeof(AtkPropertyValues)); - g_value_init (&values.new_value, G_TYPE_INT); - values.property_name = "accessible-table-column-header"; - - for (sal_Int32 nChangedColumn = aChange.FirstColumn; nChangedColumn <= aChange.LastColumn; ++nChangedColumn) - { - g_value_set_int (&values.new_value, nChangedColumn); - g_signal_emit_by_name(G_OBJECT(atk_obj), "property_change::accessible-table-column-header", &values, nullptr); - } - break; - } - - case accessibility::AccessibleEventId::TABLE_CAPTION_CHANGED: - g_signal_emit_by_name( G_OBJECT( atk_obj ), "property_change::accessible-table-caption"); - break; - - case accessibility::AccessibleEventId::TABLE_COLUMN_DESCRIPTION_CHANGED: - g_signal_emit_by_name( G_OBJECT( atk_obj ), "property_change::accessible-table-column-description"); - break; - - case accessibility::AccessibleEventId::TABLE_ROW_DESCRIPTION_CHANGED: - g_signal_emit_by_name( G_OBJECT( atk_obj ), "property_change::accessible-table-row-description"); - break; - - case accessibility::AccessibleEventId::TABLE_ROW_HEADER_CHANGED: - g_signal_emit_by_name( G_OBJECT( atk_obj ), "property_change::accessible-table-row-header"); - break; - - case accessibility::AccessibleEventId::TABLE_SUMMARY_CHANGED: - g_signal_emit_by_name( G_OBJECT( atk_obj ), "property_change::accessible-table-summary"); - break; - - case accessibility::AccessibleEventId::SELECTION_CHANGED: - case accessibility::AccessibleEventId::SELECTION_CHANGED_ADD: - case accessibility::AccessibleEventId::SELECTION_CHANGED_REMOVE: - case accessibility::AccessibleEventId::SELECTION_CHANGED_WITHIN: - if (ATK_IS_SELECTION(atk_obj)) - g_signal_emit_by_name(G_OBJECT(atk_obj), "selection_changed"); - else - { - // e.g. tdf#122353, when such dialogs become native the problem will go away anyway - SAL_INFO("vcl.gtk", "selection change from obj which doesn't support XAccessibleSelection"); - } - break; - - case accessibility::AccessibleEventId::HYPERTEXT_CHANGED: - 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 = getAccessibleContextFromSource( aEvent.Source ); - atk_object_wrapper_set_role( mpWrapper, xContext->getAccessibleRole() ); - break; - } - - case accessibility::AccessibleEventId::PAGE_CHANGED: - { - /* // If we implemented AtkDocument then I imagine this is what this - // handler should look like - sal_Int32 nPos=0; - aEvent.NewValue >>= nPos; - g_signal_emit_by_name( G_OBJECT( atk_obj ), "page_changed", nPos ); - */ - break; - } - - default: - SAL_WARN("vcl.gtk", "Unknown event notification: " << aEvent.EventId); - break; - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |