term% cat index.txt FRAME(2) System Calls Manual FRAME(2)
NAME
frinit, frsetrects, frclear, frcharofpt, frptofchar, frinsert,
frdelete, frselect, frselectp, frselectf, frgetmouse - frames of text
SYNOPSIS
#include <u.h>
#include <libc.h>
#include <libg.h>
#include <frame.h>
void frinit(Frame *f, Rectangle r, Font *ft, Bitmap *b);
void frsetrects(Frame *f, Rectangle r, Bitmap *b);
void frclear(Frame *f);
ulong frcharofpt(Frame *f, Point pt);
Point frptofchar(Frame *f, ulong p);
void frinsert(Frame *f, Rune *r0, Rune *r1, ulong p);
int frdelete(Frame *f, ulong p0, ulong p1);
void frselect(Frame *f, Mouse *m);
void frselectp(Frame *f, Fcode fc);
void frselectf(Frame *f, Point p0, Point p1, Fcode c);
extern void frgetmouse(void);
DESCRIPTION
This library supports frames of editable text in a single font on
bitmap displays, such as in sam(1) and 8½(1). Frames may hold any
character except NUL (0). Long lines are folded and tabs are at fixed
intervals.
The user-visible data structure, a Frame, is defined in <frame.h>:
typedef struct Frame Frame;
struct Frame
{
Font *font; /* of chars in the frame */
Bitmap *b; /* on which frame appears */
Rectangle r; /* in which text appears */
Rectangle entire; /* of full frame */
Frbox *box;
ulong p0, p1; /* selection */
short left; /* left edge of text */
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() */
};
Frbox is an internal type and is not used by the interface. P0 and p1
may be changed by the application provided the selection routines are
called afterwards to maintain a consistent display. Maxtab determines
the size of tab stops. Frinit sets it to 8 times the width of a 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.
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 application will keep
its own copy of the text in the window (probably as an array of 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 Frame;
the application must check maxlines, nlines, and lastlinefull to deter‐
mine, for example, whether new text needs to be appended at the end of
the Frame after calling frdelete (q.v.).
There are no routines in the library to allocate Frames; instead the
interface assumes that Frames will be components of larger structures.
Frinit prepares the Frame f so characters drawn in it will appear in
the single Font ft. It then calls frsetrects to initialize the geome‐
try for the Frame. The Bitmap b is where the Frame is to be drawn;
Rectangle r defines the limit of the portion of the Bitmap the text
will occupy. The Bitmap pointer may be null, allowing the other rou‐
tines to be called to maintain the associated data structure in, for
example, an obscured window.
Frclear frees the internal structures associated with f, permitting an‐
other frinit or frsetrects on the Frame. If f is to be deallocated,
the associated Font and Bitmap must be freed separately.
To reshape a Frame, use frclear and frinit and then frinsert (q.v.) to
recreate the display. If a Frame is being moved but not reshaped, that
is, if the shape of its containing rectangle is unchanged, it is suffi‐
cient to bitblt(2) the containing rectangle from the old to the new lo‐
cation and then call frsetrects to establish the new geometry. No re‐
drawing is necessary.
Frames hold text as runes, not as bytes. Frptofchar returns the loca‐
tion of the upper left corner of the p'th rune, starting from 0, in the
Frame f. If f holds fewer than p runes, frptofchar returns the loca‐
tion of the upper right corner of the last character in f. 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 pt.
Frinsert inserts into Frame f starting at rune index p the runes be‐
tween r0 and 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, back‐
spaces are printed; to erase a character, use frdelete.
Frdelete deletes from the Frame the text between p0 and p1; p1 points
at the first rune beyond the deletion.
Frselect tracks the mouse to select a contiguous string of text in the
Frame. When called, a mouse button is typically down. Frselect will
return when the button state has changed (some buttons may still be
down) and will set f->p0 and f->p1 to the selected range of text. Frs‐
electf and frselectp modify the display of the selected text. Frse‐
lectf highlights the text between p0 and p1 (which must have been re‐
turned by frptofchar) using bitblt in mode c. Frselectp is similar but
highlights the text from f->p0 to f->p1. Neither frselectf nor frse‐
lectp modifies f->p0 or f->p1.
Upon return from frinsert or frdelete, the display will be consistent
but f->p0 and f->p1 may not point to the desired selection. It may be
necessary to adjust the selection and use frselectf or frselectp to fix
the display.
Frgetmouse must be provided by the application; frselect calls it to
get mouse updates. Each call to frgetmouse should update the Mouse
structure pointed to by frselect's argument m. Frgetmouse should block
until the mouse status has changed.
SOURCE
/sys/src/libframe
SEE ALSO
graphics(2), bitblt(2), cachechars(2).
FRAME(2)