1*7ab27030SDavid du Colombier typedef struct Box Box; 2*7ab27030SDavid du Colombier typedef struct Cimage Cimage; 3*7ab27030SDavid du Colombier typedef struct Column Column; 4*7ab27030SDavid du Colombier typedef struct Exec Exec; 5*7ab27030SDavid du Colombier typedef struct Line Line; 6*7ab27030SDavid du Colombier typedef struct Page Page; 7*7ab27030SDavid du Colombier typedef struct Row Row; 8*7ab27030SDavid du Colombier typedef struct Runestr Runestr; 9*7ab27030SDavid du Colombier typedef struct Text Text; 10*7ab27030SDavid du Colombier typedef struct Timer Timer; 11*7ab27030SDavid du Colombier typedef struct Url Url; 12*7ab27030SDavid du Colombier typedef struct Window Window; 13*7ab27030SDavid du Colombier 14*7ab27030SDavid du Colombier struct Runestr 15*7ab27030SDavid du Colombier { 16*7ab27030SDavid du Colombier Rune *r; 17*7ab27030SDavid du Colombier int nr; 18*7ab27030SDavid du Colombier }; 19*7ab27030SDavid du Colombier 20*7ab27030SDavid du Colombier enum 21*7ab27030SDavid du Colombier { 22*7ab27030SDavid du Colombier Rowtag, 23*7ab27030SDavid du Colombier Columntag, 24*7ab27030SDavid du Colombier Tag, 25*7ab27030SDavid du Colombier Urltag, 26*7ab27030SDavid du Colombier Statustag, 27*7ab27030SDavid du Colombier Entry, 28*7ab27030SDavid du Colombier Textarea, 29*7ab27030SDavid du Colombier }; 30*7ab27030SDavid du Colombier 31*7ab27030SDavid du Colombier struct Text 32*7ab27030SDavid du Colombier { 33*7ab27030SDavid du Colombier Frame; 34*7ab27030SDavid du Colombier uint org; 35*7ab27030SDavid du Colombier uint q0; 36*7ab27030SDavid du Colombier uint q1; 37*7ab27030SDavid du Colombier int what; 38*7ab27030SDavid du Colombier Window *w; 39*7ab27030SDavid du Colombier Rectangle scrollr; 40*7ab27030SDavid du Colombier Rectangle lastsr; 41*7ab27030SDavid du Colombier Rectangle all; 42*7ab27030SDavid du Colombier Row *row; 43*7ab27030SDavid du Colombier Column *col; 44*7ab27030SDavid du Colombier Runestr rs; 45*7ab27030SDavid du Colombier }; 46*7ab27030SDavid du Colombier 47*7ab27030SDavid du Colombier uint textbacknl(Text*, uint, uint); 48*7ab27030SDavid du Colombier int textbswidth(Text*, Rune); 49*7ab27030SDavid du Colombier int textclickmatch(Text*, int, int, int, uint*); 50*7ab27030SDavid du Colombier void textclose(Text*); 51*7ab27030SDavid du Colombier void textdelete(Text*, uint, uint); 52*7ab27030SDavid du Colombier void textdoubleclick(Text*, uint*, uint*); 53*7ab27030SDavid du Colombier void textfill(Text*); 54*7ab27030SDavid du Colombier void textframescroll(Text*, int); 55*7ab27030SDavid du Colombier void textinit(Text *, Image *, Rectangle, Font *, Image **); 56*7ab27030SDavid du Colombier void textinsert(Text*, uint, Rune*, uint); 57*7ab27030SDavid du Colombier void textredraw(Text *, Rectangle, Font *, Image *); 58*7ab27030SDavid du Colombier int textresize(Text *, Image *, Rectangle); 59*7ab27030SDavid du Colombier void textscrdraw(Text*); 60*7ab27030SDavid du Colombier void textscroll(Text*, int); 61*7ab27030SDavid du Colombier void textselect(Text*); 62*7ab27030SDavid du Colombier int textselect2(Text *, uint *, uint *, Text **); 63*7ab27030SDavid du Colombier int textselect3(Text *, uint *, uint *); 64*7ab27030SDavid du Colombier void textset(Text *, Rune *, int); 65*7ab27030SDavid du Colombier void textsetorigin(Text*, uint, int); 66*7ab27030SDavid du Colombier void textsetselect(Text*, uint, uint); 67*7ab27030SDavid du Colombier void textshow(Text*, uint, uint, int); 68*7ab27030SDavid du Colombier void texttype(Text*, Rune); 69*7ab27030SDavid du Colombier void textmouse(Text *, Point, int); 70*7ab27030SDavid du Colombier 71*7ab27030SDavid du Colombier struct Line 72*7ab27030SDavid du Colombier { 73*7ab27030SDavid du Colombier Rectangle r; 74*7ab27030SDavid du Colombier int state; 75*7ab27030SDavid du Colombier int hastext; 76*7ab27030SDavid du Colombier int hastable; 77*7ab27030SDavid du Colombier Box *boxes; 78*7ab27030SDavid du Colombier Box *lastbox; 79*7ab27030SDavid du Colombier Line *prev; 80*7ab27030SDavid du Colombier Line *next; 81*7ab27030SDavid du Colombier }; 82*7ab27030SDavid du Colombier 83*7ab27030SDavid du Colombier struct Box 84*7ab27030SDavid du Colombier { 85*7ab27030SDavid du Colombier Item *i; 86*7ab27030SDavid du Colombier Rectangle r; 87*7ab27030SDavid du Colombier 88*7ab27030SDavid du Colombier void (*draw)(Box *, Page *, Image *); 89*7ab27030SDavid du Colombier void (*mouse)(Box *, Page *, int); 90*7ab27030SDavid du Colombier void (*key)(Box *, Page *, Rune); 91*7ab27030SDavid du Colombier Box *prev; 92*7ab27030SDavid du Colombier Box *next; 93*7ab27030SDavid du Colombier }; 94*7ab27030SDavid du Colombier 95*7ab27030SDavid du Colombier Box* boxalloc(Line *, Item *, Rectangle); 96*7ab27030SDavid du Colombier void boxinit(Box *); 97*7ab27030SDavid du Colombier 98*7ab27030SDavid du Colombier struct Lay 99*7ab27030SDavid du Colombier { 100*7ab27030SDavid du Colombier Rectangle r; 101*7ab27030SDavid du Colombier int width; 102*7ab27030SDavid du Colombier int xwall; 103*7ab27030SDavid du Colombier Line *lines; 104*7ab27030SDavid du Colombier Line *lastline; 105*7ab27030SDavid du Colombier Font *font; 106*7ab27030SDavid du Colombier Ifloat *floats; 107*7ab27030SDavid du Colombier int laying; 108*7ab27030SDavid du Colombier }; 109*7ab27030SDavid du Colombier 110*7ab27030SDavid du Colombier void laypage(Page *p); 111*7ab27030SDavid du Colombier Lay* layitems(Item *, Rectangle, int); 112*7ab27030SDavid du Colombier void laydraw(Page *, Image *, Lay *); 113*7ab27030SDavid du Colombier void layfree(Lay *); 114*7ab27030SDavid du Colombier 115*7ab27030SDavid du Colombier struct Cimage 116*7ab27030SDavid du Colombier { 117*7ab27030SDavid du Colombier Ref; 118*7ab27030SDavid du Colombier Image *i; 119*7ab27030SDavid du Colombier Memimage *mi; 120*7ab27030SDavid du Colombier Url *url; 121*7ab27030SDavid du Colombier Cimage *next; 122*7ab27030SDavid du Colombier }; 123*7ab27030SDavid du Colombier 124*7ab27030SDavid du Colombier struct Url 125*7ab27030SDavid du Colombier { 126*7ab27030SDavid du Colombier Ref; /* urls in window.url[] are not freed */ 127*7ab27030SDavid du Colombier int id; 128*7ab27030SDavid du Colombier int method; /* HGet or HPost */ 129*7ab27030SDavid du Colombier Runestr src; /* requested url */ 130*7ab27030SDavid du Colombier Runestr act; /* actual url (redirection) */ 131*7ab27030SDavid du Colombier Runestr post; /* only set if method==HPost */ 132*7ab27030SDavid du Colombier Runestr ctype; /* content type */ 133*7ab27030SDavid du Colombier }; 134*7ab27030SDavid du Colombier 135*7ab27030SDavid du Colombier Url* urlalloc(Runestr *, Runestr *, int); 136*7ab27030SDavid du Colombier void urlfree(Url *); 137*7ab27030SDavid du Colombier Url* urldup(Url *); 138*7ab27030SDavid du Colombier int urlopen(Url *); 139*7ab27030SDavid du Colombier 140*7ab27030SDavid du Colombier struct Page 141*7ab27030SDavid du Colombier { 142*7ab27030SDavid du Colombier Url *url; 143*7ab27030SDavid du Colombier Runestr title; 144*7ab27030SDavid du Colombier Window *w; 145*7ab27030SDavid du Colombier Image *b; 146*7ab27030SDavid du Colombier 147*7ab27030SDavid du Colombier Rectangle r; 148*7ab27030SDavid du Colombier Rectangle all; 149*7ab27030SDavid du Colombier Rectangle vscrollr; 150*7ab27030SDavid du Colombier Rectangle hscrollr; 151*7ab27030SDavid du Colombier Row *row; 152*7ab27030SDavid du Colombier Column *col; 153*7ab27030SDavid du Colombier 154*7ab27030SDavid du Colombier Docinfo *doc; 155*7ab27030SDavid du Colombier Kidinfo *kidinfo; 156*7ab27030SDavid du Colombier Item *items; 157*7ab27030SDavid du Colombier Lay *lay; 158*7ab27030SDavid du Colombier Point pos; 159*7ab27030SDavid du Colombier 160*7ab27030SDavid du Colombier int selecting; 161*7ab27030SDavid du Colombier Point top, bot; 162*7ab27030SDavid du Colombier Box *topbx, *botbx; 163*7ab27030SDavid du Colombier 164*7ab27030SDavid du Colombier int aborting; 165*7ab27030SDavid du Colombier int changed; 166*7ab27030SDavid du Colombier int loading; 167*7ab27030SDavid du Colombier 168*7ab27030SDavid du Colombier Rune *status; 169*7ab27030SDavid du Colombier 170*7ab27030SDavid du Colombier Page *parent; 171*7ab27030SDavid du Colombier Page *child; 172*7ab27030SDavid du Colombier Page *next; 173*7ab27030SDavid du Colombier 174*7ab27030SDavid du Colombier Cimage **cimage; 175*7ab27030SDavid du Colombier int ncimage; 176*7ab27030SDavid du Colombier 177*7ab27030SDavid du Colombier struct{ 178*7ab27030SDavid du Colombier long t; 179*7ab27030SDavid du Colombier Runestr rs; 180*7ab27030SDavid du Colombier }refresh; 181*7ab27030SDavid du Colombier }; 182*7ab27030SDavid du Colombier 183*7ab27030SDavid du Colombier void pageget(Page *, Runestr *, Runestr *, int, int); 184*7ab27030SDavid du Colombier void pageload(Page *, Url *, int); 185*7ab27030SDavid du Colombier void pageclose(Page *); 186*7ab27030SDavid du Colombier void pageredraw(Page *); 187*7ab27030SDavid du Colombier void pagerender(Page *); 188*7ab27030SDavid du Colombier void pagemouse(Page *, Point, int); 189*7ab27030SDavid du Colombier void pagetype(Page *, Rune, Point); 190*7ab27030SDavid du Colombier void pagescrldraw(Page *); 191*7ab27030SDavid du Colombier void pagescroll(Page *, int, int); 192*7ab27030SDavid du Colombier int pagescrollxy(Page *, int, int); 193*7ab27030SDavid du Colombier int pageabort(Page *); 194*7ab27030SDavid du Colombier void pagesnarf(Page *); 195*7ab27030SDavid du Colombier void pagesetrefresh(Page *); 196*7ab27030SDavid du Colombier int pagerefresh(Page *); 197*7ab27030SDavid du Colombier 198*7ab27030SDavid du Colombier struct Window 199*7ab27030SDavid du Colombier { 200*7ab27030SDavid du Colombier Ref; 201*7ab27030SDavid du Colombier QLock; 202*7ab27030SDavid du Colombier Text tag; 203*7ab27030SDavid du Colombier Text url; 204*7ab27030SDavid du Colombier Page page; 205*7ab27030SDavid du Colombier Text status; 206*7ab27030SDavid du Colombier int owner; 207*7ab27030SDavid du Colombier int inpage; 208*7ab27030SDavid du Colombier Rectangle r; 209*7ab27030SDavid du Colombier Column *col; 210*7ab27030SDavid du Colombier struct{ 211*7ab27030SDavid du Colombier Url **url; 212*7ab27030SDavid du Colombier int nurl; 213*7ab27030SDavid du Colombier int cid; 214*7ab27030SDavid du Colombier }history; 215*7ab27030SDavid du Colombier }; 216*7ab27030SDavid du Colombier 217*7ab27030SDavid du Colombier void wininit(Window *, Window *, Rectangle); 218*7ab27030SDavid du Colombier int winclean(Window *, int); 219*7ab27030SDavid du Colombier void winclose(Window *); 220*7ab27030SDavid du Colombier int winresize(Window *, Rectangle, int); 221*7ab27030SDavid du Colombier Text* wintext(Window *, Point); 222*7ab27030SDavid du Colombier void winlock(Window *, int); 223*7ab27030SDavid du Colombier void winunlock(Window *); 224*7ab27030SDavid du Colombier void winaddhist(Window *, Url *); 225*7ab27030SDavid du Colombier void wingohist(Window *, int); 226*7ab27030SDavid du Colombier void winsettag(Window *); 227*7ab27030SDavid du Colombier void winseturl(Window *); 228*7ab27030SDavid du Colombier void winsetstatus(Window *w, Rune *); 229*7ab27030SDavid du Colombier Text* wintype(Window *, Point, Rune); 230*7ab27030SDavid du Colombier Text* winmouse(Window *, Point, int); 231*7ab27030SDavid du Colombier void winmousebut(Window *); 232*7ab27030SDavid du Colombier void windebug(Window *); 233*7ab27030SDavid du Colombier 234*7ab27030SDavid du Colombier struct Column 235*7ab27030SDavid du Colombier { 236*7ab27030SDavid du Colombier Rectangle r; 237*7ab27030SDavid du Colombier Text tag; 238*7ab27030SDavid du Colombier Row *row; 239*7ab27030SDavid du Colombier Window **w; 240*7ab27030SDavid du Colombier int nw; 241*7ab27030SDavid du Colombier int safe; 242*7ab27030SDavid du Colombier }; 243*7ab27030SDavid du Colombier 244*7ab27030SDavid du Colombier void colinit(Column*, Rectangle); 245*7ab27030SDavid du Colombier Window* coladd(Column*, Window*, Window*, int); 246*7ab27030SDavid du Colombier void colclose(Column*, Window*, int); 247*7ab27030SDavid du Colombier void colcloseall(Column*); 248*7ab27030SDavid du Colombier void colresize(Column*, Rectangle); 249*7ab27030SDavid du Colombier Text* colwhich(Column*, Point, Rune, int); 250*7ab27030SDavid du Colombier void coldragwin(Column*, Window*, int); 251*7ab27030SDavid du Colombier void colgrow(Column*, Window*, int); 252*7ab27030SDavid du Colombier int colclean(Column*); 253*7ab27030SDavid du Colombier void colsort(Column*); 254*7ab27030SDavid du Colombier void colmousebut(Column*); 255*7ab27030SDavid du Colombier 256*7ab27030SDavid du Colombier struct Row 257*7ab27030SDavid du Colombier { 258*7ab27030SDavid du Colombier QLock; 259*7ab27030SDavid du Colombier Rectangle r; 260*7ab27030SDavid du Colombier Text tag; 261*7ab27030SDavid du Colombier Column **col; 262*7ab27030SDavid du Colombier int ncol; 263*7ab27030SDavid du Colombier 264*7ab27030SDavid du Colombier }; 265*7ab27030SDavid du Colombier 266*7ab27030SDavid du Colombier void rowinit(Row*, Rectangle); 267*7ab27030SDavid du Colombier Column* rowadd(Row*, Column *c, int); 268*7ab27030SDavid du Colombier void rowclose(Row*, Column*, int); 269*7ab27030SDavid du Colombier Text* rowwhich(Row*, Point, Rune, int); 270*7ab27030SDavid du Colombier Column* rowwhichcol(Row*, Point); 271*7ab27030SDavid du Colombier void rowresize(Row*, Rectangle); 272*7ab27030SDavid du Colombier void rowdragcol(Row*, Column*, int but); 273*7ab27030SDavid du Colombier 274*7ab27030SDavid du Colombier struct Exec 275*7ab27030SDavid du Colombier { 276*7ab27030SDavid du Colombier char *cmd; 277*7ab27030SDavid du Colombier int p[2]; /* p[1] is write to program; p[0] set to prog fd 0*/ 278*7ab27030SDavid du Colombier int q[2]; /* q[0] is read from program; q[1] set to prog fd 1 */ 279*7ab27030SDavid du Colombier Channel *sync; /* chan(ulong) */ 280*7ab27030SDavid du Colombier }; 281*7ab27030SDavid du Colombier 282*7ab27030SDavid du Colombier struct Timer 283*7ab27030SDavid du Colombier { 284*7ab27030SDavid du Colombier int dt; 285*7ab27030SDavid du Colombier int cancel; 286*7ab27030SDavid du Colombier Channel *c; /* chan(int) */ 287*7ab27030SDavid du Colombier Timer *next; 288*7ab27030SDavid du Colombier }; 289*7ab27030SDavid du Colombier 290*7ab27030SDavid du Colombier enum 291*7ab27030SDavid du Colombier { 292*7ab27030SDavid du Colombier Scrollsize = 12, 293*7ab27030SDavid du Colombier Scrollgap = 4, 294*7ab27030SDavid du Colombier Margin = 4, 295*7ab27030SDavid du Colombier Border = 2, 296*7ab27030SDavid du Colombier Space = 2, 297*7ab27030SDavid du Colombier Tabspace = 30, 298*7ab27030SDavid du Colombier Boxsize = 12, 299*7ab27030SDavid du Colombier WFont = FntR*NumSize+Tiny, 300*7ab27030SDavid du Colombier 301*7ab27030SDavid du Colombier Panspeed = 4, 302*7ab27030SDavid du Colombier Maxtab = 8, 303*7ab27030SDavid du Colombier 304*7ab27030SDavid du Colombier BUFSIZE = 1024*8, 305*7ab27030SDavid du Colombier RBUFSIZE = BUFSIZE/sizeof(Rune), 306*7ab27030SDavid du Colombier STACK = 64*1024, 307*7ab27030SDavid du Colombier }; 308*7ab27030SDavid du Colombier 309*7ab27030SDavid du Colombier enum 310*7ab27030SDavid du Colombier { 311*7ab27030SDavid du Colombier FALSE, 312*7ab27030SDavid du Colombier TRUE, 313*7ab27030SDavid du Colombier XXX, 314*7ab27030SDavid du Colombier }; 315*7ab27030SDavid du Colombier 316*7ab27030SDavid du Colombier enum 317*7ab27030SDavid du Colombier { 318*7ab27030SDavid du Colombier Light = 0xEEEEEE, 319*7ab27030SDavid du Colombier Dark = 0x666666, 320*7ab27030SDavid du Colombier Red = 0xBB0000, 321*7ab27030SDavid du Colombier Back = 0xCCCCCC, 322*7ab27030SDavid du Colombier }; 323*7ab27030SDavid du Colombier 324*7ab27030SDavid du Colombier Mouse *mouse; 325*7ab27030SDavid du Colombier Mousectl *mousectl; 326*7ab27030SDavid du Colombier Keyboardctl *keyboardctl; 327*7ab27030SDavid du Colombier Image *tagcols[NCOL]; 328*7ab27030SDavid du Colombier Image *textcols[NCOL]; 329*7ab27030SDavid du Colombier Image *but2col; 330*7ab27030SDavid du Colombier Image *but3col; 331*7ab27030SDavid du Colombier Image *button; 332*7ab27030SDavid du Colombier Image *colbutton; 333*7ab27030SDavid du Colombier Font *passfont; 334*7ab27030SDavid du Colombier Cursor boxcursor; 335*7ab27030SDavid du Colombier Row row; 336*7ab27030SDavid du Colombier Text *argtext; 337*7ab27030SDavid du Colombier Text *seltext; 338*7ab27030SDavid du Colombier Text *typetext; 339*7ab27030SDavid du Colombier Page *selpage; 340*7ab27030SDavid du Colombier Column *activecol; 341*7ab27030SDavid du Colombier char *webmountpt; 342*7ab27030SDavid du Colombier int plumbsendfd; 343*7ab27030SDavid du Colombier int webctlfd; 344*7ab27030SDavid du Colombier char *charset; 345*7ab27030SDavid du Colombier int procstderr; 346*7ab27030SDavid du Colombier 347*7ab27030SDavid du Colombier enum 348*7ab27030SDavid du Colombier { 349*7ab27030SDavid du Colombier Kscrolloneup = KF|0x20, 350*7ab27030SDavid du Colombier Kscrollonedown = KF|0x21, 351*7ab27030SDavid du Colombier }; 352*7ab27030SDavid du Colombier 353*7ab27030SDavid du Colombier Channel *cplumb; /* chan(Plumbmsg*) */ 354*7ab27030SDavid du Colombier Channel *cexit; /* chan(int) */ 355*7ab27030SDavid du Colombier Channel *crefresh; /* chan(page *) */ 356