File indexing completed on 2023-12-03 11:41:04

0001 /*
0002     SPDX-FileCopyrightText: 2012 Frederik Gladhorn <gladhorn@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #ifndef QACCESSIBILITYCLIENT_REGISTRY_P_H
0008 #define QACCESSIBILITYCLIENT_REGISTRY_P_H
0009 
0010 #include <atspi/atspi-constants.h>
0011 
0012 #include <QObject>
0013 #include <QMap>
0014 #include <QDBusContext>
0015 #include <QDBusArgument>
0016 #include <QSignalMapper>
0017 #include <QSharedPointer>
0018 
0019 #include "atspi/dbusconnection.h"
0020 #include "qaccessibilityclient/registry.h"
0021 #include "qaccessibilityclient/accessibleobject.h"
0022 #include "qaccessibilityclient/accessibleobject_p.h"
0023 #include "atspi/qt-atspi.h"
0024 #include "cachestrategy_p.h"
0025 
0026 class QDBusPendingCallWatcher;
0027 
0028 namespace QAccessibleClient {
0029 
0030 class DBusConnection;
0031 class AtSpiDBus;
0032 
0033 class RegistryPrivate :public QObject, public QDBusContext
0034 {
0035     Q_OBJECT
0036 public:
0037     RegistryPrivate(Registry *qq);
0038 
0039     void init();
0040 
0041     bool isEnabled() const;
0042     void setEnabled(bool enable);
0043     bool isScreenReaderEnabled() const;
0044     void setScreenReaderEnabled(bool enable);
0045 
0046     QUrl url(const AccessibleObject &object) const;
0047     AccessibleObject fromUrl(const QUrl &url) const;
0048 
0049     void subscribeEventListeners(const Registry::EventListeners & listeners);
0050     Registry::EventListeners eventListeners() const;
0051 
0052     QString accessibleId(const AccessibleObject &object) const;
0053     QString name(const AccessibleObject &object) const;
0054     QString description(const AccessibleObject &object) const;
0055     AccessibleObject::Role role(const AccessibleObject &object) const;
0056     QString roleName(const AccessibleObject &object) const;
0057     QString localizedRoleName(const AccessibleObject &object) const;
0058     quint64 state(const AccessibleObject &object) const;
0059     int layer(const AccessibleObject &object) const;
0060     int mdiZOrder(const AccessibleObject &object) const;
0061     double alpha(const AccessibleObject &object) const;
0062     QRect boundingRect(const AccessibleObject &object) const;
0063     QRect characterRect(const AccessibleObject &object, int offset) const;
0064     AccessibleObject::Interfaces supportedInterfaces(const AccessibleObject &object) const;
0065 
0066     int caretOffset(const AccessibleObject &object) const;
0067     int characterCount(const AccessibleObject &object) const;
0068     QList< QPair<int,int> > textSelections(const AccessibleObject &object) const;
0069     void setTextSelections(const AccessibleObject &object, const QList< QPair<int,int> > &selections);
0070     QString text(const AccessibleObject &object, int startOffset = 0, int endOffset = -1) const;
0071     QString textWithBoundary(const AccessibleObject &object, int offset, AccessibleObject::TextBoundary boundary, int *startOffset, int *endOffset) const;
0072 
0073     bool setText(const AccessibleObject &object, const QString &text);
0074     bool insertText(const AccessibleObject &object, const QString &text, int position, int length = -1);
0075     bool copyText(const AccessibleObject &object, int startPos, int endPos);
0076     bool cutText(const AccessibleObject &object, int startPos, int endPos);
0077     bool deleteText(const AccessibleObject &object, int startPos, int endPos);
0078     bool pasteText(const AccessibleObject &object, int position);
0079 
0080     AccessibleObject application(const AccessibleObject &object) const;
0081     QString appToolkitName(const AccessibleObject &object) const;
0082     QString appVersion(const AccessibleObject &object) const;
0083     int appId(const AccessibleObject &object) const;
0084     QString appLocale(const AccessibleObject &object, uint lctype) const;
0085     QString appBusAddress(const AccessibleObject &object) const;
0086 
0087     double minimumValue(const AccessibleObject &object) const;
0088     double maximumValue(const AccessibleObject &object) const;
0089     double minimumValueIncrement(const AccessibleObject &object) const;
0090     double currentValue(const AccessibleObject &object) const;
0091     bool setCurrentValue(const AccessibleObject &object, double value);
0092 
0093     QList<AccessibleObject> selection(const AccessibleObject &object) const;
0094 
0095     QString imageDescription(const AccessibleObject &object) const;
0096     QString imageLocale(const AccessibleObject &object) const;
0097     QRect imageRect(const AccessibleObject &object) const;
0098 
0099     QVector< QSharedPointer<QAction> > actions(const AccessibleObject &object);
0100 
0101     QList<AccessibleObject> topLevelAccessibles() const;
0102     AccessibleObject parentAccessible(const AccessibleObject &object) const;
0103 
0104     int childCount(const AccessibleObject &object) const;
0105     int indexInParent(const AccessibleObject &object) const;
0106     AccessibleObject child(const AccessibleObject &object, int index) const;
0107     QList<AccessibleObject> children(const AccessibleObject &object) const;
0108 
0109     static QString ACCESSIBLE_OBJECT_SCHEME_STRING;
0110 
0111 private Q_SLOTS:
0112     AccessibleObject accessibleFromPath(const QString &service, const QString &path) const;
0113     AccessibleObject accessibleFromReference(const QSpiObjectReference &reference) const;
0114     AccessibleObject accessibleFromContext() const;
0115 
0116     void connectionFetched();
0117     void slotSubscribeEventListenerFinished(QDBusPendingCallWatcher *call);
0118     void a11yConnectionChanged(const QString &interface,const QVariantMap &changedProperties, const QStringList &invalidatedProperties);
0119 
0120     void slotPropertyChange(const QString &property, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0121     void slotWindowCreate(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0122     void slotWindowDestroy(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0123     void slotWindowClose(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0124     void slotWindowReparent(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0125     void slotWindowMinimize(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0126     void slotWindowMaximize(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0127     void slotWindowRestore(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0128     void slotWindowActivate(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0129     void slotWindowDeactivate(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0130     void slotWindowDesktopCreate(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0131     void slotWindowDesktopDestroy(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0132     void slotWindowRaise(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0133     void slotWindowLower(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0134     void slotWindowMove(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0135     void slotWindowResize(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0136     void slotWindowShade(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0137     void slotWindowUnshade(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0138 
0139     void slotStateChanged(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0140     //void slotPropertyChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0141     //void slotBoundsChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0142     //void slotLinkSelected(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0143 
0144     void slotChildrenChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0145     void slotVisibleDataChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0146     void slotSelectionChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0147     void slotModelChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0148 
0149     void slotTextCaretMoved(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0150     void slotTextSelectionChanged(const QString &state, int detail1, int detail2, const QDBusVariant &/*args*/, const QAccessibleClient::QSpiObjectReference &reference);
0151 
0152     //void slotTextBoundsChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0153     void slotTextChanged(const QString &state, int start, int end, const QDBusVariant &text, const QAccessibleClient::QSpiObjectReference &reference);
0154     //void slotTextAttributesChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0155     //void slotAttributesChanged(const QString &state, int detail1, int detail2, const QDBusVariant &args, const QAccessibleClient::QSpiObjectReference &reference);
0156 
0157     void actionTriggered(const QString &action);
0158 
0159 private:
0160     QVariant getProperty ( const QString &service, const QString &path, const QString &interface, const QString &name ) const;
0161     static AccessibleObject::Role atspiRoleToRole(AtspiRole role);
0162 
0163     DBusConnection conn;
0164     QSignalMapper m_actionMapper;
0165     Registry *q;
0166     Registry::EventListeners m_subscriptions;
0167     Registry::EventListeners m_pendingSubscriptions;
0168     QHash<QString, AccessibleObject::Interface> interfaceHash;
0169     QSignalMapper m_eventMapper;
0170     ObjectCache *m_cache;
0171 //     typedef QMap<QString, QSharedPointer<AccessibleObjectPrivate> >::Iterator AccessibleObjectsHashIterator;
0172 //     typedef QMap<QString, QSharedPointer<AccessibleObjectPrivate> >::ConstIterator AccessibleObjectsHashConstIterator;
0173 //     QMap<QString, QSharedPointer<AccessibleObjectPrivate> > accessibleObjectsHash;
0174     bool removeAccessibleObject(const QAccessibleClient::AccessibleObject &accessible);
0175     bool removeAccessibleObject(const QAccessibleClient::QSpiObjectReference &reference);
0176 
0177     friend class Registry;
0178     friend class AccessibleObject;
0179     friend class AccessibleObjectPrivate;
0180 };
0181 
0182 }
0183 
0184 #endif