From 9a36bd47a29e43825f6c55ddac8a342271c100d2 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 6 May 2009 18:49:53 +0000 Subject: [PATCH] - Implement ReplyMessage and kernel support for InSendMessage and GetMessageTime. svn path=/trunk/; revision=40820 --- reactos/dll/win32/user32/windows/message.c | 15 ++++++------- reactos/include/reactos/win32k/ntuser.h | 3 ++- .../subsystems/win32/win32k/include/win32.h | 1 + .../subsystems/win32/win32k/ntuser/message.c | 2 +- reactos/subsystems/win32/win32k/ntuser/misc.c | 22 +++++++++++++++++++ 5 files changed, 33 insertions(+), 10 deletions(-) diff --git a/reactos/dll/win32/user32/windows/message.c b/reactos/dll/win32/user32/windows/message.c index b1828ad2e2e..818d20edfc3 100644 --- a/reactos/dll/win32/user32/windows/message.c +++ b/reactos/dll/win32/user32/windows/message.c @@ -1071,6 +1071,7 @@ GetMessageTime(VOID) { PUSER32_THREAD_DATA ThreadData = User32GetThreadData(); return(ThreadData->LastMessage.time); +// return NtUserGetThreadState(THREADSTATE_GETMESSAGETIME); } @@ -1090,8 +1091,7 @@ InSendMessage(VOID) return TRUE; } } - return FALSE; -/* return(NtUserGetThreadState(THREADSTATE_INSENDMESSAGE) != ISMEX_NOSEND);*/ + return(NtUserGetThreadState(THREADSTATE_INSENDMESSAGE) != ISMEX_NOSEND); } @@ -1105,23 +1105,22 @@ InSendMessageEx( { PCLIENTTHREADINFO pcti = GetWin32ClientInfo()->pClientThreadInfo; // FIXME("ISMEX %x\n",pcti); - if (pcti && !(pcti->CTI_flags & CTI_INSENDMESSAGE)) return ISMEX_NOSEND; + if (pcti && !(pcti->CTI_flags & CTI_INSENDMESSAGE)) + return ISMEX_NOSEND; else - /* return NtUserGetThreadState(THREADSTATE_INSENDMESSAGE); */ - return 0; + return NtUserGetThreadState(THREADSTATE_INSENDMESSAGE); } /* - * @unimplemented + * @implemented */ BOOL WINAPI ReplyMessage( LRESULT lResult) { - UNIMPLEMENTED; - return FALSE; + return NtUserCallOneParam(lResult, ONEPARAM_ROUTINE_REPLYMESSAGE); } diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index b8924ba6b3d..e059ccf9ec1 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -1721,7 +1721,8 @@ enum ThreadStateRoutines THREADSTATE_ACTIVEWINDOW, THREADSTATE_CAPTUREWINDOW, THREADSTATE_PROGMANWINDOW, - THREADSTATE_TASKMANWINDOW + THREADSTATE_TASKMANWINDOW, + THREADSTATE_GETMESSAGETIME }; DWORD diff --git a/reactos/subsystems/win32/win32k/include/win32.h b/reactos/subsystems/win32/win32k/include/win32.h index ea5e092c1c6..db7b155315d 100644 --- a/reactos/subsystems/win32/win32k/include/win32.h +++ b/reactos/subsystems/win32/win32k/include/win32.h @@ -38,6 +38,7 @@ typedef struct _THREADINFO PDESKTOPINFO pDeskInfo; PCLIENTINFO pClientInfo; FLONG TIF_flags; + LONG timeLast; HANDLE hDesktop; UINT cPaintsReady; /* Count of paints pending. */ UINT cTimersReady; /* Count of timers pending. */ diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 69d609ab600..e5a1493c2cc 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1359,7 +1359,7 @@ UserPostMessage(HWND Wnd, IntGetCursorLocation(pti->Desktop->WindowStation, &KernelModeMsg.pt); KeQueryTickCount(&LargeTickCount); - KernelModeMsg.time = MsqCalculateMessageTime(&LargeTickCount); + pti->timeLast = KernelModeMsg.time = MsqCalculateMessageTime(&LargeTickCount); MsqPostMessage(Window->MessageQueue, &KernelModeMsg, NULL != MsgMemoryEntry && 0 != KernelModeMsg.lParam, QS_POSTMESSAGE); diff --git a/reactos/subsystems/win32/win32k/ntuser/misc.c b/reactos/subsystems/win32/win32k/ntuser/misc.c index ff71520adb1..b3b0fe69b8a 100644 --- a/reactos/subsystems/win32/win32k/ntuser/misc.c +++ b/reactos/subsystems/win32/win32k/ntuser/misc.c @@ -96,6 +96,28 @@ NtUserGetThreadState( RETURN( (DWORD)GetW32ThreadInfo()->pDeskInfo->hTaskManWindow); case THREADSTATE_ACTIVEWINDOW: RETURN ( (DWORD)UserGetActiveWindow()); + case THREADSTATE_INSENDMESSAGE: + { + DWORD Ret = ISMEX_NOSEND; + PUSER_MESSAGE_QUEUE MessageQueue = + ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->MessageQueue; + DPRINT1("THREADSTATE_INSENDMESSAGE\n"); + + if (!IsListEmpty(&MessageQueue->SentMessagesListHead)) + { + Ret = ISMEX_SEND; + } + else if (!IsListEmpty(&MessageQueue->NotifyMessagesListHead)) + { + /* FIXME Need to set message flag when in callback mode with notify */ + Ret = ISMEX_NOTIFY; + } + /* FIXME Need to set message flag if replied to or ReplyMessage */ + RETURN( Ret); + } + case THREADSTATE_GETMESSAGETIME: + /* FIXME Needs more work! */ + RETURN( ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->timeLast); } RETURN( 0);