From 9efeb21225dff76b674ecd1388a7281be755f85c Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 20 Dec 2003 15:42:47 +0000 Subject: [PATCH] some fixes on carets svn path=/trunk/; revision=7134 --- reactos/subsys/win32k/include/caret.h | 5 +- reactos/subsys/win32k/include/msgqueue.h | 4 + reactos/subsys/win32k/main/dllmain.c | 4 +- reactos/subsys/win32k/ntuser/caret.c | 113 +++++++++++++---------- reactos/subsys/win32k/ntuser/misc.c | 4 +- reactos/subsys/win32k/ntuser/msgqueue.c | 6 +- 6 files changed, 76 insertions(+), 60 deletions(-) diff --git a/reactos/subsys/win32k/include/caret.h b/reactos/subsys/win32k/include/caret.h index 13d9904d913..c9a83d8e11c 100644 --- a/reactos/subsys/win32k/include/caret.h +++ b/reactos/subsys/win32k/include/caret.h @@ -1,11 +1,10 @@ #ifndef _WIN32K_CARET_H #define _WIN32K_CARET_H -#include -#include +#include +#include #define IDCARETTIMER (0xffff) -#define ThrdCaretInfo(x) (PTHRDCARETINFO)((PW32THREAD)(x + 1)) /* a copy of this structure is in lib/user32/include/user32.h */ typedef struct _THRDCARETINFO diff --git a/reactos/subsys/win32k/include/msgqueue.h b/reactos/subsys/win32k/include/msgqueue.h index aac43c5ba54..c36825a4267 100644 --- a/reactos/subsys/win32k/include/msgqueue.h +++ b/reactos/subsys/win32k/include/msgqueue.h @@ -3,6 +3,7 @@ #include #include +#include "caret.h" #include "hook.h" typedef struct _USER_MESSAGE @@ -74,6 +75,9 @@ typedef struct _USER_MESSAGE_QUEUE HWND MenuOwner; /* Identifes the menu state */ BYTE MenuState; + /* Caret information for this queue */ + PTHRDCARETINFO CaretInfo; + /* Window hooks */ PHOOKTABLE Hooks; diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c index aee281f61f0..0c17e0ddffc 100644 --- a/reactos/subsys/win32k/main/dllmain.c +++ b/reactos/subsys/win32k/main/dllmain.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dllmain.c,v 1.62 2003/12/13 22:38:29 weiden Exp $ +/* $Id: dllmain.c,v 1.63 2003/12/20 15:42:47 weiden Exp $ * * Entry Point for win32k.sys */ @@ -216,7 +216,7 @@ DllMain ( Win32kThreadCallback, 0, 0, - sizeof(W32THREAD) + sizeof(THRDCARETINFO), + sizeof(W32THREAD), sizeof(W32PROCESS)); WinPosSetupInternalPos(); diff --git a/reactos/subsys/win32k/ntuser/caret.c b/reactos/subsys/win32k/ntuser/caret.c index 56604046c8a..353798950fc 100644 --- a/reactos/subsys/win32k/ntuser/caret.c +++ b/reactos/subsys/win32k/ntuser/caret.c @@ -1,4 +1,4 @@ -/* $Id: caret.c,v 1.8 2003/11/23 11:39:48 navaraf Exp $ +/* $Id: caret.c,v 1.9 2003/12/20 15:42:47 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -43,9 +43,18 @@ IntHideCaret(PTHRDCARETINFO CaretInfo) BOOL FASTCALL IntDestroyCaret(PW32THREAD Win32Thread) { - PTHRDCARETINFO CaretInfo = ThrdCaretInfo(Win32Thread); - IntHideCaret(CaretInfo); - RtlZeroMemory(CaretInfo, sizeof(THRDCARETINFO)); + PUSER_MESSAGE_QUEUE ThreadQueue; + ThreadQueue = (PUSER_MESSAGE_QUEUE)Win32Thread->MessageQueue; + + if(!ThreadQueue || !ThreadQueue->CaretInfo) + return FALSE; + + 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; return TRUE; } @@ -80,7 +89,6 @@ IntSetCaretBlinkTime(UINT uMSeconds) return TRUE; } -#define CARET_VALUE_BUFFER_SIZE 32 UINT FASTCALL IntQueryCaretBlinkRate(VOID) { @@ -185,18 +193,19 @@ IntGetCaretBlinkTime(VOID) BOOL FASTCALL IntSetCaretPos(int X, int Y) { - PTHRDCARETINFO CaretInfo = ThrdCaretInfo(PsGetCurrentThread()->Win32Thread); + PUSER_MESSAGE_QUEUE ThreadQueue; + ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue; - if(CaretInfo->hWnd) + if(ThreadQueue->CaretInfo->hWnd) { - if(CaretInfo->Pos.x != X || CaretInfo->Pos.y != Y) + if(ThreadQueue->CaretInfo->Pos.x != X || ThreadQueue->CaretInfo->Pos.y != Y) { - IntHideCaret(CaretInfo); - CaretInfo->Showing = 0; - CaretInfo->Pos.x = X; - CaretInfo->Pos.y = Y; - IntCallWindowProc(NULL, CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0); - IntSetTimer(CaretInfo->hWnd, IDCARETTIMER, IntGetCaretBlinkTime(), NULL, TRUE); + IntHideCaret(ThreadQueue->CaretInfo); + ThreadQueue->CaretInfo->Showing = 0; + ThreadQueue->CaretInfo->Pos.x = X; + ThreadQueue->CaretInfo->Pos.y = Y; + IntCallWindowProc(NULL, ThreadQueue->CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0); + IntSetTimer(ThreadQueue->CaretInfo->hWnd, IDCARETTIMER, IntGetCaretBlinkTime(), NULL, TRUE); } return TRUE; } @@ -207,12 +216,13 @@ IntSetCaretPos(int X, int Y) BOOL FASTCALL IntSwitchCaretShowing(PVOID Info) { - PTHRDCARETINFO CaretInfo = ThrdCaretInfo(PsGetCurrentThread()->Win32Thread); + PUSER_MESSAGE_QUEUE ThreadQueue; + ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue; - if(CaretInfo->hWnd) + if(ThreadQueue->CaretInfo->hWnd) { - CaretInfo->Showing = (CaretInfo->Showing ? 0 : 1); - MmCopyToCaller(Info, CaretInfo, sizeof(THRDCARETINFO)); + ThreadQueue->CaretInfo->Showing = (ThreadQueue->CaretInfo->Showing ? 0 : 1); + MmCopyToCaller(Info, ThreadQueue->CaretInfo, sizeof(THRDCARETINFO)); return TRUE; } @@ -222,12 +232,14 @@ IntSwitchCaretShowing(PVOID Info) VOID FASTCALL IntDrawCaret(HWND hWnd) { - PTHRDCARETINFO CaretInfo = ThrdCaretInfo(PsGetCurrentThread()->Win32Thread); + PUSER_MESSAGE_QUEUE ThreadQueue; + ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue; - if(CaretInfo->hWnd && CaretInfo->Visible && CaretInfo->Showing) + if(ThreadQueue->CaretInfo->hWnd && ThreadQueue->CaretInfo->Visible && + ThreadQueue->CaretInfo->Showing) { - IntCallWindowProc(NULL, CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0); - CaretInfo->Showing = 1; + IntCallWindowProc(NULL, ThreadQueue->CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0); + ThreadQueue->CaretInfo->Showing = 1; } } @@ -242,7 +254,7 @@ NtUserCreateCaret( int nHeight) { PWINDOW_OBJECT WindowObject; - PTHRDCARETINFO CaretInfo; + PUSER_MESSAGE_QUEUE ThreadQueue; WindowObject = IntGetWindowObject(hWnd); if(!WindowObject) @@ -260,25 +272,24 @@ NtUserCreateCaret( IntRemoveTimer(hWnd, IDCARETTIMER, PsGetCurrentThreadId(), TRUE); - CaretInfo = ThrdCaretInfo(WindowObject->OwnerThread->Win32Thread); + ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue; - IntHideCaret(CaretInfo); + IntHideCaret(ThreadQueue->CaretInfo); - CaretInfo->hWnd = hWnd; + ThreadQueue->CaretInfo->hWnd = hWnd; if(hBitmap) { - CaretInfo->Bitmap = hBitmap; - CaretInfo->Size.cx = CaretInfo->Size.cy = 0; + ThreadQueue->CaretInfo->Bitmap = hBitmap; + ThreadQueue->CaretInfo->Size.cx = ThreadQueue->CaretInfo->Size.cy = 0; } else { - CaretInfo->Bitmap = (HBITMAP)0; - CaretInfo->Size.cx = nWidth; - CaretInfo->Size.cy = nHeight; + ThreadQueue->CaretInfo->Bitmap = (HBITMAP)0; + ThreadQueue->CaretInfo->Size.cx = nWidth; + ThreadQueue->CaretInfo->Size.cy = nHeight; } - CaretInfo->Pos.x = CaretInfo->Pos.y = 0; - CaretInfo->Visible = 0; - CaretInfo->Showing = 0; + ThreadQueue->CaretInfo->Visible = 0; + ThreadQueue->CaretInfo->Showing = 0; IntReleaseWindowObject(WindowObject); return TRUE; @@ -296,12 +307,12 @@ STDCALL NtUserGetCaretPos( LPPOINT lpPoint) { - PTHRDCARETINFO CaretInfo; + PUSER_MESSAGE_QUEUE ThreadQueue; NTSTATUS Status; - CaretInfo = ThrdCaretInfo(PsGetCurrentThread()->Win32Thread); + ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue; - Status = MmCopyToCaller(lpPoint, &(CaretInfo->Pos), sizeof(POINT)); + Status = MmCopyToCaller(lpPoint, &(ThreadQueue->CaretInfo->Pos), sizeof(POINT)); if(!NT_SUCCESS(Status)) { SetLastNtError(Status); @@ -317,7 +328,7 @@ NtUserHideCaret( HWND hWnd) { PWINDOW_OBJECT WindowObject; - PTHRDCARETINFO CaretInfo; + PUSER_MESSAGE_QUEUE ThreadQueue; WindowObject = IntGetWindowObject(hWnd); if(!WindowObject) @@ -333,22 +344,22 @@ NtUserHideCaret( return FALSE; } - CaretInfo = ThrdCaretInfo(PsGetCurrentThread()->Win32Thread); + ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue; - if(CaretInfo->hWnd != hWnd) + if(ThreadQueue->CaretInfo->hWnd != hWnd) { IntReleaseWindowObject(WindowObject); SetLastWin32Error(ERROR_ACCESS_DENIED); return FALSE; } - if(CaretInfo->Visible) + if(ThreadQueue->CaretInfo->Visible) { IntRemoveTimer(hWnd, IDCARETTIMER, PsGetCurrentThreadId(), TRUE); - IntHideCaret(CaretInfo); - CaretInfo->Visible = 0; - CaretInfo->Showing = 0; + IntHideCaret(ThreadQueue->CaretInfo); + ThreadQueue->CaretInfo->Visible = 0; + ThreadQueue->CaretInfo->Showing = 0; } IntReleaseWindowObject(WindowObject); @@ -361,7 +372,7 @@ NtUserShowCaret( HWND hWnd) { PWINDOW_OBJECT WindowObject; - PTHRDCARETINFO CaretInfo; + PUSER_MESSAGE_QUEUE ThreadQueue; WindowObject = IntGetWindowObject(hWnd); if(!WindowObject) @@ -377,21 +388,21 @@ NtUserShowCaret( return FALSE; } - CaretInfo = ThrdCaretInfo(PsGetCurrentThread()->Win32Thread); + ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue; - if(CaretInfo->hWnd != hWnd) + if(ThreadQueue->CaretInfo->hWnd != hWnd) { IntReleaseWindowObject(WindowObject); SetLastWin32Error(ERROR_ACCESS_DENIED); return FALSE; } - if(!CaretInfo->Visible) + if(!ThreadQueue->CaretInfo->Visible) { - CaretInfo->Visible = 1; - if(!CaretInfo->Showing) + ThreadQueue->CaretInfo->Visible = 1; + if(!ThreadQueue->CaretInfo->Showing) { - IntCallWindowProc(NULL, CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0); + IntCallWindowProc(NULL, ThreadQueue->CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0); } IntSetTimer(hWnd, IDCARETTIMER, IntGetCaretBlinkTime(), NULL, TRUE); } diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index f96e61036b9..9bef45c8bc4 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.35 2003/12/19 19:30:05 weiden Exp $ +/* $Id: misc.c,v 1.36 2003/12/20 15:42:47 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -588,8 +588,8 @@ NtUserGetGUIThreadInfo( return FALSE; } - CaretInfo = ThrdCaretInfo(Thread->Win32Thread); MsgQueue = (PUSER_MESSAGE_QUEUE)Desktop->ActiveMessageQueue; + CaretInfo = MsgQueue->CaretInfo; SafeGui.flags = (CaretInfo->Visible ? GUI_CARETBLINKING : 0); if(MsgQueue->MenuOwner) diff --git a/reactos/subsys/win32k/ntuser/msgqueue.c b/reactos/subsys/win32k/ntuser/msgqueue.c index 6332306e1bf..e5d7fac783e 100644 --- a/reactos/subsys/win32k/ntuser/msgqueue.c +++ b/reactos/subsys/win32k/ntuser/msgqueue.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: msgqueue.c,v 1.51 2003/12/19 19:30:05 weiden Exp $ +/* $Id: msgqueue.c,v 1.52 2003/12/20 15:42:47 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -42,6 +42,7 @@ #include #include #include +#include #define NDEBUG #include @@ -810,6 +811,7 @@ VOID FASTCALL MsqInitializeMessageQueue(struct _ETHREAD *Thread, PUSER_MESSAGE_QUEUE MessageQueue) { MessageQueue->Thread = Thread; + MessageQueue->CaretInfo = (PTHRDCARETINFO)(MessageQueue + 1); InitializeListHead(&MessageQueue->PostedMessagesListHead); InitializeListHead(&MessageQueue->SentMessagesListHead); InitializeListHead(&MessageQueue->HardwareMessagesListHead); @@ -846,7 +848,7 @@ MsqCreateMessageQueue(struct _ETHREAD *Thread) PUSER_MESSAGE_QUEUE MessageQueue; MessageQueue = (PUSER_MESSAGE_QUEUE)ExAllocatePool(PagedPool, - sizeof(USER_MESSAGE_QUEUE)); + sizeof(USER_MESSAGE_QUEUE) + sizeof(THRDCARETINFO)); if (!MessageQueue) { return NULL;