|
|
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.