Annotation of micropolis/src/tk/tkcmds.c, revision 1.1

1.1     ! root        1: /* 
        !             2:  * tkCmds.c --
        !             3:  *
        !             4:  *     This file contains a collection of Tk-related Tcl commands
        !             5:  *     that didn't fit in any particular file of the toolkit.
        !             6:  *
        !             7:  * Copyright 1990-1992 Regents of the University of California
        !             8:  * Permission to use, copy, modify, and distribute this
        !             9:  * software and its documentation for any purpose and without
        !            10:  * fee is hereby granted, provided that the above copyright
        !            11:  * notice appear in all copies.  The University of California
        !            12:  * makes no representations about the suitability of this
        !            13:  * software for any purpose.  It is provided "as is" without
        !            14:  * express or implied warranty.
        !            15:  */
        !            16: 
        !            17: #ifndef lint
        !            18: static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkCmds.c,v 1.32 92/06/03 14:21:14 ouster Exp $ SPRITE (Berkeley)";
        !            19: #endif /* not lint */
        !            20: 
        !            21: #include "tkconfig.h"
        !            22: #include "tkint.h"
        !            23: 
        !            24: /*
        !            25:  * The data structure below is used by the "after" command to remember
        !            26:  * the command to be executed later.
        !            27:  */
        !            28: 
        !            29: typedef struct {
        !            30:     Tcl_Interp *interp;                /* Interpreter in which to execute command. */
        !            31:     char *command;             /* Command to execute.  Malloc'ed, so must
        !            32:                                 * be freed when structure is deallocated. 
        !            33:                                 * NULL means nothing to execute. */
        !            34:     int *donePtr;              /* If non-NULL indicates address of word to
        !            35:                                 * set to 1 when command has finally been
        !            36:                                 * executed. */
        !            37: } AfterInfo;
        !            38: 
        !            39: /*
        !            40:  * Forward declarations for procedures defined later in this file:
        !            41:  */
        !            42: 
        !            43: static void            AfterProc _ANSI_ARGS_((ClientData clientData));
        !            44: static char *          WaitVariableProc _ANSI_ARGS_((ClientData clientData,
        !            45:                            Tcl_Interp *interp, char *name1, char *name2,
        !            46:                            int flags));
        !            47: static void            WaitWindowProc _ANSI_ARGS_((ClientData clientData,
        !            48:                            XEvent *eventPtr));
        !            49: 
        !            50: /*
        !            51:  *----------------------------------------------------------------------
        !            52:  *
        !            53:  * Tk_AfterCmd --
        !            54:  *
        !            55:  *     This procedure is invoked to process the "after" Tcl command.
        !            56:  *     See the user documentation for details on what it does.
        !            57:  *
        !            58:  * Results:
        !            59:  *     A standard Tcl result.
        !            60:  *
        !            61:  * Side effects:
        !            62:  *     See the user documentation.
        !            63:  *
        !            64:  *----------------------------------------------------------------------
        !            65:  */
        !            66: 
        !            67:        /* ARGSUSED */
        !            68: int
        !            69: Tk_AfterCmd(clientData, interp, argc, argv)
        !            70:     ClientData clientData;     /* Main window associated with
        !            71:                                 * interpreter.  Not used.*/
        !            72:     Tcl_Interp *interp;                /* Current interpreter. */
        !            73:     int argc;                  /* Number of arguments. */
        !            74:     char **argv;               /* Argument strings. */
        !            75: {
        !            76:     int ms;
        !            77:     AfterInfo *afterPtr;
        !            78:     int done;
        !            79: 
        !            80:     if (argc < 2) {
        !            81:        Tcl_AppendResult(interp, "wrong # args: should be \"",
        !            82:                argv[0], " milliseconds ?command? ?arg arg ...?\"",
        !            83:                (char *) NULL);
        !            84:        return TCL_ERROR;
        !            85:     }
        !            86: 
        !            87:     if ((Tcl_GetInt(interp, argv[1], &ms) != TCL_OK) || (ms <= 0)) {
        !            88:        Tcl_AppendResult(interp, "bad milliseconds value \"",
        !            89:                argv[1], "\"", (char *) NULL);
        !            90:        return TCL_ERROR;
        !            91:     }
        !            92:     afterPtr = (AfterInfo *) ckalloc((unsigned) (sizeof(AfterInfo)));
        !            93:     afterPtr->interp = interp;
        !            94:     if (argc == 2) {
        !            95:        afterPtr->command = (char *) NULL;
        !            96:        done = 0;
        !            97:        afterPtr->donePtr = &done;
        !            98:     } else if (argc == 3) {
        !            99:        afterPtr->command = (char *) ckalloc((unsigned) (strlen(argv[2]) + 1));
        !           100:        strcpy(afterPtr->command, argv[2]);
        !           101:        afterPtr->donePtr = (int *) NULL;
        !           102:     } else {
        !           103:        afterPtr->command = Tcl_Concat(argc-2, argv+2);
        !           104:        afterPtr->donePtr = (int *) NULL;
        !           105:     }
        !           106:     Tk_CreateTimerHandler(ms, AfterProc, (ClientData) afterPtr);
        !           107:     if (argc == 2) {
        !           108:        while (!done) {
        !           109:            Tk_DoOneEvent(0);
        !           110:        }
        !           111:     }
        !           112: 
        !           113:     /*
        !           114:      * Must reset interpreter result because it could have changed as
        !           115:      * part of events processed by Tk_DoOneEvent.
        !           116:      */
        !           117: 
        !           118:     Tcl_ResetResult(interp);
        !           119:     return TCL_OK;
        !           120: }
        !           121: 
        !           122: /*
        !           123:  *----------------------------------------------------------------------
        !           124:  *
        !           125:  * AfterProc --
        !           126:  *
        !           127:  *     Timer callback to execute commands registered with the
        !           128:  *     "after" command.
        !           129:  *
        !           130:  * Results:
        !           131:  *     None.
        !           132:  *
        !           133:  * Side effects:
        !           134:  *     Executes whatever command was specified.  If the command
        !           135:  *     returns an error, then the command "tkerror" is invoked
        !           136:  *     to process the error;  if tkerror fails then information
        !           137:  *     about the error is output on stderr.
        !           138:  *
        !           139:  *----------------------------------------------------------------------
        !           140:  */
        !           141: 
        !           142: static void
        !           143: AfterProc(clientData)
        !           144:     ClientData clientData;     /* Describes command to execute. */
        !           145: {
        !           146:     AfterInfo *afterPtr = (AfterInfo *) clientData;
        !           147:     int result;
        !           148: 
        !           149:     if (afterPtr->command != NULL) {
        !           150:        result = Tcl_GlobalEval(afterPtr->interp, afterPtr->command);
        !           151:        if (result != TCL_OK) {
        !           152:            TkBindError(afterPtr->interp);
        !           153:        }
        !           154:        ckfree(afterPtr->command);
        !           155:     }
        !           156:     if (afterPtr->donePtr != NULL) {
        !           157:        *afterPtr->donePtr = 1;
        !           158:     }
        !           159:     ckfree((char *) afterPtr);
        !           160: }
        !           161: 
        !           162: /*
        !           163:  *----------------------------------------------------------------------
        !           164:  *
        !           165:  * Tk_BindCmd --
        !           166:  *
        !           167:  *     This procedure is invoked to process the "bind" Tcl command.
        !           168:  *     See the user documentation for details on what it does.
        !           169:  *
        !           170:  * Results:
        !           171:  *     A standard Tcl result.
        !           172:  *
        !           173:  * Side effects:
        !           174:  *     See the user documentation.
        !           175:  *
        !           176:  *----------------------------------------------------------------------
        !           177:  */
        !           178: 
        !           179: int
        !           180: Tk_BindCmd(clientData, interp, argc, argv)
        !           181:     ClientData clientData;             /* Main window associated with
        !           182:                                 * interpreter. */
        !           183:     Tcl_Interp *interp;                /* Current interpreter. */
        !           184:     int argc;                  /* Number of arguments. */
        !           185:     char **argv;               /* Argument strings. */
        !           186: {
        !           187:     Tk_Window tkwin = (Tk_Window) clientData;
        !           188:     TkWindow *winPtr;
        !           189:     ClientData object;
        !           190: 
        !           191:     if ((argc < 2) || (argc > 4)) {
        !           192:        Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
        !           193:                " window ?pattern? ?command?\"", (char *) NULL);
        !           194:        return TCL_ERROR;
        !           195:     }
        !           196:     if (argv[1][0] == '.') {
        !           197:        winPtr = (TkWindow *) Tk_NameToWindow(interp, argv[1], tkwin);
        !           198:        if (winPtr == NULL) {
        !           199:            return TCL_ERROR;
        !           200:        }
        !           201:        object = (ClientData) winPtr->pathName;
        !           202:     } else {
        !           203:        winPtr = (TkWindow *) clientData;
        !           204:        object = (ClientData) Tk_GetUid(argv[1]);
        !           205:     }
        !           206: 
        !           207:     if (argc == 4) {
        !           208:        int append = 0;
        !           209:        unsigned long mask;
        !           210: 
        !           211:        if (argv[3][0] == 0) {
        !           212:            return Tk_DeleteBinding(interp, winPtr->mainPtr->bindingTable,
        !           213:                    object, argv[2]);
        !           214:        }
        !           215:        if (argv[3][0] == '+') {
        !           216:            argv[3]++;
        !           217:            append = 1;
        !           218:        }
        !           219:        mask = Tk_CreateBinding(interp, winPtr->mainPtr->bindingTable,
        !           220:                object, argv[2], argv[3], append);
        !           221:        if (mask == 0) {
        !           222:            return TCL_ERROR;
        !           223:        }
        !           224:     } else if (argc == 3) {
        !           225:        char *command;
        !           226: 
        !           227:        command = Tk_GetBinding(interp, winPtr->mainPtr->bindingTable,
        !           228:                object, argv[2]);
        !           229:        if (command == NULL) {
        !           230:            Tcl_ResetResult(interp);
        !           231:            return TCL_OK;
        !           232:        }
        !           233:        interp->result = command;
        !           234:     } else {
        !           235:        Tk_GetAllBindings(interp, winPtr->mainPtr->bindingTable, object);
        !           236:     }
        !           237:     return TCL_OK;
        !           238: }
        !           239: 
        !           240: /*
        !           241:  *----------------------------------------------------------------------
        !           242:  *
        !           243:  * TkBindEventProc --
        !           244:  *
        !           245:  *     This procedure is invoked by Tk_HandleEvent for each event;  it
        !           246:  *     causes any appropriate bindings for that event to be invoked.
        !           247:  *
        !           248:  * Results:
        !           249:  *     None.
        !           250:  *
        !           251:  * Side effects:
        !           252:  *     Depends on what bindings have been established with the "bind"
        !           253:  *     command.
        !           254:  *
        !           255:  *----------------------------------------------------------------------
        !           256:  */
        !           257: 
        !           258: void
        !           259: TkBindEventProc(winPtr, eventPtr)
        !           260:     TkWindow *winPtr;                  /* Pointer to info about window. */
        !           261:     XEvent *eventPtr;                  /* Information about event. */
        !           262: {
        !           263:     ClientData objects[3];
        !           264:     static Tk_Uid allUid = NULL;
        !           265: 
        !           266:     if ((winPtr->mainPtr == NULL) || (winPtr->mainPtr->bindingTable == NULL)) {
        !           267:        return;
        !           268:     }
        !           269:     objects[0] = (ClientData) winPtr->pathName;
        !           270:     objects[1] = (ClientData) winPtr->classUid;
        !           271:     if (allUid == NULL) {
        !           272:        allUid = Tk_GetUid("all");
        !           273:     }
        !           274:     objects[2] = (ClientData) allUid;
        !           275:     Tk_BindEvent(winPtr->mainPtr->bindingTable, eventPtr,
        !           276:            (Tk_Window) winPtr, 3, objects);
        !           277: }
        !           278: 
        !           279: /*
        !           280:  *----------------------------------------------------------------------
        !           281:  *
        !           282:  * Tk_DestroyCmd --
        !           283:  *
        !           284:  *     This procedure is invoked to process the "destroy" Tcl command.
        !           285:  *     See the user documentation for details on what it does.
        !           286:  *
        !           287:  * Results:
        !           288:  *     A standard Tcl result.
        !           289:  *
        !           290:  * Side effects:
        !           291:  *     See the user documentation.
        !           292:  *
        !           293:  *----------------------------------------------------------------------
        !           294:  */
        !           295: 
        !           296: int
        !           297: Tk_DestroyCmd(clientData, interp, argc, argv)
        !           298:     ClientData clientData;             /* Main window associated with
        !           299:                                 * interpreter. */
        !           300:     Tcl_Interp *interp;                /* Current interpreter. */
        !           301:     int argc;                  /* Number of arguments. */
        !           302:     char **argv;               /* Argument strings. */
        !           303: {
        !           304:     Tk_Window window;
        !           305:     Tk_Window tkwin = (Tk_Window) clientData;
        !           306: 
        !           307:     if (argc != 2) {
        !           308:        Tcl_AppendResult(interp, "wrong # args: should be \"",
        !           309:                argv[0], " pathName\"", (char *) NULL);
        !           310:        return TCL_ERROR;
        !           311:     }
        !           312: 
        !           313:     window = Tk_NameToWindow(interp, argv[1], tkwin);
        !           314:     if (window == NULL) {
        !           315:        return TCL_ERROR;
        !           316:     }
        !           317:     Tk_DestroyWindow(window);
        !           318:     return TCL_OK;
        !           319: }
        !           320: 
        !           321: /*
        !           322:  *----------------------------------------------------------------------
        !           323:  *
        !           324:  * Tk_UpdateCmd --
        !           325:  *
        !           326:  *     This procedure is invoked to process the "update" Tcl command.
        !           327:  *     See the user documentation for details on what it does.
        !           328:  *
        !           329:  * Results:
        !           330:  *     A standard Tcl result.
        !           331:  *
        !           332:  * Side effects:
        !           333:  *     See the user documentation.
        !           334:  *
        !           335:  *----------------------------------------------------------------------
        !           336:  */
        !           337: 
        !           338:        /* ARGSUSED */
        !           339: int
        !           340: Tk_UpdateCmd(clientData, interp, argc, argv)
        !           341:     ClientData clientData;     /* Main window associated with
        !           342:                                 * interpreter. */
        !           343:     Tcl_Interp *interp;                /* Current interpreter. */
        !           344:     int argc;                  /* Number of arguments. */
        !           345:     char **argv;               /* Argument strings. */
        !           346: {
        !           347:     Tk_Window tkwin = (Tk_Window) clientData;
        !           348:     int flags;
        !           349: 
        !           350:     if (argc == 1) {
        !           351:        flags = TK_DONT_WAIT;
        !           352:     } else if (argc == 2) {
        !           353:        if (strncmp(argv[1], "idletasks", strlen(argv[1])) != 0) {
        !           354:            Tcl_AppendResult(interp, "bad argument \"", argv[1],
        !           355:                    "\": must be idletasks", (char *) NULL);
        !           356:            return TCL_ERROR;
        !           357:        }
        !           358:        flags = TK_IDLE_EVENTS;
        !           359:     } else {
        !           360:        Tcl_AppendResult(interp, "wrong # args: should be \"",
        !           361:                argv[0], " ?idletasks?\"", (char *) NULL);
        !           362:        return TCL_ERROR;
        !           363:     }
        !           364: 
        !           365:     /*
        !           366:      * Handle all pending events, sync the display, and repeat over
        !           367:      * and over again until all pending events have been handled.
        !           368:      */
        !           369: 
        !           370:     while (1) {
        !           371:        while (Tk_DoOneEvent(flags) != 0) {
        !           372:            /* Empty loop body */
        !           373:        }
        !           374:        XSync(Tk_Display(tkwin), False);
        !           375:        if (Tk_DoOneEvent(flags) == 0) {
        !           376:            break;
        !           377:        }
        !           378:     }
        !           379: 
        !           380:     /*
        !           381:      * Must clear the interpreter's result because event handlers could
        !           382:      * have executed commands.
        !           383:      */
        !           384: 
        !           385:     Tcl_ResetResult(interp);
        !           386:     return TCL_OK;
        !           387: }
        !           388: 
        !           389: /*
        !           390:  *----------------------------------------------------------------------
        !           391:  *
        !           392:  * Tk_TkwaitCmd --
        !           393:  *
        !           394:  *     This procedure is invoked to process the "wait" Tcl command.
        !           395:  *     See the user documentation for details on what it does.
        !           396:  *
        !           397:  * Results:
        !           398:  *     A standard Tcl result.
        !           399:  *
        !           400:  * Side effects:
        !           401:  *     See the user documentation.
        !           402:  *
        !           403:  *----------------------------------------------------------------------
        !           404:  */
        !           405: 
        !           406:        /* ARGSUSED */
        !           407: int
        !           408: Tk_TkwaitCmd(clientData, interp, argc, argv)
        !           409:     ClientData clientData;     /* Main window associated with
        !           410:                                 * interpreter. */
        !           411:     Tcl_Interp *interp;                /* Current interpreter. */
        !           412:     int argc;                  /* Number of arguments. */
        !           413:     char **argv;               /* Argument strings. */
        !           414: {
        !           415:     Tk_Window tkwin = (Tk_Window) clientData;
        !           416:     int c, length;
        !           417:     int done;
        !           418: 
        !           419:     if (argc != 3) {
        !           420:        Tcl_AppendResult(interp, "wrong # args: should be \"",
        !           421:                argv[0], " variable|window name\"", (char *) NULL);
        !           422:        return TCL_ERROR;
        !           423:     }
        !           424:     c = argv[1][0];
        !           425:     length = strlen(argv[1]);
        !           426:     if ((c == 'v') && (strncmp(argv[1], "variable", length) == 0)) {
        !           427:        Tcl_TraceVar(interp, argv[2],
        !           428:                TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
        !           429:                WaitVariableProc, (ClientData) &done);
        !           430:        done = 0;
        !           431:        while (!done) {
        !           432:            Tk_DoOneEvent(0);
        !           433:        }
        !           434:        Tcl_UntraceVar(interp, argv[2],
        !           435:                TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
        !           436:                WaitVariableProc, (ClientData) &done);
        !           437:     } else if ((c == 'w') && (strncmp(argv[1], "window", length) == 0)) {
        !           438:        Tk_Window window;
        !           439: 
        !           440:        window = Tk_NameToWindow(interp, argv[2], tkwin);
        !           441:        if (window == NULL) {
        !           442:            return TCL_ERROR;
        !           443:        }
        !           444:        Tk_CreateEventHandler(window, StructureNotifyMask,
        !           445:            WaitWindowProc, (ClientData) &done);
        !           446:        done = 0;
        !           447:        while (!done) {
        !           448:            Tk_DoOneEvent(0);
        !           449:        }
        !           450:        Tk_DeleteEventHandler(window, StructureNotifyMask,
        !           451:            WaitWindowProc, (ClientData) &done);
        !           452:     } else {
        !           453:        Tcl_AppendResult(interp, "bad option \"", argv[1],
        !           454:                "\": must be variable or window", (char *) NULL);
        !           455:        return TCL_ERROR;
        !           456:     }
        !           457: 
        !           458:     /*
        !           459:      * Clear out the interpreter's result, since it may have been set
        !           460:      * by event handlers.
        !           461:      */
        !           462: 
        !           463:     Tcl_ResetResult(interp);
        !           464:     return TCL_OK;
        !           465: }
        !           466: 
        !           467:        /* ARGSUSED */
        !           468: static char *
        !           469: WaitVariableProc(clientData, interp, name1, name2, flags)
        !           470:     ClientData clientData;     /* Pointer to integer to set to 1. */
        !           471:     Tcl_Interp *interp;                /* Interpreter containing variable. */
        !           472:     char *name1;               /* Name of variable. */
        !           473:     char *name2;               /* Second part of variable name. */
        !           474:     int flags;                 /* Information about what happened. */
        !           475: {
        !           476:     int *donePtr = (int *) clientData;
        !           477: 
        !           478:     *donePtr = 1;
        !           479:     return (char *) NULL;
        !           480: }
        !           481: 
        !           482: static void
        !           483: WaitWindowProc(clientData, eventPtr)
        !           484:     ClientData clientData;     /* Pointer to integer to set to 1. */
        !           485:     XEvent *eventPtr;          /* Information about event. */
        !           486: {
        !           487:     int *donePtr = (int *) clientData;
        !           488: 
        !           489:     if (eventPtr->type == DestroyNotify) {
        !           490:        *donePtr = 1;
        !           491:     }
        !           492: }
        !           493: 
        !           494: /*
        !           495:  *----------------------------------------------------------------------
        !           496:  *
        !           497:  * Tk_WinfoCmd --
        !           498:  *
        !           499:  *     This procedure is invoked to process the "winfo" Tcl command.
        !           500:  *     See the user documentation for details on what it does.
        !           501:  *
        !           502:  * Results:
        !           503:  *     A standard Tcl result.
        !           504:  *
        !           505:  * Side effects:
        !           506:  *     See the user documentation.
        !           507:  *
        !           508:  *----------------------------------------------------------------------
        !           509:  */
        !           510: 
        !           511: int
        !           512: Tk_WinfoCmd(clientData, interp, argc, argv)
        !           513:     ClientData clientData;     /* Main window associated with
        !           514:                                 * interpreter. */
        !           515:     Tcl_Interp *interp;                /* Current interpreter. */
        !           516:     int argc;                  /* Number of arguments. */
        !           517:     char **argv;               /* Argument strings. */
        !           518: {
        !           519:     Tk_Window tkwin = (Tk_Window) clientData;
        !           520:     int length;
        !           521:     char c, *argName;
        !           522:     Tk_Window window;
        !           523:     register TkWindow *winPtr;
        !           524: 
        !           525: #define SETUP(name) \
        !           526:     if (argc != 3) {\
        !           527:        argName = name; \
        !           528:        goto wrongArgs; \
        !           529:     } \
        !           530:     window = Tk_NameToWindow(interp, argv[2], tkwin); \
        !           531:     if (window == NULL) { \
        !           532:        return TCL_ERROR; \
        !           533:     }
        !           534: 
        !           535:     if (argc < 2) {
        !           536:        Tcl_AppendResult(interp, "wrong # args: should be \"",
        !           537:                argv[0], " option ?arg?\"", (char *) NULL);
        !           538:        return TCL_ERROR;
        !           539:     }
        !           540:     c = argv[1][0];
        !           541:     length = strlen(argv[1]);
        !           542:     if ((c == 'a') && (strcmp(argv[1], "atom") == 0)) {
        !           543:        if (argc != 3) {
        !           544:            Tcl_AppendResult(interp, "wrong # args: should be \"",
        !           545:                    argv[0], " atom name\"", (char *) NULL);
        !           546:            return TCL_ERROR;
        !           547:        }
        !           548:        sprintf(interp->result, "%d", Tk_InternAtom(tkwin, argv[2]));
        !           549:     } else if ((c == 'a') && (strncmp(argv[1], "atomname", length) == 0)
        !           550:            && (length >= 5)) {
        !           551:        Atom atom;
        !           552:        char *name;
        !           553: 
        !           554:        if (argc != 3) {
        !           555:            Tcl_AppendResult(interp, "wrong # args: should be \"",
        !           556:                    argv[0], " atomname id\"", (char *) NULL);
        !           557:            return TCL_ERROR;
        !           558:        }
        !           559:        if (Tcl_GetInt(interp, argv[2], (int *) &atom) != TCL_OK) {
        !           560:            return TCL_ERROR;
        !           561:        }
        !           562:        name = Tk_GetAtomName(tkwin, atom);
        !           563:        if (strcmp(name, "?bad atom?") == 0) {
        !           564:            Tcl_AppendResult(interp, "no atom exists with id \"",
        !           565:                    argv[2], "\"", (char *) NULL);
        !           566:            return TCL_ERROR;
        !           567:        }
        !           568:        interp->result = name;
        !           569:     } else if ((c == 'c') && (strncmp(argv[1], "children", length) == 0)
        !           570:            && (length >= 2)) {
        !           571:        char *separator, *childName;
        !           572: 
        !           573:        SETUP("children");
        !           574:        separator = "";
        !           575:        for (winPtr = ((TkWindow *) window)->childList; winPtr != NULL;
        !           576:                winPtr = winPtr->nextPtr) {
        !           577:            childName = Tcl_Merge(1, &winPtr->pathName);
        !           578:            Tcl_AppendResult(interp, separator, childName, (char *) NULL);
        !           579:            ckfree(childName);
        !           580:            separator = " ";
        !           581:        }
        !           582:     } else if ((c == 'c') && (strncmp(argv[1], "class", length) == 0)
        !           583:            && (length >= 2)) {
        !           584:        SETUP("class");
        !           585:        interp->result = Tk_Class(window);
        !           586:     } else if ((c == 'c') && (strncmp(argv[1], "containing", length) == 0)
        !           587:            && (length >= 2)) {
        !           588:        int rootX, rootY;
        !           589: 
        !           590:        if (argc != 4) {
        !           591:            Tcl_AppendResult(interp, "wrong # args: should be \"",
        !           592:                    argv[0], " containing rootX rootY\"", (char *) NULL);
        !           593:            return TCL_ERROR;
        !           594:        }
        !           595:        if ((Tk_GetPixels(interp, tkwin, argv[2], &rootX) != TCL_OK)
        !           596:                || (Tk_GetPixels(interp, tkwin, argv[3], &rootY) != TCL_OK)) {
        !           597:            return TCL_ERROR;
        !           598:        }
        !           599:        window = Tk_CoordsToWindow(rootX, rootY, tkwin);
        !           600:        if (window != NULL) {
        !           601:            interp->result = Tk_PathName(window);
        !           602:        }
        !           603:     } else if ((c == 'f') && (strncmp(argv[1], "fpixels", length) == 0)
        !           604:            && (length >= 2)) {
        !           605:        double mm, pixels;
        !           606: 
        !           607:        if (argc != 4) {
        !           608:            Tcl_AppendResult(interp, "wrong # args: should be \"",
        !           609:                    argv[0], " fpixels window number\"", (char *) NULL);
        !           610:            return TCL_ERROR;
        !           611:        }
        !           612:        window = Tk_NameToWindow(interp, argv[2], tkwin);
        !           613:        if (window == NULL) {
        !           614:            return TCL_ERROR;
        !           615:        }
        !           616:        if (Tk_GetScreenMM(interp, window, argv[3], &mm) != TCL_OK) {
        !           617:            return TCL_ERROR;
        !           618:        }
        !           619:        pixels = mm * WidthOfScreen(Tk_Screen(window))
        !           620:                / WidthMMOfScreen(Tk_Screen(window));
        !           621:        sprintf(interp->result, "%g", pixels);
        !           622:     } else if ((c == 'g') && (strncmp(argv[1], "geometry", length) == 0)) {
        !           623:        SETUP("geometry");
        !           624:        sprintf(interp->result, "%dx%d+%d+%d", Tk_Width(window),
        !           625:                Tk_Height(window), Tk_X(window), Tk_Y(window));
        !           626:     } else if ((c == 'h') && (strncmp(argv[1], "height", length) == 0)) {
        !           627:        SETUP("height");
        !           628:        sprintf(interp->result, "%d", Tk_Height(window));
        !           629:     } else if ((c == 'i') && (strcmp(argv[1], "id") == 0)) {
        !           630:        SETUP("id");
        !           631:        sprintf(interp->result, "0x%x", Tk_WindowId(window));
        !           632:     } else if ((c == 'i') && (strncmp(argv[1], "interps", length) == 0)
        !           633:            && (length >= 2)) {
        !           634:        if (argc != 2) {
        !           635:            Tcl_AppendResult(interp, "wrong # args:  should be \"",
        !           636:                    argv[1], " interps\"", (char *) NULL);
        !           637:            return TCL_ERROR;
        !           638:        }
        !           639:        return TkGetInterpNames(interp, tkwin);
        !           640:     } else if ((c == 'i') && (strncmp(argv[1], "ismapped", length) == 0)
        !           641:            && (length >= 2)) {
        !           642:        SETUP("ismapped");
        !           643:        interp->result = Tk_IsMapped(window) ? "1" : "0";
        !           644:     } else if ((c == 'n') && (strncmp(argv[1], "name", length) == 0)) {
        !           645:        SETUP("geometry");
        !           646:        interp->result = Tk_Name(window);
        !           647:     } else if ((c == 'p') && (strncmp(argv[1], "parent", length) == 0)) {
        !           648:        SETUP("geometry");
        !           649:        winPtr = (TkWindow *) window;
        !           650:        if (winPtr->parentPtr != NULL) {
        !           651:            interp->result = winPtr->parentPtr->pathName;
        !           652:        }
        !           653:     } else if ((c == 'p') && (strncmp(argv[1], "pathname", length) == 0)
        !           654:            && (length >= 2)) {
        !           655:        Window id;
        !           656: 
        !           657:        if (argc != 3) {
        !           658:            argName = "pathname";
        !           659:            goto wrongArgs;
        !           660:        }
        !           661:        if (Tcl_GetInt(interp, argv[2], (int *) &id) != TCL_OK) {
        !           662:            return TCL_ERROR;
        !           663:        }
        !           664:        if ((XFindContext(Tk_Display(tkwin), id, tkWindowContext,
        !           665:                (void *) &window) != 0) || (((TkWindow *) window)->mainPtr
        !           666:                != ((TkWindow *) tkwin)->mainPtr)) {
        !           667:            Tcl_AppendResult(interp, "window id \"", argv[2],
        !           668:                    "\" doesn't exist in this application", (char *) NULL);
        !           669:            return TCL_ERROR;
        !           670:        }
        !           671:        interp->result = Tk_PathName(window);
        !           672:     } else if ((c == 'p') && (strncmp(argv[1], "pixels", length) == 0)
        !           673:            && (length >= 2)) {
        !           674:        int pixels;
        !           675: 
        !           676:        if (argc != 4) {
        !           677:            Tcl_AppendResult(interp, "wrong # args: should be \"",
        !           678:                    argv[0], " pixels window number\"", (char *) NULL);
        !           679:            return TCL_ERROR;
        !           680:        }
        !           681:        window = Tk_NameToWindow(interp, argv[2], tkwin);
        !           682:        if (window == NULL) {
        !           683:            return TCL_ERROR;
        !           684:        }
        !           685:        if (Tk_GetPixels(interp, window, argv[3], &pixels) != TCL_OK) {
        !           686:            return TCL_ERROR;
        !           687:        }
        !           688:        sprintf(interp->result, "%d", pixels);
        !           689:     } else if ((c == 'r') && (strncmp(argv[1], "reqheight", length) == 0)
        !           690:            && (length >= 4)) {
        !           691:        SETUP("reqheight");
        !           692:        sprintf(interp->result, "%d", Tk_ReqHeight(window));
        !           693:     } else if ((c == 'r') && (strncmp(argv[1], "reqwidth", length) == 0)
        !           694:            && (length >= 4)) {
        !           695:        SETUP("reqwidth");
        !           696:        sprintf(interp->result, "%d", Tk_ReqWidth(window));
        !           697:     } else if ((c == 'r') && (strcmp(argv[1], "rootx") == 0)) {
        !           698:        int x, y;
        !           699: 
        !           700:        SETUP("rootx");
        !           701:        Tk_GetRootCoords(window, &x, &y);
        !           702:        sprintf(interp->result, "%d", x);
        !           703:     } else if ((c == 'r') && (strcmp(argv[1], "rooty") == 0)) {
        !           704:        int x, y;
        !           705: 
        !           706:        SETUP("rooty");
        !           707:        Tk_GetRootCoords(window, &x, &y);
        !           708:        sprintf(interp->result, "%d", y);
        !           709:     } else if ((c == 's') && (strcmp(argv[1], "screen") == 0)) {
        !           710:        char string[20];
        !           711: 
        !           712:        SETUP("screen");
        !           713:        sprintf(string, "%d", Tk_ScreenNumber(window));
        !           714:        Tcl_AppendResult(interp, Tk_DisplayName(window), ".", string,
        !           715:                (char *) NULL);
        !           716:     } else if ((c == 's') && (strncmp(argv[1], "screencells", length) == 0)
        !           717:            && (length >= 7)) {
        !           718:        SETUP("screencells");
        !           719:        sprintf(interp->result, "%d", Tk_DefaultVisual(Tk_Screen(window))->map_entries);
        !           720:     } else if ((c == 's') && (strncmp(argv[1], "screendepth", length) == 0)
        !           721:            && (length >= 7)) {
        !           722:        SETUP("screendepth");
        !           723:        sprintf(interp->result, "%d", Tk_DefaultDepth(Tk_Screen(window)));
        !           724:     } else if ((c == 's') && (strncmp(argv[1], "screenheight", length) == 0)
        !           725:            && (length >= 7)) {
        !           726:        SETUP("screenheight");
        !           727:        sprintf(interp->result, "%d",  HeightOfScreen(Tk_Screen(window)));
        !           728:     } else if ((c == 's') && (strncmp(argv[1], "screenmmheight", length) == 0)
        !           729:            && (length >= 9)) {
        !           730:        SETUP("screenmmheight");
        !           731:        sprintf(interp->result, "%d",  HeightMMOfScreen(Tk_Screen(window)));
        !           732:     } else if ((c == 's') && (strncmp(argv[1], "screenmmwidth", length) == 0)
        !           733:            && (length >= 9)) {
        !           734:        SETUP("screenmmwidth");
        !           735:        sprintf(interp->result, "%d",  WidthMMOfScreen(Tk_Screen(window)));
        !           736:     } else if ((c == 's') && (strncmp(argv[1], "screenvisual", length) == 0)
        !           737:            && (length >= 7)) {
        !           738:        SETUP("screenvisual");
        !           739:        switch (Tk_DefaultVisual(Tk_Screen(window))->class) {
        !           740:            case PseudoColor:   interp->result = "pseudocolor"; break;
        !           741:            case GrayScale:     interp->result = "grayscale"; break;
        !           742:            case DirectColor:   interp->result = "directcolor"; break;
        !           743:            case TrueColor:     interp->result = "truecolor"; break;
        !           744:            case StaticColor:   interp->result = "staticcolor"; break;
        !           745:            case StaticGray:    interp->result = "staticgray"; break;
        !           746:            default:            interp->result = "unknown"; break;
        !           747:        }
        !           748:     } else if ((c == 's') && (strncmp(argv[1], "screenwidth", length) == 0)
        !           749:            && (length >= 7)) {
        !           750:        SETUP("screenwidth");
        !           751:        sprintf(interp->result, "%d",  WidthOfScreen(Tk_Screen(window)));
        !           752:     } else if ((c == 's') && (strcmp(argv[1], "server") == 0)) {
        !           753:        SETUP("server");
        !           754:        Tcl_AppendResult(interp, Tk_DisplayName(window), (char *) NULL);
        !           755:     } else if ((c == 't') && (strncmp(argv[1], "toplevel", length) == 0)) {
        !           756:        SETUP("toplevel");
        !           757:        for (winPtr = (TkWindow *) window; !(winPtr->flags & TK_TOP_LEVEL);
        !           758:                winPtr = winPtr->parentPtr) {
        !           759:            /* Empty loop body. */
        !           760:        }
        !           761:        interp->result = winPtr->pathName;
        !           762:     } else if ((c == 'w') && (strncmp(argv[1], "width", length) == 0)) {
        !           763:        SETUP("width");
        !           764:        sprintf(interp->result, "%d", Tk_Width(window));
        !           765:     } else if ((c == 'x') && (argv[1][1] == '\0')) {
        !           766:        SETUP("x");
        !           767:        sprintf(interp->result, "%d", Tk_X(window));
        !           768:     } else if ((c == 'y') && (argv[1][1] == '\0')) {
        !           769:        SETUP("y");
        !           770:        sprintf(interp->result, "%d", Tk_Y(window));
        !           771:     } else {
        !           772:        Tcl_AppendResult(interp, "bad option \"", argv[1],
        !           773:                "\": must be atom, atomname, children, class, fpixels, geometry, height, ",
        !           774:                "id, interps, ismapped, name, parent, pathname, ",
        !           775:                "pixels, reqheight, reqwidth, rootx, rooty, ",
        !           776:                "screen, screencells, screendepth, screenheight, ",
        !           777:                "screenmmheight, screenmmwidth, screenvisual, ",
        !           778:                "screenwidth, toplevel, width, x, or y", (char *) NULL);
        !           779:        return TCL_ERROR;
        !           780:     }
        !           781:     return TCL_OK;
        !           782: 
        !           783:     wrongArgs:
        !           784:     Tcl_AppendResult(interp, "wrong # arguments: must be \"",
        !           785:            argv[0], " ", argName, " window\"", (char *) NULL);
        !           786:     return TCL_ERROR;
        !           787: }
        !           788: 
        !           789: /*
        !           790:  *----------------------------------------------------------------------
        !           791:  *
        !           792:  * TkDeadAppCmd --
        !           793:  *
        !           794:  *     If an application has been deleted then all Tk commands will be
        !           795:  *     re-bound to this procedure.
        !           796:  *
        !           797:  * Results:
        !           798:  *     A standard Tcl error is reported to let the user know that
        !           799:  *     the application is dead.
        !           800:  *
        !           801:  * Side effects:
        !           802:  *     See the user documentation.
        !           803:  *
        !           804:  *----------------------------------------------------------------------
        !           805:  */
        !           806: 
        !           807:        /* ARGSUSED */
        !           808: int
        !           809: TkDeadAppCmd(clientData, interp, argc, argv)
        !           810:     ClientData clientData;     /* Dummy. */
        !           811:     Tcl_Interp *interp;                /* Current interpreter. */
        !           812:     int argc;                  /* Number of arguments. */
        !           813:     char **argv;               /* Argument strings. */
        !           814: {
        !           815:     Tcl_AppendResult(interp, "can't invoke \"", argv[0],
        !           816:            "\" command:  application has been destroyed", (char *) NULL);
        !           817:     return TCL_ERROR;
        !           818: }

unix.superglobalmegacorp.com

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