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

1.1     ! root        1: /* 
        !             2:  * tkPixmap.c --
        !             3:  *
        !             4:  *     This file maintains a database of read-only pixmaps for the Tk
        !             5:  *     toolkit.  This allows pixmaps to be shared between widgets and
        !             6:  *     also avoids interactions with the X server.
        !             7:  *
        !             8:  * Copyright 1992 by Sven Delmas
        !             9:  *
        !            10:  * This source is based upon the file tkBitmap.c from:
        !            11:  *
        !            12:  * Copyright 1990-1992 Regents of the University of California
        !            13:  * Permission to use, copy, modify, and distribute this
        !            14:  * software and its documentation for any purpose and without
        !            15:  * fee is hereby granted, provided that the above copyright
        !            16:  * notice appear in all copies.  The University of California
        !            17:  * makes no representations about the suitability of this
        !            18:  * software for any purpose.  It is provided "as is" without
        !            19:  * express or implied warranty.
        !            20:  *   file: /user6/ouster/wish/RCS/tkBitmap.c,v 1.16
        !            21:  *           92/08/24 09:45:43 ouster Exp $ SPRITE (Berkeley);
        !            22:  */
        !            23: 
        !            24: #if defined(USE_XPM3)
        !            25: 
        !            26: #ifndef lint
        !            27: static char *AtFSid = "$Header: tkPixmap.c[1.1] Mon Sep 28 14:12:35 1992 [email protected] frozen $";
        !            28: #endif /* not lint */
        !            29: 
        !            30: #include "tkconfig.h"
        !            31: #include "tk.h"
        !            32: 
        !            33: /*
        !            34:  * The includes below are for pre-defined bitmaps.
        !            35:  */
        !            36: 
        !            37: #include "bitmaps/gray50"
        !            38: #include "bitmaps/gray25"
        !            39: 
        !            40: /*
        !            41:  * Include the xpm 3 defines for color pixmaps
        !            42:  */
        !            43: //#include "xpmtk.h"
        !            44: #include <xpm.h>
        !            45: 
        !            46: /*
        !            47:  * One of the following data structures exists for each bitmap that is
        !            48:  * currently in use.  Each structure is indexed with both "idTable" and
        !            49:  * "nameTable".
        !            50:  */
        !            51: 
        !            52: typedef struct {
        !            53:     Pixmap bitmap;             /* X identifier for bitmap.  None means this
        !            54:                                 * bitmap was created by Tk_DefinePixmap
        !            55:                                 * and it isn't currently in use. */
        !            56:     unsigned int width, height;        /* Dimensions of bitmap. */
        !            57:     Display *display;          /* Display for which bitmap is valid. */
        !            58:     int refCount;              /* Number of active uses of bitmap. */
        !            59:     Tcl_HashEntry *hashPtr;    /* Entry in nameTable for this structure
        !            60:                                 * (needed when deleting). */
        !            61: } TkBitmap;
        !            62: 
        !            63: /*
        !            64:  * Hash table to map from a textual description of a bitmap to the
        !            65:  * TkBitmap record for the bitmap, and key structure used in that
        !            66:  * hash table:
        !            67:  */
        !            68: 
        !            69: static Tcl_HashTable nameTable;
        !            70: typedef struct {
        !            71:     Tk_Uid name;               /* Textual name for desired bitmap. */
        !            72:     Screen *screen;            /* Screen for which bitmap will be used. */
        !            73: } NameKey;
        !            74: 
        !            75: /*
        !            76:  * Hash table that maps from bitmap identifiers to the TkBitmap structure
        !            77:  * for the pixmap.  This table is indexed by Bitmap ids, and is used by
        !            78:  * Tk_FreePixmap.
        !            79:  */
        !            80: 
        !            81: static Tcl_HashTable idTable;
        !            82: 
        !            83: /*
        !            84:  * For each call to Tk_DefinePixmap one of the following structures is
        !            85:  * created to hold information about the pixmap.
        !            86:  */
        !            87: 
        !            88: typedef struct {
        !            89:     char *source;              /* Bits for bitmap. */
        !            90:     Pixmap pixmap;              /* Pre-defined pixmap */
        !            91:     unsigned int width, height;        /* Dimensions of bitmap. */
        !            92: } PredefBitmap;
        !            93: 
        !            94: /*
        !            95:  * Hash table create by Tk_DefinePixmap to map from a name to a
        !            96:  * collection of in-core data about a bitmap.  The table is
        !            97:  * indexed by the address of the data for the bitmap, and the entries
        !            98:  * contain pointers to PredefBitmap structures.
        !            99:  */
        !           100: 
        !           101: static Tcl_HashTable predefTable;
        !           102: 
        !           103: /*
        !           104:  * Hash table used by Tk_GetPixmapFromData to map from a collection
        !           105:  * of in-core data about a bitmap to a Tk_Uid giving an automatically-
        !           106:  * generated name for the bitmap:
        !           107:  */
        !           108: 
        !           109: static Tcl_HashTable dataTable;
        !           110: typedef struct {
        !           111:     char *source;              /* Bitmap bits. */
        !           112:     unsigned int width, height;        /* Dimensions of bitmap. */
        !           113: } DataKey;
        !           114: 
        !           115: static int initialized = 0;    /* 0 means static structures haven't been
        !           116:                                 * initialized yet. */
        !           117: 
        !           118: /*
        !           119:  * Forward declarations for procedures defined in this file:
        !           120:  */
        !           121: 
        !           122: static void            PixmapInit _ANSI_ARGS_((Tk_Window tkwin));
        !           123: 
        !           124: /*
        !           125:  *----------------------------------------------------------------------
        !           126:  *
        !           127:  * Tk_GetPixmap --
        !           128:  *
        !           129:  *     Given a string describing a bitmap or pixmap, locate (or create
        !           130:  *      if necessary) a pixmap that fits the description.
        !           131:  *
        !           132:  * Results:
        !           133:  *     The return value is the X identifer for the desired pixmap,
        !           134:  *      unless string couldn't be parsed correctly.  In this case,
        !           135:  *      None is returned and an error message is left in
        !           136:  *      interp->result.  The caller should never modify the pixmap
        !           137:  *      that is returned, and should eventually call Tk_FreePixmap
        !           138:  *      when the pixmap is no longer needed.
        !           139:  *
        !           140:  * Side effects:
        !           141:  *     The pixmap is added to an internal database with a reference count.
        !           142:  *     For each call to this procedure, there should eventually be a call
        !           143:  *     to Tk_FreePixmap, so that the database can be cleaned up when pixmaps
        !           144:  *     aren't needed anymore.
        !           145:  *
        !           146:  *----------------------------------------------------------------------
        !           147:  */
        !           148: Pixmap
        !           149: Tk_GetPixmap(interp, tkwin, string)
        !           150:     Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
        !           151:     Tk_Window tkwin;           /* Window in which pixmap will be used. */
        !           152:     Tk_Uid string;             /* Description of pixmap.  See manual entry
        !           153:                                 * for details on legal syntax. */
        !           154: {
        !           155:     NameKey key;
        !           156:     Tcl_HashEntry *nameHashPtr, *idHashPtr, *predefHashPtr;
        !           157:     register TkBitmap *bitmapPtr;
        !           158:     PredefBitmap *predefPtr;
        !           159:     int new;
        !           160:     Pixmap bitmap;
        !           161:     Pixmap bitmap_shape;
        !           162:     unsigned int width, height;
        !           163:     int dummy2;
        !           164:     XpmAttributes xpm_attributes;
        !           165:     Display *dpy = Tk_Display(tkwin);
        !           166: 
        !           167:     if (!initialized) {
        !           168:        PixmapInit(tkwin);
        !           169:     }
        !           170: 
        !           171:     key.name = string;
        !           172:     key.screen = Tk_Screen(tkwin);
        !           173:     nameHashPtr = Tcl_CreateHashEntry(&nameTable, (char *) &key, &new);
        !           174:     if (!new) {
        !           175:        bitmapPtr = (TkBitmap *) Tcl_GetHashValue(nameHashPtr);
        !           176:        bitmapPtr->refCount++;
        !           177:        return bitmapPtr->bitmap;
        !           178:     }
        !           179: 
        !           180:     /*
        !           181:      * No suitable bitmap exists.  Create a new bitmap from the
        !           182:      * information contained in the string.  If the string starts
        !           183:      * with "@" then the rest of the string is a file name containing
        !           184:      * the bitmap.  Otherwise the string must refer to a bitmap
        !           185:      * defined by a call to Tk_DefinePixmap.
        !           186:      */
        !           187: 
        !           188:     if (*string == '@') {
        !           189:        string = Tcl_TildeSubst(interp, string + 1);
        !           190:        if (string == NULL) {
        !           191:            goto error;
        !           192:        }
        !           193: 
        !           194:        if (XReadBitmapFile(dpy, RootWindowOfScreen(Tk_Screen(tkwin)),
        !           195:                string, &width, &height, &bitmap_shape, &dummy2, &dummy2)
        !           196:                != BitmapSuccess)
        !           197:          {
        !           198:            xpm_attributes.visual = Tk_DefaultVisual(Tk_Screen(tkwin));
        !           199:            xpm_attributes.colormap = Tk_DefaultColormap(Tk_Screen(tkwin));
        !           200:            xpm_attributes.depth = Tk_DefaultDepth(Tk_Screen(tkwin));
        !           201:            xpm_attributes.valuemask = XpmVisual | XpmColormap | XpmDepth;
        !           202: 
        !           203:            if (XpmReadFileToPixmap(dpy, RootWindowOfScreen(Tk_Screen(tkwin)),
        !           204:                                    string, &bitmap, &bitmap_shape,
        !           205:                                    &xpm_attributes) != BitmapSuccess) {
        !           206:                Tcl_AppendResult(interp, "error reading bitmap file \"",
        !           207:                               string, "\"", (char *) NULL);
        !           208:                goto error;
        !           209:            } {
        !           210:                 width = xpm_attributes.width;
        !           211:                 height = xpm_attributes.height;
        !           212:                XpmFreeAttributes(&xpm_attributes);
        !           213:            }
        !           214:        } else {
        !           215:             bitmap = XCreatePixmap(dpy, RootWindowOfScreen(Tk_Screen(tkwin)),
        !           216:                                   width, height,
        !           217:                                   Tk_DefaultDepth(Tk_Screen(tkwin)));
        !           218:            XCopyPlane(dpy, bitmap_shape, bitmap,
        !           219:                       Tk_DefaultGC(Tk_Screen(tkwin)),
        !           220:                       0, 0, width, height, 0, 0, 1);
        !           221:        }
        !           222:     } else {
        !           223:         /* first try for a display-specific version */
        !           224:        predefHashPtr = Tcl_FindHashEntry(&predefTable, (char *) &key);
        !           225:        if (predefHashPtr == NULL) {
        !           226:             /* try for a non-display specific version */
        !           227:            key.screen = (Screen*) NULL;
        !           228:            predefHashPtr = Tcl_FindHashEntry(&predefTable, (char *) &key);
        !           229:            if (predefHashPtr == NULL) {
        !           230:                /* give up */
        !           231:                Tcl_AppendResult(interp, "pixmap \"", string,
        !           232:                                 "\" not defined", (char *) NULL);
        !           233:                goto error;
        !           234:            }
        !           235:        }
        !           236:        predefPtr = (PredefBitmap *) Tcl_GetHashValue(predefHashPtr);
        !           237:        width = predefPtr->width;
        !           238:        height = predefPtr->height;
        !           239:        if (predefPtr->source != NULL) {
        !           240:            bitmap_shape =
        !           241:                XCreateBitmapFromData(dpy, Tk_DefaultRootWindow(dpy),
        !           242:                                      predefPtr->source, width, height);
        !           243:            bitmap = XCreatePixmap(dpy, RootWindowOfScreen(Tk_Screen(tkwin)),
        !           244:                                   width, height,
        !           245:                                   Tk_DefaultDepth(Tk_Screen(tkwin)));
        !           246:            XCopyPlane(dpy, bitmap_shape, bitmap,
        !           247:                       Tk_DefaultGC(Tk_Screen(tkwin)),
        !           248:                       0, 0, width, height, 0, 0, 1);
        !           249:        } else {
        !           250:            if (predefPtr->pixmap != None) {
        !           251:                bitmap = predefPtr->pixmap;
        !           252:            } else {
        !           253:              bitmap =
        !           254:                  XCreatePixmap(dpy, RootWindowOfScreen(Tk_Screen(tkwin)),
        !           255:                                width, height,
        !           256:                                Tk_DefaultDepth(Tk_Screen(tkwin)));
        !           257:            }
        !           258:         }
        !           259:     }
        !           260: 
        !           261:     /*
        !           262:      * Add information about this bitmap to our database.
        !           263:      */
        !           264: 
        !           265:     bitmapPtr = (TkBitmap *) ckalloc(sizeof(TkBitmap));
        !           266:     bitmapPtr->bitmap = bitmap;
        !           267:     bitmapPtr->width = width;
        !           268:     bitmapPtr->height = height;
        !           269:     bitmapPtr->display = dpy;
        !           270:     bitmapPtr->refCount = 1;
        !           271:     bitmapPtr->hashPtr = nameHashPtr;
        !           272:     idHashPtr = Tcl_CreateHashEntry(&idTable, (char *) bitmapPtr->bitmap,
        !           273:            &new);
        !           274:     if (!new) {
        !           275: /* deh patched to support multiple displays */
        !           276: /*     panic("pixmap already registered in Tk_GetPixmap"); */
        !           277:         bitmapPtr->refCount = 1000;
        !           278:     }
        !           279:     Tcl_SetHashValue(nameHashPtr, bitmapPtr);
        !           280:     Tcl_SetHashValue(idHashPtr, bitmapPtr);
        !           281:     return bitmapPtr->bitmap;
        !           282: 
        !           283:     error:
        !           284:     Tcl_DeleteHashEntry(nameHashPtr);
        !           285:     return None;
        !           286: }
        !           287: 
        !           288: /*
        !           289:  *----------------------------------------------------------------------
        !           290:  *
        !           291:  * Tk_DefinePixmap --
        !           292:  *
        !           293:  *     This procedure associates a textual name with a binary pixmap
        !           294:  *     description, so that the name may be used to refer to the
        !           295:  *     pixmap in future calls to Tk_GetPixmap. The pixmap can
        !           296:  *      be pre-created by the user, or can be created later
        !           297:  *      by Tk_GetPixmap().  Since pixmaps are display-specific,
        !           298:  *      a user supplied pixmap will be associated with tkwin's display.
        !           299:  *      If pixmap is given as None, then a new pixmap will be created
        !           300:  *      by Tk_GetPixmap for each unique display.
        !           301:  *
        !           302:  * Results:
        !           303:  *     A standard Tcl result.  If an error occurs then TCL_ERROR is
        !           304:  *     returned and a message is left in interp->result.
        !           305:  *
        !           306:  * Side effects:
        !           307:  *     "Name" is entered into the pixmap table and may be used from
        !           308:  *     here on to refer to the given pixmap.
        !           309:  *
        !           310:  *----------------------------------------------------------------------
        !           311:  */
        !           312: 
        !           313: int
        !           314: Tk_DefinePixmap(interp, name, tkwin, pixmap, source, width, height)
        !           315:     Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
        !           316:     Tk_Uid name;               /* Name to use for bitmap.  Must not already
        !           317:                                 * be defined as a bitmap. */
        !           318:     Tk_Window tkwin;            /* any window on screen where pixmap lives */
        !           319:     Pixmap pixmap;              /* pixmap to associate with name,
        !           320:                                 * or None to create a new pixmap */
        !           321:     char *source;              /* Address of bits for bitmap. */
        !           322:     unsigned int width;                /* Width of bitmap. */
        !           323:     unsigned int height;       /* Height of bitmap. */
        !           324: {
        !           325:     int new;
        !           326:     Tcl_HashEntry *predefHashPtr;
        !           327:     PredefBitmap *predefPtr;
        !           328:     NameKey key;
        !           329: 
        !           330:     if (!initialized) {
        !           331:        PixmapInit(tkwin);
        !           332:     }
        !           333: 
        !           334:     key.name = name;
        !           335:     key.screen = (pixmap != None) ? Tk_Screen(tkwin) : (Screen *)NULL;
        !           336:     predefHashPtr = Tcl_CreateHashEntry(&predefTable, (char *) &key, &new);
        !           337:     if (!new) {
        !           338:         Tcl_AppendResult(interp, "bitmap \"", name,
        !           339:                "\" is already defined", (char *) NULL);
        !           340:        return TCL_ERROR;
        !           341:     }
        !           342:     predefPtr = (PredefBitmap *) malloc(sizeof(PredefBitmap));
        !           343:     predefPtr->source = source;
        !           344:     predefPtr->pixmap = pixmap;
        !           345:     predefPtr->width = width;
        !           346:     predefPtr->height = height;
        !           347:     Tcl_SetHashValue(predefHashPtr, predefPtr);
        !           348:     return TCL_OK;
        !           349: }
        !           350: 
        !           351: /*
        !           352:  *--------------------------------------------------------------
        !           353:  *
        !           354:  * Tk_NameOfPixmap --
        !           355:  *
        !           356:  *     Given a pixmap, return a textual string identifying the
        !           357:  *     pixmap.
        !           358:  *
        !           359:  * Results:
        !           360:  *     The return value is the string name associated with pixmap.
        !           361:  *
        !           362:  * Side effects:
        !           363:  *     None.
        !           364:  *
        !           365:  *--------------------------------------------------------------
        !           366:  */
        !           367: 
        !           368: Tk_Uid
        !           369: Tk_NameOfPixmap(bitmap)
        !           370:     Pixmap bitmap;                     /* Bitmap whose name is wanted. */
        !           371: {
        !           372:     Tcl_HashEntry *idHashPtr;
        !           373:     TkBitmap *bitmapPtr;
        !           374: 
        !           375:     if (!initialized) {
        !           376:        unknown:
        !           377:        panic("Tk_NameOfPixmap received unknown pixmap argument");
        !           378:     }
        !           379: 
        !           380:     idHashPtr = Tcl_FindHashEntry(&idTable, (char *) bitmap);
        !           381:     if (idHashPtr == NULL) {
        !           382:        goto unknown;
        !           383:     }
        !           384:     bitmapPtr = (TkBitmap *) Tcl_GetHashValue(idHashPtr);
        !           385:     if (bitmapPtr->hashPtr == NULL) {
        !           386:         /* the bitmap has been un-defined */
        !           387:         return Tk_GetUid("UndefinedBitmap");
        !           388:     }
        !           389:     return ((NameKey *) bitmapPtr->hashPtr->key.words)->name;
        !           390: }
        !           391: 
        !           392: /*
        !           393:  *--------------------------------------------------------------
        !           394:  *
        !           395:  * Tk_SizeOfPixmap --
        !           396:  *
        !           397:  *     Given a pixmap managed by this module, returns the width
        !           398:  *     and height of the pixmap..
        !           399:  *
        !           400:  * Results:
        !           401:  *     The words at *widthPtr and *heightPtr are filled in with
        !           402:  *     the dimenstions of pixmap.
        !           403:  *
        !           404:  * Side effects:
        !           405:  *     If pixmap isn't managed by this module then the procedure
        !           406:  *     panics..
        !           407:  *
        !           408:  *--------------------------------------------------------------
        !           409:  */
        !           410: 
        !           411: void
        !           412: Tk_SizeOfPixmap(bitmap, widthPtr, heightPtr)
        !           413:     Pixmap bitmap;                     /* Bitmap whose size is wanted. */
        !           414:     unsigned int *widthPtr;            /* Store bitmap width here. */
        !           415:     unsigned int *heightPtr;           /* Store bitmap height here. */
        !           416: {
        !           417:     Tcl_HashEntry *idHashPtr;
        !           418:     TkBitmap *bitmapPtr;
        !           419: 
        !           420:     if (!initialized) {
        !           421:        unknownBitmap:
        !           422:        panic("Tk_SizeOfPixmap received unknown pixmap argument");
        !           423:     }
        !           424: 
        !           425:     idHashPtr = Tcl_FindHashEntry(&idTable, (char *) bitmap);
        !           426:     if (idHashPtr == NULL) {
        !           427:        goto unknownBitmap;
        !           428:     }
        !           429:     bitmapPtr = (TkBitmap *) Tcl_GetHashValue(idHashPtr);
        !           430:     *widthPtr = bitmapPtr->width;
        !           431:     *heightPtr = bitmapPtr->height;
        !           432: }
        !           433: 
        !           434: /*
        !           435:  *----------------------------------------------------------------------
        !           436:  *
        !           437:  * Tk_FreePixmap --
        !           438:  *
        !           439:  *     This procedure is called to release a pixmap allocated by
        !           440:  *     Tk_GetPixmap.
        !           441:  *
        !           442:  * Results:
        !           443:  *     None.
        !           444:  *
        !           445:  * Side effects:
        !           446:  *     The reference count associated with bitmap is decremented, and
        !           447:  *     it is officially deallocated if no-one is using it anymore.
        !           448:  *
        !           449:  *----------------------------------------------------------------------
        !           450:  */
        !           451: 
        !           452: void
        !           453: Tk_FreePixmap(bitmap)
        !           454:     Pixmap bitmap;                     /* Bitmap to be released. */
        !           455: {
        !           456:     Tcl_HashEntry *idHashPtr;
        !           457:     register TkBitmap *bitmapPtr;
        !           458: 
        !           459:     if (!initialized) {
        !           460:        panic("Tk_FreePixmap called before Tk_GetPixmap");
        !           461:     }
        !           462: 
        !           463:     idHashPtr = Tcl_FindHashEntry(&idTable, (char *) bitmap);
        !           464:     if (idHashPtr == NULL) {
        !           465:        panic("Tk_FreePixmap received unknown pixmap argument");
        !           466:     }
        !           467:     bitmapPtr = (TkBitmap *) Tcl_GetHashValue(idHashPtr);
        !           468:     bitmapPtr->refCount--;
        !           469:     if (bitmapPtr->refCount == 0) {
        !           470:        XFreePixmap(bitmapPtr->display, bitmapPtr->bitmap);
        !           471:        Tcl_DeleteHashEntry(idHashPtr);
        !           472:         if (bitmapPtr->hashPtr != NULL) {
        !           473:             /* If hashPtr is NULL, the bitmap has been undefined,
        !           474:              * and already removed from the name table */
        !           475:             Tcl_DeleteHashEntry(bitmapPtr->hashPtr);
        !           476:         }
        !           477:        ckfree((char *) bitmapPtr);
        !           478:     }
        !           479: }
        !           480: 
        !           481: /*
        !           482:  *----------------------------------------------------------------------
        !           483:  *
        !           484:  * Tk_GetPixmapFromData --
        !           485:  *
        !           486:  *     Given a description of the bits for a pixmap, make a pixmap that
        !           487:  *     has the given properties.
        !           488:  *
        !           489:  * Results:
        !           490:  *     The return value is the X identifer for the desired pixmap,
        !           491:  *     unless it couldn't be created properly. In this case, None is
        !           492:  *      returned and an error message is left in interp->result.  The
        !           493:  *      caller should never modify the bitmap that is returned, and
        !           494:  *      should eventually call Tk_FreePixmap when the pixmap is no
        !           495:  *      longer needed.
        !           496:  *
        !           497:  * Side effects:
        !           498:  *     The pixmap is added to an internal database with a reference count.
        !           499:  *     For each call to this procedure, there should eventually be a call
        !           500:  *     to Tk_FreePixmap, so that the database can be cleaned up when pixmaps
        !           501:  *     aren't needed anymore.
        !           502:  *
        !           503:  *----------------------------------------------------------------------
        !           504:  */
        !           505: 
        !           506:        /* ARGSUSED */
        !           507: Pixmap
        !           508: Tk_GetPixmapFromData(interp, tkwin, source, width, height)
        !           509:     Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
        !           510:     Tk_Window tkwin;           /* Window in which bitmap will be used. */
        !           511:     char *source;              /* Bitmap data for bitmap shape. */
        !           512:     unsigned int width, height;        /* Dimensions of bitmap. */
        !           513: {
        !           514:     DataKey key;
        !           515:     Tcl_HashEntry *dataHashPtr;
        !           516:     Tk_Uid name = NULL;                /* Initialization need only to prevent
        !           517:                                 * compiler warning. */
        !           518:     int new;
        !           519:     static autoNumber = 0;
        !           520:     char string[20];
        !           521: 
        !           522:     if (!initialized) {
        !           523:        PixmapInit(tkwin);
        !           524:     }
        !           525: 
        !           526:     key.source = source;
        !           527:     key.width = width;
        !           528:     key.height = height;
        !           529:     dataHashPtr = Tcl_CreateHashEntry(&dataTable, (char *) &key, &new);
        !           530:     if (!new) {
        !           531:        name = (Tk_Uid) Tcl_GetHashValue(dataHashPtr);
        !           532:     } else {
        !           533:        autoNumber++;
        !           534:        sprintf(string, "_tk%d", autoNumber);
        !           535:        name = Tk_GetUid(string);
        !           536:        Tcl_SetHashValue(dataHashPtr, name);
        !           537:        if (Tk_DefinePixmap(interp, name, tkwin, None, source, width,
        !           538:                            height) != TCL_OK) {
        !           539:            Tcl_DeleteHashEntry(dataHashPtr);
        !           540:            return TCL_ERROR;
        !           541:        }
        !           542:     }
        !           543:     return Tk_GetPixmap(interp, tkwin, name);
        !           544: }
        !           545: 
        !           546: /*
        !           547:  *----------------------------------------------------------------------
        !           548:  *
        !           549:  * PixmapInit --
        !           550:  *
        !           551:  *     Initialize the structures used for pixmap management.
        !           552:  *
        !           553:  * Results:
        !           554:  *     None.
        !           555:  *
        !           556:  * Side effects:
        !           557:  *     Read the code.
        !           558:  *
        !           559:  *----------------------------------------------------------------------
        !           560:  */
        !           561: 
        !           562: static void
        !           563: PixmapInit(tkwin)
        !           564:     Tk_Window tkwin;          /* any window on screen where pixmap lives */
        !           565: {
        !           566:     Tcl_Interp *dummy;
        !           567: 
        !           568:     dummy = Tcl_CreateInterp();
        !           569:     initialized = 1;
        !           570:     Tcl_InitHashTable(&nameTable, sizeof(NameKey)/sizeof(int));
        !           571:     Tcl_InitHashTable(&dataTable, sizeof(DataKey)/sizeof(int));
        !           572:     Tcl_InitHashTable(&predefTable, sizeof(NameKey)/sizeof(int));
        !           573:     Tcl_InitHashTable(&idTable, TCL_ONE_WORD_KEYS);
        !           574: 
        !           575:     Tk_DefinePixmap(dummy, Tk_GetUid("gray50"), tkwin, None,
        !           576:                    (char *)gray50_bits, gray50_width, gray50_height);
        !           577:     Tk_DefinePixmap(dummy, Tk_GetUid("gray25"), tkwin, None,
        !           578:                    (char *)gray25_bits, gray25_width, gray25_height);
        !           579:     Tcl_DeleteInterp(dummy);
        !           580: }
        !           581: 
        !           582: /*
        !           583:  *----------------------------------------------------------------------
        !           584:  *
        !           585:  * Tk_UndefinePixmap --
        !           586:  *
        !           587:  *     This procedure removes any association "name" with
        !           588:  *     a bitmap or pixmap.  This can be used to undefine
        !           589:  *     names defined by either Tk_DefinePixmap or Tk_DefinePixmap.
        !           590:  *     If tkwin is NULL, only display-independent pixmaps will
        !           591:  *     be removed, otherwise both display-independent and 
        !           592:  *     the pixmap associated with tkwin will be undefined.
        !           593:  *
        !           594:  * Results:
        !           595:  *     A standard Tcl result.  If an error occurs then TCL_ERROR is
        !           596:  *     returned and a message is left in interp->result.
        !           597:  *
        !           598:  * Side effects:
        !           599:  *     "Name" is removed from the predef table.
        !           600:  *
        !           601:  *----------------------------------------------------------------------
        !           602:  */
        !           603: 
        !           604: int
        !           605: Tk_UndefinePixmap(interp, name, tkwin)
        !           606:     Tcl_Interp *interp;                /* Interpreter to use for error reporting. */
        !           607:     Tk_Uid name;               /* Name of bitmap/pixmap to undefine */
        !           608:     Tk_Window tkwin;            /* any window on screen where pixmap lives */
        !           609: {
        !           610:     NameKey key;
        !           611:     Tcl_HashEntry *predefHashPtr, *nameHashPtr;
        !           612:     TkBitmap *bitmapPtr;
        !           613:     int cnt = 0;
        !           614: 
        !           615:     if (!initialized) {
        !           616:        PixmapInit(tkwin);
        !           617:     }
        !           618: 
        !           619:     key.name = name;
        !           620:     key.screen = (Screen *) NULL;
        !           621:     predefHashPtr = Tcl_FindHashEntry(&predefTable, (char*)&key);
        !           622:     if (predefHashPtr != NULL) {
        !           623:        ++cnt;
        !           624:         Tcl_DeleteHashEntry(predefHashPtr);
        !           625:     }
        !           626: 
        !           627:     key.screen = Tk_Screen(tkwin);
        !           628:     predefHashPtr = Tcl_FindHashEntry(&predefTable, (char*)&key);
        !           629:     if (predefHashPtr != NULL) {
        !           630:        ++cnt;
        !           631:         Tcl_DeleteHashEntry(predefHashPtr);
        !           632:     }
        !           633:     if (cnt == 0) {
        !           634:         Tcl_AppendResult(interp, "pixmap \"", name,
        !           635:                "\" doesn't exist", (char *) NULL);
        !           636:        return TCL_ERROR;
        !           637:     }
        !           638: 
        !           639:     /*
        !           640:      * Remove it from the name table if it is there (it might not
        !           641:      * have been created yet, it which case we wont find it).  We
        !           642:      * delete it from the name table and mark the hashPtr as NULL
        !           643:      * so that we know it has been deleted.  The pixmap still exists,
        !           644:      * and well later be freed and removed from idTable by Tk_FreeBitmap().
        !           645:      */
        !           646:     nameHashPtr = Tcl_FindHashEntry(&nameTable, (char *) &key);
        !           647:     if (nameHashPtr != NULL) {
        !           648:        bitmapPtr = (TkBitmap *) Tcl_GetHashValue(nameHashPtr);
        !           649:        /* assert(nameHashPtr == bitmapPtr->hashPtr); */
        !           650:        /* assert(bitmapPtr->refCount > 0); */
        !           651:        bitmapPtr->hashPtr = (Tcl_HashEntry*) NULL;
        !           652:        Tcl_DeleteHashEntry(nameHashPtr);
        !           653:     }
        !           654:     return TCL_OK;
        !           655: }
        !           656: 
        !           657: #endif

unix.superglobalmegacorp.com

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