xref: /inferno-os/libtk/textw.h (revision c9c0d12ef55c878b0e361f9f6936bbb4c67b40fb)
137da2899SCharles.Forsyth typedef struct TkText TkText;
237da2899SCharles.Forsyth typedef struct TkTitem TkTitem;
337da2899SCharles.Forsyth typedef struct TkTline TkTline;
437da2899SCharles.Forsyth typedef struct TkTindex TkTindex;
537da2899SCharles.Forsyth typedef struct TkTmarkinfo TkTmarkinfo;
637da2899SCharles.Forsyth typedef struct TkTtaginfo TkTtaginfo;
737da2899SCharles.Forsyth typedef struct TkTwind TkTwind;
837da2899SCharles.Forsyth 
937da2899SCharles.Forsyth enum
1037da2899SCharles.Forsyth {
1137da2899SCharles.Forsyth 	/* text item types */
1237da2899SCharles.Forsyth 	TkTascii,	/* contiguous string of ascii chars, all with same tags */
1337da2899SCharles.Forsyth 	TkTrune,	/* printable utf (one printing position) */
1437da2899SCharles.Forsyth 	TkTtab,
1537da2899SCharles.Forsyth 	TkTnewline,	/* line field contains pointer to containing line */
1637da2899SCharles.Forsyth 	TkTcontline,	/* end of non-newline line; line field as with TkTnewline */
1737da2899SCharles.Forsyth 	TkTwin,
1837da2899SCharles.Forsyth 	TkTmark,
1937da2899SCharles.Forsyth 
2037da2899SCharles.Forsyth 	TkTbyitem = 0,	/* adjustment units */
2137da2899SCharles.Forsyth 	TkTbyitemback,
2237da2899SCharles.Forsyth 	TkTbytline,
2337da2899SCharles.Forsyth 	TkTbytlineback,
2437da2899SCharles.Forsyth 	TkTbychar,
2537da2899SCharles.Forsyth 	TkTbycharback,
2637da2899SCharles.Forsyth 	TkTbycharstart,
2737da2899SCharles.Forsyth 	TkTbyline,
2837da2899SCharles.Forsyth 	TkTbylineback,
2937da2899SCharles.Forsyth 	TkTbylinestart,
3037da2899SCharles.Forsyth 	TkTbylineend,
3137da2899SCharles.Forsyth 	TkTbywordstart,
3237da2899SCharles.Forsyth 	TkTbywordend,
3337da2899SCharles.Forsyth 	TkTbywrapstart,
3437da2899SCharles.Forsyth 	TkTbywrapend,
3537da2899SCharles.Forsyth 
3637da2899SCharles.Forsyth 	TkTselid	= 0,		/* id of sel tag */
3737da2899SCharles.Forsyth 	TkTmaxtag	= 32,
3837da2899SCharles.Forsyth 	Textwidth	= 40,		/* default width, in chars */
3937da2899SCharles.Forsyth 	Textheight	= 10,		/* default height, in chars */
4037da2899SCharles.Forsyth 
4137da2899SCharles.Forsyth 	TkTfirst	= (1<<0),	/* first line in buffer, or after a TkTlast */
4237da2899SCharles.Forsyth 	TkTlast		= (1<<1),	/* TkTnewline at end of line */
4337da2899SCharles.Forsyth 	TkTdrawn	= (1<<2),	/* screen cache copy is ok */
4437da2899SCharles.Forsyth 	TkTdlocked	= (1<<3),	/* display already locked */
4537da2899SCharles.Forsyth 	TkTjustfoc	= (1<<4),	/* got focus on last B1 press */
4637da2899SCharles.Forsyth 	TkTnodrag		= (1<<5),	/* ignore B1 drag until B1 up */
4737da2899SCharles.Forsyth 	TkTunset 	= (1<<31),	/* marks int tag options "unspecified" */
4837da2899SCharles.Forsyth 
4937da2899SCharles.Forsyth 	TkTborderwidth	= 0,
5037da2899SCharles.Forsyth 	TkTjustify,
5137da2899SCharles.Forsyth 	TkTlmargin1,
5237da2899SCharles.Forsyth 	TkTlmargin2,
5337da2899SCharles.Forsyth 	TkTlmargin3,
5437da2899SCharles.Forsyth 	TkTrmargin,
5537da2899SCharles.Forsyth 	TkTspacing1,
5637da2899SCharles.Forsyth 	TkTspacing2,
5737da2899SCharles.Forsyth 	TkTspacing3,
5837da2899SCharles.Forsyth 	TkToffset,
5937da2899SCharles.Forsyth 	TkTunderline,
6037da2899SCharles.Forsyth 	TkToverstrike,
6137da2899SCharles.Forsyth 	TkTrelief,
6237da2899SCharles.Forsyth 	TkTwrap,
6337da2899SCharles.Forsyth 	TkTlineheight,
6437da2899SCharles.Forsyth 
6537da2899SCharles.Forsyth 	TkTnumopts
6637da2899SCharles.Forsyth };
6737da2899SCharles.Forsyth 
6837da2899SCharles.Forsyth struct TkTline
6937da2899SCharles.Forsyth {
7037da2899SCharles.Forsyth 	Point		orig;		/* where to put first item of line */
7137da2899SCharles.Forsyth 	int		width;
7237da2899SCharles.Forsyth 	int		height;
7337da2899SCharles.Forsyth 	int		ascent;
7437da2899SCharles.Forsyth 	int		flags;
7537da2899SCharles.Forsyth 	TkTitem*	items;
7637da2899SCharles.Forsyth 	TkTline*	next;
7737da2899SCharles.Forsyth 	TkTline*	prev;
7837da2899SCharles.Forsyth };
7937da2899SCharles.Forsyth 
8037da2899SCharles.Forsyth struct TkText
8137da2899SCharles.Forsyth {
8237da2899SCharles.Forsyth 	TkTline		start;		/* fake before-the-first line */
8337da2899SCharles.Forsyth 	TkTline		end;		/* fake after-the-last line */
8437da2899SCharles.Forsyth 	Tk*			tagshare;
8537da2899SCharles.Forsyth 	TkTtabstop*	tabs;
8637da2899SCharles.Forsyth 	TkTtaginfo*	tags;
8737da2899SCharles.Forsyth 	TkTmarkinfo*	marks;
8837da2899SCharles.Forsyth 	char*		xscroll;
8937da2899SCharles.Forsyth 	char*		yscroll;
9037da2899SCharles.Forsyth 	uchar		selunit;	/* select adjustment unit */
9137da2899SCharles.Forsyth 	uchar		tflag;		/* various text-specific flags */
9237da2899SCharles.Forsyth 	int			nlines;	/* number of nl items in widget */
9337da2899SCharles.Forsyth 	TkTitem*	selfirst;	/* first item marked with sel tag */
9437da2899SCharles.Forsyth 	TkTitem*	sellast;	/* item after last marked with sel tag */
9537da2899SCharles.Forsyth 	Point		deltatv;	/* vector from text-space to view-space */
9637da2899SCharles.Forsyth 	Point		deltaiv;	/* vector from image-space to view-space */
9737da2899SCharles.Forsyth 	Point		current;	/* last known mouse pos */
9837da2899SCharles.Forsyth 	Point		track;	/* for use when B1 or B2 is down */
9937da2899SCharles.Forsyth 	int		nexttag;	/* next usable tag index */
10037da2899SCharles.Forsyth 	TkTitem*	mouse;		/* mouse focus */
10137da2899SCharles.Forsyth 	int		inswidth;	/* width of insertion cursor */
10237da2899SCharles.Forsyth 	int		sborderwidth;
10337da2899SCharles.Forsyth 	int		opts[TkTnumopts];
10437da2899SCharles.Forsyth 	int		propagate;
10537da2899SCharles.Forsyth 	int		scrolltop[2];
10637da2899SCharles.Forsyth 	int		scrollbot[2];
10737da2899SCharles.Forsyth 	Image*		image;
10837da2899SCharles.Forsyth 	uchar		cur_flag;	/* text cursor to be shown up? */
10937da2899SCharles.Forsyth 	Rectangle	cur_rec;	/* last text cursor rectangle */
11037da2899SCharles.Forsyth };
11137da2899SCharles.Forsyth 
11237da2899SCharles.Forsyth struct TkTwind
11337da2899SCharles.Forsyth {
11437da2899SCharles.Forsyth 	Tk*		sub;		/* Subwindow of canvas */
1155849851aSforsyth 	Tk*		focus;		/* Current Mouse focus */
1165849851aSforsyth 	int		width;		/* current internal width */
1175849851aSforsyth 	int		height;		/* current internal height */
1185849851aSforsyth 	int		owned;	/* true if window is destroyed on item deletion */
11937da2899SCharles.Forsyth 	int		align;		/* how to align within line */
12037da2899SCharles.Forsyth 	char*		create;		/* creation script */
12137da2899SCharles.Forsyth 	int		padx;		/* extra space on each side */
12237da2899SCharles.Forsyth 	int		pady;		/* extra space on top and bot */
12337da2899SCharles.Forsyth 	int		ascent;		/* distance from top of widget to baseline */
12437da2899SCharles.Forsyth 	int		stretch;	/* true if need to stretch height */
12537da2899SCharles.Forsyth };
12637da2899SCharles.Forsyth 
12737da2899SCharles.Forsyth struct TkTitem
12837da2899SCharles.Forsyth {
12937da2899SCharles.Forsyth 	uchar		kind;		/* e.g. TkTascii, etc */
13037da2899SCharles.Forsyth 	uchar		tagextra;
13137da2899SCharles.Forsyth 	short		width;
13237da2899SCharles.Forsyth 	TkTitem		*next;
13337da2899SCharles.Forsyth 	union	{
13437da2899SCharles.Forsyth 		char*		string;
13537da2899SCharles.Forsyth 		TkTwind*	win;
13637da2899SCharles.Forsyth 		TkTmarkinfo*	mark;
13737da2899SCharles.Forsyth 		TkTline*	line;
13837da2899SCharles.Forsyth 	} u;
13937da2899SCharles.Forsyth 	ulong		tags[1];
14037da2899SCharles.Forsyth 	/* TkTitem length extends tagextra ulongs beyond */
14137da2899SCharles.Forsyth };
14237da2899SCharles.Forsyth 
14337da2899SCharles.Forsyth struct TkTmarkinfo
14437da2899SCharles.Forsyth {
14537da2899SCharles.Forsyth 	char*		name;
14637da2899SCharles.Forsyth 	int		gravity;
14737da2899SCharles.Forsyth 	TkTitem*	cur;
14837da2899SCharles.Forsyth 	TkTmarkinfo*	next;
14937da2899SCharles.Forsyth };
15037da2899SCharles.Forsyth 
15137da2899SCharles.Forsyth struct TkTtaginfo
15237da2899SCharles.Forsyth {
15337da2899SCharles.Forsyth 	int		id;
15437da2899SCharles.Forsyth 	char*		name;
15537da2899SCharles.Forsyth 	TkEnv*		env;
15637da2899SCharles.Forsyth 	TkTtabstop*	tabs;
15737da2899SCharles.Forsyth 	TkTtaginfo*	next;
15837da2899SCharles.Forsyth 	TkAction*	binds;		/* Binding of current events */
15937da2899SCharles.Forsyth 	int		opts[TkTnumopts];
16037da2899SCharles.Forsyth };
16137da2899SCharles.Forsyth 
16237da2899SCharles.Forsyth struct TkTindex
16337da2899SCharles.Forsyth {
16437da2899SCharles.Forsyth 	TkTitem*	item;
16537da2899SCharles.Forsyth 	TkTline*	line;
16637da2899SCharles.Forsyth 	int		pos;		/* index within multichar item */
16737da2899SCharles.Forsyth };
16837da2899SCharles.Forsyth 
16937da2899SCharles.Forsyth extern	TkCmdtab	tkttagcmd[];
17037da2899SCharles.Forsyth extern	TkCmdtab	tktmarkcmd[];
17137da2899SCharles.Forsyth extern	TkCmdtab	tktwincmd[];
17237da2899SCharles.Forsyth 
17337da2899SCharles.Forsyth extern	void		tkfreetext(Tk*);
17437da2899SCharles.Forsyth extern	char*		tktaddmarkinfo(TkText*, char*, TkTmarkinfo**);
17537da2899SCharles.Forsyth extern	char*		tktaddtaginfo(Tk*, char*, TkTtaginfo**);
17637da2899SCharles.Forsyth extern	int		tktadjustind(TkText*, int, TkTindex*);
17737da2899SCharles.Forsyth extern	int		tktanytags(TkTitem*);
17837da2899SCharles.Forsyth extern	Rectangle	tktbbox(Tk*, TkTindex*);
17937da2899SCharles.Forsyth extern	void		tktdirty(Tk*);
18037da2899SCharles.Forsyth extern	int		tktdispwidth(Tk*, TkTtabstop *tabs, TkTitem*, Font*, int, int, int);
18137da2899SCharles.Forsyth extern	void		tktendind(TkText*, TkTindex*);
18237da2899SCharles.Forsyth extern	char*	tktextcursor(Tk*, char*, char **);
18337da2899SCharles.Forsyth extern	Tk*		tktextevent(Tk*, int, void*);
18437da2899SCharles.Forsyth extern	Tk*		tktinwindow(Tk*, Point*);
18537da2899SCharles.Forsyth extern	char*		tktextselection(Tk*, char*, char**);
18637da2899SCharles.Forsyth extern	void		tktextsize(Tk*, int);
18737da2899SCharles.Forsyth extern	TkTmarkinfo*	tktfindmark(TkTmarkinfo*, char*);
18837da2899SCharles.Forsyth extern	int		tktfindsubitem(Tk*, TkTindex*);
18937da2899SCharles.Forsyth extern	TkTtaginfo*	tktfindtag(TkTtaginfo*, char*);
19037da2899SCharles.Forsyth extern	char*		tktfixgeom(Tk*, TkTline*, TkTline*, int);
19137da2899SCharles.Forsyth extern	void		tktfreeitems(TkText*, TkTitem*, int);
19237da2899SCharles.Forsyth extern	void		tktfreelines(TkText*, TkTline*, int);
19337da2899SCharles.Forsyth extern	void		tktfreemarks(TkTmarkinfo*);
19437da2899SCharles.Forsyth extern	void		tktfreetabs(TkTtabstop*);
19537da2899SCharles.Forsyth extern	void		tktfreetags(TkTtaginfo*);
19637da2899SCharles.Forsyth extern	int		tktindcompare(TkText*, TkTindex*, int, TkTindex*);
19737da2899SCharles.Forsyth extern	int		tktindbefore(TkTindex*, TkTindex*);
19837da2899SCharles.Forsyth extern	int		tktindrune(TkTindex*);
19937da2899SCharles.Forsyth extern	char*		tktinsert(Tk*, TkTindex*, char*, TkTitem*);
20037da2899SCharles.Forsyth extern	int	tktisbreak(int);
20137da2899SCharles.Forsyth extern	void		tktitemind(TkTitem*, TkTindex*);
20237da2899SCharles.Forsyth extern	char*		tktiteminsert(TkText*, TkTindex*, TkTitem*);
20337da2899SCharles.Forsyth extern	TkTline*	tktitemline(TkTitem*);
20437da2899SCharles.Forsyth extern	char*		tktindparse(Tk*, char**, TkTindex*);
20537da2899SCharles.Forsyth extern	TkTitem*	tktlastitem(TkTitem*);
20637da2899SCharles.Forsyth extern	int		tktlinenum(TkText*, TkTindex*);
20737da2899SCharles.Forsyth extern	int		tktlinepos(TkText*, TkTindex*);
20837da2899SCharles.Forsyth extern	int		tktmarkind(Tk*, char*, TkTindex*);
20937da2899SCharles.Forsyth extern	char*		tktmarkmove(Tk*, TkTmarkinfo*, TkTindex*);
21037da2899SCharles.Forsyth extern	char*		tktmarkparse(Tk*, char**, TkTmarkinfo**);
21137da2899SCharles.Forsyth extern	int		tktmaxwid(TkTline*);
21237da2899SCharles.Forsyth extern	char*		tktnewitem(int, int, TkTitem**);
21337da2899SCharles.Forsyth extern	char*		tktnewline(int, TkTitem*, TkTline*, TkTline*, TkTline**);
21437da2899SCharles.Forsyth extern	int		tktposcount(TkTitem*);
21537da2899SCharles.Forsyth extern	TkTline*	tktprevwrapline(Tk*, TkTline*);
21637da2899SCharles.Forsyth extern	void		tktremitem(TkText*, TkTindex*);
21737da2899SCharles.Forsyth extern	int		tktsametags(TkTitem*, TkTitem*);
21837da2899SCharles.Forsyth extern	char*		tktsplititem(TkTindex*);
21937da2899SCharles.Forsyth extern	void		tktstartind(TkText*, TkTindex*);
22037da2899SCharles.Forsyth extern	char*		tkttagchange(Tk*, int, TkTindex*, TkTindex*, int);
22137da2899SCharles.Forsyth extern	int		tkttagbit(TkTitem*, int, int);
22237da2899SCharles.Forsyth extern	void		tkttagcomb(TkTitem*, TkTitem*, int);
22337da2899SCharles.Forsyth extern	int		tkttagind(Tk*, char*, int, TkTindex*);
22437da2899SCharles.Forsyth extern	char*		tkttagname(TkText*, int);
22537da2899SCharles.Forsyth extern	int		tkttagnrange(TkText*, int, TkTindex*, TkTindex*, TkTindex*, TkTindex*);
22637da2899SCharles.Forsyth extern	void		tkttagopts(Tk*, TkTitem*, int*, TkEnv*, TkTtabstop **, int);
22737da2899SCharles.Forsyth extern	char*		tkttagparse(Tk*, char**, TkTtaginfo**);
22837da2899SCharles.Forsyth extern	int		tkttagset(TkTitem*, int);
22937da2899SCharles.Forsyth extern	int		tktxyind(Tk*, int, int, TkTindex*);
230*c9c0d12eSforsyth extern	void		tktxtforgetsub(Tk*, Tk*);
231