summaryrefslogtreecommitdiff
path: root/libtk/textw.h
blob: 3326cdcca94a6226fb6e1861176ac1cfba6b8d40 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
typedef struct TkText TkText;
typedef struct TkTitem TkTitem;
typedef struct TkTline TkTline;
typedef struct TkTindex TkTindex;
typedef struct TkTmarkinfo TkTmarkinfo;
typedef struct TkTtaginfo TkTtaginfo;
typedef struct TkTwind TkTwind;

enum
{
	/* text item types */
	TkTascii,	/* contiguous string of ascii chars, all with same tags */
	TkTrune,	/* printable utf (one printing position) */
	TkTtab,
	TkTnewline,	/* line field contains pointer to containing line */
	TkTcontline,	/* end of non-newline line; line field as with TkTnewline */
	TkTwin,
	TkTmark,

	TkTbyitem = 0,	/* adjustment units */
	TkTbyitemback,
	TkTbytline,
	TkTbytlineback,
	TkTbychar,
	TkTbycharback,
	TkTbycharstart,
	TkTbyline,
	TkTbylineback,
	TkTbylinestart,
	TkTbylineend,
	TkTbywordstart,
	TkTbywordend,
	TkTbywrapstart,
	TkTbywrapend,

	TkTselid	= 0,		/* id of sel tag */
	TkTmaxtag	= 32,
	Textwidth	= 40,		/* default width, in chars */
	Textheight	= 10,		/* default height, in chars */

	TkTfirst	= (1<<0),	/* first line in buffer, or after a TkTlast */
	TkTlast		= (1<<1),	/* TkTnewline at end of line */
	TkTdrawn	= (1<<2),	/* screen cache copy is ok */
	TkTdlocked	= (1<<3),	/* display already locked */
	TkTjustfoc	= (1<<4),	/* got focus on last B1 press */
	TkTnodrag		= (1<<5),	/* ignore B1 drag until B1 up */
	TkTunset 	= (1<<31),	/* marks int tag options "unspecified" */

	TkTborderwidth	= 0,
	TkTjustify,
	TkTlmargin1,
	TkTlmargin2,
	TkTlmargin3,
	TkTrmargin,
	TkTspacing1,
	TkTspacing2,
	TkTspacing3,
	TkToffset,
	TkTunderline,
	TkToverstrike,
	TkTrelief,
	TkTwrap,
	TkTlineheight,

	TkTnumopts
};

struct TkTline
{
	Point		orig;		/* where to put first item of line */
	int		width;
	int		height;
	int		ascent;
	int		flags;
	TkTitem*	items;
	TkTline*	next;
	TkTline*	prev;
};

struct TkText
{
	TkTline		start;		/* fake before-the-first line */
	TkTline		end;		/* fake after-the-last line */
	Tk*			tagshare;
	TkTtabstop*	tabs;
	TkTtaginfo*	tags;
	TkTmarkinfo*	marks;
	char*		xscroll;
	char*		yscroll;
	uchar		selunit;	/* select adjustment unit */
	uchar		tflag;		/* various text-specific flags */
	int			nlines;	/* number of nl items in widget */
	TkTitem*	selfirst;	/* first item marked with sel tag */
	TkTitem*	sellast;	/* item after last marked with sel tag */
	Point		deltatv;	/* vector from text-space to view-space */
	Point		deltaiv;	/* vector from image-space to view-space */
	Point		current;	/* last known mouse pos */
	Point		track;	/* for use when B1 or B2 is down */
	int		nexttag;	/* next usable tag index */
	TkTitem*	mouse;		/* mouse focus */
	int		inswidth;	/* width of insertion cursor */
	int		sborderwidth;
	int		opts[TkTnumopts];
	int		propagate;
	int		scrolltop[2];
	int		scrollbot[2];
	Image*		image;
	uchar		cur_flag;	/* text cursor to be shown up? */
	Rectangle	cur_rec;	/* last text cursor rectangle */
};

struct TkTwind
{
	Tk*		sub;		/* Subwindow of canvas */
	Tk*		focus;		/* Current Mouse focus */
	int		width;		/* current internal width */
	int		height;		/* current internal height */
	int		owned;	/* true if window is destroyed on item deletion */
	int		align;		/* how to align within line */
	char*		create;		/* creation script */
	int		padx;		/* extra space on each side */
	int		pady;		/* extra space on top and bot */
	int		ascent;		/* distance from top of widget to baseline */
	int		stretch;	/* true if need to stretch height */
};

struct TkTitem
{
	uchar		kind;		/* e.g. TkTascii, etc */
	uchar		tagextra;
	short		width;
	TkTitem		*next;
	union	{
		char*		string;
		TkTwind*	win;
		TkTmarkinfo*	mark;
		TkTline*	line;
	} u;
	ulong		tags[1];
	/* TkTitem length extends tagextra ulongs beyond */
};

struct TkTmarkinfo
{
	char*		name;
	int		gravity;
	TkTitem*	cur;
	TkTmarkinfo*	next;
};

struct TkTtaginfo
{
	int		id;
	char*		name;
	TkEnv*		env;
	TkTtabstop*	tabs;
	TkTtaginfo*	next;
	TkAction*	binds;		/* Binding of current events */
	int		opts[TkTnumopts];
};

struct TkTindex
{
	TkTitem*	item;
	TkTline*	line;
	int		pos;		/* index within multichar item */
};

extern	TkCmdtab	tkttagcmd[];
extern	TkCmdtab	tktmarkcmd[];
extern	TkCmdtab	tktwincmd[];

extern	void		tkfreetext(Tk*);
extern	char*		tktaddmarkinfo(TkText*, char*, TkTmarkinfo**);
extern	char*		tktaddtaginfo(Tk*, char*, TkTtaginfo**);
extern	int		tktadjustind(TkText*, int, TkTindex*);
extern	int		tktanytags(TkTitem*);
extern	Rectangle	tktbbox(Tk*, TkTindex*);
extern	void		tktdirty(Tk*);
extern	int		tktdispwidth(Tk*, TkTtabstop *tabs, TkTitem*, Font*, int, int, int);
extern	void		tktendind(TkText*, TkTindex*);
extern	char*	tktextcursor(Tk*, char*, char **);
extern	Tk*		tktextevent(Tk*, int, void*);
extern	Tk*		tktinwindow(Tk*, Point*);
extern	char*		tktextselection(Tk*, char*, char**);
extern	void		tktextsize(Tk*, int);
extern	TkTmarkinfo*	tktfindmark(TkTmarkinfo*, char*);
extern	int		tktfindsubitem(Tk*, TkTindex*);
extern	TkTtaginfo*	tktfindtag(TkTtaginfo*, char*);
extern	char*		tktfixgeom(Tk*, TkTline*, TkTline*, int);
extern	void		tktfreeitems(TkText*, TkTitem*, int);
extern	void		tktfreelines(TkText*, TkTline*, int);
extern	void		tktfreemarks(TkTmarkinfo*);
extern	void		tktfreetabs(TkTtabstop*);
extern	void		tktfreetags(TkTtaginfo*);
extern	int		tktindcompare(TkText*, TkTindex*, int, TkTindex*);
extern	int		tktindbefore(TkTindex*, TkTindex*);
extern	int		tktindrune(TkTindex*);
extern	char*		tktinsert(Tk*, TkTindex*, char*, TkTitem*);
extern	int	tktisbreak(int);
extern	void		tktitemind(TkTitem*, TkTindex*);
extern	char*		tktiteminsert(TkText*, TkTindex*, TkTitem*);
extern	TkTline*	tktitemline(TkTitem*);
extern	char*		tktindparse(Tk*, char**, TkTindex*);
extern	TkTitem*	tktlastitem(TkTitem*);
extern	int		tktlinenum(TkText*, TkTindex*);
extern	int		tktlinepos(TkText*, TkTindex*);
extern	int		tktmarkind(Tk*, char*, TkTindex*);
extern	char*		tktmarkmove(Tk*, TkTmarkinfo*, TkTindex*);
extern	char*		tktmarkparse(Tk*, char**, TkTmarkinfo**);
extern	int		tktmaxwid(TkTline*);
extern	char*		tktnewitem(int, int, TkTitem**);
extern	char*		tktnewline(int, TkTitem*, TkTline*, TkTline*, TkTline**);
extern	int		tktposcount(TkTitem*);
extern	TkTline*	tktprevwrapline(Tk*, TkTline*);
extern	void		tktremitem(TkText*, TkTindex*);
extern	int		tktsametags(TkTitem*, TkTitem*);
extern	char*		tktsplititem(TkTindex*);
extern	void		tktstartind(TkText*, TkTindex*);
extern	char*		tkttagchange(Tk*, int, TkTindex*, TkTindex*, int);
extern	int		tkttagbit(TkTitem*, int, int);
extern	void		tkttagcomb(TkTitem*, TkTitem*, int);
extern	int		tkttagind(Tk*, char*, int, TkTindex*);
extern	char*		tkttagname(TkText*, int);
extern	int		tkttagnrange(TkText*, int, TkTindex*, TkTindex*, TkTindex*, TkTindex*);
extern	void		tkttagopts(Tk*, TkTitem*, int*, TkEnv*, TkTtabstop **, int);
extern	char*		tkttagparse(Tk*, char**, TkTtaginfo**);
extern	int		tkttagset(TkTitem*, int);
extern	int		tktxyind(Tk*, int, int, TkTindex*);