Annotation of 43BSD/contrib/X/xshell/xshell.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright 1985, Cognition Inc.
                      3:  * This software is not supported by Cognition Inc. and is
                      4:  * provided "as is".  To keep the X revolution growing, please forward 
                      5:  * enhancements and bug fixes to anyone who is interested.
                      6:  */
                      7: 
                      8: /*
                      9:  * XShell - a quick "shell" to allow you to cons up programs on the fly.  The
                     10:  * program looks at Button and Key Pressed events and looks up Xshell.name in
                     11:  * $HOME/.Xdefaults where name is:
                     12:  *
                     13:  *     LeftButton, MiddleButton, RightButton - on button events.
                     14:  *     ascii (e.g. [aB^9]) - on key pressed events.
                     15:  *     PF# and various special names - on special keys.
                     16:  *
                     17:  * The idea is that the user can define any set of key/button bindings which
                     18:  * can be invoked by simply pressing in the XShell window.  This can be very
                     19:  * useful for times when you have filled all of your windows with things that
                     20:  * you don't want to (or can't) suspend.
                     21:  *
                     22:  * I find it useful to have a large and small terminal window, a dc, and 
                     23:  * sometimes an editor that I can pop up on demand.  This program was written
                     24:  * because I was tired of getting into situations where I didn't have a window
                     25:  * handy and I needed to run some little calculator or editor.  Since I use
                     26:  * a small, terse window manager I didn't just stick a bag on the side of it,
                     27:  * but wrote a separate program instead.
                     28:  *
                     29:  * Apologies to anyone who has the scallop shell as a trademark.
                     30:  *
                     31:  * Author:  Jim Fulton, Cognition Inc.
                     32:  */
                     33: #ifndef lint
                     34: static char *rcsid_xshell_c = "$Header: xshell.c,v 10.6 86/02/01 16:19:36 tony Rel $";
                     35: #endif
                     36: 
                     37: #include <stdio.h>
                     38: #include <X/Xlib.h>
                     39: #include <X/Xkeyboard.h>
                     40: #include <signal.h>
                     41: #include <ctype.h>
                     42: #include <strings.h>
                     43: #include <sys/file.h>
                     44: #include <sys/ioctl.h>
                     45: #include <sys/wait.h>
                     46: #include <sys/time.h>
                     47: #include <sys/resource.h>
                     48: #include <sys/types.h>
                     49: #include "scallopshell.h"
                     50: #include "largescallopshell.h"
                     51: 
                     52: extern KeyMapEntry StdMap[];
                     53: 
                     54: extern char *malloc();
                     55: 
                     56: #define strneq(a,b) (strncmp ((a), (b), strlen(a)) == 0)
                     57: #define streq(a,b) (strcmp ((a), (b)) == 0)
                     58: #define isopt(optname) (strneq(*argv, optname))        /* does partial matching */
                     59: #define hasarg ((argv[1] != (char *) NULL) && (argv[1][0] != '-'))
                     60: #define NO 0
                     61: #define YES 1
                     62: #define DEFAULT_FONT "helv12b"
                     63: #define micro2centi (10000)            /* microsecond to 1/100 second */
                     64: 
                     65: char *ProgramName;
                     66: 
                     67: Window ShellWindow;
                     68: Display *dpy;
                     69: int fg = BlackPixel;   /* print bits in black */
                     70: int bg = WhitePixel;   /* print background in white */
                     71: int bd = BlackPixel;   /* print border in black */
                     72: int bw = 0;            /* no border */
                     73: int volume = 1;
                     74: WindowInfo RootWindowInfo;
                     75: Bitmap IconBitmap;
                     76: Pixmap IconPixmap;
                     77: XEvent inputevent;
                     78: int width, height;
                     79: unsigned long code;
                     80: int nflash = 3;
                     81: struct timeval delaytime = {0, 5*micro2centi}; 
                     82: int quiet = NO;
                     83: short *icon_bits;
                     84: int icon_width, icon_height;
                     85: 
                     86: char **actionvector[256];              /* command table */
                     87: char actionfound[256];         /* see flags below */
                     88: #define ACTION_NEW             ((char) 0)
                     89: #define ACTION_FOUND           ((char) 1)
                     90: #define ACTION_NOT_FOUND       ((char) 2)
                     91: 
                     92: char *yes[] = {"y", "yes", "YES", "on", "ON", "On", 
                     93:                      "t", "true", "TRUE", "True", (char *) NULL};
                     94: 
                     95: char *small[] = {"s", "S", "small", "SMALL", "Small", "sm", "SM", "Sm",
                     96:                        (char *) NULL};
                     97: 
                     98: int IsMemberOf (list, string)
                     99:        register char *list[];
                    100:        register char *string;
                    101: {
                    102:        for (; *list; list++) {
                    103:            if (streq (string, *list)) return (YES);
                    104:        }
                    105:        return (NO);
                    106: }
                    107: 
                    108: reapchild ()
                    109: {
                    110:        union wait status;
                    111: 
                    112:        while (wait3 (&status, WNOHANG, (struct rusage *) 0) > 0) ;
                    113:        return;
                    114: }
                    115: 
                    116: static void Error (msg, arg)
                    117:        char *msg, *arg;
                    118: {
                    119:        fprintf (stderr, "%s:  error with %s", msg);
                    120:        if (arg != (char *) NULL && *arg != '\0')
                    121:            fprintf (stderr, ": %s\n", arg);
                    122:        else
                    123:            fprintf (stderr, "\n");
                    124:        exit (1);
                    125: }
                    126: 
                    127: static void Usage (msg)
                    128:        char *msg;
                    129: {
                    130:        fprintf (stderr, "%s:  error with \"%s\".  Usage is\n", 
                    131:                ProgramName, msg);
                    132:        fprintf (stderr, "\n\t\t%s [-flags] [=WxH+X+Y] [host:displaynum]\n\n", 
                    133:                ProgramName);
                    134:        fprintf (stderr, "where -flags are:\n");
                    135:        fprintf (stderr, "\t-fg color       Foreground color.\n");
                    136:        fprintf (stderr, "\t-bg color       Background color.\n");
                    137:        fprintf (stderr, "\t-bd color       Border color.\n");
                    138:        fprintf (stderr, "\t-bw[idth]n      Border width in pixels.\n");
                    139:        fprintf (stderr, "\t-v[olume] n     Bell volume.\n");
                    140:        fprintf (stderr, "\t-fl[ash] n      Number of times to flash icon.\n");
                    141:        fprintf (stderr, "\t-d[elay] n      1/10ths of a second flashes.\n");
                    142:        fprintf (stderr, "\t-r[everse]      Reverse video.\n");
                    143:        fprintf (stderr, "\t-q[uiet]        Don\'t feep on errors.\n");
                    144:        fprintf (stderr, "\t-s[mall]        Use a small icon instead of a big one.\n");
                    145:        fprintf (stderr, "\n");
                    146:        exit (1);
                    147: }
                    148: 
                    149: quit ()
                    150: {
                    151:        XUnmapWindow (ShellWindow);
                    152:        XCloseDisplay (dpy);
                    153:        exit (0);
                    154: }
                    155: 
                    156: main (argc, argv)
                    157:        int argc;
                    158:        char *argv[];
                    159: {
                    160:        register int i;
                    161:        register char *cp;
                    162:        char *fgname, *bgname, *bdname;
                    163:        int reverse;
                    164:        char *displayname;
                    165:        Color colorstruct;
                    166:        int c;
                    167:        char cbuf[2];
                    168:        int xoff, yoff, xsign, ysign;
                    169: 
                    170:        (void) signal (SIGINT, quit);
                    171:        (void) signal (SIGHUP, quit);
                    172:        (void) signal (SIGCHLD, reapchild);
                    173: 
                    174:        setlinebuf (stderr);
                    175: 
                    176:                        /* set program name for errors */
                    177:        ProgramName = argv[0];
                    178:        cp = rindex (ProgramName, '/');
                    179:        if (cp) ProgramName = ++cp;     /* strip off directory name */
                    180: 
                    181:                        /* Initialize variables */
                    182:        fgname = bgname = bdname = (char *) NULL;
                    183:        reverse = NO;
                    184:        displayname = (char *) NULL;
                    185:        bzero (actionfound, sizeof (actionfound));
                    186:        icon_bits = largescallopshell_bits;
                    187:        width = -1;
                    188:        height = -1;
                    189:        icon_width = largescallopshell_width; 
                    190:        icon_height = largescallopshell_height;
                    191: 
                    192:                        /* read in defaults from .Xdefaults */
                    193: 
                    194:        fgname = XGetDefault (ProgramName, "Foreground");
                    195: 
                    196:        bgname = XGetDefault (ProgramName, "Background");
                    197: 
                    198:        bdname = XGetDefault (ProgramName, "Border");
                    199: 
                    200:        cp = XGetDefault (ProgramName, "BorderWidth");
                    201:        if (cp) bw = atoi (cp);
                    202: 
                    203:        cp = XGetDefault (ProgramName, "Volume");
                    204:        if (cp) volume = atoi (cp);
                    205: 
                    206:        cp = XGetDefault (ProgramName, "Flash");
                    207:        if (cp) nflash = atoi (cp);
                    208: 
                    209:        cp = XGetDefault (ProgramName, "Delay");
                    210:        if (cp) delaytime.tv_usec = atoi (cp) * micro2centi;
                    211: 
                    212:        if ((cp = XGetDefault (ProgramName, "ReverseVideo")) != NULL)
                    213:                if (IsMemberOf (yes, cp)) reverse = YES;
                    214: 
                    215:        if ((cp = XGetDefault (ProgramName, "Quiet")) != NULL)
                    216:                if (IsMemberOf (yes, cp)) quiet = YES;
                    217: 
                    218:        if ((cp = XGetDefault (ProgramName, "IconSize")) != NULL) {
                    219:                if (IsMemberOf(small, cp)) {
                    220:                    icon_bits = scallopshell_bits;
                    221:                    icon_width = scallopshell_width; 
                    222:                    icon_height = scallopshell_height;
                    223:                }
                    224:        }
                    225: 
                    226:        cp = XGetDefault (ProgramName, "WindowGeometry");
                    227:        if (cp) {
                    228:            if (!XParse_Window_Geometry (cp, &width, &height, 
                    229:                &xsign, &xoff, &ysign, &yoff)) Usage ("default =WxH+XOFF+YOFF");
                    230:        }
                    231: 
                    232:                                        /* read command arguments */
                    233:        argv++;                         /* advance past command name */
                    234:        for (; *argv; argv++) {         /* iterate over arguments */
                    235:          if (**argv == '-') {
                    236:            if (isopt ("-fg")) {
                    237:                if (hasarg) {
                    238:                    fgname = *++argv;
                    239:                } else Usage ("-fg foreground");
                    240:            } else
                    241:            if (isopt ("-bg")) {
                    242:                if (hasarg) {
                    243:                    bgname = *++argv;
                    244:                } else Usage ("-bg background");
                    245:            } else
                    246:            if (isopt ("-bd")) {
                    247:                if (hasarg) {
                    248:                    bdname = *++argv;
                    249:                } else Usage ("-bd border color");
                    250:            } else
                    251:            if (isopt ("-bwidth")) {
                    252:                if (hasarg) {
                    253:                    bw = atoi (*++argv);
                    254:                } else Usage ("-bwidth borderwidth");
                    255:            } else
                    256:            if (isopt ("-volume")) {
                    257:                if (hasarg) {
                    258:                    volume = atoi (*++argv);
                    259:                } else Usage ("-volume volume");
                    260:            } else
                    261:            if (isopt ("-flash")) {
                    262:                if (hasarg) {
                    263:                    nflash = atoi (*++argv);
                    264:                } else Usage ("-flash n");
                    265:            } else
                    266:            if (isopt ("-delay")) {
                    267:                if (hasarg) {
                    268:                    delaytime.tv_usec = atoi (*++argv) * micro2centi;
                    269:                } else Usage ("-delay n");
                    270:            } else
                    271:            if (isopt ("-reverse")) {
                    272:                reverse = YES;
                    273:            } else 
                    274:            if (isopt ("-quiet")) {
                    275:                quiet = YES;
                    276:            } else 
                    277:            if (isopt ("-small")) {
                    278:                icon_bits = scallopshell_bits;
                    279:                icon_width = scallopshell_width;
                    280:                icon_height = scallopshell_height;
                    281:            } else 
                    282:            Usage ("-unknown flag");    /* end if command line options */
                    283:          } else if (**argv == '=') {
                    284:            if (!XParse_Window_Geometry (*argv, &width, &height, 
                    285:                &xsign, &xoff, &ysign, &yoff)) Usage ("=WxH+XOFF+YOFF");
                    286:          } else 
                    287:            displayname = *argv;
                    288:        } /*end for*/
                    289: 
                    290: 
                    291:        if (width == -1) width = icon_width;
                    292:        if (height == -1) height = icon_height;
                    293: 
                    294:                                /* okay, now set things up */
                    295:        dpy = XOpenDisplay (displayname);
                    296:        if (!dpy) 
                    297:            Error ("opening display", "");
                    298: 
                    299:        if (!XQueryWindow (RootWindow, &RootWindowInfo)) 
                    300:            Error ("query root", "");
                    301: 
                    302:        if (xsign < 0) xoff = RootWindowInfo.width - xoff - width - 2*bw;
                    303:        if (ysign < 0) yoff = RootWindowInfo.height - yoff - height - 2*bw;
                    304: 
                    305:                                /* set the colors for the various parts */
                    306: 
                    307: #define setcolor(colorname,colornum)                                   \
                    308:        if (colorname && DisplayCells() > 2 &&                          \
                    309:                XParseColor(colorname, &colorstruct) &&                 \
                    310:                XGetHardwareColor(&colorstruct)) {                      \
                    311:            colornum = colorstruct.pixel;                               \
                    312:            reverse = NO;                                               \
                    313:        }
                    314: 
                    315:        setcolor (fgname, fg);
                    316:        setcolor (bgname, bg);
                    317:        setcolor (bdname, bd);
                    318: 
                    319: #undef setcolor
                    320: 
                    321:        if (reverse) {
                    322:            i = fg;
                    323:            fg = bg;
                    324:            bg = i;
                    325:        }
                    326:                        /* now, make up the icon pixmap */
                    327: 
                    328:        IconBitmap = XStoreBitmap (icon_width, icon_height, icon_bits);
                    329:        if (!IconBitmap) Error ("storing icon bitmap", "");
                    330: 
                    331:        IconPixmap = XMakePixmap (IconBitmap, fg, bg);
                    332:        if (!IconPixmap) Error ("storing icon pixmap", "");
                    333: 
                    334:        
                    335:                        /* make the window */
                    336: 
                    337:        ShellWindow = XCreateWindow (RootWindow, xoff, yoff, width, height,
                    338:                        bw, XMakeTile(bd), XMakeTile(bg));
                    339:        if (!ShellWindow) Error ("creating shell window", "");
                    340: 
                    341:                        /* and store away the program name in the window */
                    342: 
                    343:        XStoreName (ShellWindow, ProgramName);
                    344: 
                    345:                        /* select the window events */
                    346: 
                    347:        XSelectInput (ShellWindow, KeyPressed | ButtonPressed | ExposeWindow);
                    348:        
                    349:                        /* and map it, this should generate an Expose event */
                    350:        XMapWindow (ShellWindow);
                    351: 
                    352:        while (1) {                                     /* loop forever */
                    353:            XNextEvent (&inputevent);
                    354:            code = ((XKeyOrButtonEvent *) &inputevent)->detail;
                    355:            switch ((int) inputevent.type) {
                    356:                case ExposeWindow:                      /* repaint the icon */
                    357:                    if (inputevent.window == ShellWindow)
                    358:                        XPixmapPut (ShellWindow, 0, 0, 0, 0, 
                    359:                                icon_width, icon_height, 
                    360:                                IconPixmap, GXcopy, AllPlanes);
                    361:                    break;
                    362: 
                    363:                case KeyPressed:
                    364:                    c = StdMap [code & ValueMask] [KeyState(code)];
                    365:                    switch (c) {
                    366:                        case -1:
                    367:                            feep ();
                    368:                            break;
                    369:                        case SHFT:
                    370:                            perform ("SHIFT");
                    371:                            break;
                    372:                        case CNTL:
                    373:                            perform ("CONTROL");
                    374:                            break;
                    375:                        case LOCK:
                    376:                            perform ("LOCK");
                    377:                            break;
                    378:                        case SYMBOL:
                    379:                            perform ("SYMBOL");
                    380:                            break;
                    381:                        case KEYPAD:
                    382:                            switch (code & ValueMask) {
                    383:                                case KC_KEYPAD_0:
                    384:                                    perform ("KEYPAD0");
                    385:                                    break;
                    386:                                case KC_KEYPAD_PERIOD:
                    387:                                    perform ("KEYPAD.");
                    388:                                    break;
                    389:                                case KC_ENTER:
                    390:                                    perform ("ENTER");
                    391:                                    break;
                    392:                                case KC_KEYPAD_1:
                    393:                                    perform ("KEYPAD1");
                    394:                                    break;
                    395:                                case KC_KEYPAD_2:
                    396:                                    perform ("KEYPAD2");
                    397:                                    break;
                    398:                                case KC_KEYPAD_3:
                    399:                                    perform ("KEYPAD3");
                    400:                                    break;
                    401:                                case KC_KEYPAD_4:
                    402:                                    perform ("KEYPAD4");
                    403:                                    break;
                    404:                                case KC_KEYPAD_5:
                    405:                                    perform ("KEYPAD5");
                    406:                                    break;
                    407:                                case KC_KEYPAD_6:
                    408:                                    perform ("KEYPAD6");
                    409:                                    break;
                    410:                                case KC_KEYPAD_COMMA:
                    411:                                    perform ("KEYPAD,");
                    412:                                    break;
                    413:                                case KC_KEYPAD_7:
                    414:                                    perform ("KEYPAD7");
                    415:                                    break;
                    416:                                case KC_KEYPAD_8:
                    417:                                    perform ("KEYPAD8");
                    418:                                    break;
                    419:                                case KC_KEYPAD_9:
                    420:                                    perform ("KEYPAD9");
                    421:                                    break;
                    422:                                case KC_KEYPAD_MINUS:
                    423:                                    perform ("KEYPAD-");
                    424:                                    break;
                    425:                                default:
                    426:                                    feep ();
                    427:                                    break;
                    428:                            } /*end switch*/
                    429:                            break;
                    430:                        case CURSOR:
                    431:                            switch (code & ValueMask) {
                    432:                                case KC_CURSOR_LEFT:
                    433:                                    perform ("LEFTARROW");
                    434:                                    break;
                    435:                                case KC_CURSOR_RIGHT:
                    436:                                    perform ("RIGHTARROW");
                    437:                                    break;
                    438:                                case KC_CURSOR_DOWN:
                    439:                                    perform ("DOWNARROW");
                    440:                                    break;
                    441:                                case KC_CURSOR_UP:
                    442:                                    perform ("UPARROW");
                    443:                                    break;
                    444:                                default:
                    445:                                    feep ();
                    446:                                    break;
                    447:                            }
                    448:                            break;
                    449:                        case PFX:
                    450:                            switch (code & ValueMask) {
                    451:                                case KC_PF1:
                    452:                                    perform ("PF1");
                    453:                                case KC_PF2:
                    454:                                    perform ("PF2");
                    455:                                case KC_PF3:
                    456:                                    perform ("PF3");
                    457:                                case KC_PF4:
                    458:                                    perform ("PF4");
                    459:                                default:
                    460:                                    feep ();
                    461:                                    break;
                    462:                            }
                    463:                            break;
                    464:                        case FUNC1:
                    465:                            perform ("FUNC1");
                    466:                            break;
                    467:                        case FUNC2:
                    468:                            perform ("FUNC2");
                    469:                            break;
                    470:                        case FUNC3:
                    471:                            perform ("FUNC3");
                    472:                            break;
                    473:                        case FUNC4:
                    474:                            perform ("FUNC4");
                    475:                            break;
                    476:                        case FUNC5:
                    477:                            perform ("FUNC5");
                    478:                            break;
                    479:                        case FUNC6:
                    480:                            perform ("FUNC6");
                    481:                            break;
                    482:                        case FUNC7:
                    483:                            perform ("FUNC7");
                    484:                            break;
                    485:                        case FUNC8:
                    486:                            perform ("FUNC8");
                    487:                            break;
                    488:                        case FUNC9:
                    489:                            perform ("FUNC9");
                    490:                            break;
                    491:                        case FUNC10:
                    492:                            perform ("FUNC10");
                    493:                            break;
                    494:                        case FUNC11:
                    495:                            perform ("FUNC11");
                    496:                            break;
                    497:                        case FUNC12:
                    498:                            perform ("FUNC12");
                    499:                            break;
                    500:                        case FUNC13:
                    501:                            perform ("FUNC13");
                    502:                            break;
                    503:                        case FUNC14:
                    504:                            perform ("FUNC14");
                    505:                            break;
                    506:                        case FUNC15:
                    507:                            perform ("FUNC15");
                    508:                            break;
                    509:                        case FUNC16:
                    510:                            perform ("FUNC16");
                    511:                            break;
                    512:                        case FUNC17:
                    513:                            perform ("FUNC17");
                    514:                            break;
                    515:                        case FUNC18:
                    516:                            perform ("FUNC18");
                    517:                            break;
                    518:                        case FUNC19:
                    519:                            perform ("FUNC19");
                    520:                            break;
                    521:                        case FUNC20:
                    522:                            perform ("FUNC20");
                    523:                            break;
                    524:                        case E1:
                    525:                            perform ("E1");
                    526:                            break;
                    527:                        case E2:
                    528:                            perform ("E2");
                    529:                            break;
                    530:                        case E3:
                    531:                            perform ("E3");
                    532:                            break;
                    533:                        case E4:
                    534:                            perform ("E4");
                    535:                            break;
                    536:                        case E5:
                    537:                            perform ("E5");
                    538:                            break;
                    539:                        case E6:
                    540:                            perform ("E6");
                    541:                            break;
                    542:                        default:        /* must be ascii */
                    543:                            cbuf[0] = (char) c;
                    544:                            cbuf[1] = '\0';
                    545:                            perform (cbuf);
                    546:                            break;
                    547:                    } /*end switch on keycode*/
                    548:                    break;
                    549: 
                    550:                case ButtonPressed:
                    551:                    switch (code & ValueMask) {
                    552:                        case LeftButton:
                    553:                            perform ("LEFTBUTTON");
                    554:                            break;
                    555:                        case MiddleButton:
                    556:                            perform ("MIDDLEBUTTON");
                    557:                            break;
                    558:                        case RightButton:
                    559:                            perform ("RIGHTBUTTON");
                    560:                            break;
                    561:                        default:
                    562:                            feep ();
                    563:                            break;
                    564:                    }
                    565:                    break;
                    566: 
                    567:                default:
                    568:                    feep ();
                    569:                    break;
                    570:            } /*end switch on event type*/
                    571:        } /*end while forever getting input events*/
                    572: } /*end main*/
                    573: 
                    574: /****************************************************************************
                    575:  * perform - This routine looks in its table to see if it already has a key
                    576:  * code, else it does an XGetDefault of the keyname.
                    577:  */
                    578: 
                    579: static perform (keyname)
                    580:        char *keyname;
                    581: {
                    582:        char buf[32];
                    583:        register char *cp;
                    584: 
                    585:        if (actionfound [code] == ACTION_NEW) {
                    586:            (void) strcpy (buf, "action.");
                    587:            (void) strcat (buf, keyname);
                    588:            cp = XGetDefault (ProgramName, buf);
                    589:            if (!cp) 
                    590:                actionfound [code] = ACTION_NOT_FOUND;
                    591:            else {              /* else we have to parse the string */
                    592:                parseaction (cp);
                    593:            } /*end if we have an action*/
                    594:        } /*end if we needed to look up an action*/
                    595: 
                    596:        if (actionfound [code] == ACTION_FOUND) {
                    597:            if (vfork() == 0)           /* in child, start program */
                    598:                execvp (actionvector [code] [0], actionvector [code]);
                    599:            else                        /* in parent, flash icon */
                    600:                flash ();
                    601:        } else {
                    602:            if (!quiet) feep ();
                    603:        }
                    604: 
                    605:        return;
                    606: }
                    607: 
                    608: 
                    609: static parseaction (actionstring)
                    610:        char *actionstring;
                    611: {
                    612:        register char *cp;
                    613:        register int wc = 0;            /* word count */
                    614:        register int inword;
                    615:        register char **actionlist;
                    616:        register int i;
                    617: 
                    618:        inword = 0;
                    619:        for (cp = actionstring; *cp; cp++) {    /* iterate over string */
                    620:            if (isspace(*cp)) {
                    621:                if (inword) inword = 0;         /* no longer in a word */
                    622:            } else {
                    623:                if (!inword) {                  /* weren't in word */
                    624:                    inword = 1;                 /* but now we are */
                    625:                    wc++;                       /* so increment counter */
                    626:                }
                    627:            }
                    628:        }
                    629:                        /* wc now contains the number of separate words */
                    630:        actionlist = (char **) malloc ((unsigned)sizeof (char *) * (wc + 1));
                    631:        if (!actionlist) 
                    632:            Error ("allocating memory for command list", actionstring);
                    633: 
                    634:        i = 0;
                    635:        inword = 0;
                    636:        for (cp = actionstring; *cp; cp++) {
                    637:            if (isspace(*cp)) {
                    638:                if (inword) {                   /* were in a word */
                    639:                    inword = 0;                 /* but now we're not */
                    640:                }
                    641:                *cp = '\0';                     /* and null out space */
                    642:            } else {
                    643:                if (!inword) {                  /* weren't in a word */
                    644:                    inword = 1;                 /* but now we are */
                    645:                    actionlist [i++] = cp;      /* store pointer to start of word */
                    646:                }
                    647:            }
                    648:        }
                    649:        actionlist [wc] = (char *) NULL;        /* execv wants this */
                    650: 
                    651:        actionfound [code] = ACTION_FOUND;
                    652:        actionvector [code] = actionlist;       /* store the action */
                    653:        return;
                    654: }
                    655: 
                    656: 
                    657: /****************************************************************************
                    658:  * feep - is designed to alert the user that something went wrong.  It could
                    659:  * put up a dialog box if it were smart....
                    660:  */
                    661: 
                    662: static feep ()
                    663: {
                    664:        XFeep (volume);
                    665:        XFlush ();
                    666:        return;
                    667: }
                    668: 
                    669: 
                    670: /****************************************************************************
                    671:  * flash - this just flashes the shell box a couple of times
                    672:  */
                    673: 
                    674: flash ()
                    675: {
                    676:        register int i, j;
                    677: 
                    678:        for (i = 0; i < nflash; i++) {
                    679:            for (j = 0; j < 2; j++) {
                    680:                XPixFill (ShellWindow, 0, 0, width, height, BlackPixel,
                    681:                                (Bitmap) 0, GXinvert, AllPlanes);
                    682:                XFlush ();
                    683:                (void) select (0, (fd_set *) 0, (fd_set *) 0, (fd_set *) 0, &delaytime);
                    684:            }
                    685:        }
                    686:        return;
                    687: }
                    688: 

unix.superglobalmegacorp.com

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