diff options
| author | Pietro Gagliardi <[email protected]> | 2015-01-06 17:27:41 -0500 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2015-01-06 17:27:41 -0500 |
| commit | 22123fb676d26d309d428a892c453e35e684e367 (patch) | |
| tree | 9552f1a91a8b8995065e74573e8f59f448f2b08c /wintable/accessibility.h | |
| parent | 720049bfd3c6d205859f3150dee33dee78dc3dc3 (diff) | |
Merged wintable/new/ into wintable/.
Diffstat (limited to 'wintable/accessibility.h')
| -rw-r--r-- | wintable/accessibility.h | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/wintable/accessibility.h b/wintable/accessibility.h new file mode 100644 index 0000000..3900cd2 --- /dev/null +++ b/wintable/accessibility.h @@ -0,0 +1,287 @@ +// 24 december 2014 + +struct tableAcc { + IAccessibleVtbl *vtbl; + ULONG refcount; + struct table *t; + IAccessible *std; +}; + +#define TA ((struct tableAcc *) this) + +static HRESULT STDMETHODCALLTYPE tableAccQueryInterface(IAccessible *this, REFIID riid, void **ppvObject) +{ + if (ppvObject == NULL) + return E_POINTER; + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IDispatch) || + IsEqualIID(riid, &IID_IAccessible)) { + // TODO figure out what pointer to use here + TA->vtbl->AddRef(TA); + *ppvObject = (void *) this; + return S_OK; + } + *ppvObject = NULL; + return E_NOINTERFACE; +} + +// TODO use InterlockedIncrement()/InterlockedDecrement() for these? + +static ULONG STDMETHODCALLTYPE tableAccAddRef(IAccessible *this) +{ + TA->refcount++; + // TODO correct? + return TA->refcount; +} + +static ULONG STDMETHODCALLTYPE tableAccRelease(IAccessible *this) +{ + TA->refcount--; + if (TA->refcount == 0) { + IAccessible_Release(TA->std); + tableFree(TA, "error freeing Table accessibility object"); + return 0; + } + return TA->refcount; +} + +// disregard IDispatch: http://msdn.microsoft.com/en-us/library/windows/desktop/cc307844.aspx +// TODO DISP_E_MEMBERNOTFOUND? http://blogs.msdn.com/b/saraford/archive/2004/08/20/which-controls-support-which-msaa-properties-and-how-these-controls-implement-msaa-properties.aspx +// TODO relegate these to the standard object? + +static HRESULT STDMETHODCALLTYPE tableAccGetTypeInfoCount(IAccessible *this, UINT *pctinfo) +{ + if (pctinfo == NULL) + return E_INVALIDARG; + // TODO assign something to *pctinfo? + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE tableAccGetTypeInfo(IAccessible *this, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + if (ppTInfo == NULL) + return E_INVALIDARG; + *ppTInfo = NULL; + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE tableAccGetIDsOfNames(IAccessible *this, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + // TODO verify this one + if (rgDispId == NULL) + return E_INVALIDARG; + // TODO overwrite rgDispId? + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE tableAccInvoke(IAccessible *this, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + // TODO check this one + return E_NOTIMPL; +} + +// IAccessible + +static HRESULT STDMETHODCALLTYPE tableAccget_accParent(IAccessible *this, IDispatch **ppdispParent) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccget_accChildCount(IAccessible *this, long *pcountChildren) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccget_accChild(IAccessible *this, VARIANT varChild, IDispatch **ppdispChild) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccget_accName(IAccessible *this, VARIANT varChild, BSTR *pszName) +{ +printf("tableAccget_accName()\n"); + // TODO check pointer + if (varChild.vt != VT_I4) { +printf("invalid arg\n"); + *pszName = NULL; + return E_INVALIDARG; + } + if (varChild.lVal == CHILDID_SELF) + ; // TODO standard accessible object + // TODO actually get the real name +printf("returning name\n"); + *pszName = SysAllocString(L"This is a test of the accessibility interface."); + // TODO check null pointer + return S_OK; +} + +static HRESULT STDMETHODCALLTYPE tableAccget_accValue(IAccessible *this, VARIANT varChild, BSTR *pszValue) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccget_accDescription(IAccessible *this, VARIANT varChild, BSTR *pszDescription) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccget_accRole(IAccessible *this, VARIANT varChild, VARIANT *pvarRole) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccget_accState(IAccessible *this, VARIANT varChild, VARIANT *pvarState) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccget_accHelp(IAccessible *this, VARIANT varChild, BSTR *pszHelp) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccget_accHelpTopic(IAccessible *this, BSTR *pszHelpFile, VARIANT varChild, long *pidTopic) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccget_accKeyboardShortcut(IAccessible *this, VARIANT varChild, BSTR *pszKeyboardShortcut) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccget_accFocus(IAccessible *this, VARIANT *pvarChild) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccget_accSelection(IAccessible *this, VARIANT *pvarChildren) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccget_accDefaultAction(IAccessible *this, VARIANT varChild, BSTR *pszDefaultAction) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccaccSelect(IAccessible *this, long flagsSelect, VARIANT varChild) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccaccLocation(IAccessible *this, long *pxLeft, long *pyTop, long *pcxWidth, long *pcyHeight, VARIANT varChild) +{ + // TODO + return IAccessible_accLocation(TA->std, pxLeft, pyTop, pcxWidth, pcyHeight, varChild); +} + +static HRESULT STDMETHODCALLTYPE tableAccaccNavigate(IAccessible *this, long navDir, VARIANT varStart, VARIANT *pvarEndUpAt) +{ + // TODO + return IAccessible_accNavigate(TA->std, navDir, varStart, pvarEndUpAt); +} + +static HRESULT STDMETHODCALLTYPE tableAccaccHitTest(IAccessible *this, long xLeft, long yTop, VARIANT *pvarChild) +{ + // TODO + return IAccessible_accHitTest(TA->std, xLeft, yTop, pvarChild); +} + +static HRESULT STDMETHODCALLTYPE tableAccaccDoDefaultAction(IAccessible *this, VARIANT varChild) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccput_accName(IAccessible *this, VARIANT varChild, BSTR szName) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static HRESULT STDMETHODCALLTYPE tableAccput_accValue(IAccessible *this, VARIANT varChild, BSTR szValue) +{ + // TODO + return DISP_E_MEMBERNOTFOUND; +} + +static const IAccessibleVtbl tableAccVtbl = { + .QueryInterface = tableAccQueryInterface, + .AddRef = tableAccAddRef, + .Release = tableAccRelease, + .GetTypeInfoCount = tableAccGetTypeInfoCount, + .GetTypeInfo = tableAccGetTypeInfo, + .GetIDsOfNames = tableAccGetIDsOfNames, + .Invoke = tableAccInvoke, + .get_accParent = tableAccget_accParent, + .get_accChildCount = tableAccget_accChildCount, + .get_accChild = tableAccget_accChild, + .get_accName = tableAccget_accName, + .get_accValue = tableAccget_accValue, + .get_accDescription = tableAccget_accDescription, + .get_accRole = tableAccget_accRole, + .get_accState = tableAccget_accState, + .get_accHelp = tableAccget_accHelp, + .get_accHelpTopic = tableAccget_accHelpTopic, + .get_accKeyboardShortcut = tableAccget_accKeyboardShortcut, + .get_accFocus = tableAccget_accFocus, + .get_accSelection = tableAccget_accSelection, + .get_accDefaultAction = tableAccget_accDefaultAction, + .accSelect = tableAccaccSelect, + .accLocation = tableAccaccLocation, + .accNavigate = tableAccaccNavigate, + .accHitTest = tableAccaccHitTest, + .accDoDefaultAction = tableAccaccDoDefaultAction, + .put_accName = tableAccput_accName, + .put_accValue = tableAccput_accValue, +}; + +static struct tableAcc *newTableAcc(struct table *t) +{ + struct tableAcc *ta; + HRESULT hr; + IAccessible *std; + + ta = (struct tableAcc *) tableAlloc(sizeof (struct tableAcc), "error creating Table accessibility object"); + ta->vtbl = &tableAccVtbl; + ta->vtbl->AddRef(ta); + ta->t = t; + hr = CreateStdAccessibleObject(t->hwnd, OBJID_CLIENT, &IID_IAccessible, &std); + if (hr != S_OK) + // TODO panichresult + panic("error creating standard accessible object for Table"); + ta->std = std; + return ta; +} + +static void freeTableAcc(struct tableAcc *ta) +{ + ta->t = NULL; + ta->vtbl->Release(ta); +} + +HANDLER(accessibilityHandler) +{ + if (uMsg != WM_GETOBJECT) + return FALSE; + if (((DWORD) lParam) != OBJID_CLIENT) + return FALSE; + *lResult = LresultFromObject(&IID_IAccessible, wParam, t->ta); + // TODO check *lResult + return TRUE; +} |
