2003-12-26 22:52:12 +00:00
|
|
|
/* $Id: caret.c,v 1.10 2003/12/26 22:52:11 gvg Exp $
|
2003-10-15 20:48:19 +00:00
|
|
|
*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS kernel
|
|
|
|
* PURPOSE: Caret functions
|
|
|
|
* FILE: subsys/win32k/ntuser/caret.c
|
|
|
|
* PROGRAMER: Thomas Weidenmueller (w3seek@users.sourceforge.net)
|
|
|
|
* REVISION HISTORY:
|
|
|
|
* 10/15/2003 Created
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <win32k/win32k.h>
|
2003-11-22 11:49:09 +00:00
|
|
|
#include <ddk/ntddk.h>
|
2003-10-15 20:48:19 +00:00
|
|
|
#include <internal/safe.h>
|
|
|
|
#include <include/error.h>
|
|
|
|
#include <include/window.h>
|
2003-10-16 22:07:37 +00:00
|
|
|
#include <include/caret.h>
|
|
|
|
#include <include/timer.h>
|
2003-10-17 20:31:56 +00:00
|
|
|
#include <include/callback.h>
|
2003-11-22 11:49:09 +00:00
|
|
|
#include <rosrtl/string.h>
|
2003-10-15 20:48:19 +00:00
|
|
|
|
|
|
|
#define NDEBUG
|
|
|
|
#include <debug.h>
|
|
|
|
|
2003-11-22 11:49:09 +00:00
|
|
|
#define MIN_CARETBLINKRATE 100
|
|
|
|
#define MAX_CARETBLINKRATE 10000
|
|
|
|
#define DEFAULT_CARETBLINKRATE 530
|
|
|
|
#define CARET_REGKEY L"\\Registry\\User\\.Default\\Control Panel\\Desktop"
|
|
|
|
#define CARET_VALUENAME L"CursorBlinkRate"
|
|
|
|
|
2003-10-17 20:31:56 +00:00
|
|
|
BOOL FASTCALL
|
|
|
|
IntHideCaret(PTHRDCARETINFO CaretInfo)
|
|
|
|
{
|
|
|
|
if(CaretInfo->hWnd && CaretInfo->Visible && CaretInfo->Showing)
|
|
|
|
{
|
2003-12-26 22:52:12 +00:00
|
|
|
IntSendMessage(CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0);
|
2003-10-17 20:31:56 +00:00
|
|
|
CaretInfo->Showing = 0;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2003-10-16 22:07:37 +00:00
|
|
|
BOOL FASTCALL
|
|
|
|
IntDestroyCaret(PW32THREAD Win32Thread)
|
|
|
|
{
|
2003-12-20 15:42:47 +00:00
|
|
|
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;
|
2003-10-16 22:07:37 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL FASTCALL
|
|
|
|
IntSetCaretBlinkTime(UINT uMSeconds)
|
|
|
|
{
|
2003-11-22 11:49:09 +00:00
|
|
|
/* Don't save the new value to the registry! */
|
|
|
|
NTSTATUS Status;
|
|
|
|
PWINSTATION_OBJECT WinStaObject;
|
|
|
|
|
2003-11-23 11:39:48 +00:00
|
|
|
Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
|
|
|
|
KernelMode,
|
|
|
|
0,
|
|
|
|
&WinStaObject);
|
2003-11-22 11:49:09 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* windows doesn't do this check */
|
|
|
|
if((uMSeconds < MIN_CARETBLINKRATE) || (uMSeconds > MAX_CARETBLINKRATE))
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
|
|
|
ObDereferenceObject(WinStaObject);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
WinStaObject->CaretBlinkRate = uMSeconds;
|
|
|
|
|
|
|
|
ObDereferenceObject(WinStaObject);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
UINT FASTCALL
|
|
|
|
IntQueryCaretBlinkRate(VOID)
|
|
|
|
{
|
|
|
|
UNICODE_STRING KeyName, ValueName;
|
|
|
|
NTSTATUS Status;
|
|
|
|
HANDLE KeyHandle = NULL;
|
|
|
|
OBJECT_ATTRIBUTES KeyAttributes;
|
|
|
|
PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo;
|
|
|
|
ULONG Length = 0;
|
|
|
|
ULONG ResLength = 0;
|
|
|
|
ULONG Val = 0;
|
|
|
|
|
|
|
|
RtlRosInitUnicodeStringFromLiteral(&KeyName, CARET_REGKEY);
|
|
|
|
RtlRosInitUnicodeStringFromLiteral(&ValueName, CARET_VALUENAME);
|
|
|
|
|
|
|
|
InitializeObjectAttributes(&KeyAttributes, &KeyName, OBJ_CASE_INSENSITIVE,
|
|
|
|
NULL, NULL);
|
|
|
|
|
|
|
|
Status = ZwOpenKey(&KeyHandle, KEY_READ, &KeyAttributes);
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
Status = ZwQueryValueKey(KeyHandle, &ValueName, KeyValuePartialInformation,
|
|
|
|
0, 0, &ResLength);
|
|
|
|
if((Status != STATUS_BUFFER_TOO_SMALL))
|
|
|
|
{
|
|
|
|
NtClose(KeyHandle);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
ResLength += sizeof(KEY_VALUE_PARTIAL_INFORMATION);
|
|
|
|
KeyValuePartialInfo = ExAllocatePool(PagedPool, ResLength);
|
|
|
|
Length = ResLength;
|
|
|
|
|
|
|
|
if(!KeyValuePartialInfo)
|
|
|
|
{
|
|
|
|
NtClose(KeyHandle);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
Status = ZwQueryValueKey(KeyHandle, &ValueName, KeyValuePartialInformation,
|
|
|
|
(PVOID)KeyValuePartialInfo, Length, &ResLength);
|
|
|
|
if(!NT_SUCCESS(Status) || (KeyValuePartialInfo->Type != REG_SZ))
|
|
|
|
{
|
|
|
|
NtClose(KeyHandle);
|
|
|
|
ExFreePool(KeyValuePartialInfo);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
ValueName.Length = KeyValuePartialInfo->DataLength;
|
|
|
|
ValueName.MaximumLength = KeyValuePartialInfo->DataLength;
|
|
|
|
ValueName.Buffer = (PWSTR)KeyValuePartialInfo->Data;
|
|
|
|
|
|
|
|
Status = RtlUnicodeStringToInteger(&ValueName, 0, &Val);
|
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
Val = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
ExFreePool(KeyValuePartialInfo);
|
|
|
|
NtClose(KeyHandle);
|
|
|
|
|
|
|
|
return (UINT)Val;
|
2003-10-16 22:07:37 +00:00
|
|
|
}
|
|
|
|
|
2003-11-22 01:51:05 +00:00
|
|
|
UINT FASTCALL
|
2003-10-16 22:07:37 +00:00
|
|
|
IntGetCaretBlinkTime(VOID)
|
|
|
|
{
|
2003-11-22 11:49:09 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
PWINSTATION_OBJECT WinStaObject;
|
|
|
|
UINT Ret;
|
|
|
|
|
2003-11-23 11:39:48 +00:00
|
|
|
Status = IntValidateWindowStationHandle(PROCESS_WINDOW_STATION(),
|
|
|
|
KernelMode,
|
|
|
|
0,
|
|
|
|
&WinStaObject);
|
2003-11-22 11:49:09 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ret = WinStaObject->CaretBlinkRate;
|
|
|
|
if(!Ret)
|
|
|
|
{
|
|
|
|
/* load it from the registry the first call only! */
|
|
|
|
Ret = WinStaObject->CaretBlinkRate = IntQueryCaretBlinkRate();
|
|
|
|
}
|
|
|
|
|
|
|
|
/* windows doesn't do this check */
|
|
|
|
if((Ret < MIN_CARETBLINKRATE) || (Ret > MAX_CARETBLINKRATE))
|
|
|
|
{
|
|
|
|
Ret = DEFAULT_CARETBLINKRATE;
|
|
|
|
}
|
|
|
|
|
|
|
|
ObDereferenceObject(WinStaObject);
|
|
|
|
return Ret;
|
2003-10-16 22:07:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BOOL FASTCALL
|
|
|
|
IntSetCaretPos(int X, int Y)
|
|
|
|
{
|
2003-12-20 15:42:47 +00:00
|
|
|
PUSER_MESSAGE_QUEUE ThreadQueue;
|
|
|
|
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
|
2003-10-16 22:07:37 +00:00
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
if(ThreadQueue->CaretInfo->hWnd)
|
2003-10-16 22:07:37 +00:00
|
|
|
{
|
2003-12-20 15:42:47 +00:00
|
|
|
if(ThreadQueue->CaretInfo->Pos.x != X || ThreadQueue->CaretInfo->Pos.y != Y)
|
2003-10-16 22:07:37 +00:00
|
|
|
{
|
2003-12-20 15:42:47 +00:00
|
|
|
IntHideCaret(ThreadQueue->CaretInfo);
|
|
|
|
ThreadQueue->CaretInfo->Showing = 0;
|
|
|
|
ThreadQueue->CaretInfo->Pos.x = X;
|
|
|
|
ThreadQueue->CaretInfo->Pos.y = Y;
|
2003-12-26 22:52:12 +00:00
|
|
|
IntSendMessage(ThreadQueue->CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0);
|
2003-12-20 15:42:47 +00:00
|
|
|
IntSetTimer(ThreadQueue->CaretInfo->hWnd, IDCARETTIMER, IntGetCaretBlinkTime(), NULL, TRUE);
|
2003-10-16 22:07:37 +00:00
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL FASTCALL
|
2003-10-17 20:31:56 +00:00
|
|
|
IntSwitchCaretShowing(PVOID Info)
|
2003-10-16 22:07:37 +00:00
|
|
|
{
|
2003-12-20 15:42:47 +00:00
|
|
|
PUSER_MESSAGE_QUEUE ThreadQueue;
|
|
|
|
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
|
2003-10-16 22:07:37 +00:00
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
if(ThreadQueue->CaretInfo->hWnd)
|
2003-10-16 22:07:37 +00:00
|
|
|
{
|
2003-12-20 15:42:47 +00:00
|
|
|
ThreadQueue->CaretInfo->Showing = (ThreadQueue->CaretInfo->Showing ? 0 : 1);
|
|
|
|
MmCopyToCaller(Info, ThreadQueue->CaretInfo, sizeof(THRDCARETINFO));
|
2003-10-16 22:07:37 +00:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2003-10-17 20:31:56 +00:00
|
|
|
VOID FASTCALL
|
|
|
|
IntDrawCaret(HWND hWnd)
|
|
|
|
{
|
2003-12-20 15:42:47 +00:00
|
|
|
PUSER_MESSAGE_QUEUE ThreadQueue;
|
|
|
|
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
|
2003-10-17 20:31:56 +00:00
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
if(ThreadQueue->CaretInfo->hWnd && ThreadQueue->CaretInfo->Visible &&
|
|
|
|
ThreadQueue->CaretInfo->Showing)
|
2003-10-17 20:31:56 +00:00
|
|
|
{
|
2003-12-26 22:52:12 +00:00
|
|
|
IntSendMessage(ThreadQueue->CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0);
|
2003-12-20 15:42:47 +00:00
|
|
|
ThreadQueue->CaretInfo->Showing = 1;
|
2003-10-17 20:31:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-10-16 22:07:37 +00:00
|
|
|
|
|
|
|
|
2003-10-15 20:48:19 +00:00
|
|
|
BOOL
|
|
|
|
STDCALL
|
|
|
|
NtUserCreateCaret(
|
|
|
|
HWND hWnd,
|
|
|
|
HBITMAP hBitmap,
|
|
|
|
int nWidth,
|
|
|
|
int nHeight)
|
|
|
|
{
|
2003-10-16 22:07:37 +00:00
|
|
|
PWINDOW_OBJECT WindowObject;
|
2003-12-20 15:42:47 +00:00
|
|
|
PUSER_MESSAGE_QUEUE ThreadQueue;
|
2003-10-16 22:07:37 +00:00
|
|
|
|
|
|
|
WindowObject = IntGetWindowObject(hWnd);
|
|
|
|
if(!WindowObject)
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(WindowObject->OwnerThread != PsGetCurrentThread())
|
|
|
|
{
|
|
|
|
IntReleaseWindowObject(WindowObject);
|
|
|
|
SetLastWin32Error(ERROR_ACCESS_DENIED);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
IntRemoveTimer(hWnd, IDCARETTIMER, PsGetCurrentThreadId(), TRUE);
|
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
|
2003-10-17 20:31:56 +00:00
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
IntHideCaret(ThreadQueue->CaretInfo);
|
2003-10-17 20:31:56 +00:00
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
ThreadQueue->CaretInfo->hWnd = hWnd;
|
2003-10-16 22:07:37 +00:00
|
|
|
if(hBitmap)
|
|
|
|
{
|
2003-12-20 15:42:47 +00:00
|
|
|
ThreadQueue->CaretInfo->Bitmap = hBitmap;
|
|
|
|
ThreadQueue->CaretInfo->Size.cx = ThreadQueue->CaretInfo->Size.cy = 0;
|
2003-10-16 22:07:37 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2003-12-20 15:42:47 +00:00
|
|
|
ThreadQueue->CaretInfo->Bitmap = (HBITMAP)0;
|
|
|
|
ThreadQueue->CaretInfo->Size.cx = nWidth;
|
|
|
|
ThreadQueue->CaretInfo->Size.cy = nHeight;
|
2003-10-16 22:07:37 +00:00
|
|
|
}
|
2003-12-20 15:42:47 +00:00
|
|
|
ThreadQueue->CaretInfo->Visible = 0;
|
|
|
|
ThreadQueue->CaretInfo->Showing = 0;
|
2003-10-16 22:07:37 +00:00
|
|
|
|
|
|
|
IntReleaseWindowObject(WindowObject);
|
|
|
|
return TRUE;
|
2003-10-15 20:48:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
UINT
|
|
|
|
STDCALL
|
|
|
|
NtUserGetCaretBlinkTime(VOID)
|
|
|
|
{
|
2003-10-16 22:07:37 +00:00
|
|
|
return IntGetCaretBlinkTime();
|
2003-10-15 20:48:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
STDCALL
|
|
|
|
NtUserGetCaretPos(
|
|
|
|
LPPOINT lpPoint)
|
|
|
|
{
|
2003-12-20 15:42:47 +00:00
|
|
|
PUSER_MESSAGE_QUEUE ThreadQueue;
|
2003-10-16 22:07:37 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
|
2003-10-16 22:07:37 +00:00
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
Status = MmCopyToCaller(lpPoint, &(ThreadQueue->CaretInfo->Pos), sizeof(POINT));
|
2003-10-16 22:07:37 +00:00
|
|
|
if(!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastNtError(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return TRUE;
|
2003-10-15 20:48:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
STDCALL
|
|
|
|
NtUserHideCaret(
|
|
|
|
HWND hWnd)
|
|
|
|
{
|
2003-10-16 22:07:37 +00:00
|
|
|
PWINDOW_OBJECT WindowObject;
|
2003-12-20 15:42:47 +00:00
|
|
|
PUSER_MESSAGE_QUEUE ThreadQueue;
|
2003-10-16 22:07:37 +00:00
|
|
|
|
|
|
|
WindowObject = IntGetWindowObject(hWnd);
|
|
|
|
if(!WindowObject)
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(WindowObject->OwnerThread != PsGetCurrentThread())
|
|
|
|
{
|
|
|
|
IntReleaseWindowObject(WindowObject);
|
|
|
|
SetLastWin32Error(ERROR_ACCESS_DENIED);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
|
2003-10-16 22:07:37 +00:00
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
if(ThreadQueue->CaretInfo->hWnd != hWnd)
|
2003-10-16 22:07:37 +00:00
|
|
|
{
|
|
|
|
IntReleaseWindowObject(WindowObject);
|
|
|
|
SetLastWin32Error(ERROR_ACCESS_DENIED);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
if(ThreadQueue->CaretInfo->Visible)
|
2003-10-16 22:07:37 +00:00
|
|
|
{
|
|
|
|
IntRemoveTimer(hWnd, IDCARETTIMER, PsGetCurrentThreadId(), TRUE);
|
2003-10-17 20:31:56 +00:00
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
IntHideCaret(ThreadQueue->CaretInfo);
|
|
|
|
ThreadQueue->CaretInfo->Visible = 0;
|
|
|
|
ThreadQueue->CaretInfo->Showing = 0;
|
2003-10-16 22:07:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
IntReleaseWindowObject(WindowObject);
|
|
|
|
return TRUE;
|
2003-10-15 20:48:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
STDCALL
|
|
|
|
NtUserShowCaret(
|
|
|
|
HWND hWnd)
|
|
|
|
{
|
2003-10-16 22:07:37 +00:00
|
|
|
PWINDOW_OBJECT WindowObject;
|
2003-12-20 15:42:47 +00:00
|
|
|
PUSER_MESSAGE_QUEUE ThreadQueue;
|
2003-10-16 22:07:37 +00:00
|
|
|
|
|
|
|
WindowObject = IntGetWindowObject(hWnd);
|
|
|
|
if(!WindowObject)
|
|
|
|
{
|
|
|
|
SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(WindowObject->OwnerThread != PsGetCurrentThread())
|
|
|
|
{
|
|
|
|
IntReleaseWindowObject(WindowObject);
|
|
|
|
SetLastWin32Error(ERROR_ACCESS_DENIED);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetWin32Thread()->MessageQueue;
|
2003-10-16 22:07:37 +00:00
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
if(ThreadQueue->CaretInfo->hWnd != hWnd)
|
2003-10-16 22:07:37 +00:00
|
|
|
{
|
|
|
|
IntReleaseWindowObject(WindowObject);
|
|
|
|
SetLastWin32Error(ERROR_ACCESS_DENIED);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
2003-12-20 15:42:47 +00:00
|
|
|
if(!ThreadQueue->CaretInfo->Visible)
|
2003-10-16 22:07:37 +00:00
|
|
|
{
|
2003-12-20 15:42:47 +00:00
|
|
|
ThreadQueue->CaretInfo->Visible = 1;
|
|
|
|
if(!ThreadQueue->CaretInfo->Showing)
|
2003-10-17 20:31:56 +00:00
|
|
|
{
|
2003-12-26 22:52:12 +00:00
|
|
|
IntSendMessage(ThreadQueue->CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0);
|
2003-10-17 20:31:56 +00:00
|
|
|
}
|
2003-10-16 22:07:37 +00:00
|
|
|
IntSetTimer(hWnd, IDCARETTIMER, IntGetCaretBlinkTime(), NULL, TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
IntReleaseWindowObject(WindowObject);
|
|
|
|
return TRUE;
|
2003-10-15 20:48:19 +00:00
|
|
|
}
|