Don't return overflow if no class buffer was specified.
[wine/dcerpc.git] / dlls / comctl32 / hotkey.c
blob349a5a4034764dd9a5fdfef2eb9effd5391b546b
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 <string.h>
17 #include "winbase.h"
18 #include "commctrl.h"
19 #include "debugtools.h"
21 DEFAULT_DEBUG_CHANNEL(hotkey);
23 typedef struct tagHOTKEY_INFO
25 HFONT hFont;
26 BOOL bFocus;
27 INT nHeight;
28 } HOTKEY_INFO;
30 #define HOTKEY_GetInfoPtr(hwnd) ((HOTKEY_INFO *)GetWindowLongA (hwnd, 0))
33 /* << HOTHEY_GetHotKey >> */
34 /* << HOTHEY_SetHotKey >> */
35 /* << HOTHEY_SetRules >> */
39 /* << HOTKEY_Char >> */
42 static LRESULT
43 HOTKEY_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
45 HOTKEY_INFO *infoPtr;
46 TEXTMETRICA tm;
47 HDC hdc;
49 /* allocate memory for info structure */
50 infoPtr = (HOTKEY_INFO *)COMCTL32_Alloc (sizeof(HOTKEY_INFO));
51 SetWindowLongA (hwnd, 0, (DWORD)infoPtr);
53 /* initialize info structure */
56 /* get default font height */
57 hdc = GetDC (hwnd);
58 GetTextMetricsA (hdc, &tm);
59 infoPtr->nHeight = tm.tmHeight;
60 ReleaseDC (hwnd, hdc);
62 return 0;
66 static LRESULT
67 HOTKEY_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
69 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
73 /* free hotkey info data */
74 COMCTL32_Free (infoPtr);
75 SetWindowLongA (hwnd, 0, 0);
76 return 0;
80 static LRESULT
81 HOTKEY_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
83 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
84 HBRUSH hBrush;
85 RECT rc;
87 hBrush =
88 (HBRUSH)SendMessageA (GetParent (hwnd), WM_CTLCOLOREDIT,
89 wParam, (LPARAM)hwnd);
90 if (hBrush)
91 hBrush = (HBRUSH)GetStockObject (WHITE_BRUSH);
92 GetClientRect (hwnd, &rc);
94 FillRect ((HDC)wParam, &rc, hBrush);
96 return -1;
100 inline static LRESULT
101 HOTKEY_GetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
103 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
105 return infoPtr->hFont;
109 static LRESULT
110 HOTKEY_KeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
112 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
114 switch (wParam) {
115 case VK_RETURN:
116 case VK_TAB:
117 case VK_SPACE:
118 case VK_DELETE:
119 case VK_ESCAPE:
120 case VK_BACK:
121 return DefWindowProcA (hwnd, WM_KEYDOWN, wParam, lParam);
123 case VK_SHIFT:
124 case VK_CONTROL:
125 case VK_MENU:
126 FIXME("modifier key pressed!\n");
127 break;
129 default:
130 FIXME(" %d\n", wParam);
131 break;
134 return TRUE;
138 static LRESULT
139 HOTKEY_KeyUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
141 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
143 FIXME(" %d\n", wParam);
145 return 0;
149 static LRESULT
150 HOTKEY_KillFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
152 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
154 infoPtr->bFocus = FALSE;
155 DestroyCaret ();
157 return 0;
161 static LRESULT
162 HOTKEY_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
164 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
166 SetFocus (hwnd);
168 return 0;
172 inline static LRESULT
173 HOTKEY_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
175 DWORD dwExStyle = GetWindowLongA (hwnd, GWL_EXSTYLE);
176 SetWindowLongA (hwnd, GWL_EXSTYLE, dwExStyle | WS_EX_CLIENTEDGE);
177 return DefWindowProcA (hwnd, WM_NCCREATE, wParam, lParam);
184 static LRESULT
185 HOTKEY_SetFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
187 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
189 infoPtr->bFocus = TRUE;
192 CreateCaret (hwnd, (HBITMAP)0, 1, infoPtr->nHeight);
194 SetCaretPos (1, 1);
196 ShowCaret (hwnd);
199 return 0;
203 inline static LRESULT
204 HOTKEY_SetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
206 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
207 TEXTMETRICA tm;
208 HDC hdc;
209 HFONT hOldFont = 0;
211 infoPtr->hFont = (HFONT)wParam;
213 hdc = GetDC (hwnd);
214 if (infoPtr->hFont)
215 hOldFont = SelectObject (hdc, infoPtr->hFont);
217 GetTextMetricsA (hdc, &tm);
218 infoPtr->nHeight = tm.tmHeight;
220 if (infoPtr->hFont)
221 SelectObject (hdc, hOldFont);
222 ReleaseDC (hwnd, hdc);
224 if (LOWORD(lParam)) {
226 FIXME("force redraw!\n");
230 return 0;
234 static LRESULT WINE_UNUSED
235 HOTKEY_SysKeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
237 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
239 switch (wParam) {
240 case VK_RETURN:
241 case VK_TAB:
242 case VK_SPACE:
243 case VK_DELETE:
244 case VK_ESCAPE:
245 case VK_BACK:
246 return DefWindowProcA (hwnd, WM_SYSKEYDOWN, wParam, lParam);
248 case VK_SHIFT:
249 case VK_CONTROL:
250 case VK_MENU:
251 FIXME("modifier key pressed!\n");
252 break;
254 default:
255 FIXME(" %d\n", wParam);
256 break;
259 return TRUE;
263 static LRESULT WINE_UNUSED
264 HOTKEY_SysKeyUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
266 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
268 FIXME(" %d\n", wParam);
270 return 0;
275 static LRESULT WINAPI
276 HOTKEY_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
278 TRACE("hwnd=%x msg=%x wparam=%x lparam=%lx\n", hwnd, uMsg, wParam, lParam);
279 if (!HOTKEY_GetInfoPtr (hwnd) && (uMsg != WM_CREATE))
280 return DefWindowProcA (hwnd, uMsg, wParam, lParam);
281 switch (uMsg)
283 /* case HKM_GETHOTKEY: */
284 /* case HKM_SETHOTKEY: */
285 /* case HKM_SETRULES: */
287 /* case WM_CHAR: */
289 case WM_CREATE:
290 return HOTKEY_Create (hwnd, wParam, lParam);
292 case WM_DESTROY:
293 return HOTKEY_Destroy (hwnd, wParam, lParam);
295 case WM_ERASEBKGND:
296 return HOTKEY_EraseBackground (hwnd, wParam, lParam);
298 case WM_GETDLGCODE:
299 return DLGC_WANTCHARS | DLGC_WANTARROWS;
301 case WM_GETFONT:
302 return HOTKEY_GetFont (hwnd, wParam, lParam);
304 case WM_KEYDOWN:
305 case WM_SYSKEYDOWN:
306 return HOTKEY_KeyDown (hwnd, wParam, lParam);
308 case WM_KEYUP:
309 case WM_SYSKEYUP:
310 return HOTKEY_KeyUp (hwnd, wParam, lParam);
312 case WM_KILLFOCUS:
313 return HOTKEY_KillFocus (hwnd, wParam, lParam);
315 case WM_LBUTTONDOWN:
316 return HOTKEY_LButtonDown (hwnd, wParam, lParam);
318 case WM_NCCREATE:
319 return HOTKEY_NCCreate (hwnd, wParam, lParam);
321 /* case WM_PAINT: */
323 case WM_SETFOCUS:
324 return HOTKEY_SetFocus (hwnd, wParam, lParam);
326 case WM_SETFONT:
327 return HOTKEY_SetFont (hwnd, wParam, lParam);
329 /* case WM_SYSCHAR: */
331 default:
332 if (uMsg >= WM_USER)
333 ERR("unknown msg %04x wp=%08x lp=%08lx\n",
334 uMsg, wParam, lParam);
335 return DefWindowProcA (hwnd, uMsg, wParam, lParam);
337 return 0;
341 VOID
342 HOTKEY_Register (void)
344 WNDCLASSA wndClass;
346 ZeroMemory (&wndClass, sizeof(WNDCLASSA));
347 wndClass.style = CS_GLOBALCLASS;
348 wndClass.lpfnWndProc = (WNDPROC)HOTKEY_WindowProc;
349 wndClass.cbClsExtra = 0;
350 wndClass.cbWndExtra = sizeof(HOTKEY_INFO *);
351 wndClass.hCursor = 0;
352 wndClass.hbrBackground = 0;
353 wndClass.lpszClassName = HOTKEY_CLASSA;
355 RegisterClassA (&wndClass);
359 VOID
360 HOTKEY_Unregister (void)
362 UnregisterClassA (HOTKEY_CLASSA, (HINSTANCE)NULL);