From ae68a510d48cffd1267a625ab098bd1052304bd2 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 15 Feb 2014 02:14:03 +0000 Subject: [PATCH 1/1] [Win32k] - Do not re-enter SetFocus, just call message handling to switch focus window. - Fix broken logic when searching for a non child ancestor to send messages/Set focus to. - See CORE-6452. svn path=/trunk/; revision=62196 --- reactos/win32ss/user/ntuser/focus.c | 18 +++++++++--------- reactos/win32ss/user/ntuser/msgqueue.c | 5 +---- reactos/win32ss/user/ntuser/window.c | 7 ++----- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/reactos/win32ss/user/ntuser/focus.c b/reactos/win32ss/user/ntuser/focus.c index d8b58aa57c3..c58e1d072ea 100644 --- a/reactos/win32ss/user/ntuser/focus.c +++ b/reactos/win32ss/user/ntuser/focus.c @@ -734,14 +734,13 @@ co_IntSetActiveWindow(PWND Wnd OPTIONAL, BOOL bMouse, BOOL bFocus, BOOL Async) if (bFocus && !(ThreadQueue->QF_flags & QF_FOCUSNULLSINCEACTIVE)) { /* Do not change focus if the window is no longer active */ - if (ThreadQueue->spwndActive == Wnd) + if (pti->MessageQueue->spwndActive != IntGetNonChildAncestor(pti->MessageQueue->spwndFocus)) { - if (!ThreadQueue->spwndFocus || - !Wnd || - UserGetAncestor(ThreadQueue->spwndFocus, GA_ROOT) != Wnd) - { - co_UserSetFocus(Wnd); - } + PWND pWndSend = pti->MessageQueue->spwndActive; + // Clear focus if the active window is minimized. + if (pWndSend && pti->MessageQueue->spwndActive->style & WS_MINIMIZE) pWndSend = NULL; + // Send focus messages and if so, set the focus. + IntSendFocusMessages( pti, pWndSend); } } @@ -815,12 +814,13 @@ co_UserSetFocus(PWND Window) } /* Check if we can set the focus to this window */ - for (pwndTop = Window; pwndTop != NULL; pwndTop = pwndTop->spwndParent) + //// Fixes wine win test_SetParent both "todo" line 3710 and 3720... + for (pwndTop = Window; pwndTop; pwndTop = pwndTop->spwndParent) { if (pwndTop->style & (WS_MINIMIZED|WS_DISABLED)) return 0; if ((pwndTop->style & (WS_POPUP|WS_CHILD)) != WS_CHILD) break; } - + //// if (co_HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, (WPARAM)Window->head.h, (LPARAM)hWndPrev)) { ERR("SetFocus 1 WH_CBT Call Hook return!\n"); diff --git a/reactos/win32ss/user/ntuser/msgqueue.c b/reactos/win32ss/user/ntuser/msgqueue.c index aaeef187961..eef085783bd 100644 --- a/reactos/win32ss/user/ntuser/msgqueue.c +++ b/reactos/win32ss/user/ntuser/msgqueue.c @@ -1565,10 +1565,7 @@ BOOL co_IntProcessMouseMessage(MSG* msg, BOOL* RemoveMessages, UINT first, UINT if (pwndMsg != MessageQueue->spwndActive) { PWND pwndTop = pwndMsg; - while (pwndTop && ((pwndTop->style & (WS_POPUP|WS_CHILD)) == WS_CHILD)) - { - pwndTop = pwndTop->spwndParent; - } + pwndTop = IntGetNonChildAncestor(pwndTop); if (pwndTop && pwndTop != pwndDesktop) { diff --git a/reactos/win32ss/user/ntuser/window.c b/reactos/win32ss/user/ntuser/window.c index 67664313819..91feae4df56 100644 --- a/reactos/win32ss/user/ntuser/window.c +++ b/reactos/win32ss/user/ntuser/window.c @@ -277,11 +277,8 @@ IntWinListChildren(PWND Window) PWND FASTCALL IntGetNonChildAncestor(PWND pWnd) { - if (pWnd) - { - while(pWnd && ((pWnd->style & (WS_CHILD | WS_POPUP)) != WS_CHILD)) - pWnd = pWnd->spwndParent; - } + while(pWnd && (pWnd->style & (WS_CHILD | WS_POPUP)) == WS_CHILD) + pWnd = pWnd->spwndParent; return pWnd; } -- 2.17.1