Annotation of pmsdk/samples/wmchar/wmchar.c, revision 1.1.1.1

1.1       root        1: /***************************************************************************\
                      2: * wmchar.c -- Displays WM_CHAR messages
                      3: *
                      4: * Created by Microsoft Corporation, 1989
                      5: \***************************************************************************/
                      6: 
                      7: 
                      8: #define INCL_WIN
                      9: #define INCL_GPILCIDS
                     10: #include <os2.h>
                     11: #include <string.h>
                     12: #include <stdio.h>
                     13: #include "wmchar.h"
                     14: 
                     15: 
                     16: #define max2(a, b)  ((a) > (b) ? (a) : (b))
                     17: #define min2(a, b)  ((a) < (b) ? (a) : (b))
                     18: 
                     19: 
                     20: /* display dependent values */
                     21: SHORT gcyChar;
                     22: SHORT gcxAveChar;
                     23: SHORT gcxMaxChar;
                     24: SHORT gcxMargin;
                     25: 
                     26: /* program globals */
                     27: USHORT gcMessages = 0;      /* also the "number" of the most recent message */
                     28: CHAR gszNull[] = "  --";    /* denotes an empty field */
                     29: BOOL gfKeyUps = FALSE;
                     30: 
                     31: 
                     32: /* char messages are stored in a circular buffer */
                     33: typedef struct _CHMSG {     /* cm */
                     34:     USHORT usKC;
                     35:     UCHAR uchRep;
                     36:     UCHAR uchScan;
                     37:     USHORT ch;
                     38:     USHORT usVK;
                     39: } CHMSG;
                     40: 
                     41: #define CBUFFERELTS 20
                     42: 
                     43: CHMSG gacm[CBUFFERELTS];
                     44: SHORT gicmStart = 0;
                     45: 
                     46: 
                     47: /* display field attributes are stored in an array */
                     48: typedef struct _MSGFIELD {  /* mf */
                     49:     BOOL fDisplay;          /* TRUE if field is currently being displayed */
                     50:     SHORT cxWidth;          /* field width, initially chars, then pixels */
                     51:     CHAR *szHeading;        /* field heading */
                     52: } MSGFIELD;
                     53: 
                     54: #define INUMBER         0
                     55: #define IVIRTUALKEY     1
                     56: #define ICHAR           2
                     57: #define ISCANCODE       3
                     58: #define IREPEAT         4
                     59: #define IFLAGS          5
                     60: 
                     61: MSGFIELD gamf[CDISPLAYFIELDS] = {
                     62:     TRUE,   7, " #",
                     63:     TRUE,  15, "VK_ Value",
                     64:     TRUE,  14, "Char",
                     65:     FALSE, 10, "Scan",
                     66:     FALSE, 8,  "Rep",
                     67:     TRUE,  0,  "KC_ Flags"      /* variable width, so it's last */
                     68: };
                     69: 
                     70: SHORT gcxMargin = 3;
                     71: 
                     72: 
                     73: /* char flag strings */
                     74: CHAR *gachFlags[] = {
                     75:     "char",
                     76:     "virtualkey",
                     77:     "scancode",
                     78:     "shift",
                     79:     "ctrl",
                     80:     "alt",
                     81:     "keyup",
                     82:     "prevdown",
                     83:     "lonekey",
                     84:     "deadkey",
                     85:     "composite",
                     86:     "invalidcomp",
                     87:     "toggle",
                     88:     "invalidchar",
                     89:     "dbcsrsrvd1",
                     90:     "dbcsrsrvd2"
                     91: };
                     92: 
                     93: /* virtual key strings */
                     94: CHAR *gachVK[] = {
                     95:     gszNull,
                     96:     "button1",
                     97:     "button2",
                     98:     "button3",
                     99:     "break",
                    100:     "backspace",
                    101:     "tab",
                    102:     "backtab",
                    103:     "newline",
                    104:     "shift",
                    105:     "ctrl",
                    106:     "alt",
                    107:     "altgraf",
                    108:     "pause",
                    109:     "capslock",
                    110:     "esc",
                    111:     "space",
                    112:     "pageup",
                    113:     "pagedown",
                    114:     "end",
                    115:     "home",
                    116:     "left",
                    117:     "up",
                    118:     "right",
                    119:     "down",
                    120:     "printscrn",
                    121:     "insert",
                    122:     "delete",
                    123:     "scrllock",
                    124:     "numlock",
                    125:     "enter",
                    126:     "sysrq",
                    127:     "f1",
                    128:     "f2",
                    129:     "f3",
                    130:     "f4",
                    131:     "f5",
                    132:     "f6",
                    133:     "f7",
                    134:     "f8",
                    135:     "f9",
                    136:     "f10",
                    137:     "f11",
                    138:     "f12",
                    139:     "f13",
                    140:     "f14",
                    141:     "f15",
                    142:     "f16",
                    143:     "f17",
                    144:     "f18",
                    145:     "f19",
                    146:     "f20",
                    147:     "f21",
                    148:     "f22",
                    149:     "f23",
                    150:     "f24"
                    151: };
                    152: 
                    153: 
                    154: 
                    155: /***************************************************************************\
                    156: * DrawText
                    157: *
                    158: * This function displays a text string.
                    159: *
                    160: * Parameters:
                    161: *   hps:        presentation space
                    162: *   cx, cy:     point to begin drawing
                    163: *   sz:         string to draw
                    164: *   iColor:     text color
                    165: *   fExtent:    whether to calc extent or not
                    166: *
                    167: * Returns:
                    168: *   x position of end of painted string if fExtent == TRUE
                    169: \***************************************************************************/
                    170: 
                    171: SHORT DrawText(
                    172:     HPS hps,
                    173:     SHORT cx,
                    174:     SHORT cy,
                    175:     CHAR *sz,
                    176:     LONG iColor,
                    177:     BOOL fExtent)
                    178: {
                    179:     RECTL rcl;
                    180:     SHORT cch;
                    181: 
                    182:     cch = strlen(sz);
                    183: 
                    184:     rcl.xLeft = cx;
                    185:     rcl.xRight = cx + cch * gcxMaxChar;     /* hack */
                    186:     rcl.yBottom = cy;
                    187:     rcl.yTop = cy + gcyChar;
                    188: 
                    189:     WinDrawText(hps, cch, (PCH)sz, (PRECTL)&rcl, iColor, SYSCLR_WINDOW, 0);
                    190: 
                    191:     if (fExtent) {
                    192:         WinDrawText(hps, cch, (PCH)sz, (PRECTL)&rcl, iColor,
                    193:                     SYSCLR_WINDOW, DT_QUERYEXTENT);
                    194:         return (SHORT)rcl.xRight;
                    195:     }
                    196: 
                    197:     return 0;
                    198: }
                    199: 
                    200: 
                    201: 
                    202: /***************************************************************************\
                    203: * FormatHexChar
                    204: *
                    205: * This function formats an unsigned hex number into a string.  It is needed
                    206: * to get around shortcomings of sprintf().
                    207: *
                    208: * Parameters:
                    209: *   uch:    number to format
                    210: *   sz:     string to get number
                    211: \***************************************************************************/
                    212: 
                    213: VOID FormatHexChar(
                    214:     USHORT uch,
                    215:     CHAR *sz)
                    216: {
                    217:     sprintf(sz, "0x%2x", uch);
                    218: 
                    219:     /* patch up hex byte display */
                    220:     if (strlen(sz) > 4) {
                    221:         /* remove sign extension of byte */
                    222:         sz[2] = sz[4];
                    223:         sz[3] = sz[5];
                    224:         sz[4] = 0;
                    225:     } else if (sz[2] == ' ') {
                    226:         /* fill in blank with 0 */
                    227:         sz[2] = '0';
                    228:     }
                    229: }
                    230: 
                    231: 
                    232: 
                    233: /***************************************************************************\
                    234: * DrawMessage
                    235: *
                    236: * This function draws a single message line.
                    237: *
                    238: * Parameters:
                    239: *   hps:        presentation space
                    240: *   iMessage:   message number to display
                    241: *   pcm:        pointer to message structure
                    242: *   cy:         y position of message
                    243: \***************************************************************************/
                    244: 
                    245: VOID DrawMessage(
                    246:     HPS hps,
                    247:     SHORT iMessage,
                    248:     CHMSG *pcm,
                    249:     SHORT cy)
                    250: {
                    251:     CHAR sz[16];
                    252:     USHORT fsFlags;
                    253:     SHORT i;
                    254:     SHORT cx;
                    255: 
                    256:     cx = gcxMargin;
                    257: 
                    258:     if (gamf[INUMBER].fDisplay) {
                    259:         /* draw message number */
                    260:         sprintf(sz, "%u.", iMessage);
                    261:         DrawText(hps, cx, cy, sz, SYSCLR_WINDOWTEXT, FALSE);
                    262:         cx += gamf[INUMBER].cxWidth;
                    263:     }
                    264: 
                    265:     if (gamf[IVIRTUALKEY].fDisplay) {
                    266:         /* draw virtual key code */
                    267:         DrawText(hps, cx, cy, gachVK[pcm->usVK], SYSCLR_WINDOWTEXT,
                    268:                  FALSE);
                    269:         cx += gamf[IVIRTUALKEY].cxWidth;
                    270:     }
                    271: 
                    272:     if (gamf[ICHAR].fDisplay) {
                    273:         /* draw character */
                    274:         if ((CHAR)pcm->ch) {
                    275:             FormatHexChar(pcm->ch, sz);
                    276:             DrawText(hps, cx, cy, sz, SYSCLR_WINDOWTEXT, FALSE);
                    277:             sprintf(sz, "'%c'", (CHAR)pcm->ch);
                    278:             DrawText(hps, cx + 7 * gcxAveChar, cy, sz, SYSCLR_WINDOWTEXT,
                    279:                      FALSE);
                    280:         } else {
                    281:             DrawText(hps, cx, cy, gszNull, SYSCLR_WINDOWTEXT, FALSE);
                    282:         }
                    283:         cx += gamf[ICHAR].cxWidth;
                    284:     }
                    285: 
                    286:     if (gamf[ISCANCODE].fDisplay) {
                    287:         if (pcm->uchScan) {
                    288:             FormatHexChar(pcm->uchScan, sz);
                    289:             DrawText(hps, cx, cy, sz, SYSCLR_WINDOWTEXT, FALSE);
                    290:         } else {
                    291:             DrawText(hps, cx, cy, gszNull, SYSCLR_WINDOWTEXT, FALSE);
                    292:         }
                    293:         cx += gamf[ISCANCODE].cxWidth;
                    294:     }
                    295: 
                    296:     if (gamf[IREPEAT].fDisplay) {
                    297:         sprintf(sz, "%u", pcm->uchRep);
                    298:         DrawText(hps, cx, cy, sz, SYSCLR_WINDOWTEXT, FALSE);
                    299:         cx += gamf[IREPEAT].cxWidth;
                    300:     }
                    301: 
                    302:     if (gamf[IFLAGS].fDisplay) {
                    303:         /* draw KC_ flags */
                    304:         fsFlags = pcm->usKC;
                    305:         for (i = 0; i < 16; i++) {
                    306:             if (fsFlags & 1) {
                    307:                 switch (i) {
                    308:                 case 0:
                    309:                     if (gamf[ICHAR].fDisplay)
                    310:                         goto DF_PRINTIT;
                    311:                     break;
                    312:                 case 1:
                    313:                     if (gamf[IVIRTUALKEY].fDisplay)
                    314:                         goto DF_PRINTIT;
                    315:                     break;
                    316:                 case 2:
                    317:                     if (gamf[ISCANCODE].fDisplay)
                    318:                         goto DF_PRINTIT;
                    319:                     break;
                    320:                 default:
                    321: DF_PRINTIT:
                    322:                     cx = DrawText(hps, cx, cy, gachFlags[i], SYSCLR_WINDOWTEXT, TRUE);
                    323:                     cx += gcxAveChar;
                    324:                 }
                    325:             }
                    326:             fsFlags >>= 1;
                    327:         }
                    328:         cx += gamf[IFLAGS].cxWidth;
                    329:     }
                    330: }
                    331: 
                    332: 
                    333: 
                    334: /***************************************************************************\
                    335: * PaintClient
                    336: *
                    337: * This function paints a client window.
                    338: *
                    339: * Parameters:
                    340: *   hwnd:   window handle
                    341: \***************************************************************************/
                    342: 
                    343: VOID PaintClient(
                    344:     HWND hwnd)
                    345: {
                    346:     HPS hps;
                    347:     RECTL rcl;
                    348:     SHORT iMessage;
                    349:     SHORT yBottom;
                    350:     SHORT cx;
                    351:     SHORT i;
                    352: 
                    353:     hps = WinBeginPaint(hwnd, (HPS)NULL, (PRECTL)&rcl);
                    354: 
                    355:     /* clear invalidated region */
                    356:     WinFillRect(hps, (PRECTL)&rcl, SYSCLR_WINDOW);
                    357: 
                    358:     /* get y position to start drawing */
                    359:     WinQueryWindowRect(hwnd, (PRECTL)&rcl);
                    360:     yBottom = (SHORT)(rcl.yTop - gcyChar - gcyChar / 2);
                    361: 
                    362:     /* draw headings */
                    363:     cx = gcxMargin;
                    364:     for (i = 0; i < CDISPLAYFIELDS; i++) {
                    365:         if (gamf[i].fDisplay) {
                    366:             DrawText(hps, cx, yBottom, gamf[i].szHeading,
                    367:                     SYSCLR_WINDOWSTATICTEXT, FALSE);
                    368:             cx += gamf[i].cxWidth;
                    369:         }
                    370:     }
                    371: 
                    372:     /* draw each entry */
                    373:     i = gicmStart;
                    374:     iMessage = gcMessages;
                    375:     yBottom -= (gcyChar + gcyChar / 2);
                    376:     do {
                    377:         if (!iMessage || yBottom < -gcyChar)
                    378:             break;
                    379: 
                    380:         DrawMessage(hps, iMessage, &gacm[i], yBottom);
                    381: 
                    382:         i = (i + 1) % CBUFFERELTS;
                    383:         iMessage--;
                    384:         yBottom -= gcyChar;
                    385: 
                    386:     } while (i != gicmStart);
                    387: 
                    388:     WinEndPaint(hps);
                    389: }
                    390: 
                    391: 
                    392: 
                    393: /***************************************************************************\
                    394: * NewMessage
                    395: *
                    396: * This function adds a new WM_CHAR message to the list.
                    397: *
                    398: * Parameters:
                    399: *   hwnd:       window handle
                    400: *   mp1, mp2:
                    401: *   usKC:      key flags
                    402: *   usVK:      virtual key code
                    403: *   ch:        char;
                    404: \***************************************************************************/
                    405: 
                    406: VOID NewMessage(
                    407:     HWND hwnd,
                    408:     MPARAM mp1,
                    409:     MPARAM mp2)
                    410: {
                    411:     RECTL rclScroll, rclUpdate;
                    412:     HPS hps;
                    413: 
                    414:     /* overwrite oldest entry */
                    415:     if (gicmStart)
                    416:         gicmStart--;
                    417:     else
                    418:         gicmStart = CBUFFERELTS - 1;
                    419: 
                    420:     gacm[gicmStart].usKC = SHORT1FROMMP(mp1);
                    421:     gacm[gicmStart].uchRep = CHAR3FROMMP(mp1);
                    422:     gacm[gicmStart].uchScan = CHAR4FROMMP(mp1);
                    423:     gacm[gicmStart].ch = SHORT1FROMMP(mp2);
                    424:     gacm[gicmStart].usVK = SHORT2FROMMP(mp2);
                    425: 
                    426:     gcMessages++;
                    427: 
                    428:     /* scroll and update intelligently */
                    429:     WinQueryWindowRect(hwnd, (PRECTL)&rclScroll);
                    430:     rclScroll.yTop -= 2 * gcyChar;
                    431:     rclScroll.yBottom = max2(0L, rclScroll.yTop - (LONG)(CBUFFERELTS * gcyChar));
                    432: 
                    433:     WinScrollWindow(hwnd, 0, -gcyChar, (PRECTL)&rclScroll, (PRECTL)&rclScroll,
                    434:                     NULL, &rclUpdate, 0);
                    435: 
                    436:     hps = WinGetPS(hwnd);
                    437:     WinFillRect(hps, (PRECTL)&rclUpdate, SYSCLR_WINDOW);
                    438:     DrawMessage( hps
                    439:               , gcMessages
                    440:               , &gacm[gicmStart]
                    441:               , (SHORT)rclScroll.yTop - gcyChar );
                    442:     WinReleasePS(hps);
                    443: }
                    444: 
                    445: 
                    446: 
                    447: /***************************************************************************\
                    448: * CheckMenuItem
                    449: *
                    450: * This function sets the check state of a menu item.
                    451: *
                    452: * Parameters:
                    453: *   hwnd:   frame window
                    454: *   id:     menu id
                    455: *   fCheck: check state
                    456: \***************************************************************************/
                    457: 
                    458: VOID CheckMenuItem(
                    459:     HWND hwndFrame,
                    460:     SHORT id,
                    461:     BOOL fCheck)
                    462: {
                    463:     HWND hwndMenu;
                    464: 
                    465:     /* toggle menu checkmark */
                    466:     hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
                    467:     WinSendMsg(hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(id, TRUE),
                    468:                MPFROM2SHORT(MIA_CHECKED, fCheck ? MIA_CHECKED : 0));
                    469: }
                    470: 
                    471: 
                    472: 
                    473: /***************************************************************************\
                    474: * MenuCommand
                    475: *
                    476: * This function processes WM_COMMAND messages.
                    477: *
                    478: * Parameters:
                    479: *   hwnd:   client window handle
                    480: *   id:     command identifier
                    481: \***************************************************************************/
                    482: 
                    483: VOID MenuCommand(
                    484:     HWND hwnd,
                    485:     SHORT id)
                    486: {
                    487:     BOOL *pfDisplay;
                    488:     HWND hwndFrame;
                    489: 
                    490:     if (id == IDM_CLEAR) {
                    491: 
                    492:         /* clear current messages */
                    493:         gcMessages = 0;
                    494:         WinInvalidateRect(hwnd, NULL, FALSE);
                    495: 
                    496:     } else if (id == IDM_KEYUPS) {
                    497: 
                    498:         /* toggle logging keyups */
                    499:         gfKeyUps = !gfKeyUps;
                    500:         hwndFrame = WinQueryWindow(hwnd, QW_PARENT, FALSE);
                    501:         CheckMenuItem(hwndFrame, IDM_KEYUPS, gfKeyUps);
                    502: 
                    503:     } else if (id >= IDM_DISPLAYFIRST && id <= IDM_DISPLAYLAST) {
                    504: 
                    505:         /* toggle display field */
                    506:         pfDisplay = &(gamf[id - IDM_DISPLAYFIRST].fDisplay);
                    507:         *pfDisplay = !*pfDisplay;
                    508:         hwndFrame = WinQueryWindow(hwnd, QW_PARENT, FALSE);
                    509:         CheckMenuItem(hwndFrame, id, *pfDisplay);
                    510: 
                    511:         /* repaint in new format */
                    512:         WinInvalidateRect(hwnd, NULL, FALSE);
                    513:     }
                    514: }
                    515: 
                    516: 
                    517: 
                    518: /***************************************************************************\
                    519: * MainWndProc
                    520: *
                    521: * This is the window procedure for the main client window.
                    522: \***************************************************************************/
                    523: 
                    524: MRESULT CALLBACK MainWndProc(
                    525:     HWND hwnd,
                    526:     USHORT msg,
                    527:     MPARAM mp1,
                    528:     MPARAM mp2)
                    529: {
                    530:     switch (msg) {
                    531: 
                    532:     case WM_PAINT:
                    533:         PaintClient(hwnd);
                    534:         break;
                    535: 
                    536:     case WM_COMMAND:
                    537:         MenuCommand(hwnd, SHORT1FROMMP(mp1));
                    538:         break;
                    539: 
                    540:     case WM_CHAR:
                    541:         if (gfKeyUps || !(KC_KEYUP & SHORT1FROMMP(mp1))) {
                    542: 
                    543:             /* add new message to list */
                    544:             NewMessage(hwnd, mp1, mp2);
                    545:         }
                    546:         break;
                    547: 
                    548:     default:
                    549:         return WinDefWindowProc(hwnd, msg, mp1, mp2);
                    550:     }
                    551: 
                    552:     return (MRESULT)0;
                    553: }
                    554: 
                    555: 
                    556: 
                    557: /***************************************************************************\
                    558: * CheckMenus
                    559: *
                    560: * This function sets menu check marks according to their current internal
                    561: * state.
                    562: *
                    563: * Parameters:
                    564: *   hwndFrame:  main app window handle
                    565: \***************************************************************************/
                    566: 
                    567: VOID CheckMenus(
                    568:     HWND hwndFrame)
                    569: {
                    570:     SHORT id;
                    571: 
                    572:     CheckMenuItem(hwndFrame, IDM_KEYUPS, gfKeyUps);
                    573: 
                    574:     for (id = IDM_DISPLAYFIRST; id <= IDM_DISPLAYLAST; id++) {
                    575:         CheckMenuItem(hwndFrame, id, gamf[id - IDM_DISPLAYFIRST].fDisplay);
                    576:     }
                    577: }
                    578: 
                    579: 
                    580: 
                    581: /***************************************************************************\
                    582: * RegisterSwitchEntry
                    583: *
                    584: * This function registers the app with the switch list.
                    585: *
                    586: * Parameters:
                    587: *   hwndFrame:  main app window handle
                    588: \***************************************************************************/
                    589: 
                    590: VOID RegisterSwitchEntry(
                    591:     HWND hwndFrame)
                    592: {
                    593:     PID pid;
                    594:     TID tid;
                    595:     SWCNTRL swc;
                    596: 
                    597:     WinQueryWindowProcess(hwndFrame, (PPID)&pid, (PTID)&tid);
                    598:     WinQueryWindowText(hwndFrame, MAXNAMEL, (PSZ)swc.szSwtitle);
                    599:     swc.hwnd = hwndFrame;
                    600:     swc.hwndIcon = (ULONG)NULL;
                    601:     swc.hprog = (HPROGRAM)NULL;
                    602:     swc.idProcess = pid;
                    603:     swc.idSession = NULL;
                    604:     swc.uchVisibility = SWL_VISIBLE;
                    605:     swc.fbJump = SWL_JUMPABLE;
                    606:     WinAddSwitchEntry((PSWCNTRL)&swc);
                    607: }
                    608: 
                    609: 
                    610: 
                    611: /***************************************************************************\
                    612: * GetDisplayValues
                    613: *
                    614: * This function sets display dependent global variables.
                    615: \***************************************************************************/
                    616: 
                    617: VOID GetDisplayValues(VOID)
                    618: {
                    619:     HPS hps;
                    620:     FONTMETRICS fm;
                    621:     SHORT i;
                    622: 
                    623:     hps = WinGetPS(HWND_DESKTOP);
                    624:     GpiQueryFontMetrics(hps, (ULONG)sizeof(FONTMETRICS), (PFONTMETRICS)&fm);
                    625:     WinReleasePS(hps);
                    626: 
                    627:     gcyChar = (SHORT)(fm.lMaxBaselineExt + fm.lExternalLeading);
                    628:     gcxAveChar = (SHORT)fm.lAveCharWidth;
                    629:     gcxMaxChar = (SHORT)fm.lMaxCharInc;
                    630: 
                    631:     /* adjust display widths for this font */
                    632:     gcxMargin *= gcxAveChar;
                    633:     for (i = 0; i < CDISPLAYFIELDS; i++) {
                    634:         gamf[i].cxWidth *= gcxAveChar;
                    635:     }
                    636: }
                    637: 
                    638: 
                    639: 
                    640: /***************************************************************************\
                    641: * main
                    642: *
                    643: * This is the main procedure for the app.
                    644: \***************************************************************************/
                    645: 
                    646: VOID cdecl main(VOID)
                    647: {
                    648:     HAB hab;
                    649:     HMQ hmq;
                    650:     QMSG qmsg;
                    651:     ULONG ulCreate;
                    652:     HWND hwndFrame;
                    653:     HWND hwndClient;
                    654:     static CHAR szApp[] = "Char Messages";
                    655: 
                    656:     /* init app */
                    657:     hab = WinInitialize(NULL);
                    658:     hmq = WinCreateMsgQueue(hab, 0);
                    659:     GetDisplayValues();
                    660: 
                    661:     /* create main window */
                    662:     WinRegisterClass(hab, szApp, MainWndProc, 0L, 0);
                    663:     ulCreate = FCF_TITLEBAR | FCF_SYSMENU | FCF_MINMAX | FCF_SIZEBORDER |
                    664:                FCF_MENU | FCF_SHELLPOSITION;
                    665:     hwndFrame = WinCreateStdWindow(HWND_DESKTOP, WS_VISIBLE, &ulCreate,
                    666:                                     szApp, szApp, 0L, NULL, ID_RESOURCES,
                    667:                                     &hwndClient);
                    668: 
                    669:     /* register with switch list */
                    670:     RegisterSwitchEntry(hwndFrame);
                    671: 
                    672:     /* initialize menu */
                    673:     CheckMenus(hwndFrame);
                    674: 
                    675:     /* message loop */
                    676:     while (WinGetMsg(hab, &qmsg, NULL, 0, 0))
                    677:         WinDispatchMsg(hab, &qmsg);
                    678: 
                    679:     /* clean up */
                    680:     WinDestroyWindow(hwndFrame);
                    681:     WinDestroyMsgQueue(hmq);
                    682:     WinTerminate(hab);
                    683: }

unix.superglobalmegacorp.com

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