return h;
}
+static void enableparent(HWND parent)
+{
+ if (parent) {
+ EnableWindow(parent, TRUE);
+ }
+}
+
+static HWND disableparent(HWND owner)
+{
+ HWND parent = NULL;
+ HWND disabled_owner = NULL;
+ /*
+ * Owner needs to be top level window. We need to duplicate the logic from server,
+ * because we need to disable it before creating dialog window. Note that we do that
+ * even if dialog has WS_CHILD, but only for modal dialogs, which matched what
+ * Windows does.
+ */
+ while ((GetWindowLongW(owner, GWL_STYLE) & (WS_POPUP | WS_CHILD)) == WS_CHILD) {
+ parent = GetParent(owner);
+ if (!parent || parent == GetDesktopWindow())
+ break;
+ owner = parent;
+ }
+ if (!parent)
+ parent = GetAncestor(owner, GA_ROOT);
+ if (parent)
+ {
+ owner = parent;
+ if (IsWindowEnabled(owner))
+ {
+ HWND captured = NULL;
+ disabled_owner = owner;
+ EnableWindow(disabled_owner, FALSE);
+ captured = GetCapture();
+ if (captured)
+ SendMessageW(captured, WM_CANCELMODE, 0, 0);
+ }
+ }
+ return disabled_owner;
+}
+
int CustomCreateDialogBox(int templ, HWND hDlg, DLGPROC proc)
{
struct newresource *res;
if (!hwnd) {
return 0;
}
+ HWND owner = disableparent(hDlg);
customdialogres = res;
customdialoghwnd = hwnd;
while (customdialogactive == 1) {
while ((ret = GetMessage(&msg, NULL, 0, 0))) {
if (ret == -1)
break;
- if (!IsWindow(hwnd) || !IsDialogMessage(hwnd, &msg)) {
+ if (!IsWindow(hwnd)) {
+ break;
+ }
+ if (!IsDialogMessage(hwnd, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
+ if (!IsWindow(hwnd)) {
+ break;
+ }
if (customdialogactive == -1)
break;
}
}
+ enableparent(owner);
return customdialogactive;
}