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, WPARAM32 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 = GetDC32 (wndPtr->hwndSelf);
60 GetTextMetrics32A (hdc, &tm);
61 infoPtr->nHeight = tm.tmHeight;
62 ReleaseDC32 (wndPtr->hwndSelf, hdc);
69 HOTKEY_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
71 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
75 /* free hotkey info data */
76 COMCTL32_Free (infoPtr);
83 HOTKEY_EraseBackground (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
85 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr); */
90 (HBRUSH32)SendMessage32A (wndPtr->parent->hwndSelf, WM_CTLCOLOREDIT,
91 wParam, (LPARAM)wndPtr->hwndSelf);
93 hBrush = (HBRUSH32)GetStockObject32 (WHITE_BRUSH);
94 GetClientRect32 (wndPtr->hwndSelf, &rc);
96 FillRect32 ((HDC32)wParam, &rc, hBrush);
102 __inline__ static LRESULT
103 HOTKEY_GetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
105 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
107 return infoPtr->hFont;
112 HOTKEY_KeyDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
114 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr); */
123 return DefWindowProc32A (wndPtr->hwndSelf, WM_KEYDOWN, wParam, lParam);
128 FIXME (hotkey, "modifier key pressed!\n");
132 FIXME (hotkey, " %d\n", wParam);
141 HOTKEY_KeyUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
143 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr); */
145 FIXME (hotkey, " %d\n", wParam);
152 HOTKEY_KillFocus (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
154 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
156 infoPtr->bFocus = FALSE;
164 HOTKEY_LButtonDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
166 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr); */
168 SetFocus32 (wndPtr->hwndSelf);
174 __inline__ static LRESULT
175 HOTKEY_NCCreate (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
177 wndPtr->dwExStyle |= WS_EX_CLIENTEDGE;
179 return DefWindowProc32A (wndPtr->hwndSelf, WM_NCCREATE, wParam, lParam);
187 HOTKEY_SetFocus (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
189 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
191 infoPtr->bFocus = TRUE;
194 CreateCaret32 (wndPtr->hwndSelf, (HBITMAP32)0, 1, infoPtr->nHeight);
196 SetCaretPos32 (1, 1);
198 ShowCaret32 (wndPtr->hwndSelf);
205 __inline__ static LRESULT
206 HOTKEY_SetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
208 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr);
211 HFONT32 hOldFont = 0;
213 infoPtr->hFont = (HFONT32)wParam;
215 hdc = GetDC32 (wndPtr->hwndSelf);
217 hOldFont = SelectObject32 (hdc, infoPtr->hFont);
219 GetTextMetrics32A (hdc, &tm);
220 infoPtr->nHeight = tm.tmHeight;
223 SelectObject32 (hdc, hOldFont);
224 ReleaseDC32 (wndPtr->hwndSelf, hdc);
226 if (LOWORD(lParam)) {
228 FIXME (hotkey, "force redraw!\n");
237 HOTKEY_SysKeyDown (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
239 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr); */
248 return DefWindowProc32A (wndPtr->hwndSelf, WM_SYSKEYDOWN, wParam, lParam);
253 FIXME (hotkey, "modifier key pressed!\n");
257 FIXME (hotkey, " %d\n", wParam);
266 HOTKEY_SysKeyUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam)
268 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(wndPtr); */
270 FIXME (hotkey, " %d\n", wParam);
278 HOTKEY_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 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 DefWindowProc32A (hwnd, uMsg, wParam, lParam);
343 HOTKEY_Register (VOID)
345 WNDCLASS32A wndClass;
347 if (GlobalFindAtom32A (HOTKEY_CLASS32A)) return;
349 ZeroMemory (&wndClass, sizeof(WNDCLASS32A));
350 wndClass.style = CS_GLOBALCLASS;
351 wndClass.lpfnWndProc = (WNDPROC32)HOTKEY_WindowProc;
352 wndClass.cbClsExtra = 0;
353 wndClass.cbWndExtra = sizeof(HOTKEY_INFO *);
354 wndClass.hCursor = 0;
355 wndClass.hbrBackground = 0;
356 wndClass.lpszClassName = HOTKEY_CLASS32A;
358 RegisterClass32A (&wndClass);
363 HOTKEY_Unregister (VOID)
365 if (GlobalFindAtom32A (HOTKEY_CLASS32A))
366 UnregisterClass32A (HOTKEY_CLASS32A, (HINSTANCE32)NULL);