diff --git a/reactos/win32ss/user/ntuser/focus.c b/reactos/win32ss/user/ntuser/focus.c index e0fb13b89c9..7935f1bd424 100644 --- a/reactos/win32ss/user/ntuser/focus.c +++ b/reactos/win32ss/user/ntuser/focus.c @@ -717,6 +717,8 @@ co_IntMouseActivateWindow(PWND Wnd) BOOL FASTCALL UserSetActiveWindow(PWND Wnd) { + PTHREADINFO pti = PsGetCurrentThreadWin32Thread(); + if (Wnd) // Must have a window! { if ((Wnd->style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return FALSE; @@ -734,7 +736,34 @@ UserSetActiveWindow(PWND Wnd) SetActiveWindow(0); check_wnd_state(0, 0, 0, 0); <-- This should pass if ShowWindow does it's job!!! As of 10/28/2012 it does! + Now Handle wines Msg.c test_SetActiveWindow( 0 )... */ + TRACE("USAW: Previous active window\n"); + if ( gpqForegroundPrev && + gpqForegroundPrev->spwndActivePrev && + (gpqForegroundPrev->spwndActivePrev->style & (WS_VISIBLE|WS_DISABLED)) == WS_VISIBLE && + !(gpqForegroundPrev->spwndActivePrev->state2 & WNDS2_BOTTOMMOST) && + (Wnd = VerifyWnd(gpqForegroundPrev->spwndActivePrev)) != NULL ) + { + TRACE("USAW:PAW hwnd %p\n",Wnd?Wnd->head.h:NULL); + return co_IntSetActiveWindow(Wnd, FALSE, TRUE, FALSE); + } + + // Activate anyone but the active window. + if ( pti->MessageQueue->spwndActive && + (Wnd = VerifyWnd(pti->MessageQueue->spwndActive)) != NULL ) + { + ERR("USAW:AOWM hwnd %p\n",Wnd?Wnd->head.h:NULL); + if (!ActivateOtherWindowMin(Wnd)) + { + // Okay, now go find someone else to play with! + ERR("USAW: Going to WPAOW\n"); + co_WinPosActivateOtherWindow(Wnd); + } + return TRUE; + } + + TRACE("USAW: Nothing\n"); return FALSE; } diff --git a/reactos/win32ss/user/ntuser/winpos.h b/reactos/win32ss/user/ntuser/winpos.h index fde65df46b5..9693aff2897 100644 --- a/reactos/win32ss/user/ntuser/winpos.h +++ b/reactos/win32ss/user/ntuser/winpos.h @@ -44,6 +44,7 @@ FORCEINLINE BOOL IntPtInWindow(PWND pwnd, INT x, INT y) y - pwnd->rcWindow.top); } +BOOL FASTCALL ActivateOtherWindowMin(PWND); UINT FASTCALL co_WinPosArrangeIconicWindows(PWND parent); BOOL FASTCALL IntGetClientOrigin(PWND Window, LPPOINT Point); LRESULT FASTCALL co_WinPosGetNonClientSize(PWND Window, RECTL* WindowRect, RECTL* ClientRect);