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

1.1       root        1: /*
                      2:  * tkText.h --
                      3:  *
                      4:  *     Declarations shared among the files that implement text
                      5:  *     widgets.
                      6:  *
                      7:  * Copyright 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/tkText.h,v 1.13 92/07/31 13:43:26 ouster Exp $ SPRITE (Berkeley)
                     17:  */
                     18: 
                     19: #ifndef _TKTEXT
                     20: #define _TKTEXT
                     21: 
                     22: #ifndef _TK
                     23: #include "tk.h"
                     24: #endif
                     25: 
                     26: /*
                     27:  * Opaque types for structures whose guts are only needed by a single
                     28:  * file:
                     29:  */
                     30: 
                     31: typedef struct TkTextBTree *TkTextBTree;
                     32: 
                     33: /*
                     34:  * The data structure below defines a single line of text (from newline
                     35:  * to newline, not necessarily what appears on one line of the screen).
                     36:  */
                     37: 
                     38: typedef struct TkTextLine {
                     39:     struct Node *parentPtr;            /* Pointer to parent node containing
                     40:                                         * line. */
                     41:     struct TkTextLine *nextPtr;                /* Next in linked list of lines with
                     42:                                         * same parent node in B-tree.  NULL
                     43:                                         * means end of list. */
                     44:     struct TkAnnotation *annotPtr;     /* First in list of annotations for
                     45:                                         * this line. */
                     46:     int numBytes;                      /* Number of  bytes in line, including
                     47:                                         * newline but not terminating NULL. */
                     48:     char bytes[4];                     /* Contents of line, null-terminated.
                     49:                                         * The actual length of the array will
                     50:                                         * be as large as needed to hold the
                     51:                                         * line.  THIS MUST BE THE LAST FIELD
                     52:                                         * OF THE STRUCT. */
                     53: } TkTextLine;
                     54: 
                     55: /*
                     56:  * The structures below are used to describe annotations to the text
                     57:  * (such as marks and embedded windows).  Annotations are placed at
                     58:  * a given place in the text and then float to keep their position
                     59:  * as text is inserted and deleted.  Each actual annotation
                     60:  * contains a standard set of fields, plus a type-specific set of
                     61:  * fields.  The types are as follows:
                     62:  *
                     63:  * TK_ANNOT_TOGGLE -   Marks the beginning or end of a range of
                     64:  *                     characters that have a given tag.
                     65:  * TK_ANNOT_MARK -     Holds information about a given "mark" (see
                     66:  *                     user doc. for information on marks).
                     67:  * TK_ANNOT_WINDOW -   Holds information on a window embedded in the
                     68:  *                     text.  Not implemented yet.
                     69:  */
                     70: 
                     71: typedef enum {TK_ANNOT_TOGGLE, TK_ANNOT_MARK, TK_ANNOT_WINDOW} TkAnnotType;
                     72: 
                     73: typedef struct TkAnnotation {
                     74:     TkAnnotType type;                  /* Type of annotation. */
                     75:     TkTextLine *linePtr;               /* Pointer to line structure
                     76:                                         * containing this annotation. */
                     77:     int ch;                            /* Index of character that annotation
                     78:                                         * is attached to (annotation is
                     79:                                         * considered to be just before this
                     80:                                         * character). */
                     81:     struct TkAnnotation *nextPtr;      /* Next in list of annotations for
                     82:                                         * same line of text, or NULL if
                     83:                                         * end of list. */
                     84:     union {                            /* Type-specific information. */
                     85:        struct TkTextTag *tagPtr;       /* Type == TK_ANNOT_TOGGLE. */
                     86:        Tcl_HashEntry *hPtr;            /* Type == TK_ANNOT_MARK. */
                     87:     } info;
                     88: } TkAnnotation;
                     89: 
                     90: /*
                     91:  * One data structure of the following type is used for each tag that
                     92:  * is currently being used in a text widget.  These structures are kept
                     93:  * in textPtr->tagTable and referred to in other structures, like
                     94:  * TkTagToggles.
                     95:  */
                     96: 
                     97: typedef struct TkTextTag {
                     98:     char *name;                        /* Name of this tag.  This field is actually
                     99:                                 * a pointer to the key from the entry in
                    100:                                 * textPtr->tagTable, so it needn't be freed
                    101:                                 * explicitly. */
                    102:     int priority;              /* Priority of this tag within widget.  0
                    103:                                 * means lowest priority.  Exactly one tag
                    104:                                 * has each integer value between 0 and
                    105:                                 * numTags-1. */
                    106: 
                    107:     /*
                    108:      * Information for displaying text with this tag.  The information
                    109:      * belows acts as an override on information specified by lower-priority
                    110:      * tags.  If no value is specified, then the next-lower-priority tag
                    111:      * on the text determins the value.  The text widget itself provides
                    112:      * defaults if no tag specifies an override.
                    113:      */
                    114: 
                    115:     Tk_3DBorder border;                /* Used for drawing background.  NULL means
                    116:                                 * no value specified here. */
                    117:     int borderWidth;           /* Width of 3-D border for background. */
                    118:     int relief;                        /* 3-D relief for background. */
                    119:     Pixmap bgStipple;          /* Stipple bitmap for background.  None
                    120:                                 * means no value specified here. */
                    121:     XColor *fgColor;           /* Foreground color for text.  NULL means
                    122:                                 * no value specified here. */
                    123:     XFontStruct *fontPtr;      /* Font for displaying text.  NULL means
                    124:                                 * no value specified here. */
                    125:     Pixmap fgStipple;          /* Stipple bitmap for text and other
                    126:                                 * foreground stuff.   None means no value
                    127:                                 * specified here.*/
                    128:     int underline;             /* Non-zero means draw underline underneath
                    129:                                 * text. */
                    130: } TkTextTag;
                    131: 
                    132: /*
                    133:  * The macro below determines whether or not a particular tag affects
                    134:  * the way information is displayed on the screen.  It's used, for
                    135:  * example, to determine when to redisplay in response to tag changes.
                    136:  */
                    137: 
                    138: #define TK_TAG_AFFECTS_DISPLAY(tagPtr)                                         \
                    139:        (((tagPtr)->border != NULL) || ((tagPtr)->bgStipple != None)    \
                    140:        || ((tagPtr)->fgColor != NULL) || ((tagPtr)->fontPtr != NULL)   \
                    141:        || ((tagPtr)->fgStipple != None) || ((tagPtr)->underline))
                    142: 
                    143: /*
                    144:  * The data structure below is used for searching a B-tree for transitions
                    145:  * on a single tag (or for all tag transitions).  No code outside of
                    146:  * tkTextBTree.c should ever modify any of the fields in these structures,
                    147:  * but it's OK to use them for read-only information.
                    148:  */
                    149: 
                    150: typedef struct TkTextSearch {
                    151:     TkTextBTree tree;                  /* Tree being searched. */
                    152:     int line1, ch1;                    /* Position of last tag returned
                    153:                                         * by TkBTreeNextTag. */
                    154:     int line2, ch2;                    /* Stop search after all tags at this
                    155:                                         * character position have been
                    156:                                         * processed. */
                    157:     TkTextTag *tagPtr;                 /* Tag to search for (or tag found, if
                    158:                                         * allTags is non-zero). */
                    159:     int allTags;                       /* Non-zero means ignore tag check:
                    160:                                         * search for transitions on all
                    161:                                         * tags. */
                    162:     TkTextLine *linePtr;               /* Line currently being searched.  NULL
                    163:                                         * means search is over. */
                    164:     TkAnnotation *annotPtr;            /* Pointer to next annotation to
                    165:                                         * consider.  NULL means no annotations
                    166:                                         * left in current line;  must go on
                    167:                                         * to next line. */
                    168: } TkTextSearch;
                    169: 
                    170: /*
                    171:  * A data structure of the following type is kept for each text widget that
                    172:  * currently exists for this process:
                    173:  */
                    174: 
                    175: typedef struct TkText {
                    176:     Tk_Window tkwin;           /* Window that embodies the text.  NULL
                    177:                                 * means that the window has been destroyed
                    178:                                 * but the data structures haven't yet been
                    179:                                 * cleaned up.*/
                    180:     Tcl_Interp *interp;                /* Interpreter associated with widget.  Used
                    181:                                 * to delete widget command.  */
                    182:     TkTextBTree tree;          /* B-tree representation of text and tags for
                    183:                                 * widget. */
                    184:     Tcl_HashTable tagTable;    /* Hash table that maps from tag names to
                    185:                                 * pointers to TkTextTag structures. */
                    186:     int numTags;               /* Number of tags currently defined for
                    187:                                 * widget;  needed to keep track of
                    188:                                 * priorities. */
                    189:     Tcl_HashTable markTable;   /* Hash table that maps from mark names to
                    190:                                 * pointer to TkAnnotation structures of
                    191:                                 * type TK_ANNOT_MARK. */
                    192:     Tk_Uid state;              /* Normal or disabled.  Text is read-only
                    193:                                 * when disabled. */
                    194: 
                    195:     /*
                    196:      * Default information for displaying (may be overridden by tags
                    197:      * applied to ranges of characters).
                    198:      */
                    199: 
                    200:     Tk_3DBorder border;                /* Structure used to draw 3-D border and
                    201:                                 * default background. */
                    202:     int borderWidth;           /* Width of 3-D border to draw around entire
                    203:                                 * widget. */
                    204:     int padX, padY;            /* Padding between text and window border. */
                    205:     int relief;                        /* 3-d effect for border around entire
                    206:                                 * widget: TK_RELIEF_RAISED etc. */
                    207:     Cursor cursor;             /* Current cursor for window, or None. */
                    208:     XColor *fgColor;           /* Default foreground color for text. */
                    209:     XFontStruct *fontPtr;      /* Default font for displaying text. */
                    210: 
                    211:     /*
                    212:      * Additional information used for displaying:
                    213:      */
                    214: 
                    215:     Tk_Uid wrapMode;           /* How to handle wrap-around.  Must be
                    216:                                 * tkTextCharUid, tkTextNoneUid, or
                    217:                                 * tkTextWordUid. */
                    218:     int width, height;         /* Desired dimensions for window, measured
                    219:                                 * in characters. */
                    220:     int setGrid;               /* Non-zero means pass gridding information
                    221:                                 * to window manager. */
                    222:     int prevWidth, prevHeight; /* Last known dimensions of window;  used to
                    223:                                 * detect changes in size. */
                    224:     TkTextLine *topLinePtr;    /* Text line that is supposed to be displayed
                    225:                                 * at top of the window:  set only by
                    226:                                 * tkTextDisp.c. */
                    227:     struct DInfo *dInfoPtr;    /* Additional information maintained by
                    228:                                 * tkTextDisp.c. */
                    229:     Tk_TimerToken updateTimerToken; /* Added by Don to optimize rapid 
                    230:                                     * updates. */
                    231:     
                    232:     /*
                    233:      * Information related to selection.
                    234:      */
                    235: 
                    236:     TkTextTag *selTagPtr;      /* Pointer to "sel" tag.  Used to tell when
                    237:                                 * a new selection has been made. */
                    238:     Tk_3DBorder selBorder;     /* Border and background for selected
                    239:                                 * characters.  This is a copy of information
                    240:                                 * in *cursorTagPtr, so it shouldn't be
                    241:                                 * explicitly freed. */
                    242:     int selBorderWidth;                /* Width of border around selection. */
                    243:     XColor *selFgColorPtr;     /* Foreground color for selected text.
                    244:                                 * This is a copy of information in
                    245:                                 * *cursorTagPtr, so it shouldn't be
                    246:                                 * explicitly freed. */
                    247:     int exportSelection;       /* Non-zero means tie "sel" tag to X
                    248:                                 * selection. */
                    249:     int selLine, selCh;                /* Used during multi-pass selection retrievals.
                    250:                                 * These identify the next character to be
                    251:                                 * returned from the selection. */
                    252:     int selOffset;             /* Offset in selection corresponding to
                    253:                                 * selLine and selCh.  -1 means neither
                    254:                                 * this information nor selLine or selCh
                    255:                                 * is of any use. */
                    256: 
                    257:     /*
                    258:      * Information related to insertion cursor:
                    259:      */
                    260: 
                    261:     TkAnnotation *insertAnnotPtr;
                    262:                                /* Always points to annotation for "insert"
                    263:                                 * mark. */
                    264:     Tk_3DBorder insertBorder;  /* Used to draw vertical bar for insertion
                    265:                                 * cursor. */
                    266:     int insertWidth;           /* Total width of insert cursor. */
                    267:     int insertBorderWidth;     /* Width of 3-D border around insert cursor. */
                    268:     int insertOnTime;          /* Number of milliseconds cursor should spend
                    269:                                 * in "on" state for each blink. */
                    270:     int insertOffTime;         /* Number of milliseconds cursor should spend
                    271:                                 * in "off" state for each blink. */
                    272:     Tk_TimerToken insertBlinkHandler;
                    273:                                /* Timer handler used to blink cursor on and
                    274:                                 * off. */
                    275: 
                    276:     /*
                    277:      * Information used for event bindings associated with tags:
                    278:      */
                    279: 
                    280:     Tk_BindingTable bindingTable;
                    281:                                /* Table of all bindings currently defined
                    282:                                 * for this widget.  NULL means that no
                    283:                                 * bindings exist, so the table hasn't been
                    284:                                 * created.  Each "object" used for this
                    285:                                 * table is the address of a tag. */
                    286:     TkAnnotation *currentAnnotPtr;
                    287:                                /* Pointer to annotation for "current" mark,
                    288:                                 * or NULL if none. */
                    289:     XEvent pickEvent;          /* The event from which the current character
                    290:                                 * was chosen.  Must be saved so that we
                    291:                                 * can repick after insertions and deletions. */
                    292: 
                    293:     /*
                    294:      * Miscellaneous additional information:
                    295:      */
                    296: 
                    297:     char *yScrollCmd;          /* Prefix of command to issue to update
                    298:                                 * vertical scrollbar when view changes. */
                    299:     int scanMarkLine;          /* Line that was at the top of the window
                    300:                                 * when the scan started. */
                    301:     int scanMarkY;             /* Y-position of mouse at time scan started. */
                    302:     int flags;                 /* Miscellaneous flags;  see below for
                    303:                                 * definitions. */
                    304: } TkText;
                    305: 
                    306: /*
                    307:  * Flag values for TkText records:
                    308:  *
                    309:  * GOT_SELECTION:              Non-zero means we've already claimed the
                    310:  *                             selection.
                    311:  * INSERT_ON:                  Non-zero means insertion cursor should be
                    312:  *                             displayed on screen.
                    313:  * GOT_FOCUS:                  Non-zero means this window has the input
                    314:  *                             focus.
                    315:  * BUTTON_DOWN:                        1 means that a mouse button is currently
                    316:  *                             down;  this is used to implement grabs
                    317:  *                             for the duration of button presses.
                    318:  * IN_CURRENT:                 1 means that an EnterNotify event has been
                    319:  *                             delivered to the current character with
                    320:  *                             no matching LeaveNotify event yet.
                    321:  */
                    322: 
                    323: #define GOT_SELECTION  1
                    324: #define INSERT_ON      2
                    325: #define GOT_FOCUS      4
                    326: #define BUTTON_DOWN    8
                    327: #define IN_CURRENT     0x10
                    328: 
                    329: /*
                    330:  * The constant below is used to specify a line when what is really
                    331:  * wanted is the entire text.  For now, just use a very big number.
                    332:  */
                    333: 
                    334: #define TK_END_OF_TEXT 1000000
                    335: 
                    336: /*
                    337:  * Declarations for variables shared among the text-related files:
                    338:  */
                    339: 
                    340: extern int tkBTreeDebug;
                    341: extern Tk_Uid tkTextCharUid;
                    342: extern Tk_Uid tkTextDisabledUid;
                    343: extern Tk_Uid tkTextNoneUid;
                    344: extern Tk_Uid tkTextNormalUid;
                    345: extern Tk_Uid tkTextWordUid;
                    346: 
                    347: /*
                    348:  * Declarations for procedures that are used by the text-related files
                    349:  * but shouldn't be used anywhere else in Tk (or by Tk clients):
                    350:  */
                    351: 
                    352: extern void            TkBTreeAddAnnotation _ANSI_ARGS_((
                    353:                            TkAnnotation *annotPtr));
                    354: extern int             TkBTreeCharTagged _ANSI_ARGS_((TkTextLine *linePtr,
                    355:                            int index, TkTextTag *tagPtr));
                    356: extern void            TkBTreeCheck _ANSI_ARGS_((TkTextBTree tree));
                    357: extern TkTextBTree     TkBTreeCreate _ANSI_ARGS_((void));
                    358: extern void            TkBTreeDestroy _ANSI_ARGS_((TkTextBTree tree));
                    359: extern void            TkBTreeDeleteChars _ANSI_ARGS_((TkTextBTree tree,
                    360:                            TkTextLine *line1Ptr, int ch1,
                    361:                            TkTextLine *line2Ptr, int ch2));
                    362: extern TkTextLine *    TkBTreeFindLine _ANSI_ARGS_((TkTextBTree tree,
                    363:                            int line));
                    364: extern TkTextTag **    TkBTreeGetTags _ANSI_ARGS_((TkTextBTree tree,
                    365:                            TkTextLine *linePtr, int ch, int *numTagsPtr));
                    366: extern void            TkBTreeInsertChars _ANSI_ARGS_((TkTextBTree tree,
                    367:                            TkTextLine *linePtr, int ch, char *string));
                    368: extern int             TkBTreeLineIndex _ANSI_ARGS_((TkTextLine *linePtr));
                    369: extern TkTextLine *    TkBTreeNextLine _ANSI_ARGS_((TkTextLine *linePtr));
                    370: extern int             TkBTreeNextTag _ANSI_ARGS_((TkTextSearch *searchPtr));
                    371: extern int             TkBTreeNumLines _ANSI_ARGS_((TkTextBTree tree));
                    372: extern void            TkBTreeRemoveAnnotation _ANSI_ARGS_((
                    373:                            TkAnnotation *annotPtr));
                    374: extern void            TkBTreeStartSearch _ANSI_ARGS_((TkTextBTree tree,
                    375:                            int line1, int ch1, int line2, int ch2,
                    376:                            TkTextTag *tagPtr, TkTextSearch *searchPtr));
                    377: extern void            TkBTreeTag _ANSI_ARGS_((TkTextBTree tree, int line1,
                    378:                            int ch1, int line2, int ch2, TkTextTag *tagPtr,
                    379:                            int add));
                    380: extern void            TkTextBindProc _ANSI_ARGS_((ClientData clientData,
                    381:                            XEvent *eventPtr));
                    382: extern TkTextLine *    TkTextCharAtLoc _ANSI_ARGS_((TkText *textPtr,
                    383:                            int x, int y, int *chPtr));
                    384: extern void            TkTextCreateDInfo _ANSI_ARGS_((TkText *textPtr));
                    385: extern TkTextTag *     TkTextCreateTag _ANSI_ARGS_((TkText *textPtr,
                    386:                            char *tagName));
                    387: extern void            TkTextFreeDInfo _ANSI_ARGS_((TkText *textPtr));
                    388: extern void            TkTextFreeTag _ANSI_ARGS_((TkTextTag *tagPtr));
                    389: extern int             TkTextGetIndex _ANSI_ARGS_((Tcl_Interp *interp,
                    390:                            TkText *textPtr, char *string, int *lineIndexPtr,
                    391:                            int *chPtr));
                    392: extern void            TkTextLinesChanged _ANSI_ARGS_((TkText *textPtr,
                    393:                            int first, int last));
                    394: extern void            TkTextLostSelection _ANSI_ARGS_((
                    395:                            ClientData clientData));
                    396: extern void            TkTextPickCurrent _ANSI_ARGS_((TkText *textPtr,
                    397:                            XEvent *eventPtr));
                    398: extern void            TkTextPrintIndex _ANSI_ARGS_((int line, int ch,
                    399:                            char *string));
                    400: extern TkTextLine *    TkTextRoundIndex _ANSI_ARGS_((TkText *textPtr,
                    401:                            int *lineIndexPtr, int *chPtr));
                    402: extern void            TkTextRedrawRegion _ANSI_ARGS_((TkText *textPtr,
                    403:                            int x, int y, int width, int height));
                    404: extern void            TkTextRedrawTag _ANSI_ARGS_((TkText *textPtr,
                    405:                            int line1, int ch1, int line2, int ch2,
                    406:                            TkTextTag *tagPtr, int withTag));
                    407: extern void            TkTextRelayoutWindow _ANSI_ARGS_((TkText *textPtr));
                    408: extern TkAnnotation *  TkTextSetMark _ANSI_ARGS_((TkText *textPtr, char *name,
                    409:                            int line, int ch));
                    410: extern void            TkTextSetView _ANSI_ARGS_((TkText *textPtr,
                    411:                            int line, int pickPlace));
                    412: extern int             TkTextTagCmd _ANSI_ARGS_((TkText *textPtr,
                    413:                            Tcl_Interp *interp, int argc, char **argv));
                    414: extern void            TkTextUnpickCurrent _ANSI_ARGS_((TkText *textPtr));
                    415: 
                    416: #endif /* _TKTEXT */

unix.superglobalmegacorp.com

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