From d1f8d5525430f4458f52c16f3afd7f220d6bc53b Mon Sep 17 00:00:00 2001 From: James Tabor Date: Tue, 25 Nov 2014 23:03:43 +0000 Subject: [PATCH] [Win32k] - Fixes wine win.c:test_SetParent last ShowWindow test after popup dies. svn path=/trunk/; revision=65487 --- reactos/win32ss/user/ntuser/winpos.c | 34 ++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/reactos/win32ss/user/ntuser/winpos.c b/reactos/win32ss/user/ntuser/winpos.c index 6a06b8f1839..2a0d50ba92c 100644 --- a/reactos/win32ss/user/ntuser/winpos.c +++ b/reactos/win32ss/user/ntuser/winpos.c @@ -327,6 +327,7 @@ co_WinPosActivateOtherWindow(PWND Wnd) /* If this is popup window, try to activate the owner first. */ if ((Wnd->style & WS_POPUP) && (WndTo = Wnd->spwndOwner)) { + ERR("WPAOW Popup with Owner\n"); WndTo = UserGetAncestor( WndTo, GA_ROOT ); if (can_activate_window(WndTo)) goto done; } @@ -336,18 +337,41 @@ co_WinPosActivateOtherWindow(PWND Wnd) WndTo = Wnd; for (;;) { - if (!(WndTo = WndTo->spwndNext)) break; - if (can_activate_window( WndTo )) break; + if (!(WndTo = WndTo->spwndNext)) break; + if (can_activate_window( WndTo )) goto done; + } + + /* + Fixes wine win.c:test_SetParent last ShowWindow test after popup dies. + Check for previous active window to bring to top. + */ + if (Wnd) + { + WndTo = Wnd->head.pti->MessageQueue->spwndActivePrev; + if (can_activate_window( WndTo )) goto done; + } + + // Find any window to bring to top. Works Okay for wine. + WndTo = UserGetDesktopWindow(); + WndTo = WndTo->spwndChild; + for (;;) + { + if (WndTo == Wnd) + { + WndTo = NULL; + break; + } + if (can_activate_window( WndTo )) goto done; + if (!(WndTo = WndTo->spwndNext)) break; } done: - if (WndTo) UserRefObjectCo(WndTo, &Ref); - if (!gpqForeground || Wnd == gpqForeground->spwndActive) + if ((gpqForeground && !gpqForeground->spwndActive) || Wnd == gpqForeground->spwndActive) { /* ReactOS can pass WndTo = NULL to co_IntSetForegroundWindow and returns FALSE. */ - //ERR("WinPosActivateOtherWindow Set FG 0x%p\n",WndTo); + //ERR("WinPosActivateOtherWindow Set FG 0x%p hWnd %p\n",WndTo, WndTo ? WndTo->head.h : 0); if (co_IntSetForegroundWindow(WndTo)) { if (WndTo) UserDerefObjectCo(WndTo);