123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- .TH FRAME 2
- .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 rio (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 (2)
- 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 /sys/src/libframe
- .SH SEE ALSO
- .IR graphics (2),
- .IR draw (2),
- .IR cachechars (2).
|