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*);extern void tktxtforgetsub(Tk*, Tk*);
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*);
extern void tktxtforgetsub(Tk*, Tk*);