|
|
1.1 root 1: /*----------------------------------------
2: KEYLOOK.C -- Displays WM_CHAR Messages
3: ----------------------------------------*/
4:
5: #define INCL_WIN
6: #define INCL_GPI
7: #include <os2.h>
8: #include <stdio.h>
9: #include "easyfont.h"
10:
11: #define LCID_FIXEDFONT 1L
12: #define MAX_KEYS 100
13:
14: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
15:
16: CHAR szClientClass [] = "KeyLook" ;
17: HAB hab ;
18:
19: int main (void)
20: {
21: static ULONG flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
22: FCF_SIZEBORDER | FCF_MINMAX |
23: FCF_SHELLPOSITION | FCF_TASKLIST ;
24: HMQ hmq ;
25: HWND hwndFrame, hwndClient ;
26: QMSG qmsg ;
27:
28: hab = WinInitialize (0) ;
29: hmq = WinCreateMsgQueue (hab, 0) ;
30:
31: WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ;
32:
33: hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
34: &flFrameFlags, szClientClass, NULL,
35: 0L, NULL, 0, &hwndClient) ;
36: if (hwndFrame != NULL)
37: {
38: WinSendMsg (hwndFrame, WM_SETICON,
39: WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE),
40: NULL) ;
41:
42: while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
43: WinDispatchMsg (hab, &qmsg) ;
44:
45: WinDestroyWindow (hwndFrame) ;
46: }
47: WinDestroyMsgQueue (hmq) ;
48: WinTerminate (hab) ;
49: return 0 ;
50: }
51:
52: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
53: {
54: static CHAR szHeader [] = "Scan Rept IN TG IC CM DK LK PD KU"
55: " AL CT SH SC VK CH Virt Char" ;
56: static CHAR szUndrLn [] = "---- ---- -- -- -- -- -- -- -- --"
57: " -- -- -- -- -- -- ---- ----" ;
58: static CHAR szFormat [] = "%4X %4dx %2d %2d %2d %2d %2d %2d %2d %2d"
59: " %2d %2d %2d %2d %2d %2d %4X %4X %c" ;
60:
61: static SHORT cxChar, cyChar, cyDesc, cxClient, cyClient, sNextKey ;
62: static struct {
63: MPARAM mp1 ;
64: MPARAM mp2 ;
65: BOOL fValid ;
66: }
67: key [MAX_KEYS] ;
68: CHAR szBuffer [80] ;
69: FONTMETRICS fm ;
70: HPS hps ;
71: POINTL ptl ;
72: RECTL rcl, rclInvalid ;
73: SHORT sKey, sIndex, sFlag ;
74:
75: switch (msg)
76: {
77: case WM_CREATE:
78: hps = WinGetPS (hwnd) ;
79: EzfQueryFonts (hps) ;
80:
81: if (!EzfCreateLogFont (hps, LCID_FIXEDFONT, FONTFACE_COUR,
82: FONTSIZE_10, 0))
83: {
84: WinReleasePS (hps) ;
85:
86: WinMessageBox (HWND_DESKTOP, HWND_DESKTOP,
87: "Cannot find a fixed-pitch font. Load the Courier "
88: "fonts from the Control Panel and try again.",
89: szClientClass, 0, MB_OK | MB_ICONEXCLAMATION) ;
90:
91: return 1 ;
92: }
93:
94: GpiSetCharSet (hps, LCID_FIXEDFONT) ;
95:
96: GpiQueryFontMetrics (hps, (LONG) sizeof fm, &fm) ;
97: cxChar = (SHORT) fm.lAveCharWidth ;
98: cyChar = (SHORT) fm.lMaxBaselineExt ;
99: cyDesc = (SHORT) fm.lMaxDescender ;
100:
101: GpiSetCharSet (hps, LCID_DEFAULT) ;
102: GpiDeleteSetId (hps, LCID_FIXEDFONT) ;
103: WinReleasePS (hps) ;
104: return 0 ;
105:
106: case WM_SIZE:
107: cxClient = SHORT1FROMMP (mp2) ;
108: cyClient = SHORT2FROMMP (mp2) ;
109: return 0 ;
110:
111: case WM_CHAR:
112: key [sNextKey].mp1 = mp1 ;
113: key [sNextKey].mp2 = mp2 ;
114: key [sNextKey].fValid = TRUE ;
115:
116: sNextKey = (sNextKey + 1) % MAX_KEYS ;
117:
118: WinSetRect (hwnd, &rcl,
119: 0, 2 * cyChar, cxClient, cyClient - 2 * cyChar) ;
120:
121: WinScrollWindow (hwnd, 0, cyChar, &rcl, &rcl, NULL, NULL,
122: SW_INVALIDATERGN) ;
123: WinUpdateWindow (hwnd) ;
124: return 0 ;
125:
126: case WM_PAINT:
127: hps = WinBeginPaint (hwnd, NULL, &rclInvalid) ;
128: GpiErase (hps) ;
129: EzfCreateLogFont (hps, LCID_FIXEDFONT, FONTFACE_COUR,
130: FONTSIZE_10, 0) ;
131: GpiSetCharSet (hps, LCID_FIXEDFONT) ;
132:
133: ptl.x = cxChar ;
134: ptl.y = cyDesc ;
135: GpiCharStringAt (hps, &ptl, sizeof szHeader - 1L, szHeader) ;
136:
137: ptl.y += cyChar ;
138: GpiCharStringAt (hps, &ptl, sizeof szUndrLn - 1L, szUndrLn) ;
139:
140: for (sKey = 0 ; sKey < MAX_KEYS ; sKey++)
141: {
142: ptl.y += cyChar ;
143:
144: sIndex = (sNextKey - sKey - 1 + MAX_KEYS) % MAX_KEYS ;
145:
146: if (ptl.y > rclInvalid.yTop ||
147: ptl.y > cyClient - 2 * cyChar ||
148: !key [sIndex].fValid)
149: break ;
150:
151: mp1 = key [sIndex].mp1 ;
152: mp2 = key [sIndex].mp2 ;
153:
154: sFlag = CHARMSG(&msg)->fs ;
155:
156: GpiCharStringAt (hps, &ptl,
157: (LONG) sprintf (szBuffer, szFormat,
158: CHARMSG(&msg)->scancode,
159: CHARMSG(&msg)->cRepeat,
160: sFlag & KC_INVALIDCHAR ? 1 : 0,
161: sFlag & KC_TOGGLE ? 1 : 0,
162: sFlag & KC_INVALIDCOMP ? 1 : 0,
163: sFlag & KC_COMPOSITE ? 1 : 0,
164: sFlag & KC_DEADKEY ? 1 : 0,
165: sFlag & KC_LONEKEY ? 1 : 0,
166: sFlag & KC_PREVDOWN ? 1 : 0,
167: sFlag & KC_KEYUP ? 1 : 0,
168: sFlag & KC_ALT ? 1 : 0,
169: sFlag & KC_CTRL ? 1 : 0,
170: sFlag & KC_SHIFT ? 1 : 0,
171: sFlag & KC_SCANCODE ? 1 : 0,
172: sFlag & KC_VIRTUALKEY ? 1 : 0,
173: sFlag & KC_CHAR ? 1 : 0,
174: CHARMSG(&msg)->vkey,
175: CHARMSG(&msg)->chr,
176: sFlag & KC_CHAR ? CHARMSG(&msg)->chr : ' '),
177: szBuffer) ;
178: }
179: ptl.y = cyClient - cyChar + cyDesc ;
180: GpiCharStringAt (hps, &ptl, sizeof szHeader - 1L, szHeader) ;
181:
182: ptl.y -= cyChar ;
183: GpiCharStringAt (hps, &ptl, sizeof szUndrLn - 1L, szUndrLn) ;
184:
185: GpiSetCharSet (hps, LCID_DEFAULT) ;
186: GpiDeleteSetId (hps, LCID_FIXEDFONT) ;
187: WinEndPaint (hps) ;
188: return 0 ;
189: }
190: return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
191: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.