Release 950918
[wine/dcerpc.git] / windows / caret.c
bloba85a47cee9b496b090373266709c37341af0da16
1 /*
2 * Caret functions
4 * Copyright 1993 David Metcalfe
6 static char Copyright[] = "Copyright David Metcalfe, 1993";
7 */
9 #include "windows.h"
10 #include "selectors.h"
11 #include "alias.h"
12 #include "stddebug.h"
13 /* #define DEBUG_CARET */
14 #include "debug.h"
17 typedef struct
19 HWND hwnd;
20 short hidden;
21 BOOL on;
22 short x;
23 short y;
24 short width;
25 short height;
26 COLORREF color;
27 HBITMAP bitmap;
28 WORD timeout;
29 WORD timerid;
30 } CARET;
32 static CARET Caret;
33 static BOOL LockCaret;
35 static void CARET_HideCaret();
38 /*****************************************************************
39 * CARET_Callback
41 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);
98 /*****************************************************************
99 * CARET_Initialize
101 static void CARET_Initialize()
103 DWORD WineProc,Win16Proc,Win32Proc;
104 static int initialized=0;
105 if(!initialized)
107 WineProc=(DWORD)CARET_Callback;
108 Win16Proc=(DWORD)GetWndProcEntry16("CARET_Callback");
109 Win32Proc=(DWORD)RELAY32_GetEntryPoint("WINPROCS32","CARET_Callback",0);
110 ALIAS_RegisterAlias(WineProc,Win16Proc,Win32Proc);
111 initialized=1;
116 /*****************************************************************
117 * CreateCaret (USER.163)
120 void CreateCaret(HWND hwnd, HBITMAP bitmap, short width, short height)
122 if (!hwnd) return;
125 /* if cursor already exists, destroy it */
126 /* if (Caret.hwnd)
127 DestroyCaret();
129 if (bitmap && bitmap != 1)
130 Caret.bitmap = bitmap;
132 if (width)
133 Caret.width = width;
134 else
135 Caret.width = GetSystemMetrics(SM_CXBORDER);
137 if (height)
138 Caret.height = height;
139 else
140 Caret.height = GetSystemMetrics(SM_CYBORDER);
142 Caret.hwnd = hwnd;
143 Caret.hidden = 1;
144 Caret.on = FALSE;
145 Caret.x = 0;
146 Caret.y = 0;
147 if (bitmap == 1)
148 Caret.color = GetSysColor(COLOR_GRAYTEXT);
149 else
150 Caret.color = GetSysColor(COLOR_WINDOWTEXT);
151 Caret.timeout = 750;
152 LockCaret = FALSE;
154 CARET_Initialize();
156 Caret.timerid = SetSystemTimer( (HWND)0, 0, Caret.timeout,
157 (FARPROC)GetWndProcEntry16("CARET_Callback"));
159 dprintf_caret(stddeb,"CreateCaret: hwnd=%d, timerid=%d\n",
160 hwnd, Caret.timerid);
164 /*****************************************************************
165 * DestroyCaret (USER.164)
168 void DestroyCaret()
170 /* if (!Caret.hwnd) return;
172 dprintf_caret(stddeb,"DestroyCaret: timerid=%d\n", Caret.timerid);
174 KillSystemTimer( (HWND)0, Caret.timerid);
176 if (Caret.on)
177 CARET_HideCaret();
179 Caret.hwnd = 0; /* cursor marked as not existing */
183 /*****************************************************************
184 * SetCaretPos (USER.165)
187 void SetCaretPos(short x, short y)
189 if (!Caret.hwnd) return;
191 dprintf_caret(stddeb,"SetCaretPos: x=%d, y=%d\n", x, y);
193 LockCaret = TRUE;
194 if (Caret.on)
195 CARET_HideCaret();
197 Caret.x = x;
198 Caret.y = y;
199 LockCaret = FALSE;
202 /*****************************************************************
203 * HideCaret (USER.166)
206 void HideCaret(HWND hwnd)
208 if (!Caret.hwnd) return;
209 if (hwnd && (Caret.hwnd != hwnd)) return;
211 LockCaret = TRUE;
212 if (Caret.on)
213 CARET_HideCaret();
215 ++Caret.hidden;
216 LockCaret = FALSE;
220 /*****************************************************************
221 * ShowCaret (USER.167)
224 void ShowCaret(HWND hwnd)
226 if (!Caret.hwnd) return;
227 if (hwnd && (Caret.hwnd != hwnd)) return;
229 dprintf_caret(stddeb,"ShowCaret: hidden=%d\n", Caret.hidden);
230 if (Caret.hidden)
231 --Caret.hidden;
235 /*****************************************************************
236 * SetCaretBlinkTime (USER.168)
239 void SetCaretBlinkTime(WORD msecs)
241 if (!Caret.hwnd) return;
243 CARET_Initialize();
245 KillSystemTimer( (HWND)0, Caret.timerid);
246 Caret.timeout = msecs;
247 Caret.timerid = SetSystemTimer( (HWND)0, 0, Caret.timeout,
248 (FARPROC)GetWndProcEntry16("CARET_Callback"));
252 /*****************************************************************
253 * GetCaretBlinkTime (USER.169)
256 WORD GetCaretBlinkTime()
258 if (!Caret.hwnd) return 0;
259 return Caret.timeout;
263 /*****************************************************************
264 * GetCaretPos (USER.183)
267 void GetCaretPos(LPPOINT pt)
269 if (!Caret.hwnd || !pt) return;
271 pt->x = Caret.x;
272 pt->y = Caret.y;