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 */
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 width; /* current internal width */
int height; /* current internal height */
int ascent; /* distance from top of widget to baseline */
int stretch; /* true if need to stretch height */
int owned; /* true if window is destroyed on item deletion */
Tk* focus; /* Current Mouse focus */
};
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*);
|