[Win32k]
[reactos.git] / reactos / subsystems / win32 / win32k / ntuser / caret.c
index 01f7363..340cd49 100644 (file)
@@ -11,7 +11,7 @@
 
 /* INCLUDES ******************************************************************/
 
-#include <w32k.h>
+#include <win32k.h>
 
 #define NDEBUG
 #include <debug.h>
@@ -40,7 +40,7 @@ co_IntHideCaret(PTHRDCARETINFO CaretInfo)
 }
 
 BOOL FASTCALL
-co_IntDestroyCaret(PW32THREAD Win32Thread)
+co_IntDestroyCaret(PTHREADINFO Win32Thread)
 {
    PUSER_MESSAGE_QUEUE ThreadQueue;
    ThreadQueue = (PUSER_MESSAGE_QUEUE)Win32Thread->MessageQueue;
@@ -61,7 +61,8 @@ BOOL FASTCALL
 IntSetCaretBlinkTime(UINT uMSeconds)
 {
    /* Don't save the new value to the registry! */
-   PWINSTATION_OBJECT WinStaObject = PsGetCurrentThreadWin32Thread()->Desktop->WindowStation;
+   PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
+   PWINSTATION_OBJECT WinStaObject = pti->rpdesk->rpwinstaParent;
 
    /* windows doesn't do this check */
    if((uMSeconds < MIN_CARETBLINKRATE) || (uMSeconds > MAX_CARETBLINKRATE))
@@ -72,6 +73,7 @@ IntSetCaretBlinkTime(UINT uMSeconds)
    }
 
    WinStaObject->CaretBlinkRate = uMSeconds;
+   gpsi->dtCaretBlink = uMSeconds;
 
    return TRUE;
 }
@@ -122,7 +124,7 @@ IntQueryCaretBlinkRate(VOID)
    if(!NT_SUCCESS(Status) || (KeyValuePartialInfo->Type != REG_SZ))
    {
       NtClose(KeyHandle);
-      ExFreePool(KeyValuePartialInfo);
+      ExFreePoolWithTag(KeyValuePartialInfo, TAG_STRING);
       return 0;
    }
 
@@ -136,7 +138,7 @@ IntQueryCaretBlinkRate(VOID)
       Val = 0;
    }
 
-   ExFreePool(KeyValuePartialInfo);
+   ExFreePoolWithTag(KeyValuePartialInfo, TAG_STRING);
    NtClose(KeyHandle);
 
    return (UINT)Val;
@@ -146,10 +148,12 @@ static
 UINT FASTCALL
 IntGetCaretBlinkTime(VOID)
 {
+   PTHREADINFO pti;
    PWINSTATION_OBJECT WinStaObject;
    UINT Ret;
 
-   WinStaObject = PsGetCurrentThreadWin32Thread()->Desktop->WindowStation;
+   pti = PsGetCurrentThreadWin32Thread();
+   WinStaObject = pti->rpdesk->rpwinstaParent;
 
    Ret = WinStaObject->CaretBlinkRate;
    if(!Ret)
@@ -171,8 +175,11 @@ IntGetCaretBlinkTime(VOID)
 BOOL FASTCALL
 co_IntSetCaretPos(int X, int Y)
 {
+   PTHREADINFO pti;
    PUSER_MESSAGE_QUEUE ThreadQueue;
-   ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue;
+
+   pti = PsGetCurrentThreadWin32Thread();
+   ThreadQueue = pti->MessageQueue;
 
    if(ThreadQueue->CaretInfo->hWnd)
    {
@@ -183,7 +190,7 @@ co_IntSetCaretPos(int X, int Y)
          ThreadQueue->CaretInfo->Pos.x = X;
          ThreadQueue->CaretInfo->Pos.y = Y;
          co_IntSendMessage(ThreadQueue->CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0);
-         IntSetTimer(ThreadQueue->CaretInfo->hWnd, IDCARETTIMER, IntGetCaretBlinkTime(), NULL, TRUE);
+         IntSetTimer(UserGetWindowObject(ThreadQueue->CaretInfo->hWnd), IDCARETTIMER, IntGetCaretBlinkTime(), NULL, TMRF_SYSTEM);
       }
       return TRUE;
    }
@@ -194,8 +201,11 @@ co_IntSetCaretPos(int X, int Y)
 BOOL FASTCALL
 IntSwitchCaretShowing(PVOID Info)
 {
+   PTHREADINFO pti;
    PUSER_MESSAGE_QUEUE ThreadQueue;
-   ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue;
+
+   pti = PsGetCurrentThreadWin32Thread();
+   ThreadQueue = pti->MessageQueue;
 
    if(ThreadQueue->CaretInfo->hWnd)
    {
@@ -212,8 +222,11 @@ static
 VOID FASTCALL
 co_IntDrawCaret(HWND hWnd)
 {
+   PTHREADINFO pti;
    PUSER_MESSAGE_QUEUE ThreadQueue;
-   ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue;
+
+   pti = PsGetCurrentThreadWin32Thread();
+   ThreadQueue = pti->MessageQueue;
 
    if(ThreadQueue->CaretInfo->hWnd && ThreadQueue->CaretInfo->Visible &&
          ThreadQueue->CaretInfo->Showing)
@@ -228,17 +241,19 @@ co_IntDrawCaret(HWND hWnd)
 
 BOOL FASTCALL co_UserHideCaret(PWINDOW_OBJECT Window OPTIONAL)
 {
+   PTHREADINFO pti;
    PUSER_MESSAGE_QUEUE ThreadQueue;
 
    if (Window) ASSERT_REFS_CO(Window);
 
-   if(Window && Window->OwnerThread != PsGetCurrentThread())
+   if(Window && Window->pti->pEThread != PsGetCurrentThread())
    {
       SetLastWin32Error(ERROR_ACCESS_DENIED);
       return FALSE;
    }
 
-   ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue;
+   pti = PsGetCurrentThreadWin32Thread();
+   ThreadQueue = pti->MessageQueue;
 
    if(Window && ThreadQueue->CaretInfo->hWnd != Window->hSelf)
    {
@@ -261,17 +276,19 @@ BOOL FASTCALL co_UserHideCaret(PWINDOW_OBJECT Window OPTIONAL)
 
 BOOL FASTCALL co_UserShowCaret(PWINDOW_OBJECT Window OPTIONAL)
 {
+   PTHREADINFO pti;
    PUSER_MESSAGE_QUEUE ThreadQueue;
 
    if (Window) ASSERT_REFS_CO(Window);
 
-   if(Window && Window->OwnerThread != PsGetCurrentThread())
+   if(Window && Window->pti->pEThread != PsGetCurrentThread())
    {
       SetLastWin32Error(ERROR_ACCESS_DENIED);
       return FALSE;
    }
 
-   ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue;
+   pti = PsGetCurrentThreadWin32Thread();
+   ThreadQueue = pti->MessageQueue;
 
    if(Window && ThreadQueue->CaretInfo->hWnd != Window->hSelf)
    {
@@ -286,7 +303,7 @@ BOOL FASTCALL co_UserShowCaret(PWINDOW_OBJECT Window OPTIONAL)
       {
          co_IntSendMessage(ThreadQueue->CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0);
       }
-      IntSetTimer(ThreadQueue->CaretInfo->hWnd, IDCARETTIMER, IntGetCaretBlinkTime(), NULL, TRUE);
+      IntSetTimer(UserGetWindowObject(ThreadQueue->CaretInfo->hWnd), IDCARETTIMER, IntGetCaretBlinkTime(), NULL, TMRF_SYSTEM);
    }
 
    return TRUE;
@@ -296,7 +313,7 @@ BOOL FASTCALL co_UserShowCaret(PWINDOW_OBJECT Window OPTIONAL)
 /* SYSCALLS *****************************************************************/
 
 BOOL
-STDCALL
+APIENTRY
 NtUserCreateCaret(
    HWND hWnd,
    HBITMAP hBitmap,
@@ -304,6 +321,7 @@ NtUserCreateCaret(
    int nHeight)
 {
    PWINDOW_OBJECT Window;
+   PTHREADINFO pti;
    PUSER_MESSAGE_QUEUE ThreadQueue;
    DECLARE_RETURN(BOOL);
 
@@ -315,13 +333,14 @@ NtUserCreateCaret(
       RETURN(FALSE);
    }
 
-   if(Window->OwnerThread != PsGetCurrentThread())
+   if(Window->pti->pEThread != PsGetCurrentThread())
    {
       SetLastWin32Error(ERROR_ACCESS_DENIED);
       RETURN(FALSE);
    }
 
-   ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue;
+   pti = PsGetCurrentThreadWin32Thread();
+   ThreadQueue = pti->MessageQueue;
 
    if (ThreadQueue->CaretInfo->Visible)
    {
@@ -337,6 +356,14 @@ NtUserCreateCaret(
    }
    else
    {
+      if (nWidth == 0)
+      {
+          nWidth = UserGetSystemMetrics(SM_CXBORDER);
+      }
+      if (nHeight == 0)
+      {
+          nHeight = UserGetSystemMetrics(SM_CYBORDER);
+      }
       ThreadQueue->CaretInfo->Bitmap = (HBITMAP)0;
       ThreadQueue->CaretInfo->Size.cx = nWidth;
       ThreadQueue->CaretInfo->Size.cy = nHeight;
@@ -353,7 +380,7 @@ CLEANUP:
 }
 
 UINT
-STDCALL
+APIENTRY
 NtUserGetCaretBlinkTime(VOID)
 {
    DECLARE_RETURN(UINT);
@@ -370,10 +397,11 @@ CLEANUP:
 }
 
 BOOL
-STDCALL
+APIENTRY
 NtUserGetCaretPos(
    LPPOINT lpPoint)
 {
+   PTHREADINFO pti;
    PUSER_MESSAGE_QUEUE ThreadQueue;
    NTSTATUS Status;
    DECLARE_RETURN(BOOL);
@@ -381,7 +409,8 @@ NtUserGetCaretPos(
    DPRINT("Enter NtUserGetCaretPos\n");
    UserEnterShared();
 
-   ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue;
+   pti = PsGetCurrentThreadWin32Thread();
+   ThreadQueue = pti->MessageQueue;
 
    Status = MmCopyToCaller(lpPoint, &(ThreadQueue->CaretInfo->Pos), sizeof(POINT));
    if(!NT_SUCCESS(Status))
@@ -399,7 +428,7 @@ CLEANUP:
 }
 
 BOOL
-STDCALL
+APIENTRY
 NtUserShowCaret(HWND hWnd OPTIONAL)
 {
    PWINDOW_OBJECT Window = NULL;
@@ -430,7 +459,7 @@ CLEANUP:
 }
 
 BOOL
-STDCALL
+APIENTRY
 NtUserHideCaret(HWND hWnd OPTIONAL)
 {
    PWINDOW_OBJECT Window = NULL;