1219b2ee8SDavid du Colombier #pragma src "/sys/src/libframe" 23e12c5d1SDavid du Colombier #pragma lib "libframe.a" 33e12c5d1SDavid du Colombier 43e12c5d1SDavid du Colombier typedef struct Frbox Frbox; 53e12c5d1SDavid du Colombier typedef struct Frame Frame; 63e12c5d1SDavid du Colombier 77dd7cddfSDavid du Colombier enum{ 87dd7cddfSDavid du Colombier BACK, 97dd7cddfSDavid du Colombier HIGH, 107dd7cddfSDavid du Colombier BORD, 117dd7cddfSDavid du Colombier TEXT, 127dd7cddfSDavid du Colombier HTEXT, 137dd7cddfSDavid du Colombier NCOL 147dd7cddfSDavid du Colombier }; 157dd7cddfSDavid du Colombier 167dd7cddfSDavid du Colombier #define FRTICKW 3 177dd7cddfSDavid du Colombier 183e12c5d1SDavid du Colombier struct Frbox 193e12c5d1SDavid du Colombier { 203e12c5d1SDavid du Colombier long wid; /* in pixels */ 213e12c5d1SDavid du Colombier long nrune; /* <0 ==> negate and treat as break char */ 223e12c5d1SDavid du Colombier union{ 233e12c5d1SDavid du Colombier uchar *ptr; 243e12c5d1SDavid du Colombier struct{ 253e12c5d1SDavid du Colombier short bc; /* break char */ 263e12c5d1SDavid du Colombier short minwid; 273e12c5d1SDavid du Colombier }; 283e12c5d1SDavid du Colombier }; 293e12c5d1SDavid du Colombier }; 303e12c5d1SDavid du Colombier 313e12c5d1SDavid du Colombier struct Frame 323e12c5d1SDavid du Colombier { 333e12c5d1SDavid du Colombier Font *font; /* of chars in the frame */ 347dd7cddfSDavid du Colombier Display *display; /* on which frame appears */ 357dd7cddfSDavid du Colombier Image *b; /* on which frame appears */ 367dd7cddfSDavid du Colombier Image *cols[NCOL]; /* text and background colors */ 373e12c5d1SDavid du Colombier Rectangle r; /* in which text appears */ 383e12c5d1SDavid du Colombier Rectangle entire; /* of full frame */ 397dd7cddfSDavid du Colombier void (*scroll)(Frame*, int); /* scroll function provided by application */ 403e12c5d1SDavid du Colombier Frbox *box; 413e12c5d1SDavid du Colombier ulong p0, p1; /* selection */ 423e12c5d1SDavid du Colombier ushort nbox, nalloc; 433e12c5d1SDavid du Colombier ushort maxtab; /* max size of tab, in pixels */ 443e12c5d1SDavid du Colombier ushort nchars; /* # runes in frame */ 453e12c5d1SDavid du Colombier ushort nlines; /* # lines with text */ 463e12c5d1SDavid du Colombier ushort maxlines; /* total # lines in frame */ 473e12c5d1SDavid du Colombier ushort lastlinefull; /* last line fills frame */ 483e12c5d1SDavid du Colombier ushort modified; /* changed since frselect() */ 497dd7cddfSDavid du Colombier Image *tick; /* typing tick */ 507dd7cddfSDavid du Colombier Image *tickback; /* saved image under tick */ 517dd7cddfSDavid du Colombier int ticked; /* flag: is tick onscreen? */ 523e12c5d1SDavid du Colombier }; 533e12c5d1SDavid du Colombier 543e12c5d1SDavid du Colombier ulong frcharofpt(Frame*, Point); 553e12c5d1SDavid du Colombier Point frptofchar(Frame*, ulong); 563e12c5d1SDavid du Colombier int frdelete(Frame*, ulong, ulong); 573e12c5d1SDavid du Colombier void frinsert(Frame*, Rune*, Rune*, ulong); 587dd7cddfSDavid du Colombier void frselect(Frame*, Mousectl*); 597dd7cddfSDavid du Colombier void frselectpaint(Frame*, Point, Point, Image*); 607dd7cddfSDavid du Colombier void frdrawsel(Frame*, Point, ulong, ulong, int); 61*8f5875f3SDavid du Colombier Point frdrawsel0(Frame*, Point, ulong, ulong, Image*, Image*); 627dd7cddfSDavid du Colombier void frinit(Frame*, Rectangle, Font*, Image*, Image**); 637dd7cddfSDavid du Colombier void frsetrects(Frame*, Rectangle, Image*); 647dd7cddfSDavid du Colombier void frclear(Frame*, int); 653e12c5d1SDavid du Colombier 667dd7cddfSDavid du Colombier uchar *_frallocstr(Frame*, unsigned); 673e12c5d1SDavid du Colombier void _frinsure(Frame*, int, unsigned); 683e12c5d1SDavid du Colombier Point _frdraw(Frame*, Point); 693e12c5d1SDavid du Colombier void _frgrowbox(Frame*, int); 703e12c5d1SDavid du Colombier void _frfreebox(Frame*, int, int); 713e12c5d1SDavid du Colombier void _frmergebox(Frame*, int); 723e12c5d1SDavid du Colombier void _frdelbox(Frame*, int, int); 733e12c5d1SDavid du Colombier void _frsplitbox(Frame*, int, int); 743e12c5d1SDavid du Colombier int _frfindbox(Frame*, int, ulong, ulong); 753e12c5d1SDavid du Colombier void _frclosebox(Frame*, int, int); 763e12c5d1SDavid du Colombier int _frcanfit(Frame*, Point, Frbox*); 773e12c5d1SDavid du Colombier void _frcklinewrap(Frame*, Point*, Frbox*); 783e12c5d1SDavid du Colombier void _frcklinewrap0(Frame*, Point*, Frbox*); 793e12c5d1SDavid du Colombier void _fradvance(Frame*, Point*, Frbox*); 803e12c5d1SDavid du Colombier int _frnewwid(Frame*, Point, Frbox*); 817dd7cddfSDavid du Colombier int _frnewwid0(Frame*, Point, Frbox*); 823e12c5d1SDavid du Colombier void _frclean(Frame*, Point, int, int); 83*8f5875f3SDavid du Colombier void _frdrawtext(Frame*, Point, Image*, Image*); 843e12c5d1SDavid du Colombier void _fraddbox(Frame*, int, int); 853e12c5d1SDavid du Colombier Point _frptofcharptb(Frame*, ulong, Point, int); 863e12c5d1SDavid du Colombier Point _frptofcharnb(Frame*, ulong, int); 873e12c5d1SDavid du Colombier int _frstrlen(Frame*, int); 887dd7cddfSDavid du Colombier void frtick(Frame*, Point, int); 897dd7cddfSDavid du Colombier void frinittick(Frame*); 90*8f5875f3SDavid du Colombier void frredraw(Frame*); 913e12c5d1SDavid du Colombier 923e12c5d1SDavid du Colombier #define NRUNE(b) ((b)->nrune<0? 1 : (b)->nrune) 933e12c5d1SDavid du Colombier #define NBYTE(b) strlen((char*)(b)->ptr) 94