https://git.reactos.org/?p=reactos.git;a=commitdiff;h=3672658e75586379477fd…
commit 3672658e75586379477fda5fc70d4de43590f4a9
Author: Amine Khaldi <amine.khaldi(a)reactos.org>
AuthorDate: Sun Jan 21 21:59:45 2018 +0100
Commit: Amine Khaldi <amine.khaldi(a)reactos.org>
CommitDate: Sun Jan 21 21:59:45 2018 +0100
[WSHOM.OCX] Sync with Wine 3.0. CORE-14225
---
dll/win32/wshom.ocx/shell.c | 78 ++++++++++++++++++++++++++++++++++++++++++---
media/doc/README.WINE | 2 +-
2 files changed, 75 insertions(+), 5 deletions(-)
diff --git a/dll/win32/wshom.ocx/shell.c b/dll/win32/wshom.ocx/shell.c
index 1641c6ed50..bdae7d9fcd 100644
--- a/dll/win32/wshom.ocx/shell.c
+++ b/dll/win32/wshom.ocx/shell.c
@@ -1272,11 +1272,81 @@ static HRESULT WINAPI WshShell3_Run(IWshShell3 *iface, BSTR cmd,
VARIANT *style,
}
}
-static HRESULT WINAPI WshShell3_Popup(IWshShell3 *iface, BSTR Text, VARIANT*
SecondsToWait, VARIANT *Title, VARIANT *Type, int *button)
+struct popup_thread_param
{
- FIXME("(%s %s %s %s %p): stub\n", debugstr_w(Text),
debugstr_variant(SecondsToWait),
- debugstr_variant(Title), debugstr_variant(Type), button);
- return E_NOTIMPL;
+ WCHAR *text;
+ VARIANT title;
+ VARIANT type;
+ INT button;
+};
+
+static DWORD WINAPI popup_thread_proc(void *arg)
+{
+ static const WCHAR defaulttitleW[] =
{'W','i','n','d','o','w','s','
','S','c','r','i','p','t','
','H','o','s','t',0};
+ struct popup_thread_param *param = (struct popup_thread_param *)arg;
+
+ param->button = MessageBoxW(NULL, param->text,
is_optional_argument(¶m->title) ?
+ defaulttitleW : V_BSTR(¶m->title), V_I4(¶m->type));
+ return 0;
+}
+
+static HRESULT WINAPI WshShell3_Popup(IWshShell3 *iface, BSTR text, VARIANT
*seconds_to_wait, VARIANT *title,
+ VARIANT *type, int *button)
+{
+ struct popup_thread_param param;
+ DWORD tid, status;
+ VARIANT timeout;
+ HANDLE hthread;
+ HRESULT hr;
+
+ TRACE("(%s %s %s %s %p)\n", debugstr_w(text),
debugstr_variant(seconds_to_wait), debugstr_variant(title),
+ debugstr_variant(type), button);
+
+ if (!seconds_to_wait || !title || !type || !button)
+ return E_POINTER;
+
+ VariantInit(&timeout);
+ if (!is_optional_argument(seconds_to_wait))
+ {
+ hr = VariantChangeType(&timeout, seconds_to_wait, 0, VT_I4);
+ if (FAILED(hr))
+ return hr;
+ }
+
+ VariantInit(¶m.type);
+ if (!is_optional_argument(type))
+ {
+ hr = VariantChangeType(¶m.type, type, 0, VT_I4);
+ if (FAILED(hr))
+ return hr;
+ }
+
+ if (is_optional_argument(title))
+ param.title = *title;
+ else
+ {
+ VariantInit(¶m.title);
+ hr = VariantChangeType(¶m.title, title, 0, VT_BSTR);
+ if (FAILED(hr))
+ return hr;
+ }
+
+ param.text = text;
+ param.button = -1;
+ hthread = CreateThread(NULL, 0, popup_thread_proc, ¶m, 0, &tid);
+ status = MsgWaitForMultipleObjects(1, &hthread, FALSE, V_I4(&timeout) ?
V_I4(&timeout) * 1000: INFINITE, 0);
+ if (status == WAIT_TIMEOUT)
+ {
+ PostThreadMessageW(tid, WM_QUIT, 0, 0);
+ MsgWaitForMultipleObjects(1, &hthread, FALSE, INFINITE, 0);
+ param.button = -1;
+ }
+ *button = param.button;
+
+ VariantClear(¶m.title);
+ CloseHandle(hthread);
+
+ return S_OK;
}
static HRESULT WINAPI WshShell3_CreateShortcut(IWshShell3 *iface, BSTR PathLink,
IDispatch** Shortcut)
diff --git a/media/doc/README.WINE b/media/doc/README.WINE
index b661e3d685..f366990215 100644
--- a/media/doc/README.WINE
+++ b/media/doc/README.WINE
@@ -211,7 +211,7 @@ reactos/dll/win32/wldap32 # Synced to Wine-3.0
reactos/dll/win32/wmi # Synced to WineStaging-2.9
reactos/dll/win32/wmiutils # Synced to WineStaging-2.9
reactos/dll/win32/wmvcore # Synced to Wine-3.0
-reactos/dll/win32/wshom.ocx # Synced to WineStaging-2.9
+reactos/dll/win32/wshom.ocx # Synced to Wine-3.0
reactos/dll/win32/wtsapi32 # Synced to WineStaging-2.9
reactos/dll/win32/wuapi # Synced to WineStaging-2.9
reactos/dll/win32/xinput1_1 # Synced to WineStaging-2.9