4 * Copyright 1993 David Metcalfe
6 static char Copyright[] = "Copyright David Metcalfe, 1993";
11 /* #define DEBUG_CARET */
31 static BOOL LockCaret
;
33 static WORD
CARET_Callback(HWND hwnd
, WORD msg
, WORD timerid
, LONG ctime
);
34 static void CARET_HideCaret();
37 /*****************************************************************
41 static WORD
CARET_Callback(HWND hwnd
, WORD msg
, WORD timerid
, LONG ctime
)
47 dprintf_caret(stddeb
,"CARET_Callback: id=%d: LockCaret=%d, hidden=%d, on=%d\n",
48 timerid
, LockCaret
, Caret
.hidden
, Caret
.on
);
49 if (!LockCaret
&& (!Caret
.hidden
|| Caret
.on
))
51 Caret
.on
= (Caret
.on
? FALSE
: TRUE
);
52 hdc
= GetDC(Caret
.hwnd
);
53 if (Caret
.bitmap
== 0 || Caret
.bitmap
== 1)
54 hBrush
= CreateSolidBrush(Caret
.color
);
56 hBrush
= CreatePatternBrush(Caret
.bitmap
);
57 SelectObject(hdc
, (HANDLE
)hBrush
);
58 SetROP2(hdc
, R2_XORPEN
);
59 rgn
= CreateRectRgn(Caret
.x
, Caret
.y
,
60 Caret
.x
+ Caret
.width
,
61 Caret
.y
+ Caret
.height
);
62 FillRgn(hdc
, rgn
, hBrush
);
63 DeleteObject((HANDLE
)rgn
);
64 DeleteObject((HANDLE
)hBrush
);
65 ReleaseDC(Caret
.hwnd
, hdc
);
71 /*****************************************************************
75 static void CARET_HideCaret()
82 hdc
= GetDC(Caret
.hwnd
);
83 if (Caret
.bitmap
== 0 || Caret
.bitmap
== 1)
84 hBrush
= CreateSolidBrush(Caret
.color
);
86 hBrush
= CreatePatternBrush(Caret
.bitmap
);
87 SelectObject(hdc
, (HANDLE
)hBrush
);
88 SetROP2(hdc
, R2_XORPEN
);
89 rgn
= CreateRectRgn(Caret
.x
, Caret
.y
,
90 Caret
.x
+ Caret
.width
,
91 Caret
.y
+ Caret
.height
);
92 FillRgn(hdc
, rgn
, hBrush
);
93 DeleteObject((HANDLE
)rgn
);
94 DeleteObject((HANDLE
)hBrush
);
95 ReleaseDC(Caret
.hwnd
, hdc
);
99 /*****************************************************************
100 * CreateCaret (USER.163)
103 void CreateCaret(HWND hwnd
, HBITMAP bitmap
, short width
, short height
)
108 /* if cursor already exists, destroy it */
112 if (bitmap
&& bitmap
!= 1)
113 Caret
.bitmap
= bitmap
;
118 Caret
.width
= GetSystemMetrics(SM_CXBORDER
);
121 Caret
.height
= height
;
123 Caret
.height
= GetSystemMetrics(SM_CYBORDER
);
131 Caret
.color
= GetSysColor(COLOR_GRAYTEXT
);
133 Caret
.color
= GetSysColor(COLOR_WINDOWTEXT
);
137 Caret
.timerid
= SetSystemTimer((HWND
)0, 0, Caret
.timeout
, (FARPROC
)CARET_Callback
);
139 dprintf_caret(stddeb
,"CreateCaret: hwnd=%d, timerid=%d\n",
140 hwnd
, Caret
.timerid
);
144 /*****************************************************************
145 * DestroyCaret (USER.164)
150 /* if (!Caret.hwnd) return;
152 dprintf_caret(stddeb
,"DestroyCaret: timerid=%d\n", Caret
.timerid
);
154 KillSystemTimer( (HWND
)0, Caret
.timerid
);
159 Caret
.hwnd
= 0; /* cursor marked as not existing */
163 /*****************************************************************
164 * SetCaretPos (USER.165)
167 void SetCaretPos(short x
, short y
)
169 if (!Caret
.hwnd
) return;
171 dprintf_caret(stddeb
,"SetCaretPos: x=%d, y=%d\n", x
, y
);
182 /*****************************************************************
183 * HideCaret (USER.166)
186 void HideCaret(HWND hwnd
)
188 if (!Caret
.hwnd
) return;
189 if (hwnd
&& (Caret
.hwnd
!= hwnd
)) return;
200 /*****************************************************************
201 * ShowCaret (USER.167)
204 void ShowCaret(HWND hwnd
)
206 if (!Caret
.hwnd
) return;
207 if (hwnd
&& (Caret
.hwnd
!= hwnd
)) return;
209 dprintf_caret(stddeb
,"ShowCaret: hidden=%d\n", Caret
.hidden
);
215 /*****************************************************************
216 * SetCaretBlinkTime (USER.168)
219 void SetCaretBlinkTime(WORD msecs
)
221 if (!Caret
.hwnd
) return;
223 KillSystemTimer( (HWND
)0, Caret
.timerid
);
224 Caret
.timeout
= msecs
;
225 Caret
.timerid
= SetSystemTimer((HWND
)0, 0, Caret
.timeout
, (FARPROC
)CARET_Callback
);
229 /*****************************************************************
230 * GetCaretBlinkTime (USER.169)
233 WORD
GetCaretBlinkTime()
235 if (!Caret
.hwnd
) return 0;
236 return Caret
.timeout
;
240 /*****************************************************************
241 * GetCaretPos (USER.183)
244 void GetCaretPos(LPPOINT pt
)
246 if (!Caret
.hwnd
|| !pt
) return;