xref: /inferno-os/libtk/textw.h (revision 7ef44d652ae9e5e1f5b3465d73684e4a54de73c0)
1 typedef struct TkText TkText;
2 typedef struct TkTitem TkTitem;
3 typedef struct TkTline TkTline;
4 typedef struct TkTindex TkTindex;
5 typedef struct TkTmarkinfo TkTmarkinfo;
6 typedef struct TkTtaginfo TkTtaginfo;
7 typedef struct TkTwind TkTwind;
8 
9 enum
10 {
11 	/* text item types */
12 	TkTascii,	/* contiguous string of ascii chars, all with same tags */
13 	TkTrune,	/* printable utf (one printing position) */
14 	TkTtab,
15 	TkTnewline,	/* line field contains pointer to containing line */
16 	TkTcontline,	/* end of non-newline line; line field as with TkTnewline */
17 	TkTwin,
18 	TkTmark,
19 
20 	TkTbyitem = 0,	/* adjustment units */
21 	TkTbyitemback,
22 	TkTbytline,
23 	TkTbytlineback,
24 	TkTbychar,
25 	TkTbycharback,
26 	TkTbycharstart,
27 	TkTbyline,
28 	TkTbylineback,
29 	TkTbylinestart,
30 	TkTbylineend,
31 	TkTbywordstart,
32 	TkTbywordend,
33 	TkTbywrapstart,
34 	TkTbywrapend,
35 
36 	TkTselid	= 0,		/* id of sel tag */
37 	TkTmaxtag	= 32,
38 	Textwidth	= 40,		/* default width, in chars */
39 	Textheight	= 10,		/* default height, in chars */
40 
41 	TkTfirst	= (1<<0),	/* first line in buffer, or after a TkTlast */
42 	TkTlast		= (1<<1),	/* TkTnewline at end of line */
43 	TkTdrawn	= (1<<2),	/* screen cache copy is ok */
44 	TkTdlocked	= (1<<3),	/* display already locked */
45 	TkTjustfoc	= (1<<4),	/* got focus on last B1 press */
46 	TkTnodrag		= (1<<5),	/* ignore B1 drag until B1 up */
47 	TkTunset 	= (1<<31),	/* marks int tag options "unspecified" */
48 
49 	TkTborderwidth	= 0,
50 	TkTjustify,
51 	TkTlmargin1,
52 	TkTlmargin2,
53 	TkTlmargin3,
54 	TkTrmargin,
55 	TkTspacing1,
56 	TkTspacing2,
57 	TkTspacing3,
58 	TkToffset,
59 	TkTunderline,
60 	TkToverstrike,
61 	TkTrelief,
62 	TkTwrap,
63 	TkTlineheight,
64 
65 	TkTnumopts
66 };
67 
68 struct TkTline
69 {
70 	Point		orig;		/* where to put first item of line */
71 	int		width;
72 	int		height;
73 	int		ascent;
74 	int		flags;
75 	TkTitem*	items;
76 	TkTline*	next;
77 	TkTline*	prev;
78 };
79 
80 struct TkText
81 {
82 	TkTline		start;		/* fake before-the-first line */
83 	TkTline		end;		/* fake after-the-last line */
84 	Tk*			tagshare;
85 	TkTtabstop*	tabs;
86 	TkTtaginfo*	tags;
87 	TkTmarkinfo*	marks;
88 	char*		xscroll;
89 	char*		yscroll;
90 	uchar		selunit;	/* select adjustment unit */
91 	uchar		tflag;		/* various text-specific flags */
92 	int			nlines;	/* number of nl items in widget */
93 	TkTitem*	selfirst;	/* first item marked with sel tag */
94 	TkTitem*	sellast;	/* item after last marked with sel tag */
95 	Point		deltatv;	/* vector from text-space to view-space */
96 	Point		deltaiv;	/* vector from image-space to view-space */
97 	Point		current;	/* last known mouse pos */
98 	Point		track;	/* for use when B1 or B2 is down */
99 	int		nexttag;	/* next usable tag index */
100 	TkTitem*	mouse;		/* mouse focus */
101 	int		inswidth;	/* width of insertion cursor */
102 	int		sborderwidth;
103 	int		opts[TkTnumopts];
104 	int		propagate;
105 	int		scrolltop[2];
106 	int		scrollbot[2];
107 	Image*		image;
108 	uchar		cur_flag;	/* text cursor to be shown up? */
109 	Rectangle	cur_rec;	/* last text cursor rectangle */
110 };
111 
112 struct TkTwind
113 {
114 	Tk*		sub;		/* Subwindow of canvas */
115 	Tk*		focus;		/* Current Mouse focus */
116 	int		width;		/* current internal width */
117 	int		height;		/* current internal height */
118 	int		owned;	/* true if window is destroyed on item deletion */
119 	int		align;		/* how to align within line */
120 	char*		create;		/* creation script */
121 	int		padx;		/* extra space on each side */
122 	int		pady;		/* extra space on top and bot */
123 	int		ascent;		/* distance from top of widget to baseline */
124 	int		stretch;	/* true if need to stretch height */
125 };
126 
127 struct TkTitem
128 {
129 	uchar		kind;		/* e.g. TkTascii, etc */
130 	uchar		tagextra;
131 	short		width;
132 	TkTitem		*next;
133 	union	{
134 		char*		string;
135 		TkTwind*	win;
136 		TkTmarkinfo*	mark;
137 		TkTline*	line;
138 	} u;
139 	ulong		tags[1];
140 	/* TkTitem length extends tagextra ulongs beyond */
141 };
142 
143 struct TkTmarkinfo
144 {
145 	char*		name;
146 	int		gravity;
147 	TkTitem*	cur;
148 	TkTmarkinfo*	next;
149 };
150 
151 struct TkTtaginfo
152 {
153 	int		id;
154 	char*		name;
155 	TkEnv*		env;
156 	TkTtabstop*	tabs;
157 	TkTtaginfo*	next;
158 	TkAction*	binds;		/* Binding of current events */
159 	int		opts[TkTnumopts];
160 };
161 
162 struct TkTindex
163 {
164 	TkTitem*	item;
165 	TkTline*	line;
166 	int		pos;		/* index within multichar item */
167 };
168 
169 extern	TkCmdtab	tkttagcmd[];
170 extern	TkCmdtab	tktmarkcmd[];
171 extern	TkCmdtab	tktwincmd[];
172 
173 extern	void		tkfreetext(Tk*);
174 extern	char*		tktaddmarkinfo(TkText*, char*, TkTmarkinfo**);
175 extern	char*		tktaddtaginfo(Tk*, char*, TkTtaginfo**);
176 extern	int		tktadjustind(TkText*, int, TkTindex*);
177 extern	int		tktanytags(TkTitem*);
178 extern	Rectangle	tktbbox(Tk*, TkTindex*);
179 extern	void		tktdirty(Tk*);
180 extern	int		tktdispwidth(Tk*, TkTtabstop *tabs, TkTitem*, Font*, int, int, int);
181 extern	void		tktendind(TkText*, TkTindex*);
182 extern	char*	tktextcursor(Tk*, char*, char **);
183 extern	Tk*		tktextevent(Tk*, int, void*);
184 extern	Tk*		tktinwindow(Tk*, Point*);
185 extern	char*		tktextselection(Tk*, char*, char**);
186 extern	void		tktextsize(Tk*, int);
187 extern	TkTmarkinfo*	tktfindmark(TkTmarkinfo*, char*);
188 extern	int		tktfindsubitem(Tk*, TkTindex*);
189 extern	TkTtaginfo*	tktfindtag(TkTtaginfo*, char*);
190 extern	char*		tktfixgeom(Tk*, TkTline*, TkTline*, int);
191 extern	void		tktfreeitems(TkText*, TkTitem*, int);
192 extern	void		tktfreelines(TkText*, TkTline*, int);
193 extern	void		tktfreemarks(TkTmarkinfo*);
194 extern	void		tktfreetabs(TkTtabstop*);
195 extern	void		tktfreetags(TkTtaginfo*);
196 extern	int		tktindcompare(TkText*, TkTindex*, int, TkTindex*);
197 extern	int		tktindbefore(TkTindex*, TkTindex*);
198 extern	int		tktindrune(TkTindex*);
199 extern	char*		tktinsert(Tk*, TkTindex*, char*, TkTitem*);
200 extern	int	tktisbreak(int);
201 extern	void		tktitemind(TkTitem*, TkTindex*);
202 extern	char*		tktiteminsert(TkText*, TkTindex*, TkTitem*);
203 extern	TkTline*	tktitemline(TkTitem*);
204 extern	char*		tktindparse(Tk*, char**, TkTindex*);
205 extern	TkTitem*	tktlastitem(TkTitem*);
206 extern	int		tktlinenum(TkText*, TkTindex*);
207 extern	int		tktlinepos(TkText*, TkTindex*);
208 extern	int		tktmarkind(Tk*, char*, TkTindex*);
209 extern	char*		tktmarkmove(Tk*, TkTmarkinfo*, TkTindex*);
210 extern	char*		tktmarkparse(Tk*, char**, TkTmarkinfo**);
211 extern	int		tktmaxwid(TkTline*);
212 extern	char*		tktnewitem(int, int, TkTitem**);
213 extern	char*		tktnewline(int, TkTitem*, TkTline*, TkTline*, TkTline**);
214 extern	int		tktposcount(TkTitem*);
215 extern	TkTline*	tktprevwrapline(Tk*, TkTline*);
216 extern	void		tktremitem(TkText*, TkTindex*);
217 extern	int		tktsametags(TkTitem*, TkTitem*);
218 extern	char*		tktsplititem(TkTindex*);
219 extern	void		tktstartind(TkText*, TkTindex*);
220 extern	char*		tkttagchange(Tk*, int, TkTindex*, TkTindex*, int);
221 extern	int		tkttagbit(TkTitem*, int, int);
222 extern	void		tkttagcomb(TkTitem*, TkTitem*, int);
223 extern	int		tkttagind(Tk*, char*, int, TkTindex*);
224 extern	char*		tkttagname(TkText*, int);
225 extern	int		tkttagnrange(TkText*, int, TkTindex*, TkTindex*, TkTindex*, TkTindex*);
226 extern	void		tkttagopts(Tk*, TkTitem*, int*, TkEnv*, TkTtabstop **, int);
227 extern	char*		tkttagparse(Tk*, char**, TkTtaginfo**);
228 extern	int		tkttagset(TkTitem*, int);
229 extern	int		tktxyind(Tk*, int, int, TkTindex*);
230 extern	void		tktxtforgetsub(Tk*, Tk*);
231