4 * Copyright 1998 Eric Kohl
7 * Development in progress. An author is needed! Any volunteers?
8 * I will only improve this control once in a while.
9 * Eric <ekohl@abo.rhein-zeitung.de>
22 #define HOTKEY_GetInfoPtr(wndPtr) ((HOTKEY_INFO *)wndPtr->wExtra[0])
25 /* << HOTHEY_GetHotKey >> */
26 /* << HOTHEY_SetHotKey >> */
27 /* << HOTHEY_SetRules >> */
31 /* << HOTKEY_Char >> */
35 HOTKEY_Create (WND
*wndPtr
, WPARAM wParam
, LPARAM lParam
)
41 /* allocate memory for info structure */
42 infoPtr
= (HOTKEY_INFO
*)COMCTL32_Alloc (sizeof(HOTKEY_INFO
));
43 wndPtr
->wExtra
[0] = (DWORD
)infoPtr
;
45 if (infoPtr
== NULL
) {
46 ERR (listview
, "could not allocate info memory!\n");
50 if ((HOTKEY_INFO
*)wndPtr
->wExtra
[0] != infoPtr
) {
51 ERR (listview
, "pointer assignment error!\n");
56 /* initialize info structure */
58 /* get default font height */
59 hdc
= GetDC (wndPtr
->hwndSelf
);
60 GetTextMetricsA (hdc
, &tm
);
61 infoPtr
->nHeight
= tm
.tmHeight
;
62 ReleaseDC (wndPtr
->hwndSelf
, hdc
);
69 HOTKEY_Destroy (WND
*wndPtr
, WPARAM wParam
, LPARAM lParam
)
71 HOTKEY_INFO
*infoPtr
= HOTKEY_GetInfoPtr(wndPtr
);
75 /* free hotkey info data */
76 COMCTL32_Free (infoPtr
);
83 HOTKEY_EraseBackground (WND
*wndPtr
, WPARAM wParam
, LPARAM lParam
)
85 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr); */
90 (HBRUSH
)SendMessageA (wndPtr
->parent
->hwndSelf
, WM_CTLCOLOREDIT
,
91 wParam
, (LPARAM
)wndPtr
->hwndSelf
);
93 hBrush
= (HBRUSH
)GetStockObject (WHITE_BRUSH
);
94 GetClientRect (wndPtr
->hwndSelf
, &rc
);
96 FillRect ((HDC
)wParam
, &rc
, hBrush
);
102 __inline__
static LRESULT
103 HOTKEY_GetFont (WND
*wndPtr
, WPARAM wParam
, LPARAM lParam
)
105 HOTKEY_INFO
*infoPtr
= HOTKEY_GetInfoPtr(wndPtr
);
107 return infoPtr
->hFont
;
112 HOTKEY_KeyDown (WND
*wndPtr
, WPARAM wParam
, LPARAM lParam
)
114 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr); */
123 return DefWindowProcA (wndPtr
->hwndSelf
, WM_KEYDOWN
, wParam
, lParam
);
128 FIXME (hotkey
, "modifier key pressed!\n");
132 FIXME (hotkey
, " %d\n", wParam
);
141 HOTKEY_KeyUp (WND
*wndPtr
, WPARAM wParam
, LPARAM lParam
)
143 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr); */
145 FIXME (hotkey
, " %d\n", wParam
);
152 HOTKEY_KillFocus (WND
*wndPtr
, WPARAM wParam
, LPARAM lParam
)
154 HOTKEY_INFO
*infoPtr
= HOTKEY_GetInfoPtr(wndPtr
);
156 infoPtr
->bFocus
= FALSE
;
164 HOTKEY_LButtonDown (WND
*wndPtr
, WPARAM wParam
, LPARAM lParam
)
166 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr); */
168 SetFocus (wndPtr
->hwndSelf
);
174 __inline__
static LRESULT
175 HOTKEY_NCCreate (WND
*wndPtr
, WPARAM wParam
, LPARAM lParam
)
177 wndPtr
->dwExStyle
|= WS_EX_CLIENTEDGE
;
179 return DefWindowProcA (wndPtr
->hwndSelf
, WM_NCCREATE
, wParam
, lParam
);
187 HOTKEY_SetFocus (WND
*wndPtr
, WPARAM wParam
, LPARAM lParam
)
189 HOTKEY_INFO
*infoPtr
= HOTKEY_GetInfoPtr(wndPtr
);
191 infoPtr
->bFocus
= TRUE
;
194 CreateCaret (wndPtr
->hwndSelf
, (HBITMAP
)0, 1, infoPtr
->nHeight
);
198 ShowCaret (wndPtr
->hwndSelf
);
205 __inline__
static LRESULT
206 HOTKEY_SetFont (WND
*wndPtr
, WPARAM wParam
, LPARAM lParam
)
208 HOTKEY_INFO
*infoPtr
= HOTKEY_GetInfoPtr(wndPtr
);
213 infoPtr
->hFont
= (HFONT
)wParam
;
215 hdc
= GetDC (wndPtr
->hwndSelf
);
217 hOldFont
= SelectObject (hdc
, infoPtr
->hFont
);
219 GetTextMetricsA (hdc
, &tm
);
220 infoPtr
->nHeight
= tm
.tmHeight
;
223 SelectObject (hdc
, hOldFont
);
224 ReleaseDC (wndPtr
->hwndSelf
, hdc
);
226 if (LOWORD(lParam
)) {
228 FIXME (hotkey
, "force redraw!\n");
237 HOTKEY_SysKeyDown (WND
*wndPtr
, WPARAM wParam
, LPARAM lParam
)
239 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr); */
248 return DefWindowProcA (wndPtr
->hwndSelf
, WM_SYSKEYDOWN
, wParam
, lParam
);
253 FIXME (hotkey
, "modifier key pressed!\n");
257 FIXME (hotkey
, " %d\n", wParam
);
266 HOTKEY_SysKeyUp (WND
*wndPtr
, WPARAM wParam
, LPARAM lParam
)
268 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr); */
270 FIXME (hotkey
, " %d\n", wParam
);
278 HOTKEY_WindowProc (HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
280 WND
*wndPtr
= WIN_FindWndPtr(hwnd
);
284 /* case HKM_GETHOTKEY: */
285 /* case HKM_SETHOTKEY: */
286 /* case HKM_SETRULES: */
291 return HOTKEY_Create (wndPtr
, wParam
, lParam
);
294 return HOTKEY_Destroy (wndPtr
, wParam
, lParam
);
297 return HOTKEY_EraseBackground (wndPtr
, wParam
, lParam
);
300 return DLGC_WANTCHARS
| DLGC_WANTARROWS
;
303 return HOTKEY_GetFont (wndPtr
, wParam
, lParam
);
307 return HOTKEY_KeyDown (wndPtr
, wParam
, lParam
);
311 return HOTKEY_KeyUp (wndPtr
, wParam
, lParam
);
314 return HOTKEY_KillFocus (wndPtr
, wParam
, lParam
);
317 return HOTKEY_LButtonDown (wndPtr
, wParam
, lParam
);
320 return HOTKEY_NCCreate (wndPtr
, wParam
, lParam
);
325 return HOTKEY_SetFocus (wndPtr
, wParam
, lParam
);
328 return HOTKEY_SetFont (wndPtr
, wParam
, lParam
);
330 /* case WM_SYSCHAR: */
334 ERR (hotkey
, "unknown msg %04x wp=%08x lp=%08lx\n",
335 uMsg
, wParam
, lParam
);
336 return DefWindowProcA (hwnd
, uMsg
, wParam
, lParam
);
343 HOTKEY_Register (VOID
)
347 if (GlobalFindAtomA (HOTKEY_CLASSA
)) return;
349 ZeroMemory (&wndClass
, sizeof(WNDCLASSA
));
350 wndClass
.style
= CS_GLOBALCLASS
;
351 wndClass
.lpfnWndProc
= (WNDPROC
)HOTKEY_WindowProc
;
352 wndClass
.cbClsExtra
= 0;
353 wndClass
.cbWndExtra
= sizeof(HOTKEY_INFO
*);
354 wndClass
.hCursor
= 0;
355 wndClass
.hbrBackground
= 0;
356 wndClass
.lpszClassName
= HOTKEY_CLASSA
;
358 RegisterClassA (&wndClass
);
363 HOTKEY_Unregister (VOID
)
365 if (GlobalFindAtomA (HOTKEY_CLASSA
))
366 UnregisterClassA (HOTKEY_CLASSA
, (HINSTANCE
)NULL
);