Annotation of pmsdk/samples/comtalk/avio.c, revision 1.1.1.1

1.1       root        1: /*
                      2:        avio.c -- AVIO handling routines
                      3:        For a cleaner implementation, look at the BROWSE application.
                      4: 
                      5:        Implements scrollbars, sets up an AVIO Presentation Space
                      6:        Intrinsically linked with a circular queue routine
                      7: 
                      8:        Created by Microsoft Corporation, 1989
                      9: */
                     10: 
                     11: #define  INCL_AVIO
                     12: #define         INCL_DEV
                     13: #define  INCL_VIO
                     14: #define         INCL_WIN
                     15: #include <os2.h>
                     16: #include "global.h"
                     17: #include "circleq.h"   /* Get Circular Buffer routines */
                     18: #include "avio.h"      /* Prototype our routines */
                     19: #include <stdio.h>     /* Needed to open LOG file */
                     20: /*
                     21:     Constants
                     22: */
                     23: #define AVIO_PS_ROWS   25      /* Dimensions of the AVIO PS */
                     24: #define AVIO_PS_COLUMNS        MAXLINELEN
                     25: #define        CATTRBYTES      1       /* 1 or 3 attribute bytes/cell */
                     26: #define        DEFPAGEWIDTH    5       /* Default pagesizes */
                     27: #define        DEFPAGEHEIGHT   5
                     28: 
                     29: char   Blank[2] = { 0x20, 0x07 };
                     30: 
                     31: /*
                     32:     Macros to make the code more readable
                     33: */
                     34: /* Upper and Lower Bound Calculations */
                     35: #define        Abs(a)          (((a) > 0) ? (a) : (-(a)))
                     36: #define LowerBound(pos, disp, lbound) Max(pos - disp, lbound)
                     37: #define UpperBound(pos, disp, ubound) Min(pos + disp, ubound)
                     38: 
                     39: /* Scroll Bar Abbreviations */
                     40: 
                     41: #define        DisableSB(hSB)  WinSetParent(hSB,  HWND_OBJECT, FALSE)
                     42: #define        EnableSB(hSB)   WinSetParent(hSB, hWndSBParent, FALSE)
                     43: #define        HBarHeight()    (fNeedHorz ? lHSBHeight : 0L)
                     44: #define        VBarWidth()     (fNeedVert ? lVSBWidth  : 0L)
                     45: #define SetScroll(h, pos, max) \
                     46:     WinSendMsg(h, SBM_SETSCROLLBAR, MPFROM2SHORT(pos, 0), MPFROM2SHORT(0, max))
                     47: #define        UpdateFrame(sb) \
                     48:     WinSendMsg(hWndSBParent, WM_UPDATEFRAME, MPFROMLONG(sb), 0L)
                     49: #define        UpdateOff(w)    WinEnableWindowUpdate(w, FALSE)
                     50: #define        UpdateOn(w)     WinEnableWindowUpdate(w, TRUE)
                     51: 
                     52: /* Scrolling Macros */
                     53: #define        ClearScreen()   ScrollUp(-1)
                     54: #define ScrollDown(n)  VioScrollDn(0, 0, -1, -1, n, Blank, hVPS)
                     55: #define        ScrollUp(n)     VioScrollUp(0, 0, -1, -1, n, Blank, hVPS)
                     56: #define        SetCursor(x, y) VioSetCurPos((USHORT) x, (USHORT) y, hVPS)
                     57: 
                     58: /* Miscellaneous */
                     59: /*
                     60:     If partial ANSI emulation is desired, use:
                     61:        VioSetCurPos((USHORT) x, (USHORT) y, hVPS); \
                     62:        VioWrtTTY(l->szText, l->cch, hVPS)
                     63: */
                     64: #define Blast(l, x, y) VioWrtCharStr(l->szText, l->cch, x, y, hVPS)
                     65: /*
                     66:     Calculate the number of characters in a page
                     67:     For nicer behavior, you can do rounding here
                     68: */
                     69: #define CalcChars(pPg, pCh, default) \
                     70:        ((pCh) ? (Max((int) ((pPg) / ((SHORT) pCh)), 0)) : (default))
                     71: #define        Value(value)    WinQuerySysValue(HWND_DESKTOP, value)
                     72: /*
                     73:     File-Local Variables
                     74: */
                     75: HDC    hDC;            /* Device Context */
                     76: HVPS   hVPS;           /* Virtual PS */
                     77: int    iTopLine;       /* PS Line of window corner */
                     78: int    iCurCol;        /* Current column of window corner */
                     79: int    cchPgWidth;     /* Width and height of our window */
                     80: int    cchPgHeight;
                     81: int    cchMaxHorz;     /* Scroll bar upper bounds */
                     82: int    cchMaxVert;     
                     83: BOOL   fNeedHorz;      /* Do we need the scroll bars or not? */
                     84: BOOL   fNeedVert;
                     85: HWND   hWndHScroll;    /* Window handles of ScrollBar windows */
                     86: HWND   hWndVScroll;
                     87: HWND   hWndSBParent;   /* Could mooch off the value in main(), but won't */
                     88: /*
                     89:     Measurements used to help make the window look nice
                     90: */
                     91: LONG   lChWidth,   lChHeight;                  /* Character size */
                     92: LONG   lHSBHeight, lVSBWidth;                  /* Scrollbar measurements */
                     93: LONG   lMiscWidth, lMiscHeight;                /* Border, titlebar, ... */
                     94: int    iMaxWidth,  iMaxHeight;                 /* Client area bounds  */
                     95: int    iMaxFrameWidth, iMaxFrameHeight;        /* Frame window bounds */
                     96: BOOL   fCreated;                               /* AVIO PS created */
                     97: int    rc;                                     /* Return code */
                     98: VIOCURSORINFO vci;
                     99: /*
                    100:    Local prototypes
                    101: */
                    102: void GetMeasurements(void);
                    103: void Update(USHORT, USHORT, USHORT, BOOL);
                    104: void Refresh(BOOL);
                    105: void WantCursor(BOOL);
                    106: void SetScrollPos(void);
                    107: void SetScrollPosHorz(void);
                    108: void SetScrollPosVert(void);
                    109: /*
                    110:     The actual routines
                    111: */
                    112: void GetMeasurements(void) {
                    113: /*
                    114:     Get display parameters
                    115: */
                    116:     /*
                    117:        Scroll bar widths and heights
                    118:     */
                    119:     lHSBHeight = Value(SV_CYHSCROLL);
                    120:     lVSBWidth  = Value(SV_CXVSCROLL);
                    121:     /*
                    122:        Non-PS widths and heights
                    123:     */ 
                    124:     lMiscHeight        = (Value(SV_CYSIZEBORDER) << 1) /* A border on each side */
                    125:                + Value(SV_CYTITLEBAR)          /* The title bar...      */
                    126:                + Value(SV_CYMENU)              /* ...and the menu bar   */
                    127:                + Value(SV_CYBYTEALIGN);        /* ...and alignment      */
                    128:                
                    129:     lMiscWidth = (Value(SV_CXSIZEBORDER) << 1);/* A border on each side */
                    130:     /*
                    131:        Height and width of characters
                    132:     */
                    133:     rc = DevQueryCaps(hDC, CAPS_CHAR_HEIGHT, 1L, &lChHeight);
                    134:     rc = DevQueryCaps(hDC, CAPS_CHAR_WIDTH,  1L, &lChWidth);
                    135:     /*
                    136:        Compute size of client and frame windows
                    137:     */
                    138:     iMaxWidth          = (AVIO_PS_COLUMNS      * (int) lChWidth);
                    139:     iMaxHeight         = (AVIO_PS_ROWS         * (int) lChHeight);
                    140:     iMaxFrameWidth     = (iMaxWidth            + (int) lMiscWidth);
                    141:     iMaxFrameHeight    = (iMaxHeight           + (int) lMiscHeight);
                    142:     /*
                    143:        Compute cursor attributes
                    144:     */
                    145:     vci.yStart = (USHORT) 0;
                    146:     vci.cEnd   = (USHORT) lChHeight - 1;
                    147:     vci.cx     = 0;
                    148: }
                    149: 
                    150: void AvioInit(HWND hWndFrame, HWND hWndClient) {
                    151: /*
                    152:     Initialize Presentation Space, Device Context, Scroll Bars
                    153: */
                    154:     /*
                    155:        Create the AVIO Presentation Space
                    156:     */
                    157:     hDC = WinOpenWindowDC(hWndClient);
                    158:     VioCreatePS(&hVPS, AVIO_PS_ROWS, AVIO_PS_COLUMNS, 0, CATTRBYTES, 0);
                    159:     VioAssociate(hDC, hVPS);
                    160:     fCreated = TRUE;
                    161:     /*
                    162:        Turn on the cursor and home it
                    163:     */
                    164:     WantCursor(TRUE);
                    165:     SetCursor(0, 0);
                    166:     /*
                    167:        Snag scroll bar info
                    168:     */
                    169:     hWndHScroll  = WinWindowFromID(hWndFrame,  FID_HORZSCROLL);
                    170:     hWndVScroll  = WinWindowFromID(hWndFrame,  FID_VERTSCROLL);
                    171:     hWndSBParent = WinQueryWindow(hWndHScroll, QW_PARENT, FALSE);
                    172:     fNeedHorz   = fNeedVert  = TRUE;
                    173:     /*
                    174:        Get character height in pixels, etc...
                    175:     */
                    176:     GetMeasurements();
                    177: }
                    178: 
                    179: void AvioStartup(HWND hWndClient) {
                    180:     SWP swp;
                    181:     /*
                    182:        Initialize the queue
                    183:     */
                    184:     QueInit();
                    185:     /*
                    186:        Initialize the screen
                    187:     */
                    188:     ClearScreen();
                    189:     WinQueryWindowPos(hWndClient, &swp);
                    190:     AvioSize(hWndClient, WM_NULL, NULL, MPFROM2SHORT(swp.cx, swp.cy));
                    191: }
                    192: 
                    193: void AvioScroll(USHORT SB_Command, USHORT usPosition, BOOL fHorizontal) {
                    194: /*
                    195:     Process the scroll bar messages
                    196: 
                    197:     These routines are symmetric; in fact, SB_LINELEFT = SB_LINEUP, etc...
                    198:     so one might note that this could be condensed.  It's left expanded for
                    199:     speed and clarity.  I bound the values each way so that we stay inside
                    200:     the AVIO presentation space.
                    201: */
                    202:     if (fHorizontal) {  /* Horizontal Scroll Bar */
                    203:        switch (SB_Command) {
                    204:            case SB_LINELEFT:
                    205:                iCurCol = LowerBound(iCurCol, 1, 0); break;
                    206:            case SB_LINERIGHT:
                    207:                iCurCol = UpperBound(iCurCol, 1, cchMaxHorz); break;
                    208:            case SB_PAGELEFT:
                    209:                iCurCol = LowerBound(iCurCol, cchPgWidth, 0); break;
                    210:            case SB_PAGERIGHT:
                    211:                iCurCol = UpperBound(iCurCol, cchPgWidth, cchMaxHorz); break;
                    212:            case SB_SLIDERTRACK:
                    213:                iCurCol = (SHORT) usPosition;
                    214:            default: break;
                    215:        }
                    216:        if (SB_Command != SB_SLIDERTRACK)
                    217:            SetScroll(hWndHScroll, iCurCol, cchMaxHorz);
                    218: 
                    219:     } else { /* Vertical Scroll Bar */
                    220:        switch (SB_Command) {
                    221:            case SB_LINEUP:
                    222:                iTopLine = LowerBound(iTopLine, 1, 0); break;
                    223:            case SB_LINEDOWN:
                    224:                iTopLine = UpperBound(iTopLine, 1, cchMaxVert); break;
                    225:            case SB_PAGEUP:
                    226:                iTopLine = LowerBound(iTopLine, cchPgHeight, 0); break;
                    227:            case SB_PAGEDOWN:
                    228:                iTopLine = UpperBound(iTopLine, cchPgHeight, cchMaxVert); break;
                    229:            case SB_SLIDERTRACK:
                    230:                iTopLine = (SHORT) usPosition;
                    231:            default: break;
                    232:        }
                    233:        if (SB_Command != SB_SLIDERTRACK)
                    234:            SetScroll(hWndVScroll, iTopLine, cchMaxVert);
                    235:     }
                    236:     Refresh(FALSE);
                    237: }
                    238: 
                    239: MRESULT AvioSize(HWND hWnd, USHORT msg, MPARAM mp1, MPARAM mp2) {
                    240: /*
                    241:     Do the default AVIO sizing, and kyfe a few values
                    242: */
                    243:     if (!fCreated) return 0L;
                    244:     /*
                    245:        Compute height and width of page in characters
                    246: 
                    247:        The scrollbars have already been subtracted out,
                    248:        since we are called by the client area.
                    249:     */
                    250:     cchPgHeight = CalcChars(SHORT2FROMMP(mp2), lChHeight, DEFPAGEHEIGHT); 
                    251:     cchPgWidth  = CalcChars(SHORT1FROMMP(mp2), lChWidth,  DEFPAGEWIDTH);
                    252:     /*
                    253:        Adjust scrollbar maximums
                    254:     */
                    255:     cchMaxVert = Max(AVIO_PS_ROWS    - cchPgHeight, 0);
                    256:     cchMaxHorz = Max(AVIO_PS_COLUMNS -  cchPgWidth, 0);
                    257:     /*
                    258:        Maintain scrollbar integrity
                    259:     */
                    260:     fNeedHorz = (cchMaxHorz > 0);
                    261:     fNeedVert = (cchMaxVert > 0);
                    262:     SetScroll(hWndHScroll, iCurCol  = Min(iCurCol, cchMaxHorz), cchMaxHorz);
                    263:     SetScroll(hWndVScroll, iTopLine = Min(iTopLine,cchMaxVert), cchMaxVert);
                    264:     /*
                    265:        Do the Scroll Bar shifting
                    266:     */
                    267:     Refresh(FALSE);
                    268:     /*
                    269:        Now, do the normal AVIO processing
                    270:     */
                    271:     return WinDefAVioWindowProc(hWnd, msg, mp1, mp2);
                    272: }
                    273: 
                    274: void Update
                    275:     (USHORT usLineNum, USHORT usHowMany, USHORT usStartLine, BOOL fForced) {
                    276: /*
                    277:     Updates usHowMany lines starting from usStartLine on screen.
                    278:     Starts at saved line usLineNum.  If fForced is set, all lines
                    279:     in range are displayed; otherwise it's lazy.
                    280: */
                    281:     USHORT     i;                              /* Loop index */
                    282:     USHORT     usWhichLine = usLineNum;        /* Line to be queried */
                    283:     Line       l;                              /* Line to be output */
                    284: 
                    285:     for (i = usStartLine; i < (usStartLine + usHowMany); i++) {
                    286:        l = QueQuery(usWhichLine++);            /* Get the line */
                    287:        if (!l->fDrawn || fForced) {
                    288:            if (l->cch) Blast(l, i, 0);         /* Print it out */
                    289:            if (!l->fComplete) SetCursor(i, l->cch);
                    290:            l->fDrawn = TRUE;
                    291:        }
                    292:     }
                    293: }
                    294: 
                    295: void Refresh(BOOL fRedraw) {
                    296: /*
                    297:     fRedraw forces full redraw if set 
                    298: */
                    299:     SHORT  sDelta;
                    300:     int static iOldTopLine = -AVIO_PS_ROWS;
                    301: 
                    302:     VioSetOrg(0, iCurCol, hVPS); /* Get the free AVIO horizontal shift */
                    303:     sDelta = iTopLine - iOldTopLine; /* Compute vertical shift */
                    304:     if ((Abs(sDelta) < AVIO_PS_ROWS) && !fRedraw) {
                    305:        if (sDelta < 0) {       /* Scroll Up -- make sDelta positive*/
                    306:            ScrollDown(-sDelta);
                    307:            Update(iTopLine, -sDelta, 0, TRUE);
                    308:        } else {                /* Scroll Down by sDelta */
                    309:            ScrollUp(sDelta);
                    310:            Update(iTopLine + cchPgHeight - sDelta, sDelta,
                    311:                                cchPgHeight - sDelta, TRUE);
                    312:        }
                    313:     } else AvioRedraw();       /* Redo the entire screen */
                    314:     iOldTopLine = iTopLine;
                    315: }
                    316: 
                    317: void AvioClose (void) {
                    318: /*
                    319:     Termination routines
                    320: */
                    321:     /*
                    322:        Destroy the Presentation Space
                    323:     */
                    324:     VioAssociate(NULL, hVPS);
                    325:     VioDestroyPS(hVPS);
                    326:     fCreated = FALSE;
                    327: }
                    328: 
                    329: void AvioPaint(HWND hWnd) {
                    330:     static HPS   hPS;
                    331:     static RECTL rcl;
                    332: 
                    333:     hPS = WinBeginPaint(hWnd, NULL, &rcl);
                    334:     VioShowPS(AVIO_PS_ROWS, AVIO_PS_COLUMNS, 0, hVPS);
                    335:     WinEndPaint(hPS);
                    336: } 
                    337: 
                    338: MRESULT AvioMinMax(PSWP pSWP) {
                    339: /*
                    340:     Control Maximizing
                    341: */
                    342:     if (pSWP->fs & (SWP_MAXIMIZE | SWP_RESTORE)) {
                    343:        if (pSWP->fs & SWP_MAXIMIZE) {
                    344:            /*
                    345:                Save cx, cy values for later origin displacement
                    346:            */
                    347:            int iOldcx = pSWP->cx;
                    348:            int iOldcy = pSWP->cy;
                    349:            /*
                    350:                Displace, and change to maximum size
                    351:            */
                    352:            pSWP->x += (iOldcx - (pSWP->cx = iMaxFrameWidth));
                    353:            pSWP->y += (iOldcy - (pSWP->cy = iMaxFrameHeight));
                    354:        }
                    355:        /*
                    356:            Now, fix the scroll bars
                    357:        */
                    358:        AvioAdjustFrame(pSWP);
                    359:        return TRUE;
                    360:     }
                    361:     return FALSE;
                    362: }
                    363: 
                    364: void AvioClear(void) { ClearScreen(); }
                    365: 
                    366: void AvioAdjustFrame(PSWP pSWP) {
                    367: /*
                    368:     Trap WM_ADJUSTWINDOWPOS messages to the frame with this routine.
                    369:     Keep the window sized right, and control scrollbar visibility.
                    370: */
                    371:     BOOL fNeededHorz = fNeedHorz;
                    372:     BOOL fNeededVert = fNeedVert;
                    373: /*
                    374:     Do scrollbar enable/disable calculations (but don't update the screen)
                    375: */
                    376:     if (pSWP->fs & SWP_MINIMIZE) fNeedHorz = fNeedVert = FALSE;
                    377:     if ((pSWP->cx * pSWP->cy) == 0) return;
                    378:     /*
                    379:        Do we need them?
                    380:     */
                    381:     fNeedVert = (pSWP->cy < (SHORT) (iMaxFrameHeight));
                    382:     fNeedHorz = (pSWP->cx < (SHORT) (iMaxFrameWidth  + VBarWidth()));
                    383:     fNeedVert = (pSWP->cy < (SHORT) (iMaxFrameHeight + HBarHeight()));
                    384: /*
                    385:     Do width calculations to make sure we're staying small enough.
                    386:     The Tracking Rectangle shouldn't allow us to get too big.
                    387: */
                    388:     /*
                    389:        Check if we're stretching too far
                    390:     */
                    391:     pSWP->cx = Min(pSWP->cx, iMaxFrameWidth  + (int) VBarWidth());
                    392:     pSWP->cy = Min(pSWP->cy, iMaxFrameHeight + (int) HBarHeight());
                    393:     /*
                    394:        ...if so, fix, then add them!
                    395:     */
                    396:     AvioSize(NULL, WM_NULL, NULL, MPFROM2SHORT(
                    397:        pSWP->cx - (int) (lMiscWidth + VBarWidth()),
                    398:        pSWP->cy - (int) (lMiscHeight + HBarHeight()) ));
                    399: 
                    400:     if (fNeedHorz) {
                    401:        if (!fNeededHorz) {
                    402:            EnableSB(hWndHScroll);
                    403:            UpdateOff(hWndHScroll);
                    404:            UpdateFrame(FCF_HORZSCROLL);
                    405:            UpdateOn(hWndHScroll);
                    406:        }
                    407:     } else {
                    408:        if (fNeededHorz) {
                    409:            DisableSB(hWndHScroll);
                    410:            UpdateOff(hWndHScroll);
                    411:            UpdateFrame(FCF_HORZSCROLL);
                    412:            UpdateOn(hWndHScroll);
                    413:        }
                    414:     }
                    415:     if (fNeedVert) {
                    416:        if (!fNeededVert) {
                    417:             EnableSB(hWndVScroll);
                    418:             UpdateOff(hWndVScroll);
                    419:             UpdateFrame(FCF_VERTSCROLL);
                    420:             UpdateOn(hWndVScroll);
                    421:        }
                    422:     } else {
                    423:        if (fNeededVert) {
                    424:             DisableSB(hWndVScroll);
                    425:             UpdateOff(hWndVScroll);
                    426:             UpdateFrame(FCF_VERTSCROLL);
                    427:             UpdateOn(hWndVScroll);
                    428:        }
                    429:     }
                    430: }
                    431: 
                    432: void AvioTrackFrame(HWND hWnd, MPARAM mpTrackFlags) {
                    433: /*
                    434:     Takes action on WM_TRACKFRAME message
                    435: */
                    436:     static TRACKINFO tiTrackInfo;
                    437:     /*
                    438:        Get the tracking information in the TrackInfo structure
                    439:     */
                    440:     WinSendMsg(hWnd, WM_QUERYTRACKINFO, mpTrackFlags, &tiTrackInfo);
                    441:     WinTrackRect(hWnd, NULL, &tiTrackInfo);
                    442: }
                    443: 
                    444: void AvioQueryTrackInfo(PTRACKINFO pTI) {
                    445: /*
                    446:     Forces the frame to be byte aligned and bounded
                    447: */
                    448:     BOOL fMove;
                    449:     /*
                    450:        Get the grid set up for byte alignment
                    451: 
                    452:        Set cxGrid to half a character width, because sizing
                    453:        from the keyboard tries to move by half characters.
                    454:        Also, make sure we can move the window freely.
                    455:     */
                    456:     fMove = ((pTI->fs & TF_MOVE) == TF_MOVE);
                    457:     pTI->fs     |= TF_GRID;
                    458:     pTI->cxGrid  = (fMove) ? 1 : ((SHORT) (lChWidth << 1));
                    459:     pTI->cyGrid  = (fMove) ? 1 : ((SHORT) lChHeight);
                    460:     /*
                    461:        Bound the frame now
                    462:     */
                    463:     pTI->ptlMinTrackSize.x = (pTI->cxBorder << 1) + lMiscWidth;
                    464:     pTI->ptlMinTrackSize.y = (pTI->cyBorder << 1) + lMiscHeight;
                    465:     pTI->ptlMaxTrackSize.x = iMaxFrameWidth  + lVSBWidth +  (pTI->cxBorder <<1);
                    466:     pTI->ptlMaxTrackSize.y = iMaxFrameHeight + lHSBHeight + (pTI->cyBorder <<1);
                    467: }
                    468: 
                    469: BOOL AvioUpdateLines(BOOL fPage, BOOL *fPaging) {
                    470: /*
                    471:     Update the display
                    472: */
                    473:     int        cLines;
                    474: 
                    475:     cLines = QueUpdateHead(AVIO_PS_ROWS, fPage, *fPaging);
                    476:     if (cLines == AVIO_PS_ROWS) *fPaging = TRUE;
                    477:     if (cLines > 0) {
                    478:        ScrollUp(cLines);
                    479:         Update(iTopLine + AVIO_PS_ROWS - cLines, cLines,
                    480:                        AVIO_PS_ROWS - cLines, TRUE);
                    481:     }
                    482:     Update(iTopLine, cchPgHeight, 0, FALSE);
                    483:     return TRUE;
                    484: }
                    485: 
                    486: void AvioRedraw(void) {
                    487: /*
                    488:     Clear, then redraw the entire Presentation Space
                    489: */
                    490:     ClearScreen();
                    491:     Update(iTopLine, cchPgHeight, 0, TRUE);
                    492: }
                    493: 
                    494: void WantCursor(BOOL fYes) {
                    495: /*
                    496:     Do the underscore cursor
                    497: */
                    498:     vci.attr   = (USHORT) (fYes ? 0 : -1);
                    499:     vci.yStart = 0;
                    500:     vci.cEnd   = (USHORT) lChHeight - 1;
                    501:     vci.cx     = 0;
                    502:     VioSetCurType(&vci, hVPS);
                    503: }
                    504: 
                    505: void AvioPageUp(void) {
                    506: /*
                    507:     Execute the Page Up instruction
                    508: */
                    509:     int cLines;
                    510: 
                    511:     cLines = QuePageUp(AVIO_PS_ROWS);
                    512:     ScrollDown(cLines);
                    513:     Update(iTopLine, cLines, 0, TRUE);
                    514: }
                    515: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.