blob: eb78dc80ec1f10b2ffa8b7a8059e6ab7926bc964 [file] [log] [blame]
/*
* Caret functions
*
* Copyright 1993 David Metcalfe
*/
static char Copyright[] = "Copyright David Metcalfe, 1993";
#include <X11/Intrinsic.h>
#include "windows.h"
extern XtAppContext XT_app_context;
typedef struct
{
HWND hwnd;
short hidden;
BOOL on;
short x;
short y;
short width;
short height;
COLORREF color;
WORD timeout;
XtIntervalId xtid;
} CARET;
static CARET Caret;
static BOOL LockCaret;
static void CARET_Callback(XtPointer data, XtIntervalId *xtid);
static void CARET_HideCaret(CARET *pCaret);
/*****************************************************************
* CARET_Callback
*/
static void CARET_Callback(XtPointer data, XtIntervalId *xtid)
{
CARET *pCaret = (CARET *)data;
HDC hdc;
HBRUSH hBrush;
HRGN rgn;
#ifdef DEBUG_CARET
printf("CARET_Callback: LockCaret=%d, hidden=%d, on=%d\n",
LockCaret, pCaret->hidden, pCaret->on);
#endif
if (!LockCaret && (!pCaret->hidden || pCaret->on))
{
pCaret->on = (pCaret->on ? FALSE : TRUE);
hdc = GetDC(pCaret->hwnd);
hBrush = CreateSolidBrush(pCaret->color);
SelectObject(hdc, (HANDLE)hBrush);
SetROP2(hdc, R2_XORPEN);
rgn = CreateRectRgn(pCaret->x, pCaret->y,
pCaret->x + pCaret->width,
pCaret->y + pCaret->height);
FillRgn(hdc, rgn, hBrush);
DeleteObject((HANDLE)rgn);
DeleteObject((HANDLE)hBrush);
ReleaseDC(pCaret->hwnd, hdc);
}
pCaret->xtid = XtAppAddTimeOut(XT_app_context, pCaret->timeout,
CARET_Callback, pCaret);
}
/*****************************************************************
* CARET_HideCaret
*/
static void CARET_HideCaret(CARET *pCaret)
{
HDC hdc;
HBRUSH hBrush;
HRGN rgn;
pCaret->on = FALSE;
hdc = GetDC(pCaret->hwnd);
hBrush = CreateSolidBrush(pCaret->color);
SelectObject(hdc, (HANDLE)hBrush);
SetROP2(hdc, R2_XORPEN);
rgn = CreateRectRgn(pCaret->x, pCaret->y,
pCaret->x + pCaret->width,
pCaret->y + pCaret->height);
FillRgn(hdc, rgn, hBrush);
DeleteObject((HANDLE)rgn);
DeleteObject((HANDLE)hBrush);
ReleaseDC(pCaret->hwnd, hdc);
}
/*****************************************************************
* CreateCaret (USER.163)
*/
void CreateCaret(HWND hwnd, HBITMAP bitmap, short width, short height)
{
if (!hwnd) return;
/* if cursor already exists, destroy it */
/* if (Caret.hwnd)
DestroyCaret();
*/
if (bitmap)
{
printf("CreateCaret: Bitmaps are currently not supported\n");
return;
}
if (width)
Caret.width = width;
else
Caret.width = 3; /* should be SM_CXBORDER */
if (height)
Caret.height = height;
else
Caret.height = 3; /* should be SM_CYBORDER */
Caret.hwnd = hwnd;
Caret.hidden = 1;
Caret.on = FALSE;
Caret.x = 0;
Caret.y = 0;
Caret.color = GetSysColor(COLOR_WINDOWTEXT);
Caret.timeout = 750;
LockCaret = FALSE;
Caret.xtid = XtAppAddTimeOut(XT_app_context, Caret.timeout,
CARET_Callback, &Caret);
}
/*****************************************************************
* DestroyCaret (USER.164)
*/
void DestroyCaret()
{
/* if (!Caret.hwnd) return;
*/
XtRemoveTimeOut(Caret.xtid);
if (Caret.on)
CARET_HideCaret(&Caret);
Caret.hwnd = 0; /* cursor marked as not existing */
}
/*****************************************************************
* SetCaretPos (USER.165)
*/
void SetCaretPos(short x, short y)
{
HDC hdc;
HBRUSH hBrush;
HRGN rgn;
if (!Caret.hwnd) return;
#ifdef DEBUG_CARET
printf("SetCaretPos: x=%d, y=%d\n", x, y);
#endif
LockCaret = TRUE;
if (Caret.on)
CARET_HideCaret(&Caret);
Caret.x = x;
Caret.y = y;
LockCaret = FALSE;
}
/*****************************************************************
* HideCaret (USER.166)
*/
void HideCaret(HWND hwnd)
{
if (!Caret.hwnd) return;
if (hwnd && (Caret.hwnd != hwnd)) return;
LockCaret = TRUE;
if (Caret.on)
CARET_HideCaret(&Caret);
++Caret.hidden;
LockCaret = FALSE;
}
/*****************************************************************
* ShowCaret (USER.167)
*/
void ShowCaret(HWND hwnd)
{
if (!Caret.hwnd) return;
if (hwnd && (Caret.hwnd != hwnd)) return;
#ifdef DEBUG_CARET
printf("ShowCaret: hidden=%d\n", Caret.hidden);
#endif
if (Caret.hidden)
--Caret.hidden;
}
/*****************************************************************
* SetCaretBlinkTime (USER.168)
*/
void SetCaretBlinkTime(WORD msecs)
{
if (!Caret.hwnd) return;
Caret.timeout = msecs;
}
/*****************************************************************
* GetCaretBlinkTime (USER.169)
*/
WORD GetCaretBlinkTime()
{
if (!Caret.hwnd) return;
return Caret.timeout;
}
/*****************************************************************
* GetCaretPos (USER.183)
*/
void GetCaretPos(LPPOINT pt)
{
if (!Caret.hwnd || !pt) return;
pt->x = Caret.x;
pt->y = Caret.y;
}