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