New debug scheme with explicit debug channels declaration.
[wine/hacks.git] / dlls / comctl32 / hotkey.c
blobcb5c06d4dc8f1588db4840908044ace3dff6db16
1 /*
2 * Hotkey control
4 * Copyright 1998, 1999 Eric Kohl
6 * NOTES
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>
11 * TODO:
12 * - Some messages.
13 * - Display code.
16 #include "winbase.h"
17 #include "commctrl.h"
18 #include "hotkey.h"
19 #include "debug.h"
21 DEFAULT_DEBUG_CHANNEL(hotkey)
24 #define HOTKEY_GetInfoPtr(hwnd) ((HOTKEY_INFO *)GetWindowLongA (hwnd, 0))
27 /* << HOTHEY_GetHotKey >> */
28 /* << HOTHEY_SetHotKey >> */
29 /* << HOTHEY_SetRules >> */
33 /* << HOTKEY_Char >> */
36 static LRESULT
37 HOTKEY_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
39 HOTKEY_INFO *infoPtr;
40 TEXTMETRICA tm;
41 HDC hdc;
43 /* allocate memory for info structure */
44 infoPtr = (HOTKEY_INFO *)COMCTL32_Alloc (sizeof(HOTKEY_INFO));
45 SetWindowLongA (hwnd, 0, (DWORD)infoPtr);
47 /* initialize info structure */
50 /* get default font height */
51 hdc = GetDC (hwnd);
52 GetTextMetricsA (hdc, &tm);
53 infoPtr->nHeight = tm.tmHeight;
54 ReleaseDC (hwnd, hdc);
56 return 0;
60 static LRESULT
61 HOTKEY_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
63 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
67 /* free hotkey info data */
68 COMCTL32_Free (infoPtr);
70 return 0;
74 static LRESULT
75 HOTKEY_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
77 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
78 HBRUSH hBrush;
79 RECT rc;
81 hBrush =
82 (HBRUSH)SendMessageA (GetParent (hwnd), WM_CTLCOLOREDIT,
83 wParam, (LPARAM)hwnd);
84 if (hBrush)
85 hBrush = (HBRUSH)GetStockObject (WHITE_BRUSH);
86 GetClientRect (hwnd, &rc);
88 FillRect ((HDC)wParam, &rc, hBrush);
90 return -1;
94 __inline__ static LRESULT
95 HOTKEY_GetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
97 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
99 return infoPtr->hFont;
103 static LRESULT
104 HOTKEY_KeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
106 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
108 switch (wParam) {
109 case VK_RETURN:
110 case VK_TAB:
111 case VK_SPACE:
112 case VK_DELETE:
113 case VK_ESCAPE:
114 case VK_BACK:
115 return DefWindowProcA (hwnd, WM_KEYDOWN, wParam, lParam);
117 case VK_SHIFT:
118 case VK_CONTROL:
119 case VK_MENU:
120 FIXME (hotkey, "modifier key pressed!\n");
121 break;
123 default:
124 FIXME (hotkey, " %d\n", wParam);
125 break;
128 return TRUE;
132 static LRESULT
133 HOTKEY_KeyUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
135 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
137 FIXME (hotkey, " %d\n", wParam);
139 return 0;
143 static LRESULT
144 HOTKEY_KillFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
146 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
148 infoPtr->bFocus = FALSE;
149 DestroyCaret ();
151 return 0;
155 static LRESULT
156 HOTKEY_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
158 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
160 SetFocus (hwnd);
162 return 0;
166 __inline__ static LRESULT
167 HOTKEY_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
169 DWORD dwExStyle = GetWindowLongA (hwnd, GWL_EXSTYLE);
170 SetWindowLongA (hwnd, GWL_EXSTYLE, dwExStyle | WS_EX_CLIENTEDGE);
171 return DefWindowProcA (hwnd, WM_NCCREATE, wParam, lParam);
178 static LRESULT
179 HOTKEY_SetFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
181 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
183 infoPtr->bFocus = TRUE;
186 CreateCaret (hwnd, (HBITMAP)0, 1, infoPtr->nHeight);
188 SetCaretPos (1, 1);
190 ShowCaret (hwnd);
193 return 0;
197 __inline__ static LRESULT
198 HOTKEY_SetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
200 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
201 TEXTMETRICA tm;
202 HDC hdc;
203 HFONT hOldFont = 0;
205 infoPtr->hFont = (HFONT)wParam;
207 hdc = GetDC (hwnd);
208 if (infoPtr->hFont)
209 hOldFont = SelectObject (hdc, infoPtr->hFont);
211 GetTextMetricsA (hdc, &tm);
212 infoPtr->nHeight = tm.tmHeight;
214 if (infoPtr->hFont)
215 SelectObject (hdc, hOldFont);
216 ReleaseDC (hwnd, hdc);
218 if (LOWORD(lParam)) {
220 FIXME (hotkey, "force redraw!\n");
224 return 0;
228 static LRESULT WINE_UNUSED
229 HOTKEY_SysKeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
231 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
233 switch (wParam) {
234 case VK_RETURN:
235 case VK_TAB:
236 case VK_SPACE:
237 case VK_DELETE:
238 case VK_ESCAPE:
239 case VK_BACK:
240 return DefWindowProcA (hwnd, WM_SYSKEYDOWN, wParam, lParam);
242 case VK_SHIFT:
243 case VK_CONTROL:
244 case VK_MENU:
245 FIXME (hotkey, "modifier key pressed!\n");
246 break;
248 default:
249 FIXME (hotkey, " %d\n", wParam);
250 break;
253 return TRUE;
257 static LRESULT WINE_UNUSED
258 HOTKEY_SysKeyUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
260 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
262 FIXME (hotkey, " %d\n", wParam);
264 return 0;
269 LRESULT WINAPI
270 HOTKEY_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
272 switch (uMsg)
274 /* case HKM_GETHOTKEY: */
275 /* case HKM_SETHOTKEY: */
276 /* case HKM_SETRULES: */
278 /* case WM_CHAR: */
280 case WM_CREATE:
281 return HOTKEY_Create (hwnd, wParam, lParam);
283 case WM_DESTROY:
284 return HOTKEY_Destroy (hwnd, wParam, lParam);
286 case WM_ERASEBKGND:
287 return HOTKEY_EraseBackground (hwnd, wParam, lParam);
289 case WM_GETDLGCODE:
290 return DLGC_WANTCHARS | DLGC_WANTARROWS;
292 case WM_GETFONT:
293 return HOTKEY_GetFont (hwnd, wParam, lParam);
295 case WM_KEYDOWN:
296 case WM_SYSKEYDOWN:
297 return HOTKEY_KeyDown (hwnd, wParam, lParam);
299 case WM_KEYUP:
300 case WM_SYSKEYUP:
301 return HOTKEY_KeyUp (hwnd, wParam, lParam);
303 case WM_KILLFOCUS:
304 return HOTKEY_KillFocus (hwnd, wParam, lParam);
306 case WM_LBUTTONDOWN:
307 return HOTKEY_LButtonDown (hwnd, wParam, lParam);
309 case WM_NCCREATE:
310 return HOTKEY_NCCreate (hwnd, wParam, lParam);
312 /* case WM_PAINT: */
314 case WM_SETFOCUS:
315 return HOTKEY_SetFocus (hwnd, wParam, lParam);
317 case WM_SETFONT:
318 return HOTKEY_SetFont (hwnd, wParam, lParam);
320 /* case WM_SYSCHAR: */
322 default:
323 if (uMsg >= WM_USER)
324 ERR (hotkey, "unknown msg %04x wp=%08x lp=%08lx\n",
325 uMsg, wParam, lParam);
326 return DefWindowProcA (hwnd, uMsg, wParam, lParam);
328 return 0;
332 VOID
333 HOTKEY_Register (VOID)
335 WNDCLASSA wndClass;
337 if (GlobalFindAtomA (HOTKEY_CLASSA)) return;
339 ZeroMemory (&wndClass, sizeof(WNDCLASSA));
340 wndClass.style = CS_GLOBALCLASS;
341 wndClass.lpfnWndProc = (WNDPROC)HOTKEY_WindowProc;
342 wndClass.cbClsExtra = 0;
343 wndClass.cbWndExtra = sizeof(HOTKEY_INFO *);
344 wndClass.hCursor = 0;
345 wndClass.hbrBackground = 0;
346 wndClass.lpszClassName = HOTKEY_CLASSA;
348 RegisterClassA (&wndClass);
352 VOID
353 HOTKEY_Unregister (VOID)
355 if (GlobalFindAtomA (HOTKEY_CLASSA))
356 UnregisterClassA (HOTKEY_CLASSA, (HINSTANCE)NULL);