Author: jimtabor Date: Thu Jun 7 01:08:41 2012 New Revision: 56703
URL: http://svn.reactos.org/svn/reactos?rev=56703&view=rev Log: [Win32k] - Fast fix attach thread input. Tested with win Msg test_SetFocus, fixed the WM_ACTIVATE issue, still needs more testing. See bug 7098, used the test case and it works.
Modified: trunk/reactos/win32ss/user/ntuser/focus.c trunk/reactos/win32ss/user/ntuser/input.c
Modified: trunk/reactos/win32ss/user/ntuser/focus.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/focus.c... ============================================================================== --- trunk/reactos/win32ss/user/ntuser/focus.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/ntuser/focus.c [iso-8859-1] Thu Jun 7 01:08:41 2012 @@ -595,8 +595,14 @@ } }
- /* check if the specified window can be set in the input data of a given queue */ - if ( !Window || ThreadQueue == Window->head.pti->MessageQueue) + // Check again! SetActiveWindow could have set the focus via WM_ACTIVATE. + if (ThreadQueue->spwndFocus && ThreadQueue->spwndFocus == Window) + { + hWndPrev = UserHMGetHandle(ThreadQueue->spwndFocus); + } + + /* check if the specified window can be set in the input data of a given queue */ + if (ThreadQueue == Window->head.pti->MessageQueue) /* set the current thread focus window */ ThreadQueue->spwndFocus = Window;
Modified: trunk/reactos/win32ss/user/ntuser/input.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/input.c... ============================================================================== --- trunk/reactos/win32ss/user/ntuser/input.c [iso-8859-1] (original) +++ trunk/reactos/win32ss/user/ntuser/input.c [iso-8859-1] Thu Jun 7 01:08:41 2012 @@ -395,17 +395,17 @@ }
BOOL FASTCALL -UserAttachThreadInput(PTHREADINFO pti, PTHREADINFO ptiTo, BOOL fAttach) +UserAttachThreadInput(PTHREADINFO ptiFrom, PTHREADINFO ptiTo, BOOL fAttach) { PATTACHINFO pai;
/* Can not be the same thread. */ - if (pti == ptiTo) return FALSE; + if (ptiFrom == ptiTo) return FALSE;
/* Do not attach to system threads or between different desktops. */ - if (pti->TIF_flags & TIF_DONTATTACHQUEUE || + if (ptiFrom->TIF_flags & TIF_DONTATTACHQUEUE || ptiTo->TIF_flags & TIF_DONTATTACHQUEUE || - pti->rpdesk != ptiTo->rpdesk) + ptiFrom->rpdesk != ptiTo->rpdesk) return FALSE;
/* If Attach set, allocate and link. */ @@ -415,9 +415,16 @@ if (!pai) return FALSE;
pai->paiNext = gpai; - pai->pti1 = pti; + pai->pti1 = ptiFrom; pai->pti2 = ptiTo; gpai = pai; + ERR("Attach Allocated! ptiFrom 0x%p ptiTo 0x%p\n",ptiFrom,ptiTo); + + ptiFrom->pqAttach = ptiFrom->MessageQueue; + ptiFrom->MessageQueue = ptiTo->MessageQueue; + // FIXME: conditions? + ptiFrom->MessageQueue->spwndActive = ptiFrom->pqAttach->spwndActive; + ptiFrom->MessageQueue->spwndFocus = ptiFrom->pqAttach->spwndFocus; } else /* If clear, unlink and free it. */ { @@ -430,7 +437,7 @@ /* Search list and free if found or return false. */ do { - if (pai->pti2 == ptiTo && pai->pti1 == pti) break; + if (pai->pti2 == ptiTo && pai->pti1 == ptiFrom) break; paiprev = pai; pai = pai->paiNext; } while (pai); @@ -440,8 +447,19 @@ if (paiprev) paiprev->paiNext = pai->paiNext;
ExFreePoolWithTag(pai, USERTAG_ATTACHINFO); - } - + ERR("Attach Free! ptiFrom 0x%p ptiTo 0x%p\n",ptiFrom,ptiTo); + + ptiFrom->MessageQueue = ptiFrom->pqAttach; + // FIXME: conditions? + ptiFrom->MessageQueue->spwndActive = NULL; + ptiFrom->MessageQueue->spwndFocus = NULL; + ptiFrom->pqAttach = NULL; + } + /* Note that key state, which can be ascertained by calls to the GetKeyState + or GetKeyboardState function, is reset after a call to AttachThreadInput. + ATM which one? + */ + RtlCopyMemory(ptiTo->MessageQueue->afKeyState, gafAsyncKeyState, sizeof(gafAsyncKeyState)); return TRUE; }