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