/* -*- 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 .
*/
static AtkRelationType mapRelationType(accessibility::AccessibleRelationType eRelation)
{
AtkRelationType type = ATK_RELATION_NULL;
switch (eRelation)
{ case accessibility::AccessibleRelationType_CONTENT_FLOWS_FROM:
type = ATK_RELATION_FLOWS_FROM; break;
case accessibility::AccessibleRelationType_CONTENT_FLOWS_TO:
type = ATK_RELATION_FLOWS_TO; break;
case accessibility::AccessibleRelationType_CONTROLLED_BY:
type = ATK_RELATION_CONTROLLED_BY; break;
case accessibility::AccessibleRelationType_CONTROLLER_FOR:
type = ATK_RELATION_CONTROLLER_FOR; break;
case accessibility::AccessibleRelationType_LABEL_FOR:
type = ATK_RELATION_LABEL_FOR; break;
case accessibility::AccessibleRelationType_LABELED_BY:
type = ATK_RELATION_LABELLED_BY; break;
case accessibility::AccessibleRelationType_MEMBER_OF:
type = ATK_RELATION_MEMBER_OF; break;
case accessibility::AccessibleRelationType_SUB_WINDOW_OF:
type = ATK_RELATION_SUBWINDOW_OF; break;
case accessibility::AccessibleRelationType_NODE_CHILD_OF:
type = ATK_RELATION_NODE_CHILD_OF; break;
default: break;
}
return type;
}
AtkStateType mapAtkState( sal_Int64 nState )
{
AtkStateType type = ATK_STATE_INVALID;
// A perfect / complete mapping ... switch( nState )
{ #define MAP_DIRECT( a ) \ case accessibility::AccessibleStateType::a: \
type = ATK_STATE_##a; break
MAP_DIRECT( INVALID );
MAP_DIRECT( ACTIVE );
MAP_DIRECT( ARMED );
MAP_DIRECT( BUSY );
MAP_DIRECT( CHECKABLE );
MAP_DIRECT( CHECKED );
MAP_DIRECT( EDITABLE );
MAP_DIRECT( ENABLED );
MAP_DIRECT( EXPANDABLE );
MAP_DIRECT( EXPANDED );
MAP_DIRECT( FOCUSABLE );
MAP_DIRECT( FOCUSED );
MAP_DIRECT( HORIZONTAL );
MAP_DIRECT( ICONIFIED );
MAP_DIRECT( INDETERMINATE );
MAP_DIRECT( MANAGES_DESCENDANTS );
MAP_DIRECT( MODAL );
MAP_DIRECT( MULTI_LINE );
MAP_DIRECT( OPAQUE );
MAP_DIRECT( PRESSED );
MAP_DIRECT( RESIZABLE );
MAP_DIRECT( SELECTABLE );
MAP_DIRECT( SELECTED );
MAP_DIRECT( SENSITIVE );
MAP_DIRECT( SHOWING );
MAP_DIRECT( SINGLE_LINE );
MAP_DIRECT( STALE );
MAP_DIRECT( TRANSIENT );
MAP_DIRECT( VERTICAL );
MAP_DIRECT( VISIBLE );
MAP_DIRECT( DEFAULT ); // a spelling error ... case accessibility::AccessibleStateType::DEFUNC:
type = ATK_STATE_DEFUNCT; break; case accessibility::AccessibleStateType::MULTI_SELECTABLE:
type = ATK_STATE_MULTISELECTABLE; break; default: //Mis-use ATK_STATE_LAST_DEFINED to check if a state is unmapped //NOTE! Do not report it
type = ATK_STATE_LAST_DEFINED; break;
}
return type;
}
static AtkRole mapToAtkRole(sal_Int16 nRole, sal_Int64 nStates)
{ switch (nRole)
{ case accessibility::AccessibleRole::UNKNOWN: return ATK_ROLE_UNKNOWN; case accessibility::AccessibleRole::ALERT: return ATK_ROLE_ALERT; case accessibility::AccessibleRole::BLOCK_QUOTE: return ATK_ROLE_BLOCK_QUOTE; case accessibility::AccessibleRole::COLUMN_HEADER: return ATK_ROLE_COLUMN_HEADER; case accessibility::AccessibleRole::CANVAS: return ATK_ROLE_CANVAS; case accessibility::AccessibleRole::CHECK_BOX: return ATK_ROLE_CHECK_BOX; case accessibility::AccessibleRole::CHECK_MENU_ITEM: return ATK_ROLE_CHECK_MENU_ITEM; case accessibility::AccessibleRole::COLOR_CHOOSER: return ATK_ROLE_COLOR_CHOOSER; case accessibility::AccessibleRole::COMBO_BOX: return ATK_ROLE_COMBO_BOX; case accessibility::AccessibleRole::DATE_EDITOR: return ATK_ROLE_DATE_EDITOR; case accessibility::AccessibleRole::DESKTOP_ICON: return ATK_ROLE_DESKTOP_ICON; case accessibility::AccessibleRole::DESKTOP_PANE: return ATK_ROLE_DESKTOP_FRAME; case accessibility::AccessibleRole::DIRECTORY_PANE: return ATK_ROLE_DIRECTORY_PANE; case accessibility::AccessibleRole::DIALOG: return ATK_ROLE_DIALOG; case accessibility::AccessibleRole::DOCUMENT: return ATK_ROLE_DOCUMENT_FRAME; case accessibility::AccessibleRole::EMBEDDED_OBJECT: return ATK_ROLE_EMBEDDED; case accessibility::AccessibleRole::END_NOTE: return ATK_ROLE_FOOTNOTE; case accessibility::AccessibleRole::FILE_CHOOSER: return ATK_ROLE_FILE_CHOOSER; case accessibility::AccessibleRole::FILLER: return ATK_ROLE_FILLER; case accessibility::AccessibleRole::FONT_CHOOSER: return ATK_ROLE_FONT_CHOOSER; case accessibility::AccessibleRole::FOOTER: return ATK_ROLE_FOOTER; case accessibility::AccessibleRole::FOOTNOTE: return ATK_ROLE_FOOTNOTE; case accessibility::AccessibleRole::FRAME: return ATK_ROLE_FRAME; case accessibility::AccessibleRole::GLASS_PANE: return ATK_ROLE_GLASS_PANE; case accessibility::AccessibleRole::GRAPHIC: return ATK_ROLE_IMAGE; case accessibility::AccessibleRole::GROUP_BOX: return ATK_ROLE_GROUPING; case accessibility::AccessibleRole::HEADER: return ATK_ROLE_HEADER; case accessibility::AccessibleRole::HEADING: return ATK_ROLE_HEADING; case accessibility::AccessibleRole::HYPER_LINK: return ATK_ROLE_LINK; case accessibility::AccessibleRole::ICON: return ATK_ROLE_ICON; case accessibility::AccessibleRole::INTERNAL_FRAME: return ATK_ROLE_INTERNAL_FRAME; case accessibility::AccessibleRole::LABEL: return ATK_ROLE_LABEL; case accessibility::AccessibleRole::LAYERED_PANE: return ATK_ROLE_LAYERED_PANE; case accessibility::AccessibleRole::LIST: return ATK_ROLE_LIST; case accessibility::AccessibleRole::LIST_ITEM: return ATK_ROLE_LIST_ITEM; case accessibility::AccessibleRole::MENU: return ATK_ROLE_MENU; case accessibility::AccessibleRole::MENU_BAR: return ATK_ROLE_MENU_BAR; case accessibility::AccessibleRole::MENU_ITEM: return ATK_ROLE_MENU_ITEM; case accessibility::AccessibleRole::OPTION_PANE: return ATK_ROLE_OPTION_PANE; case accessibility::AccessibleRole::PAGE_TAB: return ATK_ROLE_PAGE_TAB; case accessibility::AccessibleRole::PAGE_TAB_LIST: return ATK_ROLE_PAGE_TAB_LIST; case accessibility::AccessibleRole::PANEL: return ATK_ROLE_PANEL; case accessibility::AccessibleRole::PARAGRAPH: return ATK_ROLE_PARAGRAPH; case accessibility::AccessibleRole::PASSWORD_TEXT: return ATK_ROLE_PASSWORD_TEXT; case accessibility::AccessibleRole::POPUP_MENU: return ATK_ROLE_POPUP_MENU; case accessibility::AccessibleRole::PUSH_BUTTON: return ATK_ROLE_PUSH_BUTTON; case accessibility::AccessibleRole::PROGRESS_BAR: return ATK_ROLE_PROGRESS_BAR; case accessibility::AccessibleRole::RADIO_BUTTON: return ATK_ROLE_RADIO_BUTTON; case accessibility::AccessibleRole::RADIO_MENU_ITEM: return ATK_ROLE_RADIO_MENU_ITEM; case accessibility::AccessibleRole::ROW_HEADER: return ATK_ROLE_ROW_HEADER; case accessibility::AccessibleRole::ROOT_PANE: return ATK_ROLE_ROOT_PANE; case accessibility::AccessibleRole::SCROLL_BAR: return ATK_ROLE_SCROLL_BAR; case accessibility::AccessibleRole::SCROLL_PANE: return ATK_ROLE_SCROLL_PANE; case accessibility::AccessibleRole::SHAPE: return ATK_ROLE_PANEL; case accessibility::AccessibleRole::SEPARATOR: return ATK_ROLE_SEPARATOR; case accessibility::AccessibleRole::SLIDER: return ATK_ROLE_SLIDER; case accessibility::AccessibleRole::SPIN_BOX: return ATK_ROLE_SPIN_BUTTON; case accessibility::AccessibleRole::SPLIT_PANE: return ATK_ROLE_SPLIT_PANE; case accessibility::AccessibleRole::STATUS_BAR: return ATK_ROLE_STATUSBAR; case accessibility::AccessibleRole::TABLE: return ATK_ROLE_TABLE; case accessibility::AccessibleRole::TABLE_CELL: return ATK_ROLE_TABLE_CELL; case accessibility::AccessibleRole::TEXT: return ATK_ROLE_TEXT; case accessibility::AccessibleRole::TEXT_FRAME: return ATK_ROLE_PANEL; case accessibility::AccessibleRole::TOGGLE_BUTTON: return ATK_ROLE_TOGGLE_BUTTON; case accessibility::AccessibleRole::TOOL_BAR: return ATK_ROLE_TOOL_BAR; case accessibility::AccessibleRole::TOOL_TIP: return ATK_ROLE_TOOL_TIP; case accessibility::AccessibleRole::TREE: return ATK_ROLE_TREE; case accessibility::AccessibleRole::VIEW_PORT: return ATK_ROLE_VIEWPORT; case accessibility::AccessibleRole::WINDOW: return ATK_ROLE_WINDOW; case accessibility::AccessibleRole::BUTTON_DROPDOWN:
{ if (nStates & css::accessibility::AccessibleStateType::CHECKABLE) return ATK_ROLE_TOGGLE_BUTTON; return ATK_ROLE_PUSH_BUTTON;
} case accessibility::AccessibleRole::BUTTON_MENU: #if ATK_CHECK_VERSION(2, 46, 0) return ATK_ROLE_PUSH_BUTTON_MENU; #else return ATK_ROLE_PUSH_BUTTON; #endif case accessibility::AccessibleRole::CAPTION: return ATK_ROLE_CAPTION; case accessibility::AccessibleRole::CHART: return ATK_ROLE_CHART; case accessibility::AccessibleRole::EDIT_BAR: return ATK_ROLE_EDITBAR; case accessibility::AccessibleRole::FORM: return ATK_ROLE_FORM; case accessibility::AccessibleRole::IMAGE_MAP: return ATK_ROLE_IMAGE_MAP; case accessibility::AccessibleRole::NOTE: return ATK_ROLE_COMMENT; case accessibility::AccessibleRole::PAGE: return ATK_ROLE_PAGE; case accessibility::AccessibleRole::RULER: return ATK_ROLE_RULER; case accessibility::AccessibleRole::SECTION: return ATK_ROLE_SECTION; case accessibility::AccessibleRole::TREE_ITEM: return ATK_ROLE_TREE_ITEM; case accessibility::AccessibleRole::TREE_TABLE: return ATK_ROLE_TREE_TABLE; case accessibility::AccessibleRole::COMMENT: return ATK_ROLE_COMMENT; case accessibility::AccessibleRole::COMMENT_END: return ATK_ROLE_UNKNOWN; case accessibility::AccessibleRole::DOCUMENT_PRESENTATION: return ATK_ROLE_DOCUMENT_PRESENTATION; case accessibility::AccessibleRole::DOCUMENT_SPREADSHEET: return ATK_ROLE_DOCUMENT_SPREADSHEET; case accessibility::AccessibleRole::DOCUMENT_TEXT: return ATK_ROLE_DOCUMENT_TEXT; case accessibility::AccessibleRole::STATIC: return ATK_ROLE_STATIC; case accessibility::AccessibleRole::NOTIFICATION: return ATK_ROLE_NOTIFICATION; default:
SAL_WARN("vcl.gtk", "Unmapped accessible role: " << nRole); return ATK_ROLE_UNKNOWN;
}
}
const OUString sLocale
= aLocale.Language + u"_" + aLocale.Country + u"." + OUString::fromUtf8(pCharset); char* pLocale = g_strdup(sLocale.toUtf8().getStr()); // set pLocale as object data so it can be freed in atk_object_wrapper_finalize
g_free(g_object_get_data(G_OBJECT(pWrapper), PROPERTY_LOCALE));
g_object_set_data(G_OBJECT(pWrapper), PROPERTY_LOCALE, pLocale); return pLocale;
}
//if we're a native GtkDrawingArea with custom a11y, use the default toolkit a11y if (obj->mpOrig) return atk_object_get_index_in_parent(obj->mpOrig);
gint i = -1;
if( obj->mpContext.is() )
{ try {
sal_Int64 nIndex = obj->mpContext->getAccessibleIndexInParent(); if (nIndex > std::numeric_limits<gint>::max() ||
nIndex < std::numeric_limits<gint>::min())
{ // use -2 when the child index is too large to fit into 32 bit to neither use the // valid index of another child nor -1, which would e.g. make Orca interpret the // object as being a zombie
SAL_WARN("vcl.gtk", "wrapper_get_index_in_parent: Child index exceeds maximum gint value, " "returning -2.");
nIndex = -2;
}
i = nIndex;
} catch(const uno::Exception&) {
g_warning( "Exception in getAccessibleIndexInParent()" );
}
} return i;
}
//if we're a native GtkDrawingArea with custom a11y, use the default toolkit relation set impl if (obj->mpOrig) return atk_object_ref_relation_set(obj->mpOrig);
if( obj->mpContext.is() )
{ try {
sal_Int64 nStateSet = obj->mpContext->getAccessibleStateSet(); 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
sal_Int64 nState = sal_Int64(1) << i; if ((nStateSet & nState) && mapAtkState(nState) != ATK_STATE_LAST_DEFINED)
atk_state_set_add_state(pSet, mapAtkState(nState));
}
}
AtkObjectClass* orig_atk_klass = static_cast<AtkObjectClass*>(g_type_class_ref(ATK_TYPE_OBJECT)); // tdf#150496 we want to inherit from GtkAccessible because gtk assumes it can cast to GtkAccessible // but we want the original behaviour we got from atk_object_real_get_parent when we inherited // from AtkObject
atk_class->get_parent = orig_atk_klass->get_parent; // and likewise for focus_event
atk_class->focus_event = orig_atk_klass->focus_event;
g_type_class_unref(orig_atk_klass);
}
// Whether AtkTableCell can be supported for the interface. // Returns true if the corresponding XAccessible has role TABLE_CELL // and an XAccessibleTable as parent. staticbool isTableCell(uno::XInterface* pInterface)
{
g_return_val_if_fail(pInterface != nullptr, false);
try { auto aType = cppu::UnoType<accessibility::XAccessible>::get().getTypeLibType();
uno::Any aAcc = pInterface->queryInterface(aType);
css::uno::Reference<css::accessibility::XAccessible> xAcc;
aAcc >>= xAcc; if (!xAcc.is()) returnfalse;
for( i = 0; i < aTypeTableSize; i++ )
{ if (aTypeTable[i].sName == "Cell")
{ // there is no UNO interface for table cells, but AtkTableCell can be supported // for table cells via the methods of the parent that is a table if (isTableCell(pAccessible))
{
aTypeNameBuf.append(aTypeTable[i].sName);
bTypes[i] = true;
}
} elseif (isOfType( pAccessible, aTypeTable[i].aGetUnoType() ) )
{
aTypeNameBuf.append(aTypeTable[i].sName);
bTypes[i] = true;
}
}
if( parent )
g_object_ref( atk_obj->accessible_parent ); else
{ /* gail_focus_tracker remembers the focused object at the first * parent in the hierarchy that is a Gtk+ widget, but at the time the * event gets processed (at idle), it may be too late to create the * hierarchy, so doing it now ..
*/
uno::Reference< accessibility::XAccessible > xParent( xContext->getAccessibleParent() );
// tdf#141197 if we have a sysobj child then include that in the hierarchy
rtl::Reference<VCLXAccessibleComponent> pVCLAccComponent
= dynamic_cast<VCLXAccessibleComponent*>(rxAccessible->getAccessibleContext().get()); if (pVCLAccComponent.is())
{
VclPtr<vcl::Window> xWindow = pVCLAccComponent->GetWindow(); if (xWindow && xWindow->GetType() == WindowType::SYSTEMCHILDWINDOW)
{ const SystemEnvData* pEnvData = static_cast<SystemChildWindow*>(xWindow.get())->GetSystemData(); if (GtkWidget *pSysObj = pEnvData ? static_cast<GtkWidget*>(pEnvData->pWidget) : nullptr)
{
pWrap->mpSysObjChild = gtk_widget_get_accessible(pSysObj);
AtkObject* pParent = atk_object_wrapper_ref(xWindow->GetAccessible()); if (pParent)
{
atk_object_set_parent(pWrap->mpSysObjChild, pParent);
g_object_unref(pParent);
}
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.