|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.