mirror of
https://github.com/reactos/reactos.git
synced 2025-05-31 23:18:39 +00:00
[NtUser]
- Fix lockup while testing wine test_activateapp (all the tests including the ones commented out). Reordered focus functions to eliminate recursions. Fix ROSTESTS-208. svn path=/trunk/; revision=72880
This commit is contained in:
parent
69ce708392
commit
d8c3f23447
6 changed files with 676 additions and 238 deletions
File diff suppressed because it is too large
Load diff
|
@ -21,6 +21,11 @@ BOOL FASTCALL co_IntMouseActivateWindow(PWND Window);
|
||||||
BOOL FASTCALL co_IntSetForegroundWindow(PWND Window);
|
BOOL FASTCALL co_IntSetForegroundWindow(PWND Window);
|
||||||
BOOL FASTCALL co_IntSetForegroundWindowMouse(PWND Window);
|
BOOL FASTCALL co_IntSetForegroundWindowMouse(PWND Window);
|
||||||
BOOL FASTCALL co_IntSetActiveWindow(PWND,BOOL,BOOL,BOOL);
|
BOOL FASTCALL co_IntSetActiveWindow(PWND,BOOL,BOOL,BOOL);
|
||||||
|
BOOL FASTCALL IntUserSetActiveWindow(PWND,BOOL,BOOL,BOOL);
|
||||||
BOOL FASTCALL UserSetActiveWindow(PWND Wnd);
|
BOOL FASTCALL UserSetActiveWindow(PWND Wnd);
|
||||||
BOOL FASTCALL IntLockSetForegroundWindow(UINT uLockCode);
|
BOOL FASTCALL IntLockSetForegroundWindow(UINT uLockCode);
|
||||||
BOOL FASTCALL IntAllowSetForegroundWindow(DWORD dwProcessId);
|
BOOL FASTCALL IntAllowSetForegroundWindow(DWORD dwProcessId);
|
||||||
|
VOID FASTCALL IntActivateWindow(PWND,PTHREADINFO,HANDLE,DWORD);
|
||||||
|
BOOL FASTCALL IntDeactivateWindow(PTHREADINFO,HANDLE);
|
||||||
|
BOOL FASTCALL co_IntSetForegroundMessageQueue(PWND,PTHREADINFO,BOOL,DWORD );
|
||||||
|
VOID FASTCALL UpdateShellHook(PWND);
|
||||||
|
|
|
@ -613,7 +613,7 @@ IntCallWndProcRet ( PWND Window, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar
|
||||||
static LRESULT handle_internal_message( PWND pWnd, UINT msg, WPARAM wparam, LPARAM lparam )
|
static LRESULT handle_internal_message( PWND pWnd, UINT msg, WPARAM wparam, LPARAM lparam )
|
||||||
{
|
{
|
||||||
LRESULT lRes;
|
LRESULT lRes;
|
||||||
USER_REFERENCE_ENTRY Ref;
|
// USER_REFERENCE_ENTRY Ref;
|
||||||
// PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
|
// PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
|
||||||
|
|
||||||
if (!pWnd ||
|
if (!pWnd ||
|
||||||
|
@ -641,14 +641,6 @@ static LRESULT handle_internal_message( PWND pWnd, UINT msg, WPARAM wparam, LPAR
|
||||||
ExFreePoolWithTag(winpos, USERTAG_SWP);
|
ExFreePoolWithTag(winpos, USERTAG_SWP);
|
||||||
return lRes;
|
return lRes;
|
||||||
}
|
}
|
||||||
case WM_ASYNC_SETACTIVEWINDOW:
|
|
||||||
{
|
|
||||||
PWND Window = (PWND)wparam;
|
|
||||||
if (wparam) UserRefObjectCo(Window, &Ref);
|
|
||||||
lRes = (LRESULT)co_IntSetActiveWindow(Window,(BOOL)lparam,TRUE,TRUE);
|
|
||||||
if (wparam) UserDerefObjectCo(Window);
|
|
||||||
return lRes;
|
|
||||||
}
|
|
||||||
case WM_ASYNC_DESTROYWINDOW:
|
case WM_ASYNC_DESTROYWINDOW:
|
||||||
{
|
{
|
||||||
ERR("WM_ASYNC_DESTROYWINDOW\n");
|
ERR("WM_ASYNC_DESTROYWINDOW\n");
|
||||||
|
@ -661,16 +653,29 @@ static LRESULT handle_internal_message( PWND pWnd, UINT msg, WPARAM wparam, LPAR
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static LRESULT handle_internal_events( PTHREADINFO pti, PWND pWnd, LONG_PTR ExtraInfo, PMSG pMsg)
|
static LRESULT handle_internal_events( PTHREADINFO pti, PWND pWnd, DWORD dwQEvent, LONG_PTR ExtraInfo, PMSG pMsg)
|
||||||
{
|
{
|
||||||
LRESULT Result = 0;
|
LRESULT Result = 0;
|
||||||
|
|
||||||
switch(pMsg->lParam)
|
switch(dwQEvent)
|
||||||
{
|
{
|
||||||
case POSTEVENT_NWE:
|
case POSTEVENT_NWE:
|
||||||
{
|
{
|
||||||
co_EVENT_CallEvents( pMsg->message, pMsg->hwnd, pMsg->wParam, ExtraInfo);
|
co_EVENT_CallEvents( pMsg->message, pMsg->hwnd, pMsg->wParam, ExtraInfo);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case POSTEVENT_SAW:
|
||||||
|
{
|
||||||
|
//ERR("HIE : SAW : pti 0x%p hWnd 0x%p\n",pti,pMsg->hwnd);
|
||||||
|
IntActivateWindow((PWND)pMsg->wParam, pti, (HANDLE)pMsg->lParam, (DWORD)ExtraInfo);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case POSTEVENT_DAW:
|
||||||
|
{
|
||||||
|
//ERR("HIE : DAW : pti 0x%p tid 0x%p hWndPrev 0x%p\n",pti,ExtraInfo,pMsg->hwnd);
|
||||||
|
IntDeactivateWindow(pti, (HANDLE)ExtraInfo);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
@ -873,6 +878,7 @@ co_IntPeekMessage( PMSG Msg,
|
||||||
MsgFilterMax,
|
MsgFilterMax,
|
||||||
ProcessMask,
|
ProcessMask,
|
||||||
ExtraInfo,
|
ExtraInfo,
|
||||||
|
0,
|
||||||
Msg ))
|
Msg ))
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -914,6 +920,7 @@ co_IntPeekMessage( PMSG Msg,
|
||||||
{
|
{
|
||||||
LONG_PTR eExtraInfo;
|
LONG_PTR eExtraInfo;
|
||||||
MSG eMsg;
|
MSG eMsg;
|
||||||
|
DWORD dwQEvent;
|
||||||
if (MsqPeekMessage( pti,
|
if (MsqPeekMessage( pti,
|
||||||
TRUE,
|
TRUE,
|
||||||
Window,
|
Window,
|
||||||
|
@ -921,9 +928,10 @@ co_IntPeekMessage( PMSG Msg,
|
||||||
0,
|
0,
|
||||||
QS_EVENT,
|
QS_EVENT,
|
||||||
&eExtraInfo,
|
&eExtraInfo,
|
||||||
|
&dwQEvent,
|
||||||
&eMsg ))
|
&eMsg ))
|
||||||
{
|
{
|
||||||
handle_internal_events( pti, Window, eExtraInfo, &eMsg);
|
handle_internal_events( pti, Window, dwQEvent, eExtraInfo, &eMsg);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2115,6 +2115,7 @@ MsqPeekMessage(IN PTHREADINFO pti,
|
||||||
IN UINT MsgFilterHigh,
|
IN UINT MsgFilterHigh,
|
||||||
IN UINT QSflags,
|
IN UINT QSflags,
|
||||||
OUT LONG_PTR *ExtraInfo,
|
OUT LONG_PTR *ExtraInfo,
|
||||||
|
OUT DWORD *dwQEvent,
|
||||||
OUT PMSG Message)
|
OUT PMSG Message)
|
||||||
{
|
{
|
||||||
PUSER_MESSAGE CurrentMessage;
|
PUSER_MESSAGE CurrentMessage;
|
||||||
|
@ -2145,6 +2146,7 @@ MsqPeekMessage(IN PTHREADINFO pti,
|
||||||
*Message = CurrentMessage->Msg;
|
*Message = CurrentMessage->Msg;
|
||||||
*ExtraInfo = CurrentMessage->ExtraInfo;
|
*ExtraInfo = CurrentMessage->ExtraInfo;
|
||||||
QS_Flags = CurrentMessage->QS_Flags;
|
QS_Flags = CurrentMessage->QS_Flags;
|
||||||
|
if (dwQEvent) *dwQEvent = CurrentMessage->dwQEvent;
|
||||||
|
|
||||||
if (Remove)
|
if (Remove)
|
||||||
{
|
{
|
||||||
|
|
|
@ -120,7 +120,10 @@ enum internal_event_message
|
||||||
WM_ASYNC_DESTROYWINDOW
|
WM_ASYNC_DESTROYWINDOW
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define POSTEVENT_DAW 4
|
||||||
|
#define POSTEVENT_SAW 5
|
||||||
#define POSTEVENT_NWE 14
|
#define POSTEVENT_NWE 14
|
||||||
|
#define POSTEVENT_NONE 0xFFFF
|
||||||
|
|
||||||
extern LIST_ENTRY usmList;
|
extern LIST_ENTRY usmList;
|
||||||
|
|
||||||
|
@ -141,6 +144,7 @@ MsqPeekMessage(IN PTHREADINFO pti,
|
||||||
IN UINT MsgFilterHigh,
|
IN UINT MsgFilterHigh,
|
||||||
IN UINT QSflags,
|
IN UINT QSflags,
|
||||||
OUT LONG_PTR *ExtraInfo,
|
OUT LONG_PTR *ExtraInfo,
|
||||||
|
OUT DWORD *dwQEvent,
|
||||||
OUT PMSG Message);
|
OUT PMSG Message);
|
||||||
BOOL APIENTRY
|
BOOL APIENTRY
|
||||||
co_MsqPeekHardwareMessage(IN PTHREADINFO pti,
|
co_MsqPeekHardwareMessage(IN PTHREADINFO pti,
|
||||||
|
@ -261,7 +265,7 @@ WPARAM FASTCALL MsqGetDownKeyState(PUSER_MESSAGE_QUEUE);
|
||||||
BOOL FASTCALL IsThreadSuspended(PTHREADINFO);
|
BOOL FASTCALL IsThreadSuspended(PTHREADINFO);
|
||||||
PUSER_SENT_MESSAGE FASTCALL AllocateUserMessage(BOOL);
|
PUSER_SENT_MESSAGE FASTCALL AllocateUserMessage(BOOL);
|
||||||
VOID FASTCALL FreeUserMessage(PUSER_SENT_MESSAGE);
|
VOID FASTCALL FreeUserMessage(PUSER_SENT_MESSAGE);
|
||||||
|
VOID FASTCALL MsqDestroyMessage(PUSER_MESSAGE);
|
||||||
|
|
||||||
int UserShowCursor(BOOL bShow);
|
int UserShowCursor(BOOL bShow);
|
||||||
PCURICON_OBJECT
|
PCURICON_OBJECT
|
||||||
|
|
|
@ -401,6 +401,7 @@ co_WinPosActivateOtherWindow(PWND Wnd)
|
||||||
|
|
||||||
if (IntIsDesktopWindow(Wnd))
|
if (IntIsDesktopWindow(Wnd))
|
||||||
{
|
{
|
||||||
|
//ERR("WinPosActivateOtherWindow Set Focus Msg Q No window!\n");
|
||||||
IntSetFocusMessageQueue(NULL);
|
IntSetFocusMessageQueue(NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -437,6 +438,7 @@ co_WinPosActivateOtherWindow(PWND Wnd)
|
||||||
WndTo = WndTo->spwndChild;
|
WndTo = WndTo->spwndChild;
|
||||||
if ( WndTo == NULL )
|
if ( WndTo == NULL )
|
||||||
{
|
{
|
||||||
|
//ERR("WinPosActivateOtherWindow No window!\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (;;)
|
for (;;)
|
||||||
|
@ -464,10 +466,10 @@ done:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//ERR("WinPosActivateOtherWindow Set Active 0x%p\n",WndTo);
|
//ERR("WinPosActivateOtherWindow Set Active 0x%p\n",WndTo);
|
||||||
if (!co_IntSetActiveWindow(WndTo,FALSE,TRUE,FALSE)) /* Ok for WndTo to be NULL here */
|
if (!UserSetActiveWindow(WndTo)) /* Ok for WndTo to be NULL here */
|
||||||
{
|
{
|
||||||
//ERR("WPAOW SA 1\n");
|
//ERR("WPAOW SA 1\n");
|
||||||
co_IntSetActiveWindow(NULL,FALSE,TRUE,FALSE);
|
UserSetActiveWindow(NULL);
|
||||||
}
|
}
|
||||||
if (WndTo) UserDerefObjectCo(WndTo);
|
if (WndTo) UserDerefObjectCo(WndTo);
|
||||||
}
|
}
|
||||||
|
@ -1817,7 +1819,7 @@ co_WinPosSetWindowPos(
|
||||||
RECTL CopyRect;
|
RECTL CopyRect;
|
||||||
PWND Ancestor;
|
PWND Ancestor;
|
||||||
BOOL bPointerInWindow, PosChanged = FALSE;
|
BOOL bPointerInWindow, PosChanged = FALSE;
|
||||||
//PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
|
PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
|
||||||
|
|
||||||
ASSERT_REFS_CO(Window);
|
ASSERT_REFS_CO(Window);
|
||||||
|
|
||||||
|
@ -2215,10 +2217,15 @@ co_WinPosSetWindowPos(
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//ERR("SetWindowPos Set FG Window!\n");
|
//ERR("SetWindowPos Set FG Window!\n");
|
||||||
if (Window->state & WNDS_BEINGACTIVATED) // Inside SAW?
|
if ( pti->MessageQueue->spwndActive != Window ||
|
||||||
co_IntSetActiveWindow(Window, FALSE, TRUE, FALSE); // Fixes Api AttachThreadInput tests.
|
pti->MessageQueue != gpqForeground )
|
||||||
else
|
{
|
||||||
co_IntSetForegroundWindow(Window); // Fixes SW_HIDE issues. Wine win test_SetActiveWindow & test_SetForegroundWindow.
|
//ERR("WPSWP : set active window\n");
|
||||||
|
if (!(Window->state & WNDS_BEINGACTIVATED)) // Inside SAW?
|
||||||
|
{
|
||||||
|
co_IntSetForegroundWindow(Window); // Fixes SW_HIDE issues. Wine win test_SetActiveWindow & test_SetForegroundWindow.
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue