Annotation of micropolis/src/tk/tkcanvas.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * tkCanvas.h --
                      3:  *
                      4:  *     Declarations shared among all the files that implement
                      5:  *     canvas widgets.
                      6:  *
                      7:  * Copyright 1991-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:  * $Header: /user6/ouster/wish/RCS/tkCanvas.h,v 1.14 92/08/19 08:34:16 ouster Exp $ SPRITE (Berkeley)
                     17:  */
                     18: 
                     19: #ifndef _TKCANVAS
                     20: #define _TKCANVAS
                     21: 
                     22: #ifndef _TK
                     23: #include "tk.h"
                     24: #endif
                     25: 
                     26: /*
                     27:  * For each item in a canvas widget there exists one record with
                     28:  * the following structure.  Each actual item is represented by
                     29:  * a record with the following stuff at its beginning, plus additional
                     30:  * type-specific stuff after that.
                     31:  */
                     32: 
                     33: #define TK_TAG_SPACE 3
                     34: 
                     35: typedef struct Tk_Item  {
                     36:     int id;                            /* Unique identifier for this item
                     37:                                         * (also serves as first tag for
                     38:                                         * item). */
                     39:     struct Tk_Item *nextPtr;           /* Next in display list of all
                     40:                                         * items in this canvas.  Later items
                     41:                                         * in list are drawn on top of earlier
                     42:                                         * ones. */
                     43:     Tk_Uid staticTagSpace[TK_TAG_SPACE];/* Built-in space for limited # of
                     44:                                         * tags. */
                     45:     Tk_Uid *tagPtr;                    /* Pointer to array of tags.  Usually
                     46:                                         * points to staticTagSpace, but
                     47:                                         * may point to malloc-ed space if
                     48:                                         * there are lots of tags. */
                     49:     int tagSpace;                      /* Total amount of tag space available
                     50:                                         * at tagPtr. */
                     51:     int numTags;                       /* Number of tag slots actually used
                     52:                                         * at *tagPtr. */
                     53:     struct Tk_ItemType *typePtr;       /* Table of procedures that implement
                     54:                                         * this type of item. */
                     55:     int x1, y1, x2, y2;                        /* Bounding box for item, in integer
                     56:                                         * canvas units. Set by item-specific
                     57:                                         * code and guaranteed to contain every
                     58:                                         * pixel drawn in item.  Item area
                     59:                                         * includes x1 and y1 but not x2
                     60:                                         * and y2. */
                     61: 
                     62:     /*
                     63:      *------------------------------------------------------------------
                     64:      * Starting here is additional type-specific stuff;  see the
                     65:      * declarations for individual types to see what is part of
                     66:      * each type.  The actual space below is determined by the
                     67:      * "itemInfoSize" of the type's Tk_ItemType record.
                     68:      *------------------------------------------------------------------
                     69:      */
                     70: } Tk_Item;
                     71: 
                     72: /*
                     73:  * The record below describes a canvas widget.  It is made available
                     74:  * to the item procedures so they can access certain shared fields such
                     75:  * as the overall displacement and scale factor for the canvas.
                     76:  */
                     77: 
                     78: typedef struct {
                     79:     Tk_Window tkwin;           /* Window that embodies the canvas.  NULL
                     80:                                 * means that the window has been destroyed
                     81:                                 * but the data structures haven't yet been
                     82:                                 * cleaned up.*/
                     83:     Tcl_Interp *interp;                /* Interpreter associated with canvas. */
                     84:     Tk_Item *firstItemPtr;     /* First in list of all items in canvas,
                     85:                                 * or NULL if canvas empty. */
                     86:     Tk_Item *lastItemPtr;      /* Last in list of all items in canvas,
                     87:                                 * or NULL if canvas empty. */
                     88: 
                     89:     /*
                     90:      * Information used when displaying widget:
                     91:      */
                     92: 
                     93:     int borderWidth;           /* Width of 3-D border around window. */
                     94:     Tk_3DBorder bgBorder;      /* Used for canvas background. */
                     95:     XColor *bgColor;           /* Color used for clearing to background. */
                     96:     int relief;                        /* Indicates whether window as a whole is
                     97:                                 * raised, sunken, or flat. */
                     98:     GC pixmapGC;               /* Used to copy bits from a pixmap to the
                     99:                                 * screen and also to clear the pixmap. */
                    100:     int width, height;         /* Dimensions to request for canvas window,
                    101:                                 * specified in pixels. */
                    102:     int redrawX1, redrawY1;    /* Upper left corner of area to redraw,
                    103:                                 * in pixel coordinates.  Border pixels
                    104:                                 * are included.  Only valid if
                    105:                                 * REDRAW_PENDING flag is set. */
                    106:     int redrawX2, redrawY2;    /* Lower right corner of area to redraw,
                    107:                                 * in pixel coordinates.  Border pixels
                    108:                                 * will *not* be redrawn. */
                    109:     int confine;               /* Non-zero means constrain view to keep
                    110:                                 * as much of canvas visible as possible. */
                    111: 
                    112:     /*
                    113:      * Information used to manage and display selection:
                    114:      */
                    115: 
                    116:     Tk_3DBorder selBorder;     /* Border and background for selected
                    117:                                 * characters. */
                    118:     int selBorderWidth;                /* Width of border around selection. */
                    119:     XColor *selFgColorPtr;     /* Foreground color for selected text. */
                    120:     Tk_Item *selItemPtr;       /* Pointer to selected item.  NULL means
                    121:                                 * selection isn't in this canvas. */
                    122:     int selectFirst;           /* Index of first selected character. */
                    123:     int selectLast;            /* Index of last selected character. */
                    124:     Tk_Item *anchorItemPtr;    /* Item corresponding to "selectAnchor":
                    125:                                 * not necessarily selItemPtr. */
                    126:     int selectAnchor;          /* Fixed end of selection (i.e. "select to"
                    127:                                 * operation will use this as one end of the
                    128:                                 * selection). */
                    129: 
                    130:     /*
                    131:      * Information for display insertion cursor in text:
                    132:      */
                    133: 
                    134:     Tk_3DBorder cursorBorder;  /* Used to draw vertical bar for insertion
                    135:                                 * cursor. */
                    136:     int cursorWidth;           /* Total width of insertion cursor. */
                    137:     int cursorBorderWidth;     /* Width of 3-D border around insert cursor. */
                    138:     int cursorOnTime;          /* Number of milliseconds cursor should spend
                    139:                                 * in "on" state for each blink. */
                    140:     int cursorOffTime;         /* Number of milliseconds cursor should spend
                    141:                                 * in "off" state for each blink. */
                    142:     Tk_TimerToken cursorBlinkHandler;
                    143:                                /* Timer handler used to blink cursor on and
                    144:                                 * off. */
                    145:     Tk_Item *focusItemPtr;     /* Item that currently has the input focus,
                    146:                                 * or NULL if no such item. */
                    147: 
                    148:     /*
                    149:      * Transformation applied to canvas as a whole:  to compute screen
                    150:      * coordinates (X,Y) from canvas coordinates (x,y), do the following:
                    151:      *
                    152:      * X = x - xOrigin;
                    153:      * Y = y - yOrigin;
                    154:      */
                    155: 
                    156:     int xOrigin, yOrigin;      /* Canvas coordinates corresponding to
                    157:                                 * upper-left corner of window, given in
                    158:                                 * canvas pixel units. */
                    159:     int drawableXOrigin, drawableYOrigin;
                    160:                                /* During redisplay, these fields give the
                    161:                                 * canvas coordinates corresponding to
                    162:                                 * the upper-left corner of the drawable
                    163:                                 * where items are actually being drawn
                    164:                                 * (typically a pixmap smaller than the
                    165:                                 * whole window). */
                    166: 
                    167:     /*
                    168:      * Information used for event bindings associated with items.
                    169:      */
                    170: 
                    171:     Tk_BindingTable bindingTable;
                    172:                                /* Table of all bindings currently defined
                    173:                                 * for this canvas.  NULL means that no
                    174:                                 * bindings exist, so the table hasn't been
                    175:                                 * created.  Each "object" used for this
                    176:                                 * table is either a Tk_Uid for a tag or
                    177:                                 * the address of an item named by id. */
                    178:     Tk_Item *currentItemPtr;   /* The item currently containing the mouse
                    179:                                 * pointer, or NULL if none. */
                    180:     double closeEnough;                /* The mouse is assumed to be inside an
                    181:                                 * item if it is this close to it. */
                    182:     XEvent pickEvent;          /* The event upon which the current choice
                    183:                                 * of currentItem is based.  Must be saved
                    184:                                 * so that if the currentItem is deleted,
                    185:                                 * can pick another. */
                    186: 
                    187:     /*
                    188:      * Information used for managing scrollbars:
                    189:      */
                    190: 
                    191:     char *xScrollCmd;          /* Command prefix for communicating with
                    192:                                 * horizontal scrollbar.  NULL means no
                    193:                                 * horizontal scrollbar.  Malloc'ed*/
                    194:     char *yScrollCmd;          /* Command prefix for communicating with
                    195:                                 * vertical scrollbar.  NULL means no
                    196:                                 * vertical scrollbar.  Malloc'ed*/
                    197:     int scrollX1, scrollY1, scrollX2, scrollY2;
                    198:                                /* These four coordinates define the region
                    199:                                 * that is the 100% area for scrolling (i.e.
                    200:                                 * these numbers determine the size and
                    201:                                 * location of the sliders on scrollbars).
                    202:                                 * Units are pixels in canvas coords. */
                    203:     char *regionString;                /* The option string from which scrollX1
                    204:                                 * etc. are derived.  Malloc'ed. */
                    205:     int scrollIncrement;       /* The number of canvas units that the
                    206:                                 * picture shifts when a scrollbar up or
                    207:                                 * down arrow is pressed. */
                    208: 
                    209:     /*
                    210:      * Information used for scanning:
                    211:      */
                    212: 
                    213:     int scanX;                 /* X-position at which scan started (e.g.
                    214:                                 * button was pressed here). */
                    215:     int scanXOrigin;           /* Value of xOrigin field when scan started. */
                    216:     int scanY;                 /* Y-position at which scan started (e.g.
                    217:                                 * button was pressed here). */
                    218:     int scanYOrigin;           /* Value of yOrigin field when scan started. */
                    219: 
                    220:     /*
                    221:      * Information used to speed up searches by remembering the last item
                    222:      * created or found with an item id search.
                    223:      */
                    224: 
                    225:     Tk_Item *hotPtr;           /* Pointer to "hot" item (one that's been
                    226:                                 * recently used.  NULL means there's no
                    227:                                 * hot item. */
                    228:     Tk_Item *hotPrevPtr;       /* Pointer to predecessor to hotPtr (NULL
                    229:                                 * means item is first in list).  This is
                    230:                                 * only a hint and may not really be hotPtr's
                    231:                                 * predecessor. */
                    232: 
                    233:     /*
                    234:      * Miscellaneous information:
                    235:      */
                    236: 
                    237:     Cursor cursor;             /* Current cursor for window, or None. */
                    238:     double pixelsPerMM;                /* Scale factor between MM and pixels;
                    239:                                 * used when converting coordinates. */
                    240:     int flags;                 /* Various flags;  see below for
                    241:                                 * definitions. */
                    242:     int nextId;                        /* Number to use as id for next item
                    243:                                 * created in widget. */
                    244:     Tk_TimerToken updateTimerToken; /* Added by Don to optimize rapid 
                    245:                                     * updates. */
                    246: } Tk_Canvas;
                    247: 
                    248: /*
                    249:  * Flag bits for canvases:
                    250:  *
                    251:  * REDRAW_PENDING -            1 means a DoWhenIdle handler has already
                    252:  *                             been created to redraw some or all of the
                    253:  *                             canvas.
                    254:  * REPICK_NEEDED -             1 means DisplayCanvas should pick a new
                    255:  *                             current item before redrawing the canvas.
                    256:  * GOT_FOCUS -                 1 means the focus is currently in this
                    257:  *                             widget, so should draw the insertion cursor.
                    258:  * CURSOR_ON -                 1 means the insertion cursor is in the "on"
                    259:  *                             phase of its blink cycle.  0 means either
                    260:  *                             we don't have the focus or the cursor is in
                    261:  *                             the "off" phase of its cycle.
                    262:  * BUTTON_DOWN -               1 means that a button is currently down;
                    263:  *                             this is used to implement grabs for the
                    264:  *                             duration of button presses.
                    265:  * UPDATE_SCROLLBARS -         1 means the scrollbars should get updated
                    266:  *                             as part of the next display operation.
                    267:  */
                    268: 
                    269: #define REDRAW_PENDING         1
                    270: #define REPICK_NEEDED          2
                    271: #define GOT_FOCUS              4
                    272: #define CURSOR_ON              8
                    273: #define BUTTON_DOWN            0x10
                    274: #define UPDATE_SCROLLBARS      0x20
                    275: 
                    276: /*
                    277:  * Records of the following type are used to describe a type of
                    278:  * item (e.g.  lines, circles, etc.) that can form part of a
                    279:  * canvas widget.
                    280:  */
                    281: 
                    282: typedef int    Tk_ItemCreateProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    283:                    Tk_Item *itemPtr, int argc, char **argv));
                    284: typedef int    Tk_ItemConfigureProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    285:                    Tk_Item *itemPtr, int argc, char **argv, int flags));
                    286: typedef int    Tk_ItemCoordProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    287:                    Tk_Item *itemPtr, int argc, char **argv));
                    288: typedef void   Tk_ItemDeleteProc _ANSI_ARGS_((Tk_Item *itemPtr));
                    289: typedef void   Tk_ItemDisplayProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    290:                    Tk_Item *itemPtr, Drawable dst));
                    291: typedef double Tk_ItemPointProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    292:                    Tk_Item *itemPtr, double *pointPtr));
                    293: typedef int    Tk_ItemAreaProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    294:                    Tk_Item *itemPtr, double *rectPtr));
                    295: typedef void   Tk_ItemPostscriptProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    296:                    Tk_Item *itemPtr));
                    297: typedef void   Tk_ItemScaleProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    298:                    Tk_Item *itemPtr, double originX, double originY,
                    299:                    double scaleX, double scaleY));
                    300: typedef void   Tk_ItemTranslateProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    301:                    Tk_Item *itemPtr, double deltaX, double deltaY));
                    302: typedef int    Tk_ItemIndexProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    303:                    Tk_Item *itemPtr, char *indexString,
                    304:                    int *indexPtr));
                    305: typedef void   Tk_ItemCursorProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    306:                    Tk_Item *itemPtr, int index));
                    307: typedef int    Tk_ItemSelectionProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    308:                    Tk_Item *itemPtr, int offset, char *buffer,
                    309:                    int maxBytes));
                    310: typedef int    Tk_ItemInsertProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    311:                    Tk_Item *itemPtr, int beforeThis, char *string));
                    312: typedef int    Tk_ItemDCharsProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    313:                    Tk_Item *itemPtr, int first, int last));
                    314: 
                    315: typedef struct Tk_ItemType {
                    316:     char *name;                                /* The name of this type of item, such
                    317:                                         * as "line". */
                    318:     int itemSize;                      /* Total amount of space needed for
                    319:                                         * item's record. */
                    320:     Tk_ItemCreateProc *createProc;     /* Procedure to create a new item of
                    321:                                         * this type. */
                    322:     Tk_ConfigSpec *configSpecs;                /* Pointer to array of configuration
                    323:                                         * specs for this type.  Used for
                    324:                                         * returning configuration info. */
                    325:     Tk_ItemConfigureProc *configProc;  /* Procedure to call to change
                    326:                                         * configuration options. */
                    327:     Tk_ItemCoordProc *coordProc;       /* Procedure to call to get and set
                    328:                                         * the item's coordinates. */
                    329:     Tk_ItemDeleteProc *deleteProc;     /* Procedure to delete existing item of
                    330:                                         * this type. */
                    331:     Tk_ItemDisplayProc *displayProc;   /* Procedure to display items of
                    332:                                         * this type. */
                    333:     int alwaysRedraw;                  /* Non-zero means displayProc should
                    334:                                         * be called even when the item has
                    335:                                         * been moved off-screen. */
                    336:     Tk_ItemPointProc *pointProc;       /* Computes distance from item to
                    337:                                         * a given point. */
                    338:     Tk_ItemAreaProc *areaProc;         /* Computes whether item is inside,
                    339:                                         * outside, or overlapping an area. */
                    340:     Tk_ItemPostscriptProc *postscriptProc;
                    341:                                        /* Procedure to write a Postscript
                    342:                                         * description for items of this
                    343:                                         * type. */
                    344:     Tk_ItemScaleProc *scaleProc;       /* Procedure to rescale items of
                    345:                                         * this type. */
                    346:     Tk_ItemTranslateProc *translateProc;/* Procedure to translate items of
                    347:                                         * this type. */
                    348:     Tk_ItemIndexProc *indexProc;       /* Procedure to determine index of
                    349:                                         * indicated character.  NULL if
                    350:                                         * item doesn't support indexing. */
                    351:     Tk_ItemCursorProc *cursorProc;     /* Procedure to set cursor position
                    352:                                         * to just before a given position. */
                    353:     Tk_ItemSelectionProc *selectionProc;/* Procedure to return selection (in
                    354:                                         * STRING format) when it is in this
                    355:                                         * item. */
                    356:     Tk_ItemInsertProc *insertProc;     /* Procedure to insert something into
                    357:                                         * an item. */
                    358:     Tk_ItemDCharsProc *dCharsProc;     /* Procedure to delete characters
                    359:                                         * from an item. */
                    360:     struct Tk_ItemType *nextPtr;       /* Used to link types together into
                    361:                                         * a list. */
                    362: } Tk_ItemType;
                    363: 
                    364: /*
                    365:  * Macros to transform a point from double-precision canvas coordinates
                    366:  * to integer pixel coordinates in the pixmap where redisplay is being
                    367:  * done.
                    368:  */
                    369: 
                    370: #define SCREEN_X(canvasPtr, x) \
                    371:        (((int) ((x) + 0.5)) - (canvasPtr)->drawableXOrigin)
                    372: #define SCREEN_Y(canvasPtr, y) \
                    373:        (((int) ((y) + 0.5)) - (canvasPtr)->drawableYOrigin)
                    374: 
                    375: /*
                    376:  * Canvas-related variables that are shared among Tk modules but not
                    377:  * exported to the outside world:
                    378:  */
                    379: 
                    380: extern Tk_CustomOption tkCanvasTagsOption;
                    381: 
                    382: /*
                    383:  * Canvas-related procedures that are shared among Tk modules but not
                    384:  * exported to the outside world:
                    385:  */
                    386: 
                    387: extern void            TkBezierScreenPoints _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    388:                            double control[], int numSteps,
                    389:                            XPoint *xPointPtr));
                    390: extern void            TkFillPolygon _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    391:                            double *coordPtr, int numPoints, Drawable drawable,
                    392:                            GC gc));
                    393: extern int             TkGetCanvasCoord _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    394:                            char *string, double *doublePtr));
                    395: extern void            TkIncludePoint _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    396:                            Tk_Item *itemPtr, double *pointPtr));
                    397: extern int             TkMakeBezierCurve _ANSI_ARGS_((Tk_Canvas *canvasPtr,
                    398:                            double *pointPtr, int numPoints, int numSteps,
                    399:                            XPoint xPoints[], double dblPoints[]));
                    400: 
                    401: #endif /* _TKCANVAS */

unix.superglobalmegacorp.com

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