Blob


1 .TH FRAME 3
2 .SH NAME
3 frinit, frsetrects, frinittick, frclear, frcharofpt, frptofchar, frinsert, frdelete, frselect, frtick, frselectpaint, frdrawsel, frdrawsel0, frgetmouse \- frames of text
4 .SH SYNOPSIS
5 .nf
6 .B
7 #include <u.h>
8 .B
9 #include <libc.h>
10 .B
11 #include <draw.h>
12 .B
13 #include <thread.h>
14 .B
15 #include <mouse.h>
16 .B
17 #include <frame.h>
18 .PP
19 .B
20 void frinit(Frame *f, Rectangle r, Font *ft, Image *b, Image **cols)
21 .PP
22 .B
23 void frsetrects(Frame *f, Rectangle r, Image *b)
24 .PP
25 .B
26 void frinittick(Frame *f)
27 .PP
28 .B
29 void frclear(Frame *f, int resize)
30 .PP
31 .B
32 ulong frcharofpt(Frame *f, Point pt)
33 .PP
34 .B
35 Point frptofchar(Frame *f, ulong p)
36 .PP
37 .B
38 void frinsert(Frame *f, Rune *r0, Rune *r1, ulong p)
39 .PP
40 .B
41 int frdelete(Frame *f, ulong p0, ulong p1)
42 .PP
43 .B
44 void frselect(Frame *f, Mousectl *m)
45 .PP
46 .B
47 void frtick(Frame *f, Point pt, int up)
48 .PP
49 .B
50 void frselectpaint(Frame *f, Point p0, Point p1, Image *col)
51 .PP
52 .B
53 void frdrawsel(Frame *f, Point pt0, ulong p0, ulong p1,
54 .B
55 int highlighted)
56 .PP
57 .B
58 void frdrawsel0(Frame *f, Point pt0, ulong p0, ulong p1,
59 .B
60 Image *back, Image *text)
61 .PP
62 .ft L
63 enum{
64 BACK,
65 HIGH,
66 BORD,
67 TEXT,
68 HTEXT,
69 NCOL
70 };
71 .fi
72 .SH DESCRIPTION
73 This library supports
74 .I frames
75 of editable text in a single font on raster displays, such as in
76 .MR sam (1)
77 and
78 .MR 9term (1) .
79 Frames may hold any character except NUL (0).
80 Long lines are folded and tabs are at fixed intervals.
81 .PP
82 The user-visible data structure, a
83 .BR Frame ,
84 is defined in
85 .BR <frame.h> :
86 .IP
87 .EX
88 .ta 6n +\w'Rectangle 'u +\w'lastlinefull; 'u
89 typedef struct Frame Frame;
90 struct Frame
91 {
92 Font *font; /* of chars in the frame */
93 Display *display; /* on which frame appears */
94 Image *b; /* on which frame appears */
95 Image *cols[NCOL]; /* text and background colors */
96 Rectangle r; /* in which text appears */
97 Rectangle entire; /* of full frame */
98 Frbox *box;
99 ulong p0, p1; /* selection */
100 ushort nbox, nalloc;
101 ushort maxtab; /* max size of tab, in pixels */
102 ushort nchars; /* # runes in frame */
103 ushort nlines; /* # lines with text */
104 ushort maxlines; /* total # lines in frame */
105 ushort lastlinefull; /* last line fills frame */
106 ushort modified; /* changed since frselect() */
107 Image *tick; /* typing tick */
108 Image *tickback; /* saved image under tick */
109 int ticked; /* flag: is tick onscreen? */
110 };
111 .EE
112 .PP
113 .B Frbox
114 is an internal type and is not used by the interface.
115 .B P0
116 and
117 .B p1
118 may be changed by the application provided the selection routines are called
119 afterwards to maintain a consistent display.
120 .I Maxtab
121 determines the size of tab stops.
122 .I Frinit
123 sets it to 8 times the width of a
124 .B 0
125 (zero)
126 character in the font;
127 it may be changed before any text is added to the frame.
128 The other elements of the structure are maintained by the library and
129 should not be modified directly.
130 .PP
131 The text within frames
132 is not directly addressable;
133 instead frames are designed to work alongside
134 another structure that holds the text.
135 The typical application is to display a section of a longer document such
136 as a text file or terminal session.
137 Usually the program will keep its own copy of the
138 text in the window (probably as
139 an array of
140 .BR Runes )
141 and pass components of this text to the frame routines to
142 display the visible portion.
143 Only the text that is visible is held by the
144 .BR Frame ;
145 the application must check
146 .BR maxlines ,
147 .BR nlines ,
148 and
149 .B lastlinefull
150 to determine, for example, whether new text needs to be appended
151 at the end of the
152 .B Frame
153 after calling
154 .I frdelete
155 (q.v.).
156 .PP
157 There are no routines in the library to allocate
158 .BR Frames ;
159 instead the interface assumes that
160 .B Frames
161 will be components of larger structures.
162 .I Frinit
163 prepares the
164 .B Frame
165 .I f
166 so characters drawn in it will appear
167 in the single
168 .B Font
169 .IR ft .
170 It then calls
171 .I frsetrects
172 and
173 .I frinittick
174 to initialize the geometry for the
175 .BR Frame .
176 The
177 .B Image
178 .I b
179 is where the
180 .B Frame
181 is to be drawn;
182 .B Rectangle
183 .I r
184 defines the limit of the portion of the
185 .B Image
186 the text will occupy.
187 The
188 .B Image
189 pointer
190 may be null, allowing the other routines to be called to maintain the
191 associated data structure in, for example, an obscured window.
192 .PP
193 The array of
194 .B Images
195 cols sets the colors in which text and borders will be drawn. The background of the frame will be drawn in
196 .BR cols[BACK] ;
197 the background of highlighted text in
198 .BR cols[HIGH] ;
199 borders and scroll bar in
200 .BR cols[BORD] ;
201 regular text in
202 .BR cols[TEXT] ;
203 and highlighted text in
204 .BR cols[HTEXT] .
205 .PP
206 .I Frclear
207 frees the internal structures associated with
208 .IR f ,
209 permitting another
210 .I frinit
211 or
212 .I frsetrects
213 on the
214 .BR Frame .
215 It does not clear the associated display.
216 If
217 .I f
218 is to be deallocated, the associated
219 .B Font
220 and
221 .B Image
222 must be freed separately.
223 The
224 .B resize
225 argument should be non-zero if the frame is to be redrawn with
226 a different font; otherwise the frame will maintain some
227 data structures associated with the font.
228 .PP
229 To resize a
230 .BR Frame ,
231 use
232 .I frclear
233 and
234 .I frinit
235 and then
236 .I frinsert
237 (q.v.) to recreate the display.
238 If a
239 .B Frame
240 is being moved but not resized, that is, if the shape of its containing
241 rectangle is unchanged, it is sufficient to use
242 .MR draw (3)
243 to copy the containing rectangle from the old to the new location and then call
244 .I frsetrects
245 to establish the new geometry.
246 (It is unnecessary to call
247 .I frinittick
248 unless the font size has changed.)
249 No redrawing is necessary.
250 .PP
251 .B Frames
252 hold text as runes,
253 not as bytes.
254 .I Frptofchar
255 returns the location of the upper left corner of the
256 .I p'th
257 rune, starting from 0, in the
258 .B Frame
259 .IR f .
260 If
261 .I f
262 holds fewer than
263 .I p
264 runes,
265 .I frptofchar
266 returns the location of the upper right corner of the last character in
267 .IR f .
268 .I Frcharofpt
269 is the inverse: it
270 returns the index of the closest rune whose image's upper left corner
271 is up and to the left of
272 .IR pt .
273 .PP
274 .I Frinsert
275 inserts into
276 .B Frame
277 .I f
278 starting at rune index
279 .I p
280 the runes between
281 .I r0
282 and
283 .IR r1 .
284 If a NUL (0) character
285 is inserted, chaos will ensue.
286 Tabs and newlines
287 are handled by the library, but all other characters,
288 including control characters, are just displayed.
289 For example, backspaces are printed; to erase
290 a character, use
291 .IR frdelete .
292 .PP
293 .I Frdelete
294 deletes from the
295 .B Frame
296 the text between
297 .I p0
298 and
299 .IR p1 ;
300 .I p1
301 points at the first rune beyond the deletion.
302 .PP
303 .I Frselect
304 tracks the mouse to select a contiguous string of text in the
305 .BR Frame .
306 When called, a mouse button is typically down.
307 .I Frselect
308 will return when the button state has changed (some buttons may
309 still be down) and will set
310 .IB f ->p0
311 and
312 .IB f ->p1
313 to the selected range of text.
314 .PP
315 Programs that wish to manage the selection themselves have several routines to help.
316 They involve the maintenance of the `tick', the vertical line indicating a null selection
317 between characters, and the colored region representing a non-null selection.
318 .I Frtick
319 draws (if
320 .I up
321 is non-zero) or removes (if
322 .I up
323 is zero) the tick at the screen position indicated by
324 .IR pt .
325 .I Frdrawsel
326 repaints a section of the frame, delimited by character positions
327 .I p0
328 and
329 .IR p1 ,
330 either with plain background or
331 entirely highlighted, according to the flag
332 .IR highlighted ,
333 managing the tick appropriately.
334 The point
335 .I pt0
336 is the geometrical location of
337 .I p0
338 on the screen; like all of the selection-helper routines'
339 .B Point
340 arguments, it must be a value generated by
341 .IR frptofchar .
342 .I Frdrawsel0
343 is a lower-level routine, taking as arguments a background color,
344 .IR back ,
345 and text color,
346 .IR text .
347 It assumes that the tick is being handled (removed beforehand, replaced afterwards, as required)
348 by its caller.
349 .I Frselectpaint
350 uses a solid color,
351 .IR col ,
352 to paint a region of the frame defined by the
353 .B Points
354 .I p0
355 and
356 .IR p1 .
357 .SH SOURCE
358 .B \*9/src/libframe
359 .SH SEE ALSO
360 .MR graphics (3) ,
361 .MR draw (3) ,
362 .MR cachechars (3) .