Rewrote caret implementation to store the information in the server.

diff --git a/windows/caret.c b/windows/caret.c
deleted file mode 100644
index 1d278ab..0000000
--- a/windows/caret.c
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- * Caret functions
- *
- * Copyright 1993 David Metcalfe
- * Copyright 1996 Frans van Dorsselaer
- * Copyright 2001 Eric Pouech
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include "windef.h"
-#include "winbase.h"
-#include "wingdi.h"
-#include "winuser.h"
-#include "wine/wingdi16.h"
-#include "wine/winuser16.h"
-#include "win.h"
-#include "wine/debug.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(caret);
-
-typedef struct
-{
-    HWND     hwnd;
-    UINT     hidden;
-    BOOL     on;
-    INT      x;
-    INT      y;
-    INT      width;
-    INT      height;
-    HBITMAP  hBmp;
-    UINT     timeout;
-    UINT     timerid;
-} CARET;
-
-typedef enum
-{
-    CARET_OFF = 0,
-    CARET_ON,
-    CARET_TOGGLE
-} DISPLAY_CARET;
-
-static CARET Caret = { 0, 0, FALSE, 0, 0, 2, 12, 0, 500, 0 };
-
-/*****************************************************************
- *              CARET_GetHwnd
- */
-HWND CARET_GetHwnd(void)
-{
-    return Caret.hwnd;
-}
-
-/*****************************************************************
- *              CARET_GetRect
- */
-void CARET_GetRect(LPRECT lprc)
-{
-    lprc->right = (lprc->left = Caret.x) + Caret.width - 1;
-    lprc->bottom = (lprc->top = Caret.y) + Caret.height - 1;
-}
-
-/*****************************************************************
- *               CARET_DisplayCaret
- */
-static void CARET_DisplayCaret( DISPLAY_CARET status )
-{
-    HDC hdc;
-    HDC hCompDC;
-
-    if (Caret.on && (status == CARET_ON)) return;
-    if (!Caret.on && (status == CARET_OFF)) return;
-
-    /* So now it's always a toggle */
-
-    Caret.on = !Caret.on;
-    /* do not use DCX_CACHE here, for x,y,width,height are in logical units */
-    if (!(hdc = GetDCEx( Caret.hwnd, 0, DCX_USESTYLE /*| DCX_CACHE*/ ))) return;
-    hCompDC = CreateCompatibleDC(hdc);
-    if (hCompDC)
-    {
-	HBITMAP	hPrevBmp;
-
-	hPrevBmp = SelectObject(hCompDC, Caret.hBmp);
-	BitBlt(hdc, Caret.x, Caret.y, Caret.width, Caret.height, hCompDC, 0, 0, SRCINVERT);
-	SelectObject(hCompDC, hPrevBmp);
-	DeleteDC(hCompDC);
-    }
-    ReleaseDC( Caret.hwnd, hdc );
-}
-
-
-/*****************************************************************
- *               CARET_Callback
- */
-static VOID CALLBACK CARET_Callback( HWND hwnd, UINT msg, UINT id, DWORD ctime)
-{
-    TRACE("hwnd=%04x, timerid=%d, caret=%d\n",
-                  hwnd, id, Caret.on);
-    CARET_DisplayCaret(CARET_TOGGLE);
-}
-
-
-/*****************************************************************
- *               CARET_SetTimer
- */
-static void CARET_SetTimer(void)
-{
-    if (Caret.timerid) KillSystemTimer( (HWND)0, Caret.timerid );
-    Caret.timerid = SetSystemTimer( (HWND)0, 0, Caret.timeout,
-                                      CARET_Callback );
-}
-
-
-/*****************************************************************
- *               CARET_ResetTimer
- */
-static void CARET_ResetTimer(void)
-{
-    if (Caret.timerid)
-    {
-	KillSystemTimer( (HWND)0, Caret.timerid );
-	Caret.timerid = SetSystemTimer( (HWND)0, 0, Caret.timeout,
-                                          CARET_Callback );
-    }
-}
-
-
-/*****************************************************************
- *               CARET_KillTimer
- */
-static void CARET_KillTimer(void)
-{
-    if (Caret.timerid)
-    {
-	KillSystemTimer( (HWND)0, Caret.timerid );
-	Caret.timerid = 0;
-    }
-}
-
-
-/*****************************************************************
- *		CreateCaret (USER32.@)
- */
-BOOL WINAPI CreateCaret( HWND hwnd, HBITMAP bitmap,
-                             INT width, INT height )
-{
-    TRACE("hwnd=%04x\n", hwnd);
-
-    if (!hwnd) return FALSE;
-
-    /* if cursor already exists, destroy it */
-    if (Caret.hwnd) DestroyCaret();
-
-    if (bitmap && (bitmap != 1))
-    {
-        BITMAP bmp;
-        if (!GetObjectA( bitmap, sizeof(bmp), &bmp )) return FALSE;
-        Caret.width = bmp.bmWidth;
-        Caret.height = bmp.bmHeight;
-	bmp.bmBits = NULL;
-	Caret.hBmp = CreateBitmapIndirect(&bmp);
-
-	if (Caret.hBmp)
-	{
-	    /* copy the bitmap */
-	    LPBYTE buf = HeapAlloc(GetProcessHeap(), 0, bmp.bmWidthBytes * bmp.bmHeight);
-	    GetBitmapBits(bitmap, bmp.bmWidthBytes * bmp.bmHeight, buf);
-	    SetBitmapBits(Caret.hBmp, bmp.bmWidthBytes * bmp.bmHeight, buf);
-	    HeapFree(GetProcessHeap(), 0, buf);
-	}
-    }
-    else
-    {
-	HDC	hdc;
-
-        Caret.width = width ? width : GetSystemMetrics(SM_CXBORDER);
-        Caret.height = height ? height : GetSystemMetrics(SM_CYBORDER);
-	Caret.hBmp = 0;
-
-	/* create the uniform bitmap on the fly */
-	hdc = GetDC(hwnd);
-	if (hdc)
-	{
-	    HDC		hMemDC = CreateCompatibleDC(hdc);
-
-	    if (hMemDC)
-	    {
-		RECT	r;
-		r.left = r.top = 0;
-		r.right = Caret.width;
-		r.bottom = Caret.height;
-
-		if ((Caret.hBmp = CreateCompatibleBitmap(hMemDC, Caret.width, Caret.height)))
-		{
-		    HBITMAP hPrevBmp = SelectObject(hMemDC, Caret.hBmp);
-		    FillRect(hMemDC, &r, (bitmap ? COLOR_GRAYTEXT : COLOR_WINDOW) + 1);
-		    SelectObject(hMemDC, hPrevBmp);
-		}
-		DeleteDC(hMemDC);
-	    }
-	    ReleaseDC(hwnd, hdc);
-	}
-    }
-
-    Caret.hwnd = WIN_GetFullHandle( hwnd );
-    Caret.hidden = 1;
-    Caret.on = FALSE;
-    Caret.x = 0;
-    Caret.y = 0;
-
-    Caret.timeout = GetProfileIntA( "windows", "CursorBlinkRate", 500 );
-    return TRUE;
-}
-
-
-/*****************************************************************
- *		DestroyCaret (USER.164)
- */
-void WINAPI DestroyCaret16(void)
-{
-    DestroyCaret();
-}
-
-
-/*****************************************************************
- *		DestroyCaret (USER32.@)
- */
-BOOL WINAPI DestroyCaret(void)
-{
-    if (!Caret.hwnd) return FALSE;
-
-    TRACE("hwnd=%04x, timerid=%d\n",
-		Caret.hwnd, Caret.timerid);
-
-    CARET_KillTimer();
-    CARET_DisplayCaret(CARET_OFF);
-    DeleteObject( Caret.hBmp );
-    Caret.hwnd = 0;
-    return TRUE;
-}
-
-
-/*****************************************************************
- *		SetCaretPos (USER.165)
- */
-void WINAPI SetCaretPos16( INT16 x, INT16 y )
-{
-    SetCaretPos( x, y );
-}
-
-
-/*****************************************************************
- *		SetCaretPos (USER32.@)
- */
-BOOL WINAPI SetCaretPos( INT x, INT y)
-{
-    if (!Caret.hwnd) return FALSE;
-    if ((x == Caret.x) && (y == Caret.y)) return TRUE;
-
-    TRACE("x=%d, y=%d\n", x, y);
-
-    CARET_KillTimer();
-    CARET_DisplayCaret(CARET_OFF);
-    Caret.x = x;
-    Caret.y = y;
-    if (!Caret.hidden)
-    {
-	CARET_DisplayCaret(CARET_ON);
-	CARET_SetTimer();
-    }
-    return TRUE;
-}
-
-
-/*****************************************************************
- *		HideCaret (USER32.@)
- */
-BOOL WINAPI HideCaret( HWND hwnd )
-{
-    if (!Caret.hwnd) return FALSE;
-    if (hwnd && (Caret.hwnd != WIN_GetFullHandle(hwnd))) return FALSE;
-
-    TRACE("hwnd=%04x, hidden=%d\n",
-                  hwnd, Caret.hidden);
-
-    CARET_KillTimer();
-    CARET_DisplayCaret(CARET_OFF);
-    Caret.hidden++;
-    return TRUE;
-}
-
-
-/*****************************************************************
- *		ShowCaret (USER32.@)
- */
-BOOL WINAPI ShowCaret( HWND hwnd )
-{
-    if (!Caret.hwnd) return FALSE;
-    if (hwnd && (Caret.hwnd != WIN_GetFullHandle(hwnd))) return FALSE;
-
-    TRACE("hwnd=%04x, hidden=%d\n",
-		hwnd, Caret.hidden);
-
-    if (Caret.hidden)
-    {
-	Caret.hidden--;
-	if (!Caret.hidden)
-	{
-	    CARET_DisplayCaret(CARET_ON);
-	    CARET_SetTimer();
-	}
-    }
-    return TRUE;
-}
-
-
-/*****************************************************************
- *		SetCaretBlinkTime (USER.168)
- */
-void WINAPI SetCaretBlinkTime16( UINT16 msecs )
-{
-    SetCaretBlinkTime( msecs );
-}
-
-/*****************************************************************
- *		SetCaretBlinkTime (USER32.@)
- */
-BOOL WINAPI SetCaretBlinkTime( UINT msecs )
-{
-    if (!Caret.hwnd) return FALSE;
-
-    TRACE("hwnd=%04x, msecs=%d\n",
-		Caret.hwnd, msecs);
-
-    Caret.timeout = msecs;
-    CARET_ResetTimer();
-    return TRUE;
-}
-
-
-/*****************************************************************
- *		GetCaretBlinkTime (USER.169)
- */
-UINT16 WINAPI GetCaretBlinkTime16(void)
-{
-    return (UINT16)GetCaretBlinkTime();
-}
-
-
-/*****************************************************************
- *		GetCaretBlinkTime (USER32.@)
- */
-UINT WINAPI GetCaretBlinkTime(void)
-{
-    return Caret.timeout;
-}
-
-
-/*****************************************************************
- *		GetCaretPos (USER.183)
- */
-VOID WINAPI GetCaretPos16( LPPOINT16 pt )
-{
-    if (!Caret.hwnd || !pt) return;
-
-    TRACE("hwnd=%04x, pt=%p, x=%d, y=%d\n",
-                  Caret.hwnd, pt, Caret.x, Caret.y);
-    pt->x = (INT16)Caret.x;
-    pt->y = (INT16)Caret.y;
-}
-
-
-/*****************************************************************
- *		GetCaretPos (USER32.@)
- */
-BOOL WINAPI GetCaretPos( LPPOINT pt )
-{
-    if (!Caret.hwnd || !pt) return FALSE;
-    pt->x = Caret.x;
-    pt->y = Caret.y;
-    return TRUE;
-}
diff --git a/windows/scroll.c b/windows/scroll.c
index 6be5d6b..1db4859 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -36,29 +36,26 @@
  */
 static HWND fix_caret(HWND hWnd, LPRECT lprc, UINT flags)
 {
-   HWND hCaret = CARET_GetHwnd();
+    GUITHREADINFO info;
 
-   if( hCaret )
-   {
-       RECT rc;
-       CARET_GetRect( &rc );
-       if( hCaret == hWnd ||
-          (flags & SW_SCROLLCHILDREN && IsChild(hWnd, hCaret)) )
-       {
-           POINT pt;
-           pt.x = rc.left;
-           pt.y = rc.top;
-           MapWindowPoints( hCaret, hWnd, (LPPOINT)&rc, 2 );
-           if( IntersectRect(lprc, lprc, &rc) )
-           {
-               HideCaret(hCaret);
-               lprc->left = pt.x;
-               lprc->top = pt.y;
-               return hCaret;
-           }
-       }
-   }
-   return 0;
+    if (!GetGUIThreadInfo( GetCurrentThreadId(), &info )) return 0;
+    if (!info.hwndCaret) return 0;
+    if (info.hwndCaret == hWnd ||
+        ((flags & SW_SCROLLCHILDREN) && IsChild(hWnd, info.hwndCaret)))
+    {
+        POINT pt;
+        pt.x = info.rcCaret.left;
+        pt.y = info.rcCaret.top;
+        MapWindowPoints( info.hwndCaret, hWnd, (LPPOINT)&info.rcCaret, 2 );
+        if( IntersectRect(lprc, lprc, &info.rcCaret) )
+        {
+            HideCaret(0);
+            lprc->left = pt.x;
+            lprc->top = pt.y;
+            return info.hwndCaret;
+        }
+    }
+    return 0;
 }
 
 
diff --git a/windows/win.c b/windows/win.c
index d19cc09..a7e0c4e 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -1392,7 +1392,12 @@
  */
 static void WIN_SendDestroyMsg( HWND hwnd )
 {
-    if( CARET_GetHwnd() == hwnd) DestroyCaret();
+    GUITHREADINFO info;
+
+    if (GetGUIThreadInfo( GetCurrentThreadId(), &info ))
+    {
+        if (hwnd == info.hwndCaret) DestroyCaret();
+    }
     if (USER_Driver.pResetSelectionOwner)
         USER_Driver.pResetSelectionOwner( hwnd, TRUE );