Revision control
++ // Copyright (C) 2022 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
++
++ #ifndef QACCESSIBLE_BASE_H
++ #define QACCESSIBLE_BASE_H
++
++ #include <QtGui/qtguiglobal.h>
++ #if QT_CONFIG(accessibility)
++
++ #if 0
++ // QAccessible class is handled in qaccessible.h
++ #pragma qt_sync_stop_processing
++ #endif
++
++ #include <QtCore/qobjectdefs.h>
++
++ #include <cstring> // memset, memcmp
++
++ QT_BEGIN_NAMESPACE
++
++ class QAccessibleInterface;
++ class QAccessibleEvent;
++ class QTextCursor;
++
++ class Q_GUI_EXPORT QAccessible
++ {
++ Q_GADGET
++ public:
++
++ enum Event {
++ SoundPlayed = 0x0001,
++ Alert = 0x0002,
++ ForegroundChanged = 0x0003,
++ MenuStart = 0x0004,
++ MenuEnd = 0x0005,
++ PopupMenuStart = 0x0006,
++ PopupMenuEnd = 0x0007,
++ ContextHelpStart = 0x000C,
++ ContextHelpEnd = 0x000D,
++ DragDropStart = 0x000E,
++ DragDropEnd = 0x000F,
++ DialogStart = 0x0010,
++ DialogEnd = 0x0011,
++ ScrollingStart = 0x0012,
++ ScrollingEnd = 0x0013,
++ ScrollingPositionChanged = 0x0014,
++
++ MenuCommand = 0x0018,
++
++ // Values from IAccessible2
++ ActionChanged = 0x0101,
++ ActiveDescendantChanged = 0x0102,
++ AttributeChanged = 0x0103,
++ DocumentContentChanged = 0x0104,
++ DocumentLoadComplete = 0x0105,
++ DocumentLoadStopped = 0x0106,
++ DocumentReload = 0x0107,
++ HyperlinkEndIndexChanged = 0x0108,
++ HyperlinkNumberOfAnchorsChanged = 0x0109,
++ HyperlinkSelectedLinkChanged = 0x010A,
++ HypertextLinkActivated = 0x010B,
++ HypertextLinkSelected = 0x010C,
++ HyperlinkStartIndexChanged = 0x010D,
++ HypertextChanged = 0x010E,
++ HypertextNLinksChanged = 0x010F,
++ ObjectAttributeChanged = 0x0110,
++ PageChanged = 0x0111,
++ SectionChanged = 0x0112,
++ TableCaptionChanged = 0x0113,
++ TableColumnDescriptionChanged = 0x0114,
++ TableColumnHeaderChanged = 0x0115,
++ TableModelChanged = 0x0116,
++ TableRowDescriptionChanged = 0x0117,
++ TableRowHeaderChanged = 0x0118,
++ TableSummaryChanged = 0x0119,
++ TextAttributeChanged = 0x011A,
++ TextCaretMoved = 0x011B,
++ // TextChanged = 0x011C, is deprecated in IA2, use TextUpdated
++ TextColumnChanged = 0x011D,
++ TextInserted = 0x011E,
++ TextRemoved = 0x011F,
++ TextUpdated = 0x0120,
++ TextSelectionChanged = 0x0121,
++ VisibleDataChanged = 0x0122,
++
++ ObjectCreated = 0x8000,
++ ObjectDestroyed = 0x8001,
++ ObjectShow = 0x8002,
++ ObjectHide = 0x8003,
++ ObjectReorder = 0x8004,
++ Focus = 0x8005,
++ Selection = 0x8006,
++ SelectionAdd = 0x8007,
++ SelectionRemove = 0x8008,
++ SelectionWithin = 0x8009,
++ StateChanged = 0x800A,
++ LocationChanged = 0x800B,
++ NameChanged = 0x800C,
++ DescriptionChanged = 0x800D,
++ ValueChanged = 0x800E,
++ ParentChanged = 0x800F,
++ HelpChanged = 0x80A0,
++ DefaultActionChanged = 0x80B0,
++ AcceleratorChanged = 0x80C0,
++ Announcement = 0x80D0,
++ IdentifierChanged = 0x80E0,
++ RoleChanged = 0x80E1,
++
++ // was declared after AcceleratorChanged, without explicit value
++ InvalidEvent = AcceleratorChanged + 1,
++ };
++ Q_ENUM(Event)
++
++ // 64 bit enums seem hard on some platforms (windows...)
++ // which makes using a bit field a sensible alternative
++ struct State {
++ quint64 disabled : 1; // used to be Unavailable
++ quint64 selected : 1;
++ quint64 focusable : 1;
++ quint64 focused : 1;
++ quint64 pressed : 1;
++ quint64 checkable : 1;
++ quint64 checked : 1;
++ quint64 checkStateMixed : 1; // used to be Mixed
++ quint64 readOnly : 1;
++ quint64 hotTracked : 1;
++ quint64 defaultButton : 1;
++ quint64 expanded : 1;
++ quint64 collapsed : 1;
++ quint64 busy : 1;
++ quint64 expandable : 1;
++ quint64 marqueed : 1;
++ quint64 animated : 1;
++ quint64 invisible : 1;
++ quint64 offscreen : 1;
++ quint64 sizeable : 1;
++ quint64 movable : 1;
++ quint64 selfVoicing : 1;
++ quint64 selectable : 1;
++ quint64 linked : 1;
++ quint64 traversed : 1;
++ quint64 multiSelectable : 1;
++ quint64 extSelectable : 1;
++ quint64 passwordEdit : 1; // used to be Protected
++ quint64 hasPopup : 1;
++ quint64 modal : 1;
++
++ // IA2 - we chose to not add some IA2 states for now
++ // Below the ones that seem helpful
++ quint64 active : 1;
++ quint64 invalid : 1; // = defunct
++ quint64 editable : 1;
++ quint64 multiLine : 1;
++ quint64 selectableText : 1;
++ quint64 supportsAutoCompletion : 1;
++
++ quint64 searchEdit : 1;
++
++ // quint64 invalidEntry : 1;
++ // quint64 managesDescendants : 1;
++ // quint64 singleLine : 1; // we have multi line, this is redundant.
++ // quint64 stale : 1;
++ // quint64 transient : 1;
++ // quint64 pinned : 1;
++
++ // quint64 playsSound : 1;
++ // quint64 summaryElement : 1;
++ // quint64 updatesFrequently : 1;
++ // quint64 adjustable : 1;
++ // more and not included here: http://developer.apple.com/library/mac/#documentation/UserExperience/Reference/Accessibility_RoleAttribute_Ref/Attributes.html
++
++ // MSAA
++ // quint64 alertLow : 1;
++ // quint64 alertMedium : 1;
++ // quint64 alertHigh : 1;
++
++ Q_DECL_UNUSED_MEMBER quint64 qt_reserved : 27;
++
++ State() {
++ std::memset(this, 0, sizeof(State));
++ }
++ friend inline bool operator==(const QAccessible::State &first, const QAccessible::State &second)
++ {
++ static_assert(std::has_unique_object_representations_v<State>,
++ "memcmp() cannot be used on types with padding");
++ return std::memcmp(&first, &second, sizeof(QAccessible::State)) == 0;
++ }
++ };
++
++
++
++
++
++ enum Role {
++ NoRole = 0x00000000,
++ TitleBar = 0x00000001,
++ MenuBar = 0x00000002,
++ ScrollBar = 0x00000003,
++ Grip = 0x00000004,
++ Sound = 0x00000005,
++ Cursor = 0x00000006,
++ Caret = 0x00000007,
++ AlertMessage = 0x00000008,
++ Window = 0x00000009,
++ Client = 0x0000000A,
++ PopupMenu = 0x0000000B,
++ MenuItem = 0x0000000C,
++ ToolTip = 0x0000000D,
++ Application = 0x0000000E,
++ Document = 0x0000000F,
++ Pane = 0x00000010,
++ Chart = 0x00000011,
++ Dialog = 0x00000012,
++ Border = 0x00000013,
++ Grouping = 0x00000014,
++ Separator = 0x00000015,
++ ToolBar = 0x00000016,
++ StatusBar = 0x00000017,
++ Table = 0x00000018,
++ ColumnHeader = 0x00000019,
++ RowHeader = 0x0000001A,
++ Column = 0x0000001B,
++ Row = 0x0000001C,
++ Cell = 0x0000001D,
++ Link = 0x0000001E,
++ HelpBalloon = 0x0000001F,
++ Assistant = 0x00000020,
++ List = 0x00000021,
++ ListItem = 0x00000022,
++ Tree = 0x00000023,
++ TreeItem = 0x00000024,
++ PageTab = 0x00000025,
++ PropertyPage = 0x00000026,
++ Indicator = 0x00000027,
++ Graphic = 0x00000028,
++ StaticText = 0x00000029,
++ EditableText = 0x0000002A, // Editable, selectable, etc.
++ Button = 0x0000002B,
++ #ifndef Q_QDOC
++ PushButton = Button, // deprecated
++ #endif
++ CheckBox = 0x0000002C,
++ RadioButton = 0x0000002D,
++ ComboBox = 0x0000002E,
++ // DropList = 0x0000002F,
++ ProgressBar = 0x00000030,
++ Dial = 0x00000031,
++ HotkeyField = 0x00000032,
++ Slider = 0x00000033,
++ SpinBox = 0x00000034,
++ Canvas = 0x00000035, // MSAA: ROLE_SYSTEM_DIAGRAM - The object represents a graphical image that is used to diagram data.
++ Animation = 0x00000036,
++ Equation = 0x00000037,
++ ButtonDropDown = 0x00000038, // The object represents a button that expands a grid.
++ ButtonMenu = 0x00000039,
++ ButtonDropGrid = 0x0000003A,
++ Whitespace = 0x0000003B, // The object represents blank space between other objects.
++ PageTabList = 0x0000003C,
++ Clock = 0x0000003D,
++ Splitter = 0x0000003E,
++ // Reserved space in case MSAA roles needs to be added
++
++ // Additional Qt roles where enum value does not map directly to MSAA:
++ LayeredPane = 0x00000080,
++ Terminal = 0x00000081,
++ Desktop = 0x00000082,
++ Paragraph = 0x00000083,
++ WebDocument = 0x00000084,
++ Section = 0x00000085,
++ Notification = 0x00000086,
++ Switch = 0x00000087,
++
++ // IAccessible2 roles
++ // IA2_ROLE_CANVAS = 0x401, // An object that can be drawn into and to manage events from the objects drawn into it
++ // IA2_ROLE_CAPTION = 0x402,
++ // IA2_ROLE_CHECK_MENU_ITEM = 0x403,
++ ColorChooser = 0x404,
++ // IA2_ROLE_DATE_EDITOR = 0x405,
++ // IA2_ROLE_DESKTOP_ICON = 0x406,
++ // IA2_ROLE_DESKTOP_PANE = 0x407,
++ // IA2_ROLE_DIRECTORY_PANE = 0x408,
++ // IA2_ROLE_EDITBAR = 0x409,
++ // IA2_ROLE_EMBEDDED_OBJECT = 0x40A,
++ // IA2_ROLE_ENDNOTE = 0x40B,
++ // IA2_ROLE_FILE_CHOOSER = 0x40C,
++ // IA2_ROLE_FONT_CHOOSER = 0x40D,
++ Footer = 0x40E,
++ // IA2_ROLE_FOOTNOTE = 0x40F,
++ Form = 0x410,
++ // some platforms (windows and at-spi) use Frame for regular windows
++ // because window was taken for tool/dock windows by MSAA
++ // Frame = 0x411,
++ // IA2_ROLE_GLASS_PANE = 0x412,
++ // IA2_ROLE_HEADER = 0x413,
++ Heading = 0x414,
++ // IA2_ROLE_ICON = 0x415,
++ // IA2_ROLE_IMAGE_MAP = 0x416,
++ // IA2_ROLE_INPUT_METHOD_WINDOW = 0x417,
++ // IA2_ROLE_INTERNAL_FRAME = 0x418,
++ // IA2_ROLE_LABEL = 0x419,
++ // IA2_ROLE_LAYERED_PANE = 0x41A,
++ Note = 0x41B,
++ // IA2_ROLE_OPTION_PANE = 0x41C,
++ // IA2_ROLE_PAGE = 0x41D,
++ // IA2_ROLE_PARAGRAPH = 0x42E,
++ // IA2_ROLE_RADIO_MENU_ITEM = 0x41F,
++ // IA2_ROLE_REDUNDANT_OBJECT = 0x420,
++ // IA2_ROLE_ROOT_PANE = 0x421,
++ // IA2_ROLE_RULER = 0x422,
++ // IA2_ROLE_SCROLL_PANE = 0x423,
++ // IA2_ROLE_SECTION = 0x424,
++ // IA2_ROLE_SHAPE = 0x425,
++ // IA2_ROLE_SPLIT_PANE = 0x426,
++ // IA2_ROLE_TEAR_OFF_MENU = 0x427,
++ // IA2_ROLE_TERMINAL = 0x428,
++ // IA2_ROLE_TEXT_FRAME = 0x429,
++ // IA2_ROLE_TOGGLE_BUTTON = 0x42A,
++ // IA2_ROLE_VIEW_PORT = 0x42B,
++ ComplementaryContent = 0x42C,
++ // IA2_ROLE_LANDMARK = 0x42D,
++ // IA2_ROLE_LEVEL_BAR = 0x42E,
++ // IA2_ROLE_CONTENT_DELETION = 0x42F,
++ // IA2_ROLE_CONTENT_INSERTION = 0x430,
++ BlockQuote = 0x431,
++ // IA2_ROLE_MARK = 0x432,
++ // IA2_ROLE_SUGGESTION = 0x433,
++ // IA2_ROLE_COMMENT = = 0x434,
++
++ UserRole = 0x0000ffff
++ };
++ Q_ENUM(Role)
++
++ enum Text {
++ Name = 0,
++ Description,
++ Value,
++ Help,
++ Accelerator,
++ DebugDescription,
++ Identifier,
++ UserText = 0x0000ffff
++ };
++
++ enum RelationFlag {
++ Label = 0x00000001,
++ Labelled = 0x00000002,
++ Controller = 0x00000004,
++ Controlled = 0x00000008,
++ DescriptionFor = 0x00000010,
++ Described = 0x00000020,
++ FlowsFrom = 0x00000040,
++ FlowsTo = 0x00000080,
++ AllRelations = 0xffffffff
++ };
++ Q_DECLARE_FLAGS(Relation, RelationFlag)
++
++ enum InterfaceType
++ {
++ TextInterface,
++ EditableTextInterface,
++ ValueInterface,
++ ActionInterface,
++ ImageInterface,
++ TableInterface,
++ TableCellInterface,
++ HyperlinkInterface,
++ SelectionInterface,
++ AttributesInterface,
++ ViewportInterface,
++ };
++
++ enum TextBoundaryType {
++ CharBoundary,
++ WordBoundary,
++ SentenceBoundary,
++ ParagraphBoundary,
++ LineBoundary,
++ NoBoundary
++ };
++
++ enum class Attribute {
++ Custom,
++ Level,
++ Locale,
++ Orientation,
++ PositionInSet,
++ SizeOfSet,
++ };
++ Q_ENUM(Attribute)
++
++ enum class AnnouncementPoliteness {
++ Polite,
++ Assertive,
++ };
++ Q_ENUM(AnnouncementPoliteness)
++
++ typedef QAccessibleInterface*(*InterfaceFactory)(const QString &key, QObject*);
++ typedef void(*UpdateHandler)(QAccessibleEvent *event);
++ typedef void(*RootObjectHandler)(QObject*);
++
++ typedef unsigned Id;
++
++ static void installFactory(InterfaceFactory);
++ static void removeFactory(InterfaceFactory);
++ static UpdateHandler installUpdateHandler(UpdateHandler);
++ static RootObjectHandler installRootObjectHandler(RootObjectHandler);
++
++ class Q_GUI_EXPORT ActivationObserver
++ {
++ public:
++ virtual ~ActivationObserver();
++ virtual void accessibilityActiveChanged(bool active) = 0;
++ };
++ static void installActivationObserver(ActivationObserver *);
++ static void removeActivationObserver(ActivationObserver *);
++
++ static QAccessibleInterface *queryAccessibleInterface(QObject *);
++ static Id uniqueId(QAccessibleInterface *iface);
++ static QAccessibleInterface *accessibleInterface(Id uniqueId);
++ static Id registerAccessibleInterface(QAccessibleInterface *iface);
++ static void deleteAccessibleInterface(Id uniqueId);
++
++ static void updateAccessibility(QAccessibleEvent *event);
++
++ static bool isActive();
++ static void setActive(bool active);
++ static void setRootObject(QObject *object);
++
++ static void cleanup();
++
++ static std::pair< int, int > qAccessibleTextBoundaryHelper(const QTextCursor &cursor, TextBoundaryType boundaryType);
++
++ private:
++ static UpdateHandler updateHandler;
++ static RootObjectHandler rootObjectHandler;
++
++ QAccessible() {}
++
++ friend class QAccessibleCache;
++ };
++
++ Q_DECLARE_OPERATORS_FOR_FLAGS(QAccessible::Relation)
++
++ QT_END_NAMESPACE
++
++ #endif // QT_CONFIG(accessibility)
++ #endif // QACCESSIBLE_BASE_H