diff options
Diffstat (limited to 'wintable/new/accessibility.h')
| -rw-r--r-- | wintable/new/accessibility.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/wintable/new/accessibility.h b/wintable/new/accessibility.h new file mode 100644 index 0000000..bb50dd3 --- /dev/null +++ b/wintable/new/accessibility.h @@ -0,0 +1,75 @@ +// 24 december 2014 + +struct tableAcc { + IAccessibleVtbl *vtbl; + ULONG refcount; + struct table *t; +}; + +static HRESULT STDMETHODCALLTYPE tableAccQueryInterface(IUnknown *this, REFIID riid, void **ppvObject) +{ + if (ppvObject == NULL) + return E_POINTER; + if (IsEqualIID(riid, IID_IUnknown) || +0)// IsEqualIID(riid, IID_IDispatch) +{// IsEqualIID(riid, IID_IAccessible) { + *ppvObject = (void *) this; + return S_OK; + } + *ppvObject = NULL; + return E_NOINTERFACE; +} + +#define TA ((struct tableAcc *) this) + +// TODO use InterlockedIncrement()/InterlockedDecrement() for these? + +static ULONG STDMETHODCALLTYPE tableAccAddRef(IUnknown *this) +{ + TA->refcount++; + return TA->refcount; +} + +static ULONG STDMETHODCALLTYPE tableAccRelease(IUnknown *this) +{ + TA->refcount--; + if (TA->refcount == 0) { + tableFree(TA, "error freeing Table accessibility object"); + return 0; + } + return TA->refcount; +} + +static const IAccessibleVtbl tableAccVtbl = { + .QueryInterface = tableAccQueryInterface, + .AddRef = tableAccAddRef, + .Release = tableAccRelease, +}; + +static struct tableAcc *newTableAcc(struct table *t) +{ + struct tableAcc *ta; + + ta = (struct tableAcc *) tableAlloc(sizeof (struct tableAcc), "error creating Table accessibility object"); + ta->vtbl = &tableAccVtbl; + ta->vtbl->AddRef(vtbl); + ta->t = t; + return ta; +} + +static void freeTableAcc(struct tableAcc *ta) +{ + ta->t = NULL; + ta->vtbl->Release(ta); +} + +HANDLER(accessibilityHandler) +{ + if (uMsg != WM_GETOBJECT) + return FALSE; + if (wParam != OBJID_CLIENT) + return FALSE; + *lResult = LresultFromObject(IID_IUnknown, wParam, t->ta); + // TODO check *lResult + return TRUE; +} |
