QWindow *QWindowsAccessibility::windowHelper(const QAccessibleInterface *iface) { QWindow *window = iface->window(); if (!window) { QAccessibleInterface *acc = iface->parent(); while (acc && acc->isValid() && !window) { window = acc->window(); QAccessibleInterface *par = acc->parent(); acc = par; } } return window; }
void QAccessibleCache::deleteInterface(QAccessible::Id id, QObject *obj) { QAccessibleInterface *iface = idToInterface.take(id); if (!obj) obj = iface->object(); if (obj) objectToId.remove(obj); delete iface; #ifdef Q_OS_MAC removeCocoaElement(id); #endif }
static jint parentId(JNIEnv */*env*/, jobject /*thiz*/, jint objectId) { QAccessibleInterface *iface = interfaceFromId(objectId); if (iface) { QAccessibleInterface *parent = iface->parent(); if (parent) { if (parent->role() == QAccessible::Application) return -1; return QAccessible::uniqueId(parent); } } return -1; }
static jobject screenRect(JNIEnv *env, jobject /*thiz*/, jint objectId) { QRect rect; QAccessibleInterface *iface = interfaceFromId(objectId); if (iface && iface->isValid()) { rect = iface->rect(); } jclass rectClass = env->FindClass("android/graphics/Rect"); jmethodID ctor = env->GetMethodID(rectClass, "<init>", "(IIII)V"); jobject jrect = env->NewObject(rectClass, ctor, rect.left(), rect.top(), rect.right(), rect.bottom()); return jrect; }
HRESULT STDMETHODCALLTYPE QWindowsAccessible::GetWindow(HWND *phwnd) { *phwnd = 0; if (!accessible->isValid()) return E_UNEXPECTED; QObject *o = accessible->object(); if (!o || !o->isWidgetType()) return E_FAIL; *phwnd = static_cast<QWidget*>(o)->effectiveWinId(); return S_OK; }
static QWindow *window_helper(const QAccessibleInterface *iface) { QWindow *window = iface->window(); if (!window) { QAccessibleInterface *acc = iface->parent(); while (acc && !window) { window = acc->window(); QAccessibleInterface *par = acc->parent(); delete acc; acc = par; } } return window; }
// moz: [important] HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::get_accChild(VARIANT varChildID, IDispatch** ppdispChild) { accessibleDebugClientCalls(accessible); if (!accessible->isValid()) return E_FAIL; if (varChildID.vt != VT_I4) return E_INVALIDARG; int childIndex = varChildID.lVal; QAccessibleInterface *acc = 0; if (childIndex < 0) { const int entry = childIndex; QPair<QObject*, int> ref = QWindowsAccessibility::getCachedObject(entry); if (ref.first) { acc = QAccessible::queryAccessibleInterface(ref.first); if (acc && ref.second >= 0) { QAccessibleInterface *res = acc->child(ref.second); delete acc; if (!res) return E_INVALIDARG; acc = res; } } else { qWarning("get_accChild got a negative varChildID, but did not find it in cache"); } } else { if (childIndex) { acc = accessible->child(childIndex - 1); } else { // Yes, some AT clients (Active Accessibility Object Inspector) // actually ask for the same object. As a consequence, we need to clone ourselves: if (QAccessibleInterface *par = accessible->parent()) { const int indexOf = par->indexOfChild(accessible); QAccessibleInterface *clone = par->child(indexOf); delete par; acc = clone; } } } if (acc) { *ppdispChild = QWindowsAccessibility::wrap(acc); return S_OK; } return E_FAIL; }
HRESULT STDMETHODCALLTYPE QWindowsAccessible::accSelect(long flagsSelect, VARIANT varID) { showDebug(__FUNCTION__, accessible); if (!accessible->isValid()) return E_FAIL; bool res = false; AccessibleElement elem(varID.lVal, accessible); QAccessibleInterface *acc = elem.iface; if (acc) { const int entry = elem.entry; if (flagsSelect & SELFLAG_TAKEFOCUS) res = acc->doAction(SetFocus, entry, QVariantList()); if (flagsSelect & SELFLAG_TAKESELECTION) { acc->doAction(ClearSelection, 0, QVariantList()); //### bug, 0 should be entry?? res = acc->doAction(AddToSelection, entry, QVariantList()); } if (flagsSelect & SELFLAG_EXTENDSELECTION) res = acc->doAction(ExtendSelection, entry, QVariantList()); if (flagsSelect & SELFLAG_ADDSELECTION) res = acc->doAction(AddToSelection, entry, QVariantList()); if (flagsSelect & SELFLAG_REMOVESELECTION) res = acc->doAction(RemoveSelection, entry, QVariantList()); } return res ? S_OK : S_FALSE; }
HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accDefaultAction(VARIANT varID, BSTR* pszDefaultAction) { Q_UNUSED(varID); showDebug(__FUNCTION__, accessible); if (!accessible->isValid()) return E_FAIL; *pszDefaultAction = 0; if (QAccessibleActionInterface *actionIface = accessible->actionInterface()) { const QString def = actionIface->actionNames().value(0); if (!def.isEmpty()) *pszDefaultAction = QStringToBSTR(def); } return *pszDefaultAction ? S_OK : S_FALSE; }
static jint hitTest(JNIEnv */*env*/, jobject /*thiz*/, jfloat x, jfloat y) { QAccessibleInterface *root = interfaceFromId(-1); if (root) { QAccessibleInterface *child = root->childAt((int)x, (int)y); QAccessibleInterface *lastChild = 0; while (child && (child != lastChild)) { lastChild = child; child = child->childAt((int)x, (int)y); } if (lastChild) return QAccessible::uniqueId(lastChild); } return -1; }
HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accChild(VARIANT varChildID, IDispatch** ppdispChild) { showDebug(__FUNCTION__, accessible); if (!accessible->isValid()) return E_FAIL; if (varChildID.vt == VT_EMPTY) return E_INVALIDARG; int childIndex = varChildID.lVal; QAccessibleInterface *acc = 0; AccessibleElement elem(childIndex, accessible); if (elem.iface) { RelationFlag rel = elem.entry ? Child : Self; int index = elem.iface->navigate(rel, elem.entry, &acc); if (index == -1) return E_INVALIDARG; } if (acc) { QWindowsAccessible* wacc = new QWindowsAccessible(acc); wacc->QueryInterface(IID_IDispatch, (void**)ppdispChild); return S_OK; } *ppdispChild = 0; return S_FALSE; }
// moz: [important] HRESULT STDMETHODCALLTYPE QWindowsAccessible::accSelect(long flagsSelect, VARIANT varID) { Q_UNUSED(flagsSelect); Q_UNUSED(varID); showDebug(__FUNCTION__, accessible); if (!accessible->isValid()) return E_FAIL; bool res = false; /* ### Check for accessibleTableInterface() or accessibleTextInterface() ### and if there are no ia2 interfaces we should do nothing?? if (flagsSelect & SELFLAG_TAKEFOCUS) res = accessible->doAction(SetFocus, varID.lVal, QVariantList()); if (flagsSelect & SELFLAG_TAKESELECTION) { accessible->doAction(ClearSelection, 0, QVariantList()); res = accessible->doAction(AddToSelection, varID.lVal, QVariantList()); } if (flagsSelect & SELFLAG_EXTENDSELECTION) res = accessible->doAction(ExtendSelection, varID.lVal, QVariantList()); if (flagsSelect & SELFLAG_ADDSELECTION) res = accessible->doAction(AddToSelection, varID.lVal, QVariantList()); if (flagsSelect & SELFLAG_REMOVESELECTION) res = accessible->doAction(RemoveSelection, varID.lVal, QVariantList()); */ return res ? S_OK : S_FALSE; }
HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::get_accDefaultAction(VARIANT varID, BSTR* pszDefaultAction) { Q_UNUSED(varID); QAccessibleInterface *accessible = accessibleInterface(); accessibleDebugClientCalls(accessible); if (!accessible) return E_FAIL; *pszDefaultAction = 0; if (QAccessibleActionInterface *actionIface = accessible->actionInterface()) { const QString def = actionIface->actionNames().value(0); if (!def.isEmpty()) *pszDefaultAction = QStringToBSTR(def); } return *pszDefaultAction ? S_OK : S_FALSE; }
/* Properties and methods */ HRESULT STDMETHODCALLTYPE QWindowsAccessible::accDoDefaultAction(VARIANT varID) { Q_UNUSED(varID); showDebug(__FUNCTION__, accessible); if (!accessible->isValid()) return E_FAIL; if (QAccessibleActionInterface *actionIface = accessible->actionInterface()) { const QString def = actionIface->actionNames().value(0); if (!def.isEmpty()) { actionIface->doAction(def); return S_OK; } } return S_FALSE; }
/* Properties and methods */ HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::accDoDefaultAction(VARIANT varID) { Q_UNUSED(varID); QAccessibleInterface *accessible = accessibleInterface(); accessibleDebugClientCalls(accessible); if (!accessible) return E_FAIL; if (QAccessibleActionInterface *actionIface = accessible->actionInterface()) { const QString def = actionIface->actionNames().value(0); if (!def.isEmpty()) { actionIface->doAction(def); return S_OK; } } return S_FALSE; }
// moz: [important] HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accChild(VARIANT varChildID, IDispatch** ppdispChild) { showDebug(__FUNCTION__, accessible); if (!accessible->isValid()) return E_FAIL; if (varChildID.vt == VT_EMPTY) return E_INVALIDARG; int childIndex = varChildID.lVal; QAccessibleInterface *acc = 0; if (childIndex < 0) { const int entry = childIndex; QPair<QObject*, int> ref = qAccessibleRecentSentEvents()->value(entry); if (ref.first) { acc = QAccessible::queryAccessibleInterface(ref.first); if (acc && ref.second) { if (ref.second) { QAccessibleInterface *res = acc->child(ref.second - 1); delete acc; if (!res) return E_INVALIDARG; acc = res; } } } } else { if (childIndex) { acc = accessible->child(childIndex - 1); } else { // FIXME Q_ASSERT(0); } } if (acc) { QWindowsAccessible* wacc = new QWindowsAccessible(acc); wacc->QueryInterface(IID_IDispatch, (void**)ppdispChild); return S_OK; } *ppdispChild = 0; return S_FALSE; }
HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accRole(VARIANT varID, VARIANT *pvarRole) { #ifdef DEBUG_SHOW_ATCLIENT_COMMANDS showDebug(__FUNCTION__, accessible); #endif //DEBUG_SHOW_ATCLIENT_COMMANDS if (!accessible->isValid()) return E_FAIL; Role role = accessible->role(varID.lVal); if (role != NoRole) { (*pvarRole).vt = VT_I4; (*pvarRole).lVal = role; } else { (*pvarRole).vt = VT_EMPTY; } return S_OK; }
HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accName(VARIANT varID, BSTR* pszName) { #ifdef DEBUG_SHOW_ATCLIENT_COMMANDS showDebug(__FUNCTION__, accessible); #endif //DEBUG_SHOW_ATCLIENT_COMMANDS if (!accessible->isValid()) return E_FAIL; QString n = accessible->text(Name, varID.lVal); if (n.size()) { *pszName = QStringToBSTR(n); return S_OK; } *pszName = 0; return S_FALSE; }
HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accKeyboardShortcut(VARIANT varID, BSTR *pszKeyboardShortcut) { #ifdef DEBUG_SHOW_ATCLIENT_COMMANDS showDebug(__FUNCTION__, accessible); #endif //DEBUG_SHOW_ATCLIENT_COMMANDS if (!accessible->isValid()) return E_FAIL; QString sc = accessible->text(Accelerator, varID.lVal); if (sc.size()) { *pszKeyboardShortcut = QStringToBSTR(sc); return S_OK; } *pszKeyboardShortcut = 0; return S_FALSE; }
HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accDescription(VARIANT varID, BSTR* pszDescription) { #ifdef DEBUG_SHOW_ATCLIENT_COMMANDS showDebug(__FUNCTION__, accessible); #endif //DEBUG_SHOW_ATCLIENT_COMMANDS if (!accessible->isValid()) return E_FAIL; QString descr = accessible->text(Description, varID.lVal); if (descr.size()) { *pszDescription = QStringToBSTR(descr); return S_OK; } *pszDescription = 0; return S_FALSE; }
HRESULT STDMETHODCALLTYPE QWindowsAccessible::accSelect(long flagsSelect, VARIANT varID) { #ifdef DEBUG_SHOW_ATCLIENT_COMMANDS showDebug(__FUNCTION__, accessible); #endif //DEBUG_SHOW_ATCLIENT_COMMANDS if (!accessible->isValid()) return E_FAIL; bool res = false; if (flagsSelect & SELFLAG_TAKEFOCUS) res = accessible->doAction(SetFocus, varID.lVal, QVariantList()); if (flagsSelect & SELFLAG_TAKESELECTION) { accessible->doAction(ClearSelection, 0, QVariantList()); res = accessible->doAction(AddToSelection, varID.lVal, QVariantList()); } if (flagsSelect & SELFLAG_EXTENDSELECTION) res = accessible->doAction(ExtendSelection, varID.lVal, QVariantList()); if (flagsSelect & SELFLAG_ADDSELECTION) res = accessible->doAction(AddToSelection, varID.lVal, QVariantList()); if (flagsSelect & SELFLAG_REMOVESELECTION) res = accessible->doAction(RemoveSelection, varID.lVal, QVariantList()); return res ? S_OK : S_FALSE; }
static jintArray childIdListForAccessibleObject(JNIEnv *env, jobject /*thiz*/, jint objectId) { QAccessibleInterface *iface = interfaceFromId(objectId); if (iface) { jintArray jArray = env->NewIntArray(jsize(iface->childCount())); for (int i = 0; i < iface->childCount(); ++i) { QAccessibleInterface *child = iface->child(i); if (child) { QAccessible::Id ifaceId = QAccessible::uniqueId(child); jint jid = ifaceId; env->SetIntArrayRegion(jArray, i, 1, &jid); } } return jArray; } return env->NewIntArray(jsize(0)); }
// moz: [important] HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::get_accParent(IDispatch** ppdispParent) { QAccessibleInterface *accessible = accessibleInterface(); accessibleDebugClientCalls(accessible); if (!accessible) return E_FAIL; QAccessibleInterface *acc = accessible->parent(); if (acc) { if (IAccessible *iface = QWindowsAccessibility::wrap(acc)) { *ppdispParent = iface; return S_OK; } } *ppdispParent = 0; return S_FALSE; }
/*! \reimp */ QAccessible::Role QAccessibleWidget::role(int child) const { if (!child) return d->role; QWidgetList childList = childWidgets(widget()); if (childList.count() > 0 && child <= childList.count()) { QWidget *targetWidget = childList.at(child - 1); QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(targetWidget); if (iface) { QAccessible::Role role = iface->role(0); delete iface; return role; } } return NoRole; }
HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accKeyboardShortcut(VARIANT varID, BSTR *pszKeyboardShortcut) { Q_UNUSED(varID); showDebug(__FUNCTION__, accessible); if (!accessible->isValid()) return E_FAIL; *pszKeyboardShortcut = 0; if (QAccessibleActionInterface *actionIface = accessible->actionInterface()) { const QString def = actionIface->actionNames().value(0); if (!def.isEmpty()) { const QString keyBoardShortCut = actionIface->keyBindingsForAction(def).value(0); if (!keyBoardShortCut.isEmpty()) *pszKeyboardShortcut = QStringToBSTR(keyBoardShortCut); } } return *pszKeyboardShortcut ? S_OK : S_FALSE; }
// moz: [important] HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::get_accChild(VARIANT varChildID, IDispatch** ppdispChild) { QAccessibleInterface *accessible = accessibleInterface(); accessibleDebugClientCalls(accessible); if (!accessible) return E_FAIL; if (varChildID.vt != VT_I4) return E_INVALIDARG; QAccessibleInterface *acc = childPointer(accessible, varChildID); if (acc && acc->isValid()) { *ppdispChild = QWindowsAccessibility::wrap(acc); return S_OK; } return E_FAIL; }
// moz: [important] HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accParent(IDispatch** ppdispParent) { showDebug(__FUNCTION__, accessible); if (!accessible->isValid()) return E_FAIL; QAccessibleInterface *acc = accessible->parent(); if (acc) { QWindowsAccessible* wacc = new QWindowsAccessible(acc); wacc->QueryInterface(IID_IDispatch, (void**)ppdispParent); if (*ppdispParent) return S_OK; } *ppdispParent = 0; return S_FALSE; }
/* Properties and methods */ HRESULT STDMETHODCALLTYPE QWindowsAccessible::accDoDefaultAction(VARIANT varID) { showDebug(__FUNCTION__, accessible); if (!accessible->isValid()) return E_FAIL; AccessibleElement elem(varID.lVal, accessible); const bool res = elem.iface ? elem.iface->doAction(DefaultAction, elem.entry, QVariantList()) : false; return res ? S_OK : S_FALSE; }
// moz: [important] HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::accLocation(long *pxLeft, long *pyTop, long *pcxWidth, long *pcyHeight, VARIANT varID) { QAccessibleInterface *accessible = accessibleInterface(); accessibleDebugClientCalls(accessible); if (!accessible) return E_FAIL; QAccessibleInterface *acc = childPointer(accessible, varID); if (!acc || !acc->isValid()) return E_FAIL; const QRect rect = acc->rect(); *pxLeft = rect.x(); *pyTop = rect.y(); *pcxWidth = rect.width(); *pcyHeight = rect.height(); return S_OK; }
// moz: [important] HRESULT STDMETHODCALLTYPE QWindowsAccessible::get_accValue(VARIANT varID, BSTR* pszValue) { showDebug(__FUNCTION__, accessible); if (!accessible->isValid() || varID.lVal) return E_FAIL; QString value; if (accessible->valueInterface()) { value = QString::number(accessible->valueInterface()->currentValue().toDouble()); } else { value = accessible->text(QAccessible::Value); } if (!value.isNull()) { *pszValue = QStringToBSTR(value); return S_OK; } *pszValue = 0; return S_FALSE; }