|
|
1.1 root 1: /*----------------------------------
2: FREEMEM.C -- Free Memory Display
3: ----------------------------------*/
4:
5: #define INCL_WIN
6: #define INCL_GPI
7: #define INCL_DOS
8:
9: #include <os2.h>
10: #include <stddef.h>
11:
12: #define ID_TIMER 1
13:
14: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
15: VOID SizeTheWindow (HWND) ;
16:
17: int main (void)
18: {
19: static CHAR szClientClass[] = "FreeMem" ;
20: HAB hab ;
21: HMQ hmq ;
22: HWND hwndClient, hwndFrame ;
23: QMSG qmsg ;
24: ULONG flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU ;
25: ULONG flFrameStyle = FS_BORDER ;
26:
27: hab = WinInitialize (0) ;
28: hmq = WinCreateMsgQueue (hab, 0) ;
29:
30: WinRegisterClass (hab, szClientClass, ClientWndProc, 0L, 0) ;
31:
32: hwndFrame = WinCreateStdWindow (HWND_DESKTOP, flFrameStyle,
33: &flFrameFlags, szClientClass,
34: szClientClass,
35: 0L, NULL, 0, &hwndClient) ;
36:
37: SizeTheWindow (hwndFrame) ;
38: WinShowWindow (hwndFrame, TRUE) ;
39:
40: if (WinStartTimer (hab, hwndClient, ID_TIMER, 1000))
41: {
42: while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
43: WinDispatchMsg (hab, &qmsg) ;
44:
45: WinStopTimer (hab, hwndClient, ID_TIMER) ;
46: }
47: else
48: WinMessageBox (HWND_DESKTOP, hwndClient,
49: "Too many clocks or timers",
50: szClientClass, 0, MB_OK | MB_ICONEXCLAMATION) ;
51:
52: WinDestroyWindow (hwndFrame) ;
53: WinDestroyMsgQueue (hmq) ;
54: WinTerminate (hab) ;
55:
56: return 0 ;
57: }
58:
59: VOID SizeTheWindow (HWND hwndFrame)
60: {
61: FONTMETRICS fm ;
62: HPS hps ;
63: RECTL rcl ;
64:
65: hps = WinGetPS (hwndFrame) ;
66: GpiQueryFontMetrics (hps, (LONG) sizeof fm, &fm) ;
67: WinReleasePS (hps) ;
68:
69: rcl.yBottom = 0 ;
70: rcl.yTop = 3 * fm.lMaxBaselineExt / 2 ;
71: rcl.xLeft = 0 ;
72: rcl.xRight = 14 * fm.lAveCharWidth ;
73:
74: WinCalcFrameRect (hwndFrame, &rcl, FALSE) ;
75:
76: WinSetWindowPos (hwndFrame, NULL, (SHORT) rcl.xLeft, (SHORT) rcl.yBottom,
77: (SHORT) (rcl.xRight - rcl.xLeft),
78: (SHORT) (rcl.yTop - rcl.yBottom), SWP_SIZE | SWP_MOVE) ;
79: }
80:
81: VOID FormatNumber (ULONG ulValue, CHAR *szResult)
82: {
83: BOOL fDisplay = FALSE ;
84: SHORT sDigit ;
85: ULONG ulQuotient, ulDivisor = 1000000000L ;
86:
87: for (sDigit = 0 ; sDigit < 10 ; sDigit++)
88: {
89: ulQuotient = ulValue / ulDivisor ;
90:
91: if (fDisplay || ulQuotient > 0 || sDigit == 9)
92: {
93: fDisplay = TRUE ;
94:
95: *szResult++ = (CHAR) ('0' + ulQuotient) ;
96:
97: if ((sDigit % 3 == 0) && sDigit != 9)
98: *szResult++ = ',' ;
99: }
100: ulValue -= ulQuotient * ulDivisor ;
101: ulDivisor /= 10 ;
102: }
103: *szResult = '\0' ;
104: }
105:
106: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
107: {
108: static RECTL rcl ;
109: static ULONG ulFreeMem, ulPrevMem ;
110: CHAR szBuffer [16] ;
111: HPS hps;
112:
113: switch (msg)
114: {
115: case WM_SIZE:
116: WinQueryWindowRect (hwnd, &rcl) ;
117: return 0 ;
118:
119: case WM_TIMER:
120: DosMemAvail (&ulFreeMem) ;
121:
122: if (ulFreeMem != ulPrevMem)
123: {
124: WinInvalidateRect (hwnd, NULL, FALSE) ;
125: ulPrevMem = ulFreeMem ;
126: }
127: return 0 ;
128:
129: case WM_PAINT:
130: hps = WinBeginPaint (hwnd, NULL, NULL) ;
131:
132: FormatNumber (ulFreeMem, szBuffer) ;
133:
134: WinDrawText (hps, -1, szBuffer, &rcl,
135: CLR_NEUTRAL, CLR_BACKGROUND,
136: DT_CENTER | DT_VCENTER | DT_ERASERECT) ;
137:
138: WinEndPaint (hps) ;
139: return 0 ;
140: }
141: return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.