text: typedef struct TkCimeth TkCimeth;
  typedef struct TkCitem TkCitem;
  typedef struct TkCanvas TkCanvas;
  typedef struct TkCline TkCline;
  typedef struct TkCtag TkCtag;
  typedef struct TkCpoints TkCpoints;
  typedef struct TkCwind TkCwind;
  
  struct TkCline
  {
  	int		arrow;
  	int		shape[3];
  	int		width;
  	Image*		stipple;
  	Image*		pen;
  	int		arrowf;
  	int		arrowl;
  	int		capstyle;
  	int		smooth;
  	int		steps;
  };
  
  struct TkCwind
  {
  	Tk*		sub;		/* Subwindow of canvas */
  	Tk*		focus;		/* Current Mouse focus */
  	int		width;		/* Requested width */
  	int		height;		/* Requested height */
  	int		flags;		/* possible: Tkanchor|Tksetwidth|Tksetheight */
  };
  
  struct TkCpoints
  {
  	int		npoint;		/* Number of points */
  	Point*		parampt;	/* Parameters in fixed point */
  	Point*		drawpt;		/* Draw coord in pixels */
  	Rectangle	bb;		/* Bounding box in pixels */
  };
  
  struct TkCitem
  {
  	int		id;		/* Unique id */
  	int		type;		/* Object type */
  	TkCpoints	p;		/* Points plus bounding box */
  	TkEnv*		env;		/* Colors & fonts */
  	TkCitem*	next;		/* Z order */
  	TkName*		tags;		/* Temporary tag spot */
  	TkCtag*		stag;		/* Real tag structure */
  //	char		obj[TKSTRUCTALIGN];
  };
  
  struct TkCtag
  {
  	TkCitem*	item;		/* Link to item */
  	TkName*		name;		/* Text name or id */
  	TkCtag*		taglist;	/* link items with this tag */
  	TkCtag*		itemlist;	/* link tags for this item */
  };
  
  enum
  {
  	/* Item types */
  	TkCVline,
  	TkCVtext,
  	TkCVrect,
  	TkCVoval,
  	TkCVbitmap,
  	TkCVpoly,
  	TkCVwindow,
  	TkCVimage,
  	TkCVarc,
  
  	TkCselto	= 0,
  	TkCselfrom,
  	TkCseladjust,
  
  	TkCbufauto	= 0,
  	TkCbufnone,
  	TkCbufvisible,
  	TkCbufall,
  
  	TkCadd		= 0,
  	TkCfind,
  	
  	TkChash		= 32,
  
  	TkCarrowf	= (1<<0),
  	TkCarrowl	= (1<<1),
  	Tknarrow	= 6		/* Number of points in arrow */
  };
  
  struct TkCanvas
  {
  	int		close;
  	int		confine;
  	int		cleanup;
  	int		scrollr[4];
  	Rectangle	region;
  	Rectangle	update;		/* Area to paint next draw */
  	Point		view;
  	TkCitem*	selection;
  	int		width;
  	int		height;
  	int		sborderwidth;
  	int		xscrolli;	/* Scroll increment */
  	int		yscrolli;
  	char*		xscroll;	/* Scroll commands */
  	char*		yscroll;
  	int		id;		/* Unique id */
  	TkCitem*	head;		/* Items in Z order */
  	TkCitem*	tail;		/* Head is lowest, tail is highest */
  	TkCitem*	focus;		/* Keyboard focus */
  	TkCitem*	mouse;		/* Mouse focus */
  	TkCitem* grab;
  	TkName*		current;	/* Fake for current tag */
  	TkCtag		curtag;
  	Image*		image;		/* Drawing space */
  	int			ialloc;		/* image was allocated by us? */
  	Image*		mask;		/* mask space (for stippling) */
  	TkName*		thash[TkChash];	/* Tag hash */
  	int		actions;
  	int		actlim;
  	int		buffer;
  };
  
  struct TkCimeth
  {
  	char*	name;
  	char*	(*create)(Tk*, char *arg, char **val);
  	void	(*draw)(Image*, TkCitem*, TkEnv*);
  	void	(*free)(TkCitem*);
  	char*	(*coord)(TkCitem*, char*, int, int);
  	char*	(*cget)(TkCitem*, char*, char**);
  	char*	(*conf)(Tk*, TkCitem*, char*);
  	int		(*hit)(TkCitem*, Point);
  };
  
  extern	TkCimeth	tkcimethod[];
  extern	int	cvslshape[];
  extern	Rectangle	bbnil;
  extern	Rectangle	huger;
  
  /* General */
  extern	char*		tkcaddtag(Tk*, TkCitem*, int);
  extern	TkCtag*		tkcfirsttag(TkCitem*, TkCtag*);
  extern	TkCtag*		tkclasttag(TkCitem*, TkCtag*);
  extern	void		tkcvsappend(TkCanvas*, TkCitem*);
  extern	TkCitem*	 tkcnewitem(Tk*, int, int);
  extern	void		tkcvsfreeitem(TkCitem*);
  extern	Point		tkcvsrelpos(Tk*);
  extern	Tk*		tkcvsinwindow(Tk*, Point*);
  extern	char*		tkcvstextdchar(Tk*, TkCitem*, char*);
  extern	char*		tkcvstextindex(Tk*, TkCitem*, char*, char **val);
  extern	char*		tkcvstextinsert(Tk*, TkCitem*, char*);
  extern	char*		tkcvstexticursor(Tk*, TkCitem*, char*);
  extern	void		tkmkpen(Image**, TkEnv*, Image*);
  extern	void		tkcvstextfocus(Tk*, TkCitem*, int);
  extern	char*		tkcvstextselect(Tk*, TkCitem*, char*, int);
  extern	void		tkcvstextclr(Tk*);
  extern	Tk*		tkcvsevent(Tk*, int, void*);
  extern	Point		tkcvsanchor(Point, int, int, int);
  extern	void		tkcvsdirty(Tk*);
  extern	void		tkfreectag(TkCtag*);
  extern	char*		tkparsepts(TkTop*, TkCpoints*, char**, int);
  extern	void		tkfreepoint(TkCpoints*);
  extern	void		tkxlatepts(Point*, int, int, int);
  extern	void		tkpolybound(Point*, int, Rectangle*);
  extern	TkName*		tkctaglook(Tk*, TkName*, char*);
  extern	void		tkbbmax(Rectangle*, Rectangle*);
  extern	void		tkcvssetdirty(Tk*);
  
  /* Canvas Item methods - required to populate tkcimethod in canvs.c */
  extern	char*	tkcvslinecreat(Tk*, char *arg, char **val);
  extern	void	tkcvslinedraw(Image*, TkCitem*, TkEnv*);
  extern	void	tkcvslinefree(TkCitem*);
  extern	char*	tkcvslinecoord(TkCitem*, char*, int, int);
  extern	char*	tkcvslinecget(TkCitem*, char*, char**);
  extern	char*	tkcvslineconf(Tk*, TkCitem*, char*);
  extern	int		tkcvslinehit(TkCitem*, Point);
  
  extern	char*	tkcvstextcreat(Tk*, char *arg, char **val);
  extern	void	tkcvstextdraw(Image*, TkCitem*, TkEnv*);
  extern	void	tkcvstextfree(TkCitem*);
  extern	char*	tkcvstextcoord(TkCitem*, char*, int, int);
  extern	char*	tkcvstextcget(TkCitem*, char*, char**);
  extern	char*	tkcvstextconf(Tk*, TkCitem*, char*);
  
  extern	char*	tkcvsrectcreat(Tk*, char *arg, char **val);
  extern	void	tkcvsrectdraw(Image*, TkCitem*, TkEnv*);
  extern	void	tkcvsrectfree(TkCitem*);
  extern	char*	tkcvsrectcoord(TkCitem*, char*, int, int);
  extern	char*	tkcvsrectcget(TkCitem*, char*, char**);
  extern	char*	tkcvsrectconf(Tk*, TkCitem*, char*);
  
  extern	char*	tkcvsovalcreat(Tk*, char *arg, char **val);
  extern	void	tkcvsovaldraw(Image*, TkCitem*, TkEnv*);
  extern	void	tkcvsovalfree(TkCitem*);
  extern	char*	tkcvsovalcoord(TkCitem*, char*, int, int);
  extern	char*	tkcvsovalcget(TkCitem*, char*, char**);
  extern	char*	tkcvsovalconf(Tk*, TkCitem*, char*);
  extern	int		tkcvsovalhit(TkCitem*, Point);
  
  extern	char*	tkcvsarccreat(Tk*, char *arg, char **val);
  extern	void	tkcvsarcdraw(Image*, TkCitem*, TkEnv*);
  extern	void	tkcvsarcfree(TkCitem*);
  extern	char*	tkcvsarccoord(TkCitem*, char*, int, int);
  extern	char*	tkcvsarccget(TkCitem*, char*, char**);
  extern	char*	tkcvsarcconf(Tk*, TkCitem*, char*);
  
  extern	char*	tkcvsbitcreat(Tk*, char *arg, char **val);
  extern	void	tkcvsbitdraw(Image*, TkCitem*, TkEnv*);
  extern	void	tkcvsbitfree(TkCitem*);
  extern	char*	tkcvsbitcoord(TkCitem*, char*, int, int);
  extern	char*	tkcvsbitcget(TkCitem*, char*, char**);
  extern	char*	tkcvsbitconf(Tk*, TkCitem*, char*);
  
  extern	char*	tkcvswindcreat(Tk*, char *arg, char **val);
  extern	void	tkcvswinddraw(Image*, TkCitem*, TkEnv*);
  extern	void	tkcvswindfree(TkCitem*);
  extern	char*	tkcvswindcoord(TkCitem*, char*, int, int);
  extern	char*	tkcvswindcget(TkCitem*, char*, char**);
  extern	char*	tkcvswindconf(Tk*, TkCitem*, char*);
  
  extern	char*	tkcvspolycreat(Tk*, char *arg, char **val);
  extern	void	tkcvspolydraw(Image*, TkCitem*, TkEnv*);
  extern	void	tkcvspolyfree(TkCitem*);
  extern	char*	tkcvspolycoord(TkCitem*, char*, int, int);
  extern	char*	tkcvspolycget(TkCitem*, char*, char**);
  extern	char*	tkcvspolyconf(Tk*, TkCitem*, char*);
  extern	int		tkcvspolyhit(TkCitem*, Point);
  
  extern	char*	tkcvsimgcreat(Tk*, char *arg, char **val);
  extern	void	tkcvsimgdraw(Image*, TkCitem*, TkEnv*);
  extern	void	tkcvsimgfree(TkCitem*);
  extern	char*	tkcvsimgcoord(TkCitem*, char*, int, int);
  extern	char*	tkcvsimgcget(TkCitem*, char*, char**);
  extern	char*	tkcvsimgconf(Tk*, TkCitem*, char*);
  
  extern	TkCitem*	tkcvsfindwin(Tk*);
  extern	void		tkcvsforgetsub(Tk*, Tk*);
  