summaryrefslogtreecommitdiff
path: root/wintable/new/accessibility.h
diff options
context:
space:
mode:
Diffstat (limited to 'wintable/new/accessibility.h')
-rw-r--r--wintable/new/accessibility.h75
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;
+}