4 * Copyright 1993 David Metcalfe
12 /* #define DEBUG_CARET */
38 static CARET Caret = { (HWND)0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
41 /*****************************************************************
49 /*****************************************************************
52 void CARET_DisplayCaret(DISPLAY_CARET status)
59 if (Caret.on && (status == CARET_ON)) return;
60 if (!Caret.on && (status == CARET_OFF)) return;
62 /* So now it's always a toggle */
65 hdc = GetDC(Caret.hwnd);
66 if (Caret.bitmap == (HBITMAP)0 || Caret.bitmap == (HBITMAP)1)
67 hBrush = CreateSolidBrush(Caret.color);
69 hBrush = CreatePatternBrush(Caret.bitmap);
70 hPrevBrush = SelectObject(hdc, (HANDLE)hBrush);
71 SetROP2(hdc, R2_XORPEN);
72 rgn = CreateRectRgn(Caret.x, Caret.y,
73 Caret.x + Caret.width,
74 Caret.y + Caret.height);
75 FillRgn(hdc, rgn, hBrush);
77 SelectObject( hdc, hPrevBrush );
78 DeleteObject( hBrush );
79 ReleaseDC(Caret.hwnd, hdc);
83 /*****************************************************************
86 WORD CARET_Callback(HWND hwnd, WORD msg, WORD timerid, LONG ctime)
88 dprintf_caret(stddeb,"CARET_Callback: hwnd="NPFMT", timerid=%d, "
89 "caret=%d\n", hwnd, timerid, Caret.on);
91 CARET_DisplayCaret(CARET_TOGGLE);
96 /*****************************************************************
99 void CARET_SetTimer(void)
101 if (Caret.timerid) KillSystemTimer((HWND)0, Caret.timerid);
102 Caret.timerid = SetSystemTimer((HWND)0, 0, Caret.timeout,
103 (FARPROC)GetWndProcEntry16("CARET_Callback"));
107 /*****************************************************************
110 void CARET_ResetTimer(void)
114 KillSystemTimer((HWND)0, Caret.timerid);
115 Caret.timerid = SetSystemTimer((HWND)0, 0, Caret.timeout,
116 (FARPROC)GetWndProcEntry16("CARET_Callback"));
121 /*****************************************************************
124 void CARET_KillTimer(void)
128 KillSystemTimer((HWND)0, Caret.timerid);
134 /*****************************************************************
137 static void CARET_Initialize()
139 DWORD WineProc,Win16Proc,Win32Proc;
140 static int initialized=0;
144 WineProc = (DWORD)CARET_Callback;
145 Win16Proc = (DWORD)GetWndProcEntry16("CARET_Callback");
146 Win32Proc = (DWORD)RELAY32_GetEntryPoint(
147 RELAY32_GetBuiltinDLL("WINPROCS32"),
148 "CARET_Callback", 0);
149 ALIAS_RegisterAlias(WineProc, Win16Proc, Win32Proc);
155 /*****************************************************************
156 * CreateCaret (USER.163)
158 BOOL CreateCaret(HWND hwnd, HBITMAP bitmap, INT width, INT height)
160 dprintf_caret(stddeb,"CreateCaret: hwnd="NPFMT"\n", hwnd);
162 if (!hwnd) return FALSE;
164 /* if cursor already exists, destroy it */
165 if (Caret.hwnd) DestroyCaret();
167 if (bitmap && bitmap != (HBITMAP)1) Caret.bitmap = bitmap;
172 Caret.width = GetSystemMetrics(SM_CXBORDER);
175 Caret.height = height;
177 Caret.height = GetSystemMetrics(SM_CYBORDER);
184 if (bitmap == (HBITMAP)1)
185 Caret.color = GetSysColor(COLOR_GRAYTEXT);
187 Caret.color = GetSysColor(COLOR_WINDOW);
188 Caret.timeout = GetProfileInt( "windows", "CursorBlinkRate", 750 );
196 /*****************************************************************
197 * DestroyCaret (USER.164)
202 if (!Caret.hwnd) return FALSE;
204 dprintf_caret(stddeb,"DestroyCaret: hwnd="NPFMT", timerid=%d\n",
205 Caret.hwnd, Caret.timerid);
208 CARET_DisplayCaret(CARET_OFF);
215 /*****************************************************************
216 * SetCaretPos (USER.165)
219 void SetCaretPos(short x, short y)
221 if (!Caret.hwnd) return;
222 if ((x == Caret.x) && (y == Caret.y)) return;
224 dprintf_caret(stddeb,"SetCaretPos: x=%d, y=%d\n", x, y);
227 CARET_DisplayCaret(CARET_OFF);
232 CARET_DisplayCaret(CARET_ON);
237 /*****************************************************************
238 * HideCaret (USER.166)
241 void HideCaret(HWND hwnd)
243 if (!Caret.hwnd) return;
244 if (hwnd && (Caret.hwnd != hwnd)) return;
246 dprintf_caret(stddeb,"HideCaret: hwnd="NPFMT", hidden=%d\n",
250 CARET_DisplayCaret(CARET_OFF);
255 /*****************************************************************
256 * ShowCaret (USER.167)
259 void ShowCaret(HWND hwnd)
261 if (!Caret.hwnd) return;
262 if (hwnd && (Caret.hwnd != hwnd)) return;
264 dprintf_caret(stddeb,"ShowCaret: hwnd="NPFMT", hidden=%d\n",
272 CARET_DisplayCaret(CARET_ON);
279 /*****************************************************************
280 * SetCaretBlinkTime (USER.168)
283 void SetCaretBlinkTime(WORD msecs)
285 if (!Caret.hwnd) return;
287 dprintf_caret(stddeb,"SetCaretBlinkTime: hwnd="NPFMT", msecs=%d\n",
290 Caret.timeout = msecs;
295 /*****************************************************************
296 * GetCaretBlinkTime (USER.169)
299 WORD GetCaretBlinkTime()
301 if (!Caret.hwnd) return 0;
303 dprintf_caret(stddeb,"GetCaretBlinkTime: hwnd="NPFMT", msecs=%d\n",
304 Caret.hwnd, Caret.timeout);
306 return Caret.timeout;
310 /*****************************************************************
311 * GetCaretPos (USER.183)
314 void GetCaretPos(LPPOINT pt)
316 if (!Caret.hwnd || !pt) return;
318 dprintf_caret(stddeb,"GetCaretPos: hwnd="NPFMT", pt=%p, x=%d, y=%d\n",
319 Caret.hwnd, pt, Caret.x, Caret.y);