4 * Copyright 1993 David Metcalfe
6 static char Copyright[] = "Copyright David Metcalfe, 1993";
10 #include "selectors.h"
13 /* #define DEBUG_CARET */
33 static BOOL LockCaret
;
35 static void CARET_HideCaret();
38 /*****************************************************************
41 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
);
98 /*****************************************************************
101 static void CARET_Initialize()
103 DWORD WineProc
,Win16Proc
,Win32Proc
;
104 static int initialized
=0;
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
);
116 /*****************************************************************
117 * CreateCaret (USER.163)
120 void CreateCaret(HWND hwnd
, HBITMAP bitmap
, short width
, short height
)
125 /* if cursor already exists, destroy it */
129 if (bitmap
&& bitmap
!= 1)
130 Caret
.bitmap
= bitmap
;
135 Caret
.width
= GetSystemMetrics(SM_CXBORDER
);
138 Caret
.height
= height
;
140 Caret
.height
= GetSystemMetrics(SM_CYBORDER
);
148 Caret
.color
= GetSysColor(COLOR_GRAYTEXT
);
150 Caret
.color
= GetSysColor(COLOR_WINDOWTEXT
);
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)
170 /* if (!Caret.hwnd) return;
172 dprintf_caret(stddeb
,"DestroyCaret: timerid=%d\n", Caret
.timerid
);
174 KillSystemTimer( (HWND
)0, Caret
.timerid
);
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
);
202 /*****************************************************************
203 * HideCaret (USER.166)
206 void HideCaret(HWND hwnd
)
208 if (!Caret
.hwnd
) return;
209 if (hwnd
&& (Caret
.hwnd
!= hwnd
)) return;
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
);
235 /*****************************************************************
236 * SetCaretBlinkTime (USER.168)
239 void SetCaretBlinkTime(WORD msecs
)
241 if (!Caret
.hwnd
) return;
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;