1 /* 2 * tkCanvas.h -- 3 * 4 * Declarations shared among all the files that implement 5 * canvas widgets. 6 * 7 * Copyright (c) 1991-1994 The Regents of the University of California. 8 * Copyright (c) 1994-1995 Sun Microsystems, Inc. 9 * 10 * See the file "license.terms" for information on usage and redistribution 11 * of this file, and for a DISCLAIMER OF ALL WARRANTIES. 12 * 13 * SCCS: @(#) tkCanvas.h 1.41 96/02/15 18:51:28 14 */ 15 16 #ifndef _TKCANVAS 17 #define _TKCANVAS 18 19 #ifndef _TK 20 #include "tk.h" 21 #endif 22 23 /* 24 * The record below describes a canvas widget. It is made available 25 * to the item procedures so they can access certain shared fields such 26 * as the overall displacement and scale factor for the canvas. 27 */ 28 29 typedef struct TkCanvas { 30 Tk_Window tkwin; /* Window that embodies the canvas. NULL 31 * means that the window has been destroyed 32 * but the data structures haven't yet been 33 * cleaned up.*/ 34 Display *display; /* Display containing widget; needed, among 35 * other things, to release resources after 36 * tkwin has already gone away. */ 37 Tcl_Interp *interp; /* Interpreter associated with canvas. */ 38 Tcl_Command widgetCmd; /* Token for canvas's widget command. */ 39 Tk_Item *firstItemPtr; /* First in list of all items in canvas, 40 * or NULL if canvas empty. */ 41 Tk_Item *lastItemPtr; /* Last in list of all items in canvas, 42 * or NULL if canvas empty. */ 43 44 /* 45 * Information used when displaying widget: 46 */ 47 48 int borderWidth; /* Width of 3-D border around window. */ 49 Tk_3DBorder bgBorder; /* Used for canvas background. */ 50 int relief; /* Indicates whether window as a whole is 51 * raised, sunken, or flat. */ 52 int highlightWidth; /* Width in pixels of highlight to draw 53 * around widget when it has the focus. 54 * <= 0 means don't draw a highlight. */ 55 XColor *highlightBgColorPtr; 56 /* Color for drawing traversal highlight 57 * area when highlight is off. */ 58 XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ 59 int inset; /* Total width of all borders, including 60 * traversal highlight and 3-D border. 61 * Indicates how much interior stuff must 62 * be offset from outside edges to leave 63 * room for borders. */ 64 GC pixmapGC; /* Used to copy bits from a pixmap to the 65 * screen and also to clear the pixmap. */ 66 int width, height; /* Dimensions to request for canvas window, 67 * specified in pixels. */ 68 int redrawX1, redrawY1; /* Upper left corner of area to redraw, 69 * in pixel coordinates. Border pixels 70 * are included. Only valid if 71 * REDRAW_PENDING flag is set. */ 72 int redrawX2, redrawY2; /* Lower right corner of area to redraw, 73 * in integer canvas coordinates. Border 74 * pixels will *not* be redrawn. */ 75 int confine; /* Non-zero means constrain view to keep 76 * as much of canvas visible as possible. */ 77 78 /* 79 * Information used to manage the selection and insertion cursor: 80 */ 81 82 Tk_CanvasTextInfo textInfo; /* Contains lots of fields; see tk.h for 83 * details. This structure is shared with 84 * the code that implements individual items. */ 85 int insertOnTime; /* Number of milliseconds cursor should spend 86 * in "on" state for each blink. */ 87 int insertOffTime; /* Number of milliseconds cursor should spend 88 * in "off" state for each blink. */ 89 Tcl_TimerToken insertBlinkHandler; 90 /* Timer handler used to blink cursor on and 91 * off. */ 92 93 /* 94 * Transformation applied to canvas as a whole: to compute screen 95 * coordinates (X,Y) from canvas coordinates (x,y), do the following: 96 * 97 * X = x - xOrigin; 98 * Y = y - yOrigin; 99 */ 100 101 int xOrigin, yOrigin; /* Canvas coordinates corresponding to 102 * upper-left corner of window, given in 103 * canvas pixel units. */ 104 int drawableXOrigin, drawableYOrigin; 105 /* During redisplay, these fields give the 106 * canvas coordinates corresponding to 107 * the upper-left corner of the drawable 108 * where items are actually being drawn 109 * (typically a pixmap smaller than the 110 * whole window). */ 111 112 /* 113 * Information used for event bindings associated with items. 114 */ 115 116 Tk_BindingTable bindingTable; 117 /* Table of all bindings currently defined 118 * for this canvas. NULL means that no 119 * bindings exist, so the table hasn't been 120 * created. Each "object" used for this 121 * table is either a Tk_Uid for a tag or 122 * the address of an item named by id. */ 123 Tk_Item *currentItemPtr; /* The item currently containing the mouse 124 * pointer, or NULL if none. */ 125 Tk_Item *newCurrentPtr; /* The item that is about to become the 126 * current one, or NULL. This field is 127 * used to detect deletions of the new 128 * current item pointer that occur during 129 * Leave processing of the previous current 130 * item. */ 131 double closeEnough; /* The mouse is assumed to be inside an 132 * item if it is this close to it. */ 133 XEvent pickEvent; /* The event upon which the current choice 134 * of currentItem is based. Must be saved 135 * so that if the currentItem is deleted, 136 * can pick another. */ 137 int state; /* Last known modifier state. Used to 138 * defer picking a new current object 139 * while buttons are down. */ 140 141 /* 142 * Information used for managing scrollbars: 143 */ 144 145 char *xScrollCmd; /* Command prefix for communicating with 146 * horizontal scrollbar. NULL means no 147 * horizontal scrollbar. Malloc'ed*/ 148 char *yScrollCmd; /* Command prefix for communicating with 149 * vertical scrollbar. NULL means no 150 * vertical scrollbar. Malloc'ed*/ 151 int scrollX1, scrollY1, scrollX2, scrollY2; 152 /* These four coordinates define the region 153 * that is the 100% area for scrolling (i.e. 154 * these numbers determine the size and 155 * location of the sliders on scrollbars). 156 * Units are pixels in canvas coords. */ 157 char *regionString; /* The option string from which scrollX1 158 * etc. are derived. Malloc'ed. */ 159 int xScrollIncrement; /* If >0, defines a grid for horizontal 160 * scrolling. This is the size of the "unit", 161 * and the left edge of the screen will always 162 * lie on an even unit boundary. */ 163 int yScrollIncrement; /* If >0, defines a grid for horizontal 164 * scrolling. This is the size of the "unit", 165 * and the left edge of the screen will always 166 * lie on an even unit boundary. */ 167 168 /* 169 * Information used for scanning: 170 */ 171 172 int scanX; /* X-position at which scan started (e.g. 173 * button was pressed here). */ 174 int scanXOrigin; /* Value of xOrigin field when scan started. */ 175 int scanY; /* Y-position at which scan started (e.g. 176 * button was pressed here). */ 177 int scanYOrigin; /* Value of yOrigin field when scan started. */ 178 179 /* 180 * Information used to speed up searches by remembering the last item 181 * created or found with an item id search. 182 */ 183 184 Tk_Item *hotPtr; /* Pointer to "hot" item (one that's been 185 * recently used. NULL means there's no 186 * hot item. */ 187 Tk_Item *hotPrevPtr; /* Pointer to predecessor to hotPtr (NULL 188 * means item is first in list). This is 189 * only a hint and may not really be hotPtr's 190 * predecessor. */ 191 192 /* 193 * Miscellaneous information: 194 */ 195 196 Tk_Cursor cursor; /* Current cursor for window, or None. */ 197 char *takeFocus; /* Value of -takefocus option; not used in 198 * the C code, but used by keyboard traversal 199 * scripts. Malloc'ed, but may be NULL. */ 200 double pixelsPerMM; /* Scale factor between MM and pixels; 201 * used when converting coordinates. */ 202 int flags; /* Various flags; see below for 203 * definitions. */ 204 int nextId; /* Number to use as id for next item 205 * created in widget. */ 206 struct TkPostscriptInfo *psInfoPtr; 207 /* Pointer to information used for generating 208 * Postscript for the canvas. NULL means 209 * no Postscript is currently being 210 * generated. */ 211 } TkCanvas; 212 213 /* 214 * Flag bits for canvases: 215 * 216 * REDRAW_PENDING - 1 means a DoWhenIdle handler has already 217 * been created to redraw some or all of the 218 * canvas. 219 * REDRAW_BORDERS - 1 means that the borders need to be redrawn 220 * during the next redisplay operation. 221 * REPICK_NEEDED - 1 means DisplayCanvas should pick a new 222 * current item before redrawing the canvas. 223 * GOT_FOCUS - 1 means the focus is currently in this 224 * widget, so should draw the insertion cursor 225 * and traversal highlight. 226 * CURSOR_ON - 1 means the insertion cursor is in the "on" 227 * phase of its blink cycle. 0 means either 228 * we don't have the focus or the cursor is in 229 * the "off" phase of its cycle. 230 * UPDATE_SCROLLBARS - 1 means the scrollbars should get updated 231 * as part of the next display operation. 232 * LEFT_GRABBED_ITEM - 1 means that the mouse left the current 233 * item while a grab was in effect, so we 234 * didn't change canvasPtr->currentItemPtr. 235 * REPICK_IN_PROGRESS - 1 means PickCurrentItem is currently 236 * executing. If it should be called recursively, 237 * it should simply return immediately. 238 */ 239 240 #define REDRAW_PENDING 1 241 #define REDRAW_BORDERS 2 242 #define REPICK_NEEDED 4 243 #define GOT_FOCUS 8 244 #define CURSOR_ON 0x10 245 #define UPDATE_SCROLLBARS 0x20 246 #define LEFT_GRABBED_ITEM 0x40 247 #define REPICK_IN_PROGRESS 0x100 248 249 /* 250 * Canvas-related procedures that are shared among Tk modules but not 251 * exported to the outside world: 252 */ 253 254 extern int TkCanvPostscriptCmd _ANSI_ARGS_((TkCanvas *canvasPtr, 255 Tcl_Interp *interp, int argc, char **argv)); 256 257 #endif /* _TKCANVAS */ 258