source: trunk/src/comctl32/hotkey.c@ 968

Last change on this file since 968 was 968, checked in by cbratschi, 26 years ago

bugs fixed, hotkey: first version

File size: 10.8 KB
Line 
1/* $Id: hotkey.c,v 1.5 1999-09-18 12:21:26 cbratschi Exp $ */
2/*
3 * Hotkey control
4 *
5 * Copyright 1998, 1999 Eric Kohl
6 * Copyright 1999 Achim Hasenmueller
7 * Copyright 1999 Christoph Bratschi
8 *
9 * NOTES
10 * Development in progress.
11 * CB: difficult with new User32
12 *
13 * TODO:
14 * - keyboard messages
15 */
16
17#include "winbase.h"
18#include "commctrl.h"
19#include "hotkey.h"
20#include <string.h>
21
22#define HOTKEY_GetInfoPtr(hwnd) ((HOTKEY_INFO*)GetWindowLongA(hwnd,0))
23
24static VOID
25HOTKEY_UpdateHotKey(HWND hwnd);
26
27static BYTE
28HOTKEY_Check(HOTKEY_INFO *infoPtr,BYTE bfMods)
29{
30 if ((infoPtr->fwCombInv & HKCOMB_A && bfMods == HOTKEYF_ALT) ||
31 (infoPtr->fwCombInv & HKCOMB_C && bfMods == HOTKEYF_CONTROL) ||
32 (infoPtr->fwCombInv & HKCOMB_CA && bfMods == HOTKEYF_CONTROL | HOTKEYF_ALT) ||
33 (infoPtr->fwCombInv & HKCOMB_NONE && bfMods == 0) ||
34 (infoPtr->fwCombInv & HKCOMB_S && bfMods == HOTKEYF_SHIFT) ||
35 (infoPtr->fwCombInv & HKCOMB_SA && bfMods == HOTKEYF_SHIFT | HOTKEYF_ALT) ||
36 (infoPtr->fwCombInv & HKCOMB_SC && bfMods == HOTKEYF_SHIFT | HOTKEYF_CONTROL) ||
37 (infoPtr->fwCombInv & HKCOMB_SCA && bfMods == HOTKEYF_SHIFT | HOTKEYF_CONTROL | HOTKEYF_ALT))
38 return infoPtr->fwModInv;
39 else
40 return bfMods;
41}
42
43
44static LRESULT
45HOTKEY_SetHotKey(HWND hwnd,WPARAM wParam,LPARAM lParam)
46{
47 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(hwnd);
48
49 infoPtr->bVKHotKey = wParam & 0xFF;
50 infoPtr->bfMods = HOTKEY_Check(infoPtr,wParam & 0xFF00);
51
52 HOTKEY_UpdateHotKey(hwnd);
53
54 return 0;
55}
56
57
58static LRESULT
59HOTKEY_GetHotKey(HWND hwnd,WPARAM wParam,LPARAM lParam)
60{
61 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(hwnd);
62
63 return MAKEWORD(infoPtr->bVKHotKey,infoPtr->bfMods);
64}
65
66
67static LRESULT
68HOTKEY_SetRules(HWND hwnd,WPARAM wParam,LPARAM lParam)
69{
70 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(hwnd);
71 BYTE oldMods = infoPtr->bfMods;
72
73 infoPtr->fwCombInv = wParam;
74 infoPtr->fwModInv = lParam;
75
76 infoPtr->bfMods = HOTKEY_Check(infoPtr,infoPtr->bfMods);
77 if (infoPtr->bfMods != oldMods) HOTKEY_UpdateHotKey(hwnd);
78
79 return 0;
80}
81
82
83static LRESULT
84HOTKEY_Char(HWND hwnd,WPARAM wParam,LPARAM lParam)
85{
86 //CB:
87 return 0;
88}
89
90
91static LRESULT
92HOTKEY_SysChar(HWND hwnd,WPARAM wParam,LPARAM lParam)
93{
94 //CB:
95 return 0;
96}
97
98
99static LRESULT
100HOTKEY_Create (HWND hwnd, WPARAM wParam, LPARAM lParam)
101{
102 HOTKEY_INFO *infoPtr;
103 TEXTMETRICA tm;
104 HDC hdc;
105
106 /* allocate memory for info structure */
107 infoPtr = (HOTKEY_INFO *)COMCTL32_Alloc (sizeof(HOTKEY_INFO));
108 SetWindowLongA(hwnd,0,(DWORD)infoPtr);
109
110 /* initialize info structure */
111
112 infoPtr->hFont = 0;
113 infoPtr->bFocus = FALSE;
114 infoPtr->bVKHotKey = 0;
115 infoPtr->bfMods = 0;
116 infoPtr->fwCombInv = 0;
117 infoPtr->fwModInv = 0;
118
119 /* get default font height */
120 hdc = GetDC (hwnd);
121 GetTextMetricsA (hdc, &tm);
122 infoPtr->nHeight = tm.tmHeight;
123 ReleaseDC (hwnd, hdc);
124
125 return 0;
126}
127
128
129static LRESULT
130HOTKEY_Destroy (HWND hwnd, WPARAM wParam, LPARAM lParam)
131{
132 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
133
134 /* free hotkey info data */
135 COMCTL32_Free (infoPtr);
136
137 return 0;
138}
139
140
141static LRESULT
142HOTKEY_EraseBackground (HWND hwnd, WPARAM wParam, LPARAM lParam)
143{
144 HBRUSH hBrush;
145 RECT rc;
146
147 hBrush = (HBRUSH)SendMessageA(GetParent(hwnd),WM_CTLCOLOREDIT,wParam,(LPARAM)hwnd);
148 if (!hBrush) hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
149 GetClientRect(hwnd,&rc);
150 FillRect((HDC)wParam,&rc,hBrush);
151
152 return -1;
153}
154
155
156static LRESULT
157HOTKEY_GetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
158{
159 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
160
161 return infoPtr->hFont;
162}
163
164
165static LRESULT
166HOTKEY_KeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
167{
168 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
169
170 switch (wParam) {
171 case VK_RETURN:
172 case VK_TAB:
173 case VK_SPACE:
174 case VK_DELETE:
175 case VK_ESCAPE:
176 case VK_BACK:
177 return DefWindowProcA (hwnd, WM_KEYDOWN, wParam, lParam);
178
179 case VK_SHIFT:
180 case VK_CONTROL:
181 case VK_MENU:
182// FIXME (hotkey, "modifier key pressed!\n");
183 break;
184
185 default:
186// FIXME (hotkey, " %d\n", wParam);
187 break;
188 }
189
190 return TRUE;
191}
192
193
194static LRESULT
195HOTKEY_KeyUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
196{
197 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
198
199// FIXME (hotkey, " %d\n", wParam);
200
201 return 0;
202}
203
204
205static LRESULT
206HOTKEY_KillFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
207{
208 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
209
210 infoPtr->bFocus = FALSE;
211 DestroyCaret ();
212
213 return 0;
214}
215
216
217static LRESULT
218HOTKEY_LButtonDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
219{
220/* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
221
222 SetFocus (hwnd);
223
224 return 0;
225}
226
227
228static LRESULT
229HOTKEY_NCCreate (HWND hwnd, WPARAM wParam, LPARAM lParam)
230{
231 DWORD dwExStyle = GetWindowLongA (hwnd, GWL_EXSTYLE);
232 SetWindowLongA (hwnd, GWL_EXSTYLE, dwExStyle | WS_EX_CLIENTEDGE);
233 return DefWindowProcA (hwnd, WM_NCCREATE, wParam, lParam);
234}
235
236
237static VOID
238HOTKEY_Draw(HWND hwnd,HDC hdc)
239{
240 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr(hwnd);
241 RECT rect;
242 char text[50];
243 HFONT oldFont;
244
245 GetClientRect(hwnd,&rect);
246 DrawEdge(hdc,&rect,EDGE_SUNKEN,BF_RECT | BF_ADJUST);
247
248 //draw string
249 text[0] = 0;
250 if (infoPtr->bfMods & HOTKEYF_ALT) strcat(text,"ALT");
251 if (infoPtr->bfMods & HOTKEYF_CONTROL)
252 {
253 if (text[0]) strcat(text,"+");
254 strcat(text,"CONTROL");
255 }
256 if (infoPtr->bfMods & HOTKEYF_SHIFT)
257 {
258 if (text[0]) strcat(text,"+");
259 strcat(text,"SHIFT");
260 }
261
262 if (infoPtr->bVKHotKey)
263 {
264 char char2[2];
265
266 if (text[0]) strcat(text,"+");
267 char2[0] = (char)infoPtr->bVKHotKey;
268 char2[1] = 0;
269 strcat(text,char2);
270 }
271 if(infoPtr->hFont) oldFont = SelectObject(hdc,infoPtr->hFont);
272 SetBkMode(hdc,TRANSPARENT);
273 DrawTextA(hdc,text,strlen(text),&rect,DT_LEFT | DT_BOTTOM | DT_SINGLELINE);
274 if (infoPtr->hFont) SelectObject(hdc,oldFont);
275}
276
277
278static LRESULT
279HOTKEY_Paint(HWND hwnd,WPARAM wParam,LPARAM lParam)
280{
281 PAINTSTRUCT ps;
282 HDC hdc;
283
284 if (wParam == 0) hdc = BeginPaint(hwnd,&ps);
285 else hdc = wParam;
286
287 HOTKEY_Draw(hwnd,hdc);
288
289 if (wParam == 0) EndPaint(hwnd,&ps);
290
291 return 0;
292}
293
294
295static VOID
296HOTKEY_UpdateHotKey(HWND hwnd)
297{
298 HDC hdc;
299 RECT rect;
300 HBRUSH hBrush;
301
302 GetClientRect(hwnd,&rect);
303 InflateRect(&rect,2,2);
304 hdc = GetDC(hwnd);
305 hBrush = (HBRUSH)SendMessageA(GetParent(hwnd),WM_CTLCOLOREDIT,hdc,(LPARAM)hwnd);
306 if (!hBrush) hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
307 FillRect(hdc,&rect,hBrush);
308 HOTKEY_Draw(hwnd,hdc);
309 ReleaseDC(hwnd,hdc);
310}
311
312static LRESULT
313HOTKEY_SetFocus (HWND hwnd, WPARAM wParam, LPARAM lParam)
314{
315 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
316
317 infoPtr->bFocus = TRUE;
318
319 CreateCaret (hwnd, (HBITMAP)0, 1, infoPtr->nHeight);
320 SetCaretPos (3,3);
321 ShowCaret (hwnd);
322
323 return 0;
324}
325
326
327static LRESULT
328HOTKEY_SetFont (HWND hwnd, WPARAM wParam, LPARAM lParam)
329{
330 HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd);
331 TEXTMETRICA tm;
332 HDC hdc;
333 HFONT hOldFont = 0;
334
335 infoPtr->hFont = (HFONT)wParam;
336
337 hdc = GetDC (hwnd);
338 if (infoPtr->hFont)
339 hOldFont = SelectObject (hdc, infoPtr->hFont);
340
341 GetTextMetricsA (hdc, &tm);
342 infoPtr->nHeight = tm.tmHeight;
343
344 if (infoPtr->hFont)
345 SelectObject (hdc, hOldFont);
346 ReleaseDC (hwnd, hdc);
347
348 if (LOWORD(lParam)) HOTKEY_UpdateHotKey(hwnd);
349
350 return 0;
351}
352
353
354static LRESULT WINE_UNUSED
355HOTKEY_SysKeyDown (HWND hwnd, WPARAM wParam, LPARAM lParam)
356{
357 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
358
359 switch (wParam) {
360 case VK_RETURN:
361 case VK_TAB:
362 case VK_SPACE:
363 case VK_DELETE:
364 case VK_ESCAPE:
365 case VK_BACK:
366 return DefWindowProcA (hwnd, WM_SYSKEYDOWN, wParam, lParam);
367
368 case VK_SHIFT:
369 case VK_CONTROL:
370 case VK_MENU:
371// FIXME (hotkey, "modifier key pressed!\n");
372 break;
373
374 default:
375// FIXME (hotkey, " %d\n", wParam);
376 break;
377 }
378
379 return TRUE;
380}
381
382
383static LRESULT WINE_UNUSED
384HOTKEY_SysKeyUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
385{
386 /* HOTKEY_INFO *infoPtr = HOTKEY_GetInfoPtr (hwnd); */
387
388// FIXME (hotkey, " %d\n", wParam);
389
390 return 0;
391}
392
393
394
395static LRESULT WINAPI
396HOTKEY_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
397{
398 switch (uMsg)
399 {
400 case HKM_GETHOTKEY:
401 return HOTKEY_GetHotKey(hwnd,wParam,lParam);
402
403 case HKM_SETHOTKEY:
404 return HOTKEY_SetHotKey(hwnd,wParam,lParam);
405
406 case HKM_SETRULES:
407 return HOTKEY_SetRules(hwnd,wParam,lParam);
408
409 case WM_CHAR:
410 return HOTKEY_Char(hwnd,wParam,lParam);
411
412 case WM_CREATE:
413 return HOTKEY_Create (hwnd, wParam, lParam);
414
415 case WM_DESTROY:
416 return HOTKEY_Destroy (hwnd, wParam, lParam);
417
418 case WM_ERASEBKGND:
419 return HOTKEY_EraseBackground (hwnd, wParam, lParam);
420
421 case WM_GETDLGCODE:
422 return DLGC_WANTCHARS | DLGC_WANTARROWS;
423
424 case WM_GETFONT:
425 return HOTKEY_GetFont (hwnd, wParam, lParam);
426
427 case WM_KEYDOWN:
428 return HOTKEY_KeyDown(hwnd,wParam,lParam);
429
430 case WM_SYSKEYDOWN:
431 return HOTKEY_SysKeyDown (hwnd, wParam, lParam);
432
433 case WM_KEYUP:
434 return HOTKEY_KeyUp(hwnd,wParam,lParam);
435
436 case WM_SYSKEYUP:
437 return HOTKEY_SysKeyUp (hwnd, wParam, lParam);
438
439 case WM_KILLFOCUS:
440 return HOTKEY_KillFocus (hwnd, wParam, lParam);
441
442 case WM_LBUTTONDOWN:
443 return HOTKEY_LButtonDown (hwnd, wParam, lParam);
444
445 case WM_NCCREATE:
446 return HOTKEY_NCCreate (hwnd, wParam, lParam);
447
448 case WM_PAINT:
449 return HOTKEY_Paint(hwnd,wParam,lParam);
450
451 case WM_SETFOCUS:
452 return HOTKEY_SetFocus (hwnd, wParam, lParam);
453
454 case WM_SETFONT:
455 return HOTKEY_SetFont (hwnd, wParam, lParam);
456
457 case WM_SYSCHAR:
458 return HOTKEY_SysChar(hwnd,wParam,lParam);
459
460 default:
461// if (uMsg >= WM_USER)
462// ERR (hotkey, "unknown msg %04x wp=%08x lp=%08lx\n",
463// uMsg, wParam, lParam);
464 return DefWindowProcA (hwnd, uMsg, wParam, lParam);
465 }
466 return 0;
467}
468
469
470VOID
471HOTKEY_Register (VOID)
472{
473 WNDCLASSA wndClass;
474
475 if (GlobalFindAtomA (HOTKEY_CLASSA)) return;
476
477 ZeroMemory (&wndClass, sizeof(WNDCLASSA));
478 wndClass.style = CS_GLOBALCLASS;
479 wndClass.lpfnWndProc = (WNDPROC)HOTKEY_WindowProc;
480 wndClass.cbClsExtra = 0;
481 wndClass.cbWndExtra = sizeof(HOTKEY_INFO *);
482 wndClass.hCursor = 0;
483 wndClass.hbrBackground = 0;
484 wndClass.lpszClassName = HOTKEY_CLASSA;
485
486 RegisterClassA (&wndClass);
487}
488
489
490VOID
491HOTKEY_Unregister (VOID)
492{
493 if (GlobalFindAtomA (HOTKEY_CLASSA))
494 UnregisterClassA (HOTKEY_CLASSA, (HINSTANCE)NULL);
495}
496
Note: See TracBrowser for help on using the repository browser.