.TH FRAME 3
.SH NAME
frinit, frsetrects, frinittick, frclear, frcharofpt, frptofchar, frinsert, frdelete, frselect, frtick, frselectpaint, frdrawsel, frdrawsel0, frgetmouse \- frames of text
.SH SYNOPSIS
.nf
.B
#include <u.h>
.B
#include <libc.h>
.B
#include <draw.h>
.B
#include <thread.h>
.B
#include <mouse.h>
.B
#include <frame.h>
.PP
.B
void  frinit(Frame *f, Rectangle r, Font *ft, Image *b, Image **cols)
.PP
.B
void  frsetrects(Frame *f, Rectangle r, Image *b)
.PP
.B
void  frinittick(Frame *f)
.PP
.B
void  frclear(Frame *f, int resize)
.PP
.B
ulong frcharofpt(Frame *f, Point pt)
.PP
.B
Point frptofchar(Frame *f, ulong p)
.PP
.B
void  frinsert(Frame *f, Rune *r0, Rune *r1, ulong p)
.PP
.B
int   frdelete(Frame *f, ulong p0, ulong p1)
.PP
.B
void  frselect(Frame *f, Mousectl *m)
.PP
.B
void  frtick(Frame *f, Point pt, int up)
.PP
.B
void  frselectpaint(Frame *f, Point p0, Point p1, Image *col)
.PP
.B
void  frdrawsel(Frame *f, Point pt0, ulong p0, ulong p1,
.B
		int highlighted)
.PP
.B
void  frdrawsel0(Frame *f, Point pt0, ulong p0, ulong p1,
.B
		Image *back, Image *text)
.PP
.ft L
enum{
	BACK,
	HIGH,
	BORD,
	TEXT,
	HTEXT,
	NCOL
};
.fi
.SH DESCRIPTION
This library supports
.I frames
of editable text in a single font on raster displays, such as in
.IR sam (1)
and
.IR 9term (1).
Frames may hold any character except NUL (0).
Long lines are folded and tabs are at fixed intervals.
.PP
The user-visible data structure, a
.BR Frame ,
is defined in
.BR <frame.h> :
.IP
.EX
.ta 6n +\w'Rectangle 'u +\w'lastlinefull;   'u
typedef struct Frame Frame;
struct Frame
{
	Font	*font;		/* of chars in the frame */
	Display	*display;	/* on which frame appears */
	Image	*b;		/* on which frame appears */
	Image	*cols[NCOL];	/* text and background colors */
	Rectangle	r;		/* in which text appears */
	Rectangle	entire;		/* of full frame */
	Frbox	*box;
	ulong	p0, p1;		/* selection */
	ushort	nbox, nalloc;
	ushort	maxtab;		/* max size of tab, in pixels */
	ushort	nchars;		/* # runes in frame */
	ushort	nlines;		/* # lines with text */
	ushort	maxlines;	/* total # lines in frame */
	ushort	lastlinefull;	/* last line fills frame */
	ushort	modified;	/* changed since frselect() */
	Image	*tick;	/* typing tick */
	Image	*tickback;	/* saved image under tick */
	int	ticked;	/* flag: is tick onscreen? */
};
.EE
.PP
.B Frbox
is an internal type and is not used by the interface.
.B P0
and
.B p1
may be changed by the application provided the selection routines are called
afterwards to maintain a consistent display.
.I Maxtab
determines the size of tab stops.
.I Frinit
sets it to 8 times the width of a
.B 0
(zero)
character in the font;
it may be changed before any text is added to the frame.
The other elements of the structure are maintained by the library and
should not be modified directly.
.PP
The text within frames
is not directly addressable;
instead frames are designed to work alongside
another structure that holds the text.
The typical application is to display a section of a longer document such
as a text file or terminal session.
Usually the program will keep its own copy of the
text in the window (probably as
an array of
.BR Runes )
and pass components of this text to the frame routines to
display the visible portion.
Only the text that is visible is held by the
.BR Frame ;
the application must check
.BR maxlines ,
.BR nlines ,
and
.B lastlinefull
to determine, for example, whether new text needs to be appended
at the end of the
.B Frame
after calling
.I frdelete
(q.v.). 
.PP
There are no routines in the library to allocate
.BR Frames ;
instead the interface assumes that
.B Frames
will be components of larger structures.
.I Frinit
prepares the
.B Frame
.I f
so characters drawn in it will appear
in the single
.B Font
.IR ft .
It then calls
.I frsetrects
and
.I frinittick
to initialize the geometry for the
.BR Frame .
The
.B Image
.I b
is where the
.B Frame
is to be drawn;
.B Rectangle
.I r
defines the limit of the portion of the
.B Image
the text will occupy.
The
.B Image
pointer
may be null, allowing the other routines to be called to maintain the
associated data structure in, for example, an obscured window.
.PP
The array of
.B Images
cols sets the colors in which text and borders will be drawn.  The background of the frame will be drawn in
.BR cols[BACK] ;
the background of highlighted text in
.BR cols[HIGH] ;
borders and scroll bar in
.BR cols[BORD] ;
regular text in
.BR cols[TEXT] ;
and highlighted text in
.BR cols[HTEXT] .
.PP
.I Frclear
frees the internal structures associated with
.IR f ,
permitting another
.I frinit
or
.I frsetrects
on the
.BR Frame .
It does not clear the associated display.
If
.I f
is to be deallocated, the associated
.B Font
and
.B Image
must be freed separately.
The
.B resize
argument should be non-zero if the frame is to be redrawn with
a different font; otherwise the frame will maintain some
data structures associated with the font.
.PP
To resize a
.BR Frame ,
use
.I frclear
and
.I frinit
and then
.I frinsert
(q.v.) to recreate the display.
If a
.B Frame
is being moved but not resized, that is, if the shape of its containing
rectangle is unchanged, it is sufficient to use
.IR draw (3)
to copy the containing rectangle from the old to the new location and then call
.I frsetrects
to establish the new geometry.
(It is unnecessary to call
.I frinittick
unless the font size has changed.)
No redrawing is necessary.
.PP
.B Frames
hold text as runes,
not as bytes.
.I Frptofchar
returns the location of the upper left corner of the
.I p'th
rune, starting from 0, in the
.B Frame
.IR f .
If
.I f
holds fewer than
.I p
runes,
.I frptofchar
returns the location of the upper right corner of the last character in
.IR f .
.I Frcharofpt
is the inverse: it
returns the index of the closest rune whose image's upper left corner
is up and to the left of
.IR pt .
.PP
.I Frinsert
inserts into
.B Frame
.I f
starting at rune index
.I p
the runes between
.I r0
and
.IR r1 .
If a NUL (0) character
is inserted, chaos will ensue.
Tabs and newlines
are handled by the library, but all other characters,
including control characters, are just displayed.
For example, backspaces are printed; to erase
a character, use
.IR frdelete .
.PP
.I Frdelete
deletes from the
.B Frame
the text between
.I p0
and
.IR p1 ;
.I p1
points at the first rune beyond the deletion.
.PP
.I Frselect
tracks the mouse to select a contiguous string of text in the
.BR Frame .
When called, a mouse button is typically down.
.I Frselect
will return when the button state has changed (some buttons may
still be down) and will set
.IB f ->p0
and
.IB f ->p1
to the selected range of text.
.PP
Programs that wish to manage the selection themselves have several routines to help.
They involve the maintenance of the `tick', the vertical line indicating a null selection
between characters, and the colored region representing a non-null selection.
.I Frtick
draws (if
.I up
is non-zero) or removes (if
.I up
is zero) the tick at the screen position indicated by
.IR pt .
.I Frdrawsel
repaints a section of the frame, delimited by character positions
.I p0
and
.IR p1 ,
either with plain background or
entirely highlighted, according to the flag
.IR highlighted ,
managing the tick appropriately.
The point
.I pt0
is the geometrical location of
.I p0
on the screen; like all of the selection-helper routines'
.B Point
arguments, it must be a value generated by
.IR frptofchar .
.I Frdrawsel0
is a lower-level routine, taking as arguments a background color,
.IR back ,
and text color,
.IR text .
It assumes that the tick is being handled (removed beforehand, replaced afterwards, as required)
by its caller.
.I Frselectpaint
uses a solid color,
.IR col ,
to paint a region of the frame defined by the
.B Points
.I p0
and
.IR p1 .
.SH SOURCE
.B \*9/src/libframe
.SH SEE ALSO
.IR graphics (3),
.IR draw (3),
.IR cachechars (3).
