typedef struct Box Box; typedef struct Cimage Cimage; typedef struct Column Column; typedef struct Exec Exec; typedef struct Line Line; typedef struct Page Page; typedef struct Row Row; typedef struct Runestr Runestr; typedef struct Text Text; typedef struct Timer Timer; typedef struct Url Url; typedef struct Window Window; struct Runestr { Rune *r; int nr; }; enum { Rowtag, Columntag, Tag, Urltag, Statustag, Entry, Textarea, }; struct Text { Frame; uint org; uint q0; uint q1; int what; Window *w; Rectangle scrollr; Rectangle lastsr; Rectangle all; Row *row; Column *col; Runestr rs; }; uint textbacknl(Text*, uint, uint); int textbswidth(Text*, Rune); int textclickmatch(Text*, int, int, int, uint*); void textclose(Text*); void textdelete(Text*, uint, uint); void textdoubleclick(Text*, uint*, uint*); void textfill(Text*); void textframescroll(Text*, int); void textinit(Text *, Image *, Rectangle, Font *, Image **); void textinsert(Text*, uint, Rune*, uint); void textredraw(Text *, Rectangle, Font *, Image *); int textresize(Text *, Image *, Rectangle); void textscrdraw(Text*); void textscroll(Text*, int); void textselect(Text*); int textselect2(Text *, uint *, uint *, Text **); int textselect3(Text *, uint *, uint *); void textset(Text *, Rune *, int); void textsetorigin(Text*, uint, int); void textsetselect(Text*, uint, uint); void textshow(Text*, uint, uint, int); void texttype(Text*, Rune); void textmouse(Text *, Point, int); struct Line { Rectangle r; int state; int hastext; int hastable; Box *boxes; Box *lastbox; Line *prev; Line *next; }; struct Box { Item *i; Rectangle r; void (*draw)(Box *, Page *, Image *); void (*mouse)(Box *, Page *, int); void (*key)(Box *, Page *, Rune); Box *prev; Box *next; }; Box* boxalloc(Line *, Item *, Rectangle); void boxinit(Box *); struct Lay { Rectangle r; int width; int xwall; Line *lines; Line *lastline; Font *font; Ifloat *floats; int laying; }; void laypage(Page *p); Lay* layitems(Item *, Rectangle, int); void laydraw(Page *, Image *, Lay *); void layfree(Lay *); struct Cimage { Ref; Image *i; Memimage *mi; Url *url; Cimage *next; }; struct Url { Ref; /* urls in window.url[] are not freed */ int id; int method; /* HGet or HPost */ Runestr src; /* requested url */ Runestr act; /* actual url (redirection) */ Runestr post; /* only set if method==HPost */ Runestr ctype; /* content type */ }; Url* urlalloc(Runestr *, Runestr *, int); void urlfree(Url *); Url* urldup(Url *); int urlopen(Url *); struct Page { Url *url; Runestr title; Window *w; Image *b; Rectangle r; Rectangle all; Rectangle vscrollr; Rectangle hscrollr; Row *row; Column *col; Docinfo *doc; Kidinfo *kidinfo; Item *items; Lay *lay; Point pos; int selecting; Point top, bot; Box *topbx, *botbx; int aborting; int changed; int loading; Rune *status; Page *parent; Page *child; Page *next; Cimage **cimage; int ncimage; struct{ long t; Runestr rs; }refresh; }; void pageget(Page *, Runestr *, Runestr *, int, int); void pageload(Page *, Url *, int); void pageclose(Page *); void pageredraw(Page *); void pagerender(Page *); void pagemouse(Page *, Point, int); void pagetype(Page *, Rune, Point); void pagescrldraw(Page *); void pagescroll(Page *, int, int); int pagescrollxy(Page *, int, int); int pageabort(Page *); void pagesnarf(Page *); void pagesetrefresh(Page *); int pagerefresh(Page *); struct Window { Ref; QLock; Text tag; Text url; Page page; Text status; int owner; int inpage; Rectangle r; Column *col; struct{ Url **url; int nurl; int cid; }history; }; void wininit(Window *, Window *, Rectangle); int winclean(Window *, int); void winclose(Window *); int winresize(Window *, Rectangle, int); Text* wintext(Window *, Point); void winlock(Window *, int); void winunlock(Window *); void winaddhist(Window *, Url *); void wingohist(Window *, int); void winsettag(Window *); void winseturl(Window *); void winsetstatus(Window *w, Rune *); Text* wintype(Window *, Point, Rune); Text* winmouse(Window *, Point, int); void winmousebut(Window *); void windebug(Window *); struct Column { Rectangle r; Text tag; Row *row; Window **w; int nw; int safe; }; void colinit(Column*, Rectangle); Window* coladd(Column*, Window*, Window*, int); void colclose(Column*, Window*, int); void colcloseall(Column*); void colresize(Column*, Rectangle); Text* colwhich(Column*, Point, Rune, int); void coldragwin(Column*, Window*, int); void colgrow(Column*, Window*, int); int colclean(Column*); void colsort(Column*); void colmousebut(Column*); struct Row { QLock; Rectangle r; Text tag; Column **col; int ncol; }; void rowinit(Row*, Rectangle); Column* rowadd(Row*, Column *c, int); void rowclose(Row*, Column*, int); Text* rowwhich(Row*, Point, Rune, int); Column* rowwhichcol(Row*, Point); void rowresize(Row*, Rectangle); void rowdragcol(Row*, Column*, int but); struct Exec { char *cmd; int p[2]; /* p[1] is write to program; p[0] set to prog fd 0*/ int q[2]; /* q[0] is read from program; q[1] set to prog fd 1 */ Channel *sync; /* chan(ulong) */ }; struct Timer { int dt; int cancel; Channel *c; /* chan(int) */ Timer *next; }; enum { Scrollsize = 12, Scrollgap = 4, Margin = 4, Border = 2, Space = 2, Tabspace = 30, Boxsize = 12, WFont = FntR*NumSize+Tiny, Panspeed = 4, Maxtab = 8, BUFSIZE = 1024*8, RBUFSIZE = BUFSIZE/sizeof(Rune), STACK = 64*1024, }; enum { FALSE, TRUE, XXX, }; enum { Light = 0xEEEEEE, Dark = 0x666666, Red = 0xBB0000, Back = 0xCCCCCC, }; Mouse *mouse; Mousectl *mousectl; Keyboardctl *keyboardctl; Image *tagcols[NCOL]; Image *textcols[NCOL]; Image *but2col; Image *but3col; Image *button; Image *colbutton; Font *passfont; Cursor boxcursor; Row row; Text *argtext; Text *seltext; Text *typetext; Page *selpage; Column *activecol; char *webmountpt; int plumbsendfd; int webctlfd; char *charset; int procstderr; enum { Kscrolloneup = KF|0x20, Kscrollonedown = KF|0x21, }; Channel *cplumb; /* chan(Plumbmsg*) */ Channel *cexit; /* chan(int) */ Channel *crefresh; /* chan(page *) */