Release 950319
[wine.git] / windows / caret.c
blob5c31d192afd8c65f2daecd7500c08ae94683c446
1 /*
2 * Caret functions
4 * Copyright 1993 David Metcalfe
6 static char Copyright[] = "Copyright David Metcalfe, 1993";
7 */
9 #include "windows.h"
10 #include "stddebug.h"
11 /* #define DEBUG_CARET */
12 #include "debug.h"
15 typedef struct
17 HWND hwnd;
18 short hidden;
19 BOOL on;
20 short x;
21 short y;
22 short width;
23 short height;
24 COLORREF color;
25 HBITMAP bitmap;
26 WORD timeout;
27 WORD timerid;
28 } CARET;
30 static CARET Caret;
31 static BOOL LockCaret;
33 static WORD CARET_Callback(HWND hwnd, WORD msg, WORD timerid, LONG ctime);
34 static void CARET_HideCaret();
37 /*****************************************************************
38 * CARET_Callback
41 static WORD CARET_Callback(HWND hwnd, WORD msg, WORD timerid, LONG ctime)
43 HDC hdc;
44 HBRUSH hBrush;
45 HRGN rgn;
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);
55 else
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);
67 return 0;
71 /*****************************************************************
72 * CARET_HideCaret
75 static void CARET_HideCaret()
77 HDC hdc;
78 HBRUSH hBrush;
79 HRGN rgn;
81 Caret.on = FALSE;
82 hdc = GetDC(Caret.hwnd);
83 if (Caret.bitmap == 0 || Caret.bitmap == 1)
84 hBrush = CreateSolidBrush(Caret.color);
85 else
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)
105 if (!hwnd) return;
108 /* if cursor already exists, destroy it */
109 /* if (Caret.hwnd)
110 DestroyCaret();
112 if (bitmap && bitmap != 1)
113 Caret.bitmap = bitmap;
115 if (width)
116 Caret.width = width;
117 else
118 Caret.width = GetSystemMetrics(SM_CXBORDER);
120 if (height)
121 Caret.height = height;
122 else
123 Caret.height = GetSystemMetrics(SM_CYBORDER);
125 Caret.hwnd = hwnd;
126 Caret.hidden = 1;
127 Caret.on = FALSE;
128 Caret.x = 0;
129 Caret.y = 0;
130 if (bitmap == 1)
131 Caret.color = GetSysColor(COLOR_GRAYTEXT);
132 else
133 Caret.color = GetSysColor(COLOR_WINDOWTEXT);
134 Caret.timeout = 750;
135 LockCaret = FALSE;
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)
148 void DestroyCaret()
150 /* if (!Caret.hwnd) return;
152 dprintf_caret(stddeb,"DestroyCaret: timerid=%d\n", Caret.timerid);
154 KillSystemTimer( (HWND)0, Caret.timerid);
156 if (Caret.on)
157 CARET_HideCaret();
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);
173 LockCaret = TRUE;
174 if (Caret.on)
175 CARET_HideCaret();
177 Caret.x = x;
178 Caret.y = y;
179 LockCaret = FALSE;
182 /*****************************************************************
183 * HideCaret (USER.166)
186 void HideCaret(HWND hwnd)
188 if (!Caret.hwnd) return;
189 if (hwnd && (Caret.hwnd != hwnd)) return;
191 LockCaret = TRUE;
192 if (Caret.on)
193 CARET_HideCaret();
195 ++Caret.hidden;
196 LockCaret = FALSE;
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);
210 if (Caret.hidden)
211 --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;
248 pt->x = Caret.x;
249 pt->y = Caret.y;