explorer: Implement IShellWindows::FindWindowSW() for non-desktop windows.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
54e1559a25
commit
7b56edf9a4
|
@ -1064,7 +1064,7 @@ static void test_ShellWindows(void)
|
||||||
|
|
||||||
VariantInit(&v2);
|
VariantInit(&v2);
|
||||||
hr = IShellWindows_FindWindowSW(shellwindows, &v, &v2, SWC_EXPLORER, &ret, 0, &disp);
|
hr = IShellWindows_FindWindowSW(shellwindows, &v, &v2, SWC_EXPLORER, &ret, 0, &disp);
|
||||||
todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
|
ok(hr == S_FALSE, "Got hr %#x.\n", hr);
|
||||||
ok(!ret, "Got window %#x.\n", ret);
|
ok(!ret, "Got window %#x.\n", ret);
|
||||||
ok(!disp, "Got IDispatch %p.\n", &disp);
|
ok(!disp, "Got IDispatch %p.\n", &disp);
|
||||||
|
|
||||||
|
@ -1075,15 +1075,15 @@ static void test_ShellWindows(void)
|
||||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||||
|
|
||||||
hr = IShellWindows_FindWindowSW(shellwindows, &v, &v2, SWC_EXPLORER, &ret, 0, &disp);
|
hr = IShellWindows_FindWindowSW(shellwindows, &v, &v2, SWC_EXPLORER, &ret, 0, &disp);
|
||||||
todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
|
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
||||||
todo_wine ok(ret == (LONG)(LONG_PTR)hwnd, "Expected %p, got %#x.\n", hwnd, ret);
|
ok(ret == (LONG)(LONG_PTR)hwnd, "Expected %p, got %#x.\n", hwnd, ret);
|
||||||
ok(!disp, "Got IDispatch %p.\n", &disp);
|
ok(!disp, "Got IDispatch %p.\n", &disp);
|
||||||
|
|
||||||
hr = IShellWindows_Revoke(shellwindows, cookie);
|
hr = IShellWindows_Revoke(shellwindows, cookie);
|
||||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
hr = IShellWindows_FindWindowSW(shellwindows, &v, &v2, SWC_EXPLORER, &ret, 0, &disp);
|
hr = IShellWindows_FindWindowSW(shellwindows, &v, &v2, SWC_EXPLORER, &ret, 0, &disp);
|
||||||
todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
|
ok(hr == S_FALSE, "Got hr %#x.\n", hr);
|
||||||
ok(!ret, "Got window %#x.\n", ret);
|
ok(!ret, "Got window %#x.\n", ret);
|
||||||
ok(!disp, "Got IDispatch %p.\n", &disp);
|
ok(!disp, "Got IDispatch %p.\n", &disp);
|
||||||
|
|
||||||
|
|
|
@ -1284,26 +1284,49 @@ static HRESULT WINAPI shellwindows_OnActivated(IShellWindows *iface, LONG cookie
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI shellwindows_FindWindowSW(IShellWindows *iface, VARIANT *loc,
|
static HRESULT WINAPI shellwindows_FindWindowSW(IShellWindows *iface, VARIANT *location,
|
||||||
VARIANT *root, int class, LONG *hwnd, int options, IDispatch **disp)
|
VARIANT *root, int class, LONG *hwnd, int options, IDispatch **disp)
|
||||||
{
|
{
|
||||||
TRACE("%s %s 0x%x %p 0x%x %p\n", debugstr_variant(loc), debugstr_variant(root),
|
struct shellwindows *sw = impl_from_IShellWindows(iface);
|
||||||
class, hwnd, options, disp);
|
unsigned int i;
|
||||||
|
|
||||||
if (class != SWC_DESKTOP)
|
TRACE("iface %p, location %p, root %p, class %#x, hwnd %p, options %#x, disp %p.\n",
|
||||||
|
iface, location, root, class, hwnd, options, disp);
|
||||||
|
|
||||||
|
if (class == SWC_DESKTOP)
|
||||||
{
|
{
|
||||||
WARN("only SWC_DESKTOP class supported.\n");
|
*hwnd = (LONG)(LONG_PTR)GetDesktopWindow();
|
||||||
|
if (options & SWFO_NEEDDISPATCH)
|
||||||
|
{
|
||||||
|
*disp = (IDispatch *)&desktopshellbrowserwindow.IWebBrowser2_iface;
|
||||||
|
IDispatch_AddRef(*disp);
|
||||||
|
}
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options)
|
||||||
|
FIXME("Ignoring options %#x.\n", options);
|
||||||
|
|
||||||
|
if (V_VT(location) != (VT_ARRAY | VT_UI1))
|
||||||
|
{
|
||||||
|
FIXME("Unexpected variant type %s.\n", debugstr_vt(V_VT(location)));
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
*hwnd = HandleToLong(GetDesktopWindow());
|
EnterCriticalSection(&sw->cs);
|
||||||
if (options & SWFO_NEEDDISPATCH)
|
|
||||||
|
for (i = 0; i < sw->count; ++i)
|
||||||
{
|
{
|
||||||
*disp = (IDispatch*)&desktopshellbrowserwindow.IWebBrowser2_iface;
|
if (sw->windows[i].class == class && ILIsEqual(V_ARRAY(location)->pvData, sw->windows[i].pidl))
|
||||||
IDispatch_AddRef(*disp);
|
{
|
||||||
|
*hwnd = sw->windows[i].hwnd;
|
||||||
|
LeaveCriticalSection(&sw->cs);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return S_OK;
|
LeaveCriticalSection(&sw->cs);
|
||||||
|
return S_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI shellwindows_OnCreated(IShellWindows *iface, LONG cookie, IUnknown *punk)
|
static HRESULT WINAPI shellwindows_OnCreated(IShellWindows *iface, LONG cookie, IUnknown *punk)
|
||||||
|
|
Loading…
Reference in New Issue