430 lines
17 KiB
C
430 lines
17 KiB
C
|
/*
|
||
|
* tkCanvas.h --
|
||
|
*
|
||
|
* Declarations shared among all the files that implement
|
||
|
* canvas widgets.
|
||
|
*
|
||
|
* Copyright (c) 1991-1993 The Regents of the University of California.
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* Permission is hereby granted, without written agreement and without
|
||
|
* license or royalty fees, to use, copy, modify, and distribute this
|
||
|
* software and its documentation for any purpose, provided that the
|
||
|
* above copyright notice and the following two paragraphs appear in
|
||
|
* all copies of this software.
|
||
|
*
|
||
|
* IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
|
||
|
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
|
||
|
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
|
||
|
* CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
*
|
||
|
* THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
|
||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
||
|
* ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
|
||
|
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||
|
*
|
||
|
* $Header: /user6/ouster/wish/RCS/tkCanvas.h,v 1.21 93/06/16 17:15:32 ouster Exp $ SPRITE (Berkeley)
|
||
|
*/
|
||
|
|
||
|
#ifndef _TKCANVAS
|
||
|
#define _TKCANVAS
|
||
|
|
||
|
#ifndef _TK
|
||
|
#include "tk.h"
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
* For each item in a canvas widget there exists one record with
|
||
|
* the following structure. Each actual item is represented by
|
||
|
* a record with the following stuff at its beginning, plus additional
|
||
|
* type-specific stuff after that.
|
||
|
*/
|
||
|
|
||
|
#define TK_TAG_SPACE 3
|
||
|
|
||
|
typedef struct Tk_Item {
|
||
|
int id; /* Unique identifier for this item
|
||
|
* (also serves as first tag for
|
||
|
* item). */
|
||
|
struct Tk_Item *nextPtr; /* Next in display list of all
|
||
|
* items in this canvas. Later items
|
||
|
* in list are drawn on top of earlier
|
||
|
* ones. */
|
||
|
Tk_Uid staticTagSpace[TK_TAG_SPACE];/* Built-in space for limited # of
|
||
|
* tags. */
|
||
|
Tk_Uid *tagPtr; /* Pointer to array of tags. Usually
|
||
|
* points to staticTagSpace, but
|
||
|
* may point to malloc-ed space if
|
||
|
* there are lots of tags. */
|
||
|
int tagSpace; /* Total amount of tag space available
|
||
|
* at tagPtr. */
|
||
|
int numTags; /* Number of tag slots actually used
|
||
|
* at *tagPtr. */
|
||
|
struct Tk_ItemType *typePtr; /* Table of procedures that implement
|
||
|
* this type of item. */
|
||
|
int x1, y1, x2, y2; /* Bounding box for item, in integer
|
||
|
* canvas units. Set by item-specific
|
||
|
* code and guaranteed to contain every
|
||
|
* pixel drawn in item. Item area
|
||
|
* includes x1 and y1 but not x2
|
||
|
* and y2. */
|
||
|
|
||
|
/*
|
||
|
*------------------------------------------------------------------
|
||
|
* Starting here is additional type-specific stuff; see the
|
||
|
* declarations for individual types to see what is part of
|
||
|
* each type. The actual space below is determined by the
|
||
|
* "itemInfoSize" of the type's Tk_ItemType record.
|
||
|
*------------------------------------------------------------------
|
||
|
*/
|
||
|
} Tk_Item;
|
||
|
|
||
|
/*
|
||
|
* The record below describes a canvas widget. It is made available
|
||
|
* to the item procedures so they can access certain shared fields such
|
||
|
* as the overall displacement and scale factor for the canvas.
|
||
|
*/
|
||
|
|
||
|
typedef struct {
|
||
|
Tk_Window tkwin; /* Window that embodies the canvas. NULL
|
||
|
* means that the window has been destroyed
|
||
|
* but the data structures haven't yet been
|
||
|
* cleaned up.*/
|
||
|
Display *display; /* Display containing widget; needed, among
|
||
|
* other things, to release resources after
|
||
|
* tkwin has already gone away. */
|
||
|
Tcl_Interp *interp; /* Interpreter associated with canvas. */
|
||
|
Tk_Item *firstItemPtr; /* First in list of all items in canvas,
|
||
|
* or NULL if canvas empty. */
|
||
|
Tk_Item *lastItemPtr; /* Last in list of all items in canvas,
|
||
|
* or NULL if canvas empty. */
|
||
|
|
||
|
/*
|
||
|
* Information used when displaying widget:
|
||
|
*/
|
||
|
|
||
|
int borderWidth; /* Width of 3-D border around window. */
|
||
|
Tk_3DBorder bgBorder; /* Used for canvas background. */
|
||
|
int relief; /* Indicates whether window as a whole is
|
||
|
* raised, sunken, or flat. */
|
||
|
GC pixmapGC; /* Used to copy bits from a pixmap to the
|
||
|
* screen and also to clear the pixmap. */
|
||
|
int width, height; /* Dimensions to request for canvas window,
|
||
|
* specified in pixels. */
|
||
|
int redrawX1, redrawY1; /* Upper left corner of area to redraw,
|
||
|
* in pixel coordinates. Border pixels
|
||
|
* are included. Only valid if
|
||
|
* REDRAW_PENDING flag is set. */
|
||
|
int redrawX2, redrawY2; /* Lower right corner of area to redraw,
|
||
|
* in pixel coordinates. Border pixels
|
||
|
* will *not* be redrawn. */
|
||
|
int confine; /* Non-zero means constrain view to keep
|
||
|
* as much of canvas visible as possible. */
|
||
|
|
||
|
/*
|
||
|
* Information used to manage and display selection:
|
||
|
*/
|
||
|
|
||
|
Tk_3DBorder selBorder; /* Border and background for selected
|
||
|
* characters. */
|
||
|
int selBorderWidth; /* Width of border around selection. */
|
||
|
XColor *selFgColorPtr; /* Foreground color for selected text. */
|
||
|
Tk_Item *selItemPtr; /* Pointer to selected item. NULL means
|
||
|
* selection isn't in this canvas. */
|
||
|
int selectFirst; /* Index of first selected character. */
|
||
|
int selectLast; /* Index of last selected character. */
|
||
|
Tk_Item *anchorItemPtr; /* Item corresponding to "selectAnchor":
|
||
|
* not necessarily selItemPtr. */
|
||
|
int selectAnchor; /* Fixed end of selection (i.e. "select to"
|
||
|
* operation will use this as one end of the
|
||
|
* selection). */
|
||
|
|
||
|
/*
|
||
|
* Information for display insertion cursor in text:
|
||
|
*/
|
||
|
|
||
|
Tk_3DBorder insertBorder; /* Used to draw vertical bar for insertion
|
||
|
* cursor. */
|
||
|
int insertWidth; /* Total width of insertion cursor. */
|
||
|
int insertBorderWidth; /* Width of 3-D border around insert cursor. */
|
||
|
int insertOnTime; /* Number of milliseconds cursor should spend
|
||
|
* in "on" state for each blink. */
|
||
|
int insertOffTime; /* Number of milliseconds cursor should spend
|
||
|
* in "off" state for each blink. */
|
||
|
Tk_TimerToken insertBlinkHandler;
|
||
|
/* Timer handler used to blink cursor on and
|
||
|
* off. */
|
||
|
Tk_Item *focusItemPtr; /* Item that currently has the input focus,
|
||
|
* or NULL if no such item. */
|
||
|
|
||
|
/*
|
||
|
* Transformation applied to canvas as a whole: to compute screen
|
||
|
* coordinates (X,Y) from canvas coordinates (x,y), do the following:
|
||
|
*
|
||
|
* X = x - xOrigin;
|
||
|
* Y = y - yOrigin;
|
||
|
*/
|
||
|
|
||
|
int xOrigin, yOrigin; /* Canvas coordinates corresponding to
|
||
|
* upper-left corner of window, given in
|
||
|
* canvas pixel units. */
|
||
|
int drawableXOrigin, drawableYOrigin;
|
||
|
/* During redisplay, these fields give the
|
||
|
* canvas coordinates corresponding to
|
||
|
* the upper-left corner of the drawable
|
||
|
* where items are actually being drawn
|
||
|
* (typically a pixmap smaller than the
|
||
|
* whole window). */
|
||
|
|
||
|
/*
|
||
|
* Information used for event bindings associated with items.
|
||
|
*/
|
||
|
|
||
|
Tk_BindingTable bindingTable;
|
||
|
/* Table of all bindings currently defined
|
||
|
* for this canvas. NULL means that no
|
||
|
* bindings exist, so the table hasn't been
|
||
|
* created. Each "object" used for this
|
||
|
* table is either a Tk_Uid for a tag or
|
||
|
* the address of an item named by id. */
|
||
|
Tk_Item *currentItemPtr; /* The item currently containing the mouse
|
||
|
* pointer, or NULL if none. */
|
||
|
double closeEnough; /* The mouse is assumed to be inside an
|
||
|
* item if it is this close to it. */
|
||
|
XEvent pickEvent; /* The event upon which the current choice
|
||
|
* of currentItem is based. Must be saved
|
||
|
* so that if the currentItem is deleted,
|
||
|
* can pick another. */
|
||
|
int state; /* Last known modifier state. Used to
|
||
|
* defer picking a new current object
|
||
|
* while buttons are down. */
|
||
|
|
||
|
/*
|
||
|
* Information used for managing scrollbars:
|
||
|
*/
|
||
|
|
||
|
char *xScrollCmd; /* Command prefix for communicating with
|
||
|
* horizontal scrollbar. NULL means no
|
||
|
* horizontal scrollbar. Malloc'ed*/
|
||
|
char *yScrollCmd; /* Command prefix for communicating with
|
||
|
* vertical scrollbar. NULL means no
|
||
|
* vertical scrollbar. Malloc'ed*/
|
||
|
int scrollX1, scrollY1, scrollX2, scrollY2;
|
||
|
/* These four coordinates define the region
|
||
|
* that is the 100% area for scrolling (i.e.
|
||
|
* these numbers determine the size and
|
||
|
* location of the sliders on scrollbars).
|
||
|
* Units are pixels in canvas coords. */
|
||
|
char *regionString; /* The option string from which scrollX1
|
||
|
* etc. are derived. Malloc'ed. */
|
||
|
int scrollIncrement; /* The number of canvas units that the
|
||
|
* picture shifts when a scrollbar up or
|
||
|
* down arrow is pressed. */
|
||
|
|
||
|
/*
|
||
|
* Information used for scanning:
|
||
|
*/
|
||
|
|
||
|
int scanX; /* X-position at which scan started (e.g.
|
||
|
* button was pressed here). */
|
||
|
int scanXOrigin; /* Value of xOrigin field when scan started. */
|
||
|
int scanY; /* Y-position at which scan started (e.g.
|
||
|
* button was pressed here). */
|
||
|
int scanYOrigin; /* Value of yOrigin field when scan started. */
|
||
|
|
||
|
/*
|
||
|
* Information used to speed up searches by remembering the last item
|
||
|
* created or found with an item id search.
|
||
|
*/
|
||
|
|
||
|
Tk_Item *hotPtr; /* Pointer to "hot" item (one that's been
|
||
|
* recently used. NULL means there's no
|
||
|
* hot item. */
|
||
|
Tk_Item *hotPrevPtr; /* Pointer to predecessor to hotPtr (NULL
|
||
|
* means item is first in list). This is
|
||
|
* only a hint and may not really be hotPtr's
|
||
|
* predecessor. */
|
||
|
|
||
|
/*
|
||
|
* Miscellaneous information:
|
||
|
*/
|
||
|
|
||
|
Cursor cursor; /* Current cursor for window, or None. */
|
||
|
double pixelsPerMM; /* Scale factor between MM and pixels;
|
||
|
* used when converting coordinates. */
|
||
|
int flags; /* Various flags; see below for
|
||
|
* definitions. */
|
||
|
int nextId; /* Number to use as id for next item
|
||
|
* created in widget. */
|
||
|
} Tk_Canvas;
|
||
|
|
||
|
/*
|
||
|
* Flag bits for canvases:
|
||
|
*
|
||
|
* REDRAW_PENDING - 1 means a DoWhenIdle handler has already
|
||
|
* been created to redraw some or all of the
|
||
|
* canvas.
|
||
|
* REPICK_NEEDED - 1 means DisplayCanvas should pick a new
|
||
|
* current item before redrawing the canvas.
|
||
|
* GOT_FOCUS - 1 means the focus is currently in this
|
||
|
* widget, so should draw the insertion cursor.
|
||
|
* CURSOR_ON - 1 means the insertion cursor is in the "on"
|
||
|
* phase of its blink cycle. 0 means either
|
||
|
* we don't have the focus or the cursor is in
|
||
|
* the "off" phase of its cycle.
|
||
|
* UPDATE_SCROLLBARS - 1 means the scrollbars should get updated
|
||
|
* as part of the next display operation.
|
||
|
*/
|
||
|
|
||
|
#define REDRAW_PENDING 1
|
||
|
#define REPICK_NEEDED 2
|
||
|
#define GOT_FOCUS 4
|
||
|
#define CURSOR_ON 8
|
||
|
#define UPDATE_SCROLLBARS 0x10
|
||
|
|
||
|
/*
|
||
|
* Records of the following type are used to describe a type of
|
||
|
* item (e.g. lines, circles, etc.) that can form part of a
|
||
|
* canvas widget.
|
||
|
*/
|
||
|
|
||
|
typedef int Tk_ItemCreateProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, int argc, char **argv));
|
||
|
typedef int Tk_ItemConfigureProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, int argc, char **argv, int flags));
|
||
|
typedef int Tk_ItemCoordProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, int argc, char **argv));
|
||
|
typedef void Tk_ItemDeleteProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr));
|
||
|
typedef void Tk_ItemDisplayProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, Drawable dst));
|
||
|
typedef double Tk_ItemPointProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, double *pointPtr));
|
||
|
typedef int Tk_ItemAreaProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, double *rectPtr));
|
||
|
typedef int Tk_ItemPostscriptProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, Tk_PostscriptInfo *psInfoPtr));
|
||
|
typedef void Tk_ItemScaleProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, double originX, double originY,
|
||
|
double scaleX, double scaleY));
|
||
|
typedef void Tk_ItemTranslateProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, double deltaX, double deltaY));
|
||
|
typedef int Tk_ItemIndexProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, char *indexString,
|
||
|
int *indexPtr));
|
||
|
typedef void Tk_ItemCursorProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, int index));
|
||
|
typedef int Tk_ItemSelectionProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, int offset, char *buffer,
|
||
|
int maxBytes));
|
||
|
typedef int Tk_ItemInsertProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, int beforeThis, char *string));
|
||
|
typedef int Tk_ItemDCharsProc _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, int first, int last));
|
||
|
|
||
|
typedef struct Tk_ItemType {
|
||
|
char *name; /* The name of this type of item, such
|
||
|
* as "line". */
|
||
|
int itemSize; /* Total amount of space needed for
|
||
|
* item's record. */
|
||
|
Tk_ItemCreateProc *createProc; /* Procedure to create a new item of
|
||
|
* this type. */
|
||
|
Tk_ConfigSpec *configSpecs; /* Pointer to array of configuration
|
||
|
* specs for this type. Used for
|
||
|
* returning configuration info. */
|
||
|
Tk_ItemConfigureProc *configProc; /* Procedure to call to change
|
||
|
* configuration options. */
|
||
|
Tk_ItemCoordProc *coordProc; /* Procedure to call to get and set
|
||
|
* the item's coordinates. */
|
||
|
Tk_ItemDeleteProc *deleteProc; /* Procedure to delete existing item of
|
||
|
* this type. */
|
||
|
Tk_ItemDisplayProc *displayProc; /* Procedure to display items of
|
||
|
* this type. */
|
||
|
int alwaysRedraw; /* Non-zero means displayProc should
|
||
|
* be called even when the item has
|
||
|
* been moved off-screen. */
|
||
|
Tk_ItemPointProc *pointProc; /* Computes distance from item to
|
||
|
* a given point. */
|
||
|
Tk_ItemAreaProc *areaProc; /* Computes whether item is inside,
|
||
|
* outside, or overlapping an area. */
|
||
|
Tk_ItemPostscriptProc *postscriptProc;
|
||
|
/* Procedure to write a Postscript
|
||
|
* description for items of this
|
||
|
* type. */
|
||
|
Tk_ItemScaleProc *scaleProc; /* Procedure to rescale items of
|
||
|
* this type. */
|
||
|
Tk_ItemTranslateProc *translateProc;/* Procedure to translate items of
|
||
|
* this type. */
|
||
|
Tk_ItemIndexProc *indexProc; /* Procedure to determine index of
|
||
|
* indicated character. NULL if
|
||
|
* item doesn't support indexing. */
|
||
|
Tk_ItemCursorProc *icursorProc; /* Procedure to set insert cursor pos.
|
||
|
* to just before a given position. */
|
||
|
Tk_ItemSelectionProc *selectionProc;/* Procedure to return selection (in
|
||
|
* STRING format) when it is in this
|
||
|
* item. */
|
||
|
Tk_ItemInsertProc *insertProc; /* Procedure to insert something into
|
||
|
* an item. */
|
||
|
Tk_ItemDCharsProc *dCharsProc; /* Procedure to delete characters
|
||
|
* from an item. */
|
||
|
struct Tk_ItemType *nextPtr; /* Used to link types together into
|
||
|
* a list. */
|
||
|
} Tk_ItemType;
|
||
|
|
||
|
/*
|
||
|
* Macros to transform a point from double-precision canvas coordinates
|
||
|
* to integer pixel coordinates in the pixmap where redisplay is being
|
||
|
* done.
|
||
|
*/
|
||
|
|
||
|
#define SCREEN_X(canvasPtr, x) \
|
||
|
(((int) ((x) + (((x) > 0) ? 0.5 : -0.5))) - (canvasPtr)->drawableXOrigin)
|
||
|
#define SCREEN_Y(canvasPtr, y) \
|
||
|
(((int) ((y) + (((y) > 0) ? 0.5 : -0.5))) - (canvasPtr)->drawableYOrigin)
|
||
|
|
||
|
/*
|
||
|
* Canvas-related variables that are shared among Tk modules but not
|
||
|
* exported to the outside world:
|
||
|
*/
|
||
|
|
||
|
extern Tk_CustomOption tkCanvasTagsOption;
|
||
|
|
||
|
/*
|
||
|
* Canvas-related procedures that are shared among Tk modules but not
|
||
|
* exported to the outside world:
|
||
|
*/
|
||
|
|
||
|
extern void TkBezierScreenPoints _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
double control[], int numSteps,
|
||
|
XPoint *xPointPtr));
|
||
|
extern int TkCanvPostscriptCmd _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tcl_Interp *interp, int argc, char **argv));
|
||
|
extern int TkCanvPsBitmap _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_PostscriptInfo *psInfoPtr, Pixmap bitmap));
|
||
|
extern int TkCanvPsColor _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_PostscriptInfo *psInfoPtr, XColor *colorPtr));
|
||
|
extern int TkCanvPsFont _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_PostscriptInfo *psInfoPtr,
|
||
|
XFontStruct *fontStructPtr));
|
||
|
extern void TkCanvPsPath _ANSI_ARGS_((Tcl_Interp *interp,
|
||
|
double *coordPtr, int numPoints,
|
||
|
Tk_PostscriptInfo *psInfoPtr));
|
||
|
extern int TkCanvPsStipple _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_PostscriptInfo *psInfoPtr, Pixmap bitmap,
|
||
|
int filled));
|
||
|
extern double TkCanvPsY _ANSI_ARGS_((Tk_PostscriptInfo *psInfoPtr,
|
||
|
double y));
|
||
|
extern void TkFillPolygon _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
double *coordPtr, int numPoints, Drawable drawable,
|
||
|
GC gc));
|
||
|
extern int TkGetCanvasCoord _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
char *string, double *doublePtr));
|
||
|
extern void TkIncludePoint _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
Tk_Item *itemPtr, double *pointPtr));
|
||
|
extern int TkMakeBezierCurve _ANSI_ARGS_((Tk_Canvas *canvasPtr,
|
||
|
double *pointPtr, int numPoints, int numSteps,
|
||
|
XPoint xPoints[], double dblPoints[]));
|
||
|
|
||
|
#endif /* _TKCANVAS */
|