From: Esme Povirk esme@codeweavers.com
--- dlls/comctl32/syslink.c | 42 +++++++++++++++++++++++++++++++++-- dlls/comctl32/tests/syslink.c | 6 ++--- 2 files changed, 43 insertions(+), 5 deletions(-)
diff --git a/dlls/comctl32/syslink.c b/dlls/comctl32/syslink.c index cca9e67253e..50a52152eed 100644 --- a/dlls/comctl32/syslink.c +++ b/dlls/comctl32/syslink.c @@ -278,8 +278,46 @@ static HRESULT WINAPI Accessible_get_accRole(IAccessible *iface, VARIANT childid
static HRESULT WINAPI Accessible_get_accState(IAccessible *iface, VARIANT childid, VARIANT *state) { - FIXME("%p\n", iface); - return E_NOTIMPL; + SYSLINK_ACC *This = impl_from_IAccessible(iface); + HRESULT hr; + DOC_ITEM* item; + GUITHREADINFO info; + BOOL focused = 0; + + TRACE("%p, %s\n", iface, debugstr_variant(&childid)); + + hr = Accessible_FindChild(This, childid, &item); + if (FAILED(hr)) + return hr; + + V_VT(state) = VT_I4; + V_I4(state) = 0; + + info.cbSize = sizeof(info); + if(GetGUIThreadInfo(0, &info) && info.hwndFocus == This->infoPtr->Self) + focused = 1; + + if (item) + { + V_I4(state) |= STATE_SYSTEM_FOCUSABLE|STATE_SYSTEM_LINKED; + if (focused && (item->u.Link.state & LIS_FOCUSED) == LIS_FOCUSED) + V_I4(state) |= STATE_SYSTEM_FOCUSED; + } + else + { + LONG style = GetWindowLongW(This->infoPtr->Self, GWL_STYLE); + + if (style & WS_DISABLED) + V_I4(state) |= STATE_SYSTEM_UNAVAILABLE; + else + V_I4(state) |= STATE_SYSTEM_FOCUSABLE; + if (!(style & WS_VISIBLE)) + V_I4(state) |= STATE_SYSTEM_INVISIBLE; + if (focused) + V_I4(state) |= STATE_SYSTEM_FOCUSED; + } + + return S_OK; }
static HRESULT WINAPI Accessible_get_accHelp(IAccessible *iface, VARIANT childid, BSTR *help) diff --git a/dlls/comctl32/tests/syslink.c b/dlls/comctl32/tests/syslink.c index 65909774d19..67df0a041e8 100644 --- a/dlls/comctl32/tests/syslink.c +++ b/dlls/comctl32/tests/syslink.c @@ -316,13 +316,13 @@ static void test_msaa(void) ok(V_VT(&varResult) == VT_I4, "accRole returned vt=%x\n", V_VT(&varResult)); ok(V_I4(&varResult) == ROLE_SYSTEM_CLIENT, "accRole returned %li\n", V_I4(&varResult));
-todo_wine { VariantClear(&varResult); hr = IAccessible_get_accState(acc, varChild, &varResult); ok(hr == S_OK, "accState failed, hr=%lx\n", hr); ok(V_VT(&varResult) == VT_I4, "accState returned vt=%x\n", V_VT(&varResult)); ok(V_I4(&varResult) == STATE_SYSTEM_FOCUSABLE, "accState returned %li\n", V_I4(&varResult));
+todo_wine { hr = IAccessible_get_accName(acc, varChild, &name); ok(hr == S_OK, "accName failed, hr=%lx\n", hr); if (SUCCEEDED(hr)) { @@ -355,13 +355,13 @@ todo_wine { ok(V_VT(&varResult) == VT_I4, "accRole returned vt=%x\n", V_VT(&varResult)); ok(V_I4(&varResult) == ROLE_SYSTEM_LINK, "accRole returned %li\n", V_I4(&varResult));
-todo_wine { VariantClear(&varResult); hr = IAccessible_get_accState(acc, varChild, &varResult); ok(hr == S_OK, "accState failed, hr=%lx\n", hr); ok(V_VT(&varResult) == VT_I4, "accState returned vt=%x\n", V_VT(&varResult)); ok(V_I4(&varResult) == (STATE_SYSTEM_FOCUSABLE|STATE_SYSTEM_LINKED), "accState returned %li\n", V_I4(&varResult));
+todo_wine { hr = IAccessible_get_accName(acc, varChild, &name); ok(hr == S_OK, "accName failed, hr=%lx\n", hr); if (SUCCEEDED(hr)) { @@ -401,13 +401,13 @@ todo_wine { ok(V_VT(&varResult) == VT_I4, "accRole returned vt=%x\n", V_VT(&varResult)); ok(V_I4(&varResult) == ROLE_SYSTEM_LINK, "accRole returned %li\n", V_I4(&varResult));
-todo_wine { VariantClear(&varResult); hr = IAccessible_get_accState(acc, varChild, &varResult); ok(hr == S_OK, "accState failed, hr=%lx\n", hr); ok(V_VT(&varResult) == VT_I4, "accState returned vt=%x\n", V_VT(&varResult)); ok(V_I4(&varResult) == (STATE_SYSTEM_FOCUSABLE|STATE_SYSTEM_LINKED), "accState returned %li\n", V_I4(&varResult));
+todo_wine { hr = IAccessible_get_accName(acc, varChild, &name); ok(hr == S_OK, "accName failed, hr=%lx\n", hr); if (SUCCEEDED(hr)) {