From: Thomas Faber Date: Sat, 24 Oct 2015 15:46:34 +0000 (+0000) Subject: [WIN32K:NTUSER] X-Git-Tag: ReactOS-0.4.0~376 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=910e2d7dc7cd280aaa34364922f4caaec0ee299c [WIN32K:NTUSER] - Make CaretInfo part of the USER_MESSAGE_QUEUE structure since the pointer can no longer change CORE-10395 svn path=/trunk/; revision=69679 --- diff --git a/reactos/win32ss/user/ntuser/caret.c b/reactos/win32ss/user/ntuser/caret.c index 9d8a4343679..6f6bc3ec17f 100644 --- a/reactos/win32ss/user/ntuser/caret.c +++ b/reactos/win32ss/user/ntuser/caret.c @@ -101,7 +101,7 @@ CaretSystemTimerProc(HWND hwnd, pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; - if (ThreadQueue->CaretInfo->hWnd != hwnd) + if (ThreadQueue->CaretInfo.hWnd != hwnd) { TRACE("Not the same caret window!\n"); return; @@ -126,8 +126,8 @@ CaretSystemTimerProc(HWND hwnd, { case IDCARETTIMER: { - ThreadQueue->CaretInfo->Showing = (ThreadQueue->CaretInfo->Showing ? 0 : 1); - co_IntDrawCaret(pWnd, ThreadQueue->CaretInfo); + ThreadQueue->CaretInfo.Showing = (ThreadQueue->CaretInfo.Showing ? 0 : 1); + co_IntDrawCaret(pWnd, &ThreadQueue->CaretInfo); } } return; @@ -155,18 +155,18 @@ co_IntDestroyCaret(PTHREADINFO Win32Thread) { PUSER_MESSAGE_QUEUE ThreadQueue; PWND pWnd; - ThreadQueue = (PUSER_MESSAGE_QUEUE)Win32Thread->MessageQueue; + ThreadQueue = Win32Thread->MessageQueue; - if(!ThreadQueue || !ThreadQueue->CaretInfo) + if (!ThreadQueue) return FALSE; - pWnd = ValidateHwndNoErr(ThreadQueue->CaretInfo->hWnd); - co_IntHideCaret(ThreadQueue->CaretInfo); - ThreadQueue->CaretInfo->Bitmap = (HBITMAP)0; - ThreadQueue->CaretInfo->hWnd = (HWND)0; - ThreadQueue->CaretInfo->Size.cx = ThreadQueue->CaretInfo->Size.cy = 0; - ThreadQueue->CaretInfo->Showing = 0; - ThreadQueue->CaretInfo->Visible = 0; + pWnd = ValidateHwndNoErr(ThreadQueue->CaretInfo.hWnd); + co_IntHideCaret(&ThreadQueue->CaretInfo); + ThreadQueue->CaretInfo.Bitmap = (HBITMAP)0; + ThreadQueue->CaretInfo.hWnd = (HWND)0; + ThreadQueue->CaretInfo.Size.cx = ThreadQueue->CaretInfo.Size.cy = 0; + ThreadQueue->CaretInfo.Showing = 0; + ThreadQueue->CaretInfo.Visible = 0; if (pWnd) { IntNotifyWinEvent(EVENT_OBJECT_DESTROY, pWnd, OBJID_CARET, CHILDID_SELF, 0); @@ -201,16 +201,16 @@ co_IntSetCaretPos(int X, int Y) pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; - if(ThreadQueue->CaretInfo->hWnd) + if(ThreadQueue->CaretInfo.hWnd) { - pWnd = UserGetWindowObject(ThreadQueue->CaretInfo->hWnd); - if(ThreadQueue->CaretInfo->Pos.x != X || ThreadQueue->CaretInfo->Pos.y != Y) + pWnd = UserGetWindowObject(ThreadQueue->CaretInfo.hWnd); + if(ThreadQueue->CaretInfo.Pos.x != X || ThreadQueue->CaretInfo.Pos.y != Y) { - co_IntHideCaret(ThreadQueue->CaretInfo); - ThreadQueue->CaretInfo->Showing = 1; - ThreadQueue->CaretInfo->Pos.x = X; - ThreadQueue->CaretInfo->Pos.y = Y; - co_IntDrawCaret(pWnd, ThreadQueue->CaretInfo); + co_IntHideCaret(&ThreadQueue->CaretInfo); + ThreadQueue->CaretInfo.Showing = 1; + ThreadQueue->CaretInfo.Pos.x = X; + ThreadQueue->CaretInfo.Pos.y = Y; + co_IntDrawCaret(pWnd, &ThreadQueue->CaretInfo); IntSetTimer(pWnd, IDCARETTIMER, gpsi->dtCaretBlink, CaretSystemTimerProc, TMRF_SYSTEM); IntNotifyWinEvent(EVENT_OBJECT_LOCATIONCHANGE, pWnd, OBJID_CARET, CHILDID_SELF, 0); @@ -237,20 +237,20 @@ BOOL FASTCALL co_UserHideCaret(PWND Window OPTIONAL) pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; - if(Window && ThreadQueue->CaretInfo->hWnd != Window->head.h) + if(Window && ThreadQueue->CaretInfo.hWnd != Window->head.h) { EngSetLastError(ERROR_ACCESS_DENIED); return FALSE; } - if(ThreadQueue->CaretInfo->Visible) + if(ThreadQueue->CaretInfo.Visible) { - PWND pwnd = UserGetWindowObject(ThreadQueue->CaretInfo->hWnd); + PWND pwnd = UserGetWindowObject(ThreadQueue->CaretInfo.hWnd); IntKillTimer(pwnd, IDCARETTIMER, TRUE); - co_IntHideCaret(ThreadQueue->CaretInfo); - ThreadQueue->CaretInfo->Visible = 0; - ThreadQueue->CaretInfo->Showing = 0; + co_IntHideCaret(&ThreadQueue->CaretInfo); + ThreadQueue->CaretInfo.Visible = 0; + ThreadQueue->CaretInfo.Showing = 0; } return TRUE; @@ -273,17 +273,17 @@ BOOL FASTCALL co_UserShowCaret(PWND Window OPTIONAL) pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; - if(Window && ThreadQueue->CaretInfo->hWnd != Window->head.h) + if(Window && ThreadQueue->CaretInfo.hWnd != Window->head.h) { EngSetLastError(ERROR_ACCESS_DENIED); return FALSE; } - if (!ThreadQueue->CaretInfo->Visible) + if (!ThreadQueue->CaretInfo.Visible) { - ThreadQueue->CaretInfo->Visible = 1; - pWnd = ValidateHwndNoErr(ThreadQueue->CaretInfo->hWnd); - if (!ThreadQueue->CaretInfo->Showing && pWnd) + ThreadQueue->CaretInfo.Visible = 1; + pWnd = ValidateHwndNoErr(ThreadQueue->CaretInfo.hWnd); + if (!ThreadQueue->CaretInfo.Showing && pWnd) { IntNotifyWinEvent(EVENT_OBJECT_SHOW, pWnd, OBJID_CARET, OBJID_CARET, 0); } @@ -324,17 +324,17 @@ NtUserCreateCaret( pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; - if (ThreadQueue->CaretInfo->Visible) + if (ThreadQueue->CaretInfo.Visible) { IntKillTimer(Window, IDCARETTIMER, TRUE); - co_IntHideCaret(ThreadQueue->CaretInfo); + co_IntHideCaret(&ThreadQueue->CaretInfo); } - ThreadQueue->CaretInfo->hWnd = hWnd; + ThreadQueue->CaretInfo.hWnd = hWnd; if(hBitmap) { - ThreadQueue->CaretInfo->Bitmap = hBitmap; - ThreadQueue->CaretInfo->Size.cx = ThreadQueue->CaretInfo->Size.cy = 0; + ThreadQueue->CaretInfo.Bitmap = hBitmap; + ThreadQueue->CaretInfo.Size.cx = ThreadQueue->CaretInfo.Size.cy = 0; } else { @@ -346,12 +346,12 @@ NtUserCreateCaret( { nHeight = UserGetSystemMetrics(SM_CYBORDER); } - ThreadQueue->CaretInfo->Bitmap = (HBITMAP)0; - ThreadQueue->CaretInfo->Size.cx = nWidth; - ThreadQueue->CaretInfo->Size.cy = nHeight; + ThreadQueue->CaretInfo.Bitmap = (HBITMAP)0; + ThreadQueue->CaretInfo.Size.cx = nWidth; + ThreadQueue->CaretInfo.Size.cy = nHeight; } - ThreadQueue->CaretInfo->Visible = 0; - ThreadQueue->CaretInfo->Showing = 0; + ThreadQueue->CaretInfo.Visible = 0; + ThreadQueue->CaretInfo.Showing = 0; IntSetTimer( Window, IDCARETTIMER, gpsi->dtCaretBlink, CaretSystemTimerProc, TMRF_SYSTEM ); @@ -396,7 +396,7 @@ NtUserGetCaretPos( pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; - Status = MmCopyToCaller(lpPoint, &(ThreadQueue->CaretInfo->Pos), sizeof(POINT)); + Status = MmCopyToCaller(lpPoint, &ThreadQueue->CaretInfo.Pos, sizeof(POINT)); if(!NT_SUCCESS(Status)) { SetLastNtError(Status); diff --git a/reactos/win32ss/user/ntuser/input.c b/reactos/win32ss/user/ntuser/input.c index 16acf5a8e71..b004006737b 100644 --- a/reactos/win32ss/user/ntuser/input.c +++ b/reactos/win32ss/user/ntuser/input.c @@ -524,9 +524,9 @@ UserAttachThreadInput(PTHREADINFO ptiFrom, PTHREADINFO ptiTo, BOOL fAttach) ptiTo->MessageQueue->spwndFocus = ptiFrom->MessageQueue->spwndFocus; ptiTo->MessageQueue->spwndCapture = ptiFrom->MessageQueue->spwndCapture; ptiTo->MessageQueue->QF_flags ^= ((ptiTo->MessageQueue->QF_flags ^ ptiFrom->MessageQueue->QF_flags) & QF_CAPTURELOCKED); - RtlCopyMemory(ptiTo->MessageQueue->CaretInfo, - ptiFrom->MessageQueue->CaretInfo, - sizeof(*ptiTo->MessageQueue->CaretInfo)); + RtlCopyMemory(&ptiTo->MessageQueue->CaretInfo, + &ptiFrom->MessageQueue->CaretInfo, + sizeof(ptiTo->MessageQueue->CaretInfo)); IntSetFocusMessageQueue(NULL); IntSetFocusMessageQueue(ptiTo->MessageQueue); gptiForeground = ptiTo; diff --git a/reactos/win32ss/user/ntuser/misc.c b/reactos/win32ss/user/ntuser/misc.c index ed7ca2557d5..0cb5fd114d0 100644 --- a/reactos/win32ss/user/ntuser/misc.c +++ b/reactos/win32ss/user/ntuser/misc.c @@ -394,7 +394,7 @@ NtUserGetGUIThreadInfo( if ( Desktop ) MsgQueue = Desktop->ActiveMessageQueue; } - CaretInfo = MsgQueue->CaretInfo; + CaretInfo = &MsgQueue->CaretInfo; SafeGui.flags = (CaretInfo->Visible ? GUI_CARETBLINKING : 0); /* diff --git a/reactos/win32ss/user/ntuser/msgqueue.c b/reactos/win32ss/user/ntuser/msgqueue.c index 32c1253d3d2..fda7e8a9204 100644 --- a/reactos/win32ss/user/ntuser/msgqueue.c +++ b/reactos/win32ss/user/ntuser/msgqueue.c @@ -2080,7 +2080,6 @@ HungAppSysTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) BOOLEAN FASTCALL MsqInitializeMessageQueue(PTHREADINFO pti, PUSER_MESSAGE_QUEUE MessageQueue) { - MessageQueue->CaretInfo = (PTHRDCARETINFO)(MessageQueue + 1); InitializeListHead(&MessageQueue->HardwareMessagesListHead); // Keep here! MessageQueue->spwndFocus = NULL; MessageQueue->iCursorLevel = 0; @@ -2269,16 +2268,16 @@ MsqCreateMessageQueue(PTHREADINFO pti) { PUSER_MESSAGE_QUEUE MessageQueue; - MessageQueue = (PUSER_MESSAGE_QUEUE)ExAllocatePoolWithTag(NonPagedPool, - sizeof(USER_MESSAGE_QUEUE) + sizeof(THRDCARETINFO), - USERTAG_Q); + MessageQueue = ExAllocatePoolWithTag(NonPagedPool, + sizeof(*MessageQueue), + USERTAG_Q); if (!MessageQueue) { return NULL; } - RtlZeroMemory(MessageQueue, sizeof(USER_MESSAGE_QUEUE) + sizeof(THRDCARETINFO)); + RtlZeroMemory(MessageQueue, sizeof(*MessageQueue)); /* hold at least one reference until it'll be destroyed */ IntReferenceMessageQueue(MessageQueue); /* initialize the queue */ @@ -2406,9 +2405,8 @@ MsqSetStateWindow(PTHREADINFO pti, ULONG Type, HWND hWnd) MessageQueue->MoveSize = hWnd; return Prev; case MSQ_STATE_CARET: - ASSERT(MessageQueue->CaretInfo); - Prev = MessageQueue->CaretInfo->hWnd; - MessageQueue->CaretInfo->hWnd = hWnd; + Prev = MessageQueue->CaretInfo.hWnd; + MessageQueue->CaretInfo.hWnd = hWnd; return Prev; } diff --git a/reactos/win32ss/user/ntuser/msgqueue.h b/reactos/win32ss/user/ntuser/msgqueue.h index ca3c2a25738..a2b9be06bb3 100644 --- a/reactos/win32ss/user/ntuser/msgqueue.h +++ b/reactos/win32ss/user/ntuser/msgqueue.h @@ -67,8 +67,6 @@ typedef struct _USER_MESSAGE_QUEUE HWND MenuOwner; /* Identifes the menu state */ BYTE MenuState; - /* Caret information for this queue */ - PTHRDCARETINFO CaretInfo; /* Message Queue Flags */ DWORD QF_flags; DWORD cThreads; // Shared message queue counter. @@ -85,6 +83,8 @@ typedef struct _USER_MESSAGE_QUEUE /* Cursor object */ PCURICON_OBJECT CursorObject; + /* Caret information for this queue */ + THRDCARETINFO CaretInfo; } USER_MESSAGE_QUEUE, *PUSER_MESSAGE_QUEUE; #define QF_UPDATEKEYSTATE 0x00000001 diff --git a/reactos/win32ss/user/ntuser/scrollex.c b/reactos/win32ss/user/ntuser/scrollex.c index 64576ec113a..cd7d6be3d91 100644 --- a/reactos/win32ss/user/ntuser/scrollex.c +++ b/reactos/win32ss/user/ntuser/scrollex.c @@ -27,7 +27,7 @@ co_IntFixCaret(PWND Window, RECTL *lprc, UINT flags) Desktop = pti->rpdesk; ActiveMessageQueue = Desktop->ActiveMessageQueue; if (!ActiveMessageQueue) return 0; - CaretInfo = ActiveMessageQueue->CaretInfo; + CaretInfo = &ActiveMessageQueue->CaretInfo; hWndCaret = CaretInfo->hWnd; WndCaret = ValidateHwndNoErr(hWndCaret); diff --git a/reactos/win32ss/user/ntuser/window.c b/reactos/win32ss/user/ntuser/window.c index bcc915e4eb7..24e8cd86d7f 100644 --- a/reactos/win32ss/user/ntuser/window.c +++ b/reactos/win32ss/user/ntuser/window.c @@ -417,7 +417,7 @@ static void IntSendDestroyMsg(HWND hWnd) } } - if (ti->MessageQueue->CaretInfo->hWnd == UserHMGetHandle(Window)) + if (ti->MessageQueue->CaretInfo.hWnd == UserHMGetHandle(Window)) { co_IntDestroyCaret(ti); }