| #ifndef _FRAME_H_ | 
 | #define _FRAME_H_ 1 | 
 | #if defined(__cplusplus) | 
 | extern "C" { | 
 | #endif | 
 |  | 
 | AUTOLIB(frame) | 
 |  | 
 | typedef struct Frbox Frbox; | 
 | typedef struct Frame Frame; | 
 |  | 
 | enum{ | 
 | 	BACK, | 
 | 	HIGH, | 
 | 	BORD, | 
 | 	TEXT, | 
 | 	HTEXT, | 
 | 	NCOL | 
 | }; | 
 |  | 
 | #define	FRTICKW	3 | 
 | struct Frbox | 
 | { | 
 | 	long		wid;		/* in pixels */ | 
 | 	long		nrune;		/* <0 ==> negate and treat as break char */ | 
 | 	uchar	*ptr; | 
 | 	short	bc;	/* break char */ | 
 | 	short	minwid; | 
 | }; | 
 |  | 
 | struct Frame | 
 | { | 
 | 	Font		*font;		/* of chars in the frame */ | 
 | 	Display		*display;	/* on which frame appears */ | 
 | 	Image		*b;		/* on which frame appears */ | 
 | 	Image		*cols[NCOL];	/* text and background colors */ | 
 | 	Rectangle	r;		/* in which text appears */ | 
 | 	Rectangle	entire;		/* of full frame */ | 
 | 	void			(*scroll)(Frame*, int);	/* scroll function provided by application */ | 
 | 	Frbox		*box; | 
 | 	ulong		p0, p1;		/* selection */ | 
 | 	ushort		nbox, nalloc; | 
 | 	ushort		maxtab;		/* max size of tab, in pixels */ | 
 | 	ushort		nchars;		/* # runes in frame */ | 
 | 	ushort		nlines;		/* # lines with text */ | 
 | 	ushort		maxlines;	/* total # lines in frame */ | 
 | 	ushort		lastlinefull;	/* last line fills frame */ | 
 | 	ushort		modified;	/* changed since frselect() */ | 
 | 	Image		*tick;	/* typing tick */ | 
 | 	Image		*tickback;	/* saved image under tick */ | 
 | 	int			ticked;	/* flag: is tick onscreen? */ | 
 | 	int			noredraw;	/* don't draw on the screen */ | 
 | 	int			tickscale;	/* tick scaling factor */ | 
 | }; | 
 |  | 
 | ulong	frcharofpt(Frame*, Point); | 
 | Point	frptofchar(Frame*, ulong); | 
 | int	frdelete(Frame*, ulong, ulong); | 
 | void	frinsert(Frame*, Rune*, Rune*, ulong); | 
 | void	frselect(Frame*, Mousectl*); | 
 | void	frselectpaint(Frame*, Point, Point, Image*); | 
 | void	frdrawsel(Frame*, Point, ulong, ulong, int); | 
 | Point	frdrawsel0(Frame*, Point, ulong, ulong, Image*, Image*); | 
 | void	frinit(Frame*, Rectangle, Font*, Image*, Image**); | 
 | void	frsetrects(Frame*, Rectangle, Image*); | 
 | void	frclear(Frame*, int); | 
 | void	frredraw(Frame*); | 
 |  | 
 | uchar	*_frallocstr(Frame*, unsigned); | 
 | void	_frinsure(Frame*, int, unsigned); | 
 | Point	_frdraw(Frame*, Point); | 
 | void	_frgrowbox(Frame*, int); | 
 | void	_frfreebox(Frame*, int, int); | 
 | void	_frmergebox(Frame*, int); | 
 | void	_frdelbox(Frame*, int, int); | 
 | void	_frsplitbox(Frame*, int, int); | 
 | int	_frfindbox(Frame*, int, ulong, ulong); | 
 | void	_frclosebox(Frame*, int, int); | 
 | int	_frcanfit(Frame*, Point, Frbox*); | 
 | void	_frcklinewrap(Frame*, Point*, Frbox*); | 
 | void	_frcklinewrap0(Frame*, Point*, Frbox*); | 
 | void	_fradvance(Frame*, Point*, Frbox*); | 
 | int	_frnewwid(Frame*, Point, Frbox*); | 
 | int	_frnewwid0(Frame*, Point, Frbox*); | 
 | void	_frclean(Frame*, Point, int, int); | 
 | void	_frdrawtext(Frame*, Point, Image*, Image*); | 
 | void	_fraddbox(Frame*, int, int); | 
 | Point	_frptofcharptb(Frame*, ulong, Point, int); | 
 | Point	_frptofcharnb(Frame*, ulong, int); | 
 | int	_frstrlen(Frame*, int); | 
 | void	frtick(Frame*, Point, int); | 
 | void	frinittick(Frame*); | 
 |  | 
 | #define	NRUNE(b)	((b)->nrune<0? 1 : (b)->nrune) | 
 | #define	NBYTE(b)	strlen((char*)(b)->ptr) | 
 | #if defined(__cplusplus) | 
 | } | 
 | #endif | 
 | #endif |