]> git.lizzy.rs Git - plan9front.git/blob - sys/man/2/control
tmdate(2): correct example in manpage
[plan9front.git] / sys / man / 2 / control
1 .TH CONTROL 2
2 .SH NAME
3 Control,
4 Controlset,
5 activate,
6 closecontrol,
7 closecontrolset,
8 controlcalled,
9 controlwire,
10 createbox,
11 createboxbox,
12 createbutton,
13 createcolumn,
14 createentry,
15 createkeyboard,
16 createlabel,
17 createmenu,
18 createradiobutton,
19 createrow,
20 createscribble,
21 createslider,
22 createstack,
23 createtab,
24 createtext,
25 createtextbutton,
26 ctlerror,
27 ctlmalloc,
28 ctlrealloc,
29 ctlstrdup,
30 ctlprint,
31 deactivate,
32 freectlfont,
33 freectlimage,
34 initcontrols,
35 namectlfont,
36 namectlimage,
37 newcontrolset,
38 resizecontrolset
39 \- interactive graphical controls
40 .SH SYNOPSIS
41 .EX
42 .ta 4n +4n +4n +4n +4n +4n +4n
43 #include <u.h>
44 #include <libc.h>
45 #include <draw.h>
46 #include <thread.h>
47 #include <keyboard.h>
48 #include <mouse.h>
49 #include <control.h>
50 .sp 0.3
51 typedef struct Control Control;
52 typedef struct Controlset Controlset;
53 .sp 0.3
54 struct Control
55 {
56         char            *name;
57         Rectangle       rect;   /* area on screen */
58         Rectangle       size;   /* min/max Dx, Dy (not a rect) */
59         Channel *event; /* chan(char*) to client */
60         Channel *data;  /* chan(char*) to client */
61         \&...
62 };
63 .sp 0.3
64 struct Controlset
65 {
66         \&...
67         Channel         *ctl;
68         Channel         *data;
69         \&...
70         int     clicktotype;
71         \&...
72 };
73 .sp 0.3
74 void            initcontrols(void)
75 .sp 0.3
76 Controlset*     newcontrolset(Image *i, Channel *kc, Channel *mc, Channel *rc)
77 .sp 0.3
78 void            closecontrolset(Controlset *cs)
79 .sp 0.3
80 int             namectlfont(Font *font, char *name)
81 .sp 0.3
82 int             freectlfont(char *name)
83 .sp 0.3
84 int             namectlimage(Image *image, char *name)
85 .sp 0.3
86 int             freectlimage(char *name)
87 .sp 0.3
88 Control*        createbox(Controlset *cs, char *name)
89 .sp 0.3
90 Control*        createboxbox(Controlset *cs, char *name)
91 .sp 0.3
92 Control*        createbutton(Controlset *cs, char *name)
93 .sp 0.3
94 Control*        createcolumn(Controlset*, char*)
95 .sp 0.3
96 Control*        createentry(Controlset *cs, char *name)
97 .sp 0.3
98 Control*        createkeyboard(Controlset *cs, char *name)
99 .sp 0.3
100 Control*        createlabel(Controlset *cs, char *name)
101 .sp 0.3
102 Control*        createmenu(Controlset *cs, char *name)
103 .sp 0.3
104 Control*        createradiobutton(Controlset *cs, char *name)
105 .sp 0.3
106 Control*        createrow(Controlset*, char*)
107 .sp 0.3
108 Control*        createscribble(Controlset *cs, char *name)
109 .sp 0.3
110 Control*        createslider(Controlset *cs, char *name)
111 .sp 0.3
112 Control*        createstack(Controlset*, char*)
113 .sp 0.3
114 Control*        createtab(Controlset*, char *)
115 .sp 0.3
116 Control*        createtext(Controlset *cs, char *name)
117 .sp 0.3
118 Control*        createtextbutton(Controlset *cs, char *name)
119 .sp 0.3
120 void            closecontrol(Control *c)
121 .sp 0.3
122 int             ctlprint(Control*, char*, ...);
123 .sp 0.3
124 void            ctlerror(char *fmt, ...)
125 .sp 0.3
126 Control*        controlcalled(char *name)
127 .sp 0.3
128 void            controlwire(Control *c, char *cname, Channel *ch)
129 .sp 0.3
130 void            activate(Control *c)
131 .sp 0.3
132 void            deactivate(Control *c)
133 .sp 0.3
134 void            resizecontrolset(Controlset *cs)
135 .sp 0.3
136 void*           ctlmalloc(uint n)
137 .sp 0.3
138 void*           ctlrealloc(void *p, uint n)
139 .sp 0.3
140 char*           ctlstrdup(char *s)
141 .sp 0.3
142 int             ctldeletequits;
143 .EE
144 .SH DESCRIPTION
145 This library provides a set of interactive
146 controls for graphical displays: buttons, sliders, text entry boxes, and so on.
147 It also provides aggregator
148 .BR Control s:
149 boxes, columns, rows and stacks of
150 .BR Control s.
151 A stack is a collection of co-located
152 .BR Control s,
153 of which one is normally visible.
154 A
155 .B Controlset
156 collects a group of
157 .BR Control s
158 that share mouse and keyboard.  Each
159 .B Controlset
160 has a separate thread of control that processes keyboard and mouse events as
161 well as commands to be passed on to the
162 .BR Control s.
163 Since each
164 .B Controlset
165 uses a thread, programs using the control library must
166 be linked with the thread library,
167 .IR thread (2).
168 .PP
169 .BR Control s
170 are manipulated by reading and writing to the control channel,
171 .BR ctl ,
172 of their
173 .BR Controlset .
174 .BR Channel s
175 are defined in
176 .IR thread (2).
177 Each
178 .B Control
179 has two output channels:
180 .B Event
181 delivers messages about actions within the control (such as a button press) and
182 .B data
183 delivers (if requested by an appropriate write to
184 .BR ctl )
185 control-specific data such as the contents of a field.
186 .PP
187 The library provides a simple mechanism for automatic layout:
188 the minimum and maximum sizes of each simple control can be specified.
189 .BR Boxbox ,
190 .BR row ,
191 .B column
192 and
193 .B stack
194 .BR Control s
195 then use these sizes to lay out their constituent
196 .BR Control s
197 when called upon
198 to do so.  See the description of these grouping
199 .BR Control s
200 for further details.
201 .SS "Message format
202 All messages are represented as
203 .SM UTF\c
204 -8
205 text.
206 Numbers are formatted in decimal, and strings are transmitted in the
207 quoted form of
208 .IR quote (2).
209 .PP
210 Messages sent to a
211 .B Controlset
212 are of the form,
213 .IP
214 .IR sender :
215 .I destination
216 .I verb
217 .RI [ argument
218 \&... ]
219 .LP
220 The sender (and the colon following it) may be omitted.
221 For example, the initial field of a text entry control called
222 .I entry
223 could be set by sending the message,
224 .IP
225 .B "entry value 'Hello, world!'
226 .PP
227 to its
228 .BR Controlset 's
229 .B ctl
230 file.
231 This message contains the verb
232 .B value
233 and the single argument
234 .B "Hello, world!"
235 .PP
236 To make it easy to write messages, the function
237 .IR chanprint
238 (see
239 .IR thread (2))
240 can be used to print formatted text to a
241 .BR Controlset 's
242 channel.
243 .PP
244 The
245 .B %q
246 and
247 .B %Q
248 formats are convenient for properly quoting string arguments,
249 as in
250 .IP
251 .EX
252 chanprint(e->event, "value %q", "Don't touch!");
253 .EE
254 .PP
255 It is wise to use
256 .B %q
257 always instead of
258 .BR %s
259 when sending messages, and avoid dealing with the quoting explicitly.
260 In the other direction,
261 .B tokenize
262 (see
263 .IR getfields (2))
264 parses these messages and interprets the quotes correctly.
265 .PP
266 The destination of a message can be a named control, or a set of controls identified
267 by name or type.  The command
268 .IP
269 .B "'entry slider' show
270 .PP
271 (note the quotation) sends the `show' command to the entry named
272 .I entry
273 and all controls of type
274 .IR slider .
275 If there were a control whose name was
276 .I slider
277 that control would also be shown.
278 .LP
279 \f2
280 Note that we are still experimenting with destination names.
281 One proposal is that
282 a destination of the form
283 \fR"`name1 name2 â‹¯ type1 type2 â‹¯'\fP
284 selects all controls of the named types in the control hierarchies (of columns, rows and
285 stacks) whose names precede the types.
286 .LP
287 Messages sent by a control on its
288 .B event
289 channel are of the form
290 .IP
291 .IB sender :
292 .IB event
293 .PP
294 The
295 .I sender
296 is the name of the control sending the message;
297 the
298 .I event
299 describes the event.  Its format can often be controlled by setting the
300 .BR Control 's
301 .IR "format string" .
302 For example, when the user types a newline at a text entry
303 .B Control
304 named
305 .BR entry,
306 the control sends the message
307 .IP
308 .B entry:\ value\ 'Hello\ again!'
309 on its
310 .B event
311 channel.
312 .SS "Initialization and Control sets
313 After
314 .B initdraw
315 (see
316 .IR graphics (2))
317 is called,
318 the function
319 .I initcontrols
320 should be called to initialize the library.
321 It calls
322 .I quotefmtinstall
323 to install the
324 .B %q
325 and
326 .B %Q
327 formats; see
328 .IR quote (2).
329 .PP
330 Each control is represented by a
331 .B Control
332 data structure and is associated with a
333 .B Controlset
334 that groups a set of controls sharing mouse, keyboard, and display.
335 Most applications will need only one
336 .BR Controlset ;
337 only those with multiple windows or unusual configurations will need
338 more than one.
339 The function
340 .I newcontrolset
341 creates a
342 .BR Controlset .
343 Its arguments are the image (usually a window)
344 on which its controls will appear, typically the
345 .B screen
346 variable in the draw library, and three channels:
347 .BR kc ,
348 a channel of
349 .B Runes
350 from the keyboard;
351 .BR mc ,
352 a channel of
353 .B Mouse
354 structures from the mouse;
355 and
356 .BR rc ,
357 a channel of
358 .B int
359 that indicates when the window has been resized.
360 Any of the channels may be nil,
361 in which case
362 .I newcontrolset
363 will call
364 .B initkeyboard
365 and/or
366 .B initmouse
367 (see
368 .IR keyboard (2)
369 and
370 .IR mouse (2))
371 to initialize the keyboard and mouse
372 and connect them to the control set.
373 The mouse and resize channels must both be nil or both be non-nil.
374 .PP
375 The function
376 .I closecontrolset
377 frees all the controls in the control set and tears down all the associated threads.
378 It does not close the mouse and keyboard.
379 .PP
380 The public elements of a
381 .B Controlset
382 are the flag
383 .BR clicktotype ,
384 and the
385 .I ctl
386 and
387 .I data
388 channels.
389 .PP
390 .I Clicktotype
391 is zero by default.
392 If it is set to non-zero, the controls
393 in the set will acquire `focus' by the click-to-type paradigm.
394 Otherwise, focus is always given to the control under the mouse.
395 .PP
396 Commands for controls are sent through the
397 .BR Controlset 's
398 .I ctl
399 channel.
400 One special command is recognized by the
401 .B Controlset
402 itself:  Sending
403 the string
404 .B sync
405 to the
406 .I ctl
407 channel causes that string to be echoed to the
408 .BR Controlset 's
409 .I data
410 channel when all commands up to the
411 .I sync
412 command have been processed.  The string is
413 allocated and must be freed (see
414 .IR malloc (2)).
415 Synchronization is necessary between sending a command, for example, to resize
416 all controls, and using their
417 .I rect
418 fields.
419 .PP
420 The function
421 .I resizecontrolset
422 must be provided by the user.
423 When the associated window is resized, the library will call
424 .I resizecontrolset
425 with the affected
426 .BR Controlset ;
427 the function should reconnect to and redraw the window.
428 .PP
429 If all windows are organized in a hierachy of
430 .IR boxboxes ,
431 .IR columns ,
432 .I rows
433 and
434 .IR stacks ,
435 and minimum and maximum sizes have already been supplied, only
436 the top control needs to be resized (see the
437 .I rect
438 command below).
439 .SS "Fonts and images
440 Fonts and images must be given names so they may be referenced
441 in messages.
442 The functions
443 .I namectlfont
444 and
445 .I namectlimage
446 associate a (unique) name with the specified font or image.
447 The association is removed by
448 .I freectlfont
449 and
450 .IR freectlimage .
451 The font or image is not freed by these functions, however.
452 .PP
453 The function
454 .I initcontrols
455 establishes name bindings for all the colors mentioned in
456 .BR <draw.h> ,
457 such as
458 .BR black ,
459 .BR white ,
460 .BR red ,
461 .BR yellow ,
462 etc., as well as masks
463 .B transparent
464 and
465 .BR opaque .
466 It also sets the name
467 .B font
468 to refer to the default
469 .B font
470 variable set up by
471 .BR initdraw .
472 .SS Creation
473 Each type of control has an associated creation function:
474 .IR createbutton ,
475 .IR createentry ,
476 etc.,
477 whose arguments are the
478 .B Controlset
479 to attach it to and a globally unique name for it.
480 A control may be destroyed by calling
481 .IR closecontrol .
482 .PP
483 The function
484 .I controlcalled
485 returns a pointer to the
486 .B Control
487 with the given
488 .IR name ,
489 or nil if no such control exists.
490 .SS Configuration
491 After a control is created, it must be configured using the control-specific
492 commands documented below.
493 Commands are sent to the
494 .B ctl
495 channel of the
496 .BR Controlset .
497 Multiple commands may be sent in a single message; newline characters
498 separate commands.
499 For an example, see the implementation of
500 .I resizecontrolset
501 in the
502 .B EXAMPLES
503 section.
504 Note that newline is a separator, not a terminator; the final command
505 does not need a newline.
506 .PP
507 Messages sent to the
508 .I ctl
509 channel are delivered to all controls that match the
510 .I destination
511 field.  This field is a set of names separated by spaces, tabs or newlines.
512 A control matches the destination if its name or its type is among the set.
513 .PP
514 The recipient of a message ignores the initial
515 .IB sender :
516 field of the message, if present,
517 making it possible to send messages generated on an
518 .B event
519 channel directly to another control's
520 .B ctl
521 channel.
522 .SS Activation
523 When they are created, controls are disabled: they do not respond to
524 user input.
525 Not all controls need to be responsive;
526 for example, labels are static and a text display
527 might show a log of messages but not be useful to edit.
528 But buttons, entry boxes, and other text displays should be active.
529 .PP
530 To enable a control, call the
531 .I activate
532 function, which
533 specifies that the
534 .B Control
535 .I c
536 should respond to mouse and keyboard events;
537 .I deactivate
538 turns it off again.
539 .PP
540 Controls can be either
541 .I revealed
542 (default) or
543 .IR hidden .
544 When a control is hidden, it will not receive mouse or keyboard events
545 and state changes or
546 .I show
547 commands will be ignored until the control is once again
548 .IR revealed .
549 Control hiding is particularly useful when different controls are overlayed,
550 revealing only the `top' one.
551 .PP
552 The function
553 .I controlwire
554 permits rearrangement of the channels associated with a
555 .BR Control .
556 The channel
557 .I cname
558 (one of
559 \f5"data"\fP
560 or
561 \f5"event"\fP)
562 of
563 .B Control
564 .I c
565 is reassigned to the channel
566 .IR ch .
567 There are several uses for this operation:
568 one may reassign all the
569 .B event
570 channels to a single channel, in effect multiplexing all the events onto
571 a single channel;
572 or connect the
573 .B event
574 channel of a slider to the
575 .B ctl
576 channel for delivery to a text display (after setting the format for the slider's messages
577 to name the destination control and the appropriate syntax for the rest of the command)
578 to let the slider act as a scroll bar for the text without rerouting the messages explicitly.
579 .SS Controls
580 The following sections document the individual controls in alphabetical order.
581 The layout of each section is a brief description of the control's behavior,
582 followed by the messages it sends on
583 .BR event ,
584 followed by the messages it accepts via the
585 .B ctl
586 channel.
587 The
588 .B event
589 messages are triggered
590 .I only
591 by mouse or keyboard action; messages to the
592 .B ctl
593 file do not cause events to be generated.
594 .PP
595 All controls accept the following messages:
596 .TF \fLreveal
597 .TP
598 .BI rect " minx miny maxx maxy
599 Set the bounding rectangle for the control on the display.
600 The syntax generated by the
601 .B %R
602 print format of the draw library is also acceptable for the coordinates.
603 .TP
604 .BR size " [ \f2minΔx minΔy maxΔx maxΔy\fP ]
605 Set the minimum and maximum size for automatic layout in
606 .IR columns ,
607 .I rows
608 and
609 .IR stacks .
610 Without its four arguments, this command is ignored by primitive controls
611 and used by grouping controls to calculate their minimum and maximum sizes
612 by examining those of their constituent members.
613 If all primitive controls have been assigned a size, a single size request addressed
614 to the top of a layout hierarchy will assign sizes to all grouping
615 .BR Control s.
616 .TP
617 .B hide
618 Disable drawing of the control and ignore mouse and keyboard events
619 until the control is once again revealed.
620 Grouping
621 .BR Control s
622 (\f2column\fP, \f2row\fP, and \f2stack\fP) pass the
623 request down to their constituent
624 .BR Control s.
625 .TP
626 .B reveal
627 This is the opposite of
628 .BR hide :
629 the
630 .B Control
631 is displayed and mouse and keyboard operations resume.
632 Grouping
633 .BR Control s
634 (\f2column\fP, \f2row\fP, and \f2stack\fP) pass the
635 request down to their constituent
636 .BR Control s.
637 The
638 .B reveal
639 command for
640 .I stacks
641 takes an optional argument naming the
642 .B Control
643 to be revealed; all
644 other
645 .BR Control s
646 will be hidden.
647 .TP
648 .B show
649 Display the
650 .B Control
651 on its screen if not hidden.
652 Some actions will also cause the
653 .BR Control s
654 to show themselves automatically
655 (but never when the
656 .B control
657 is hidden).
658 Grouping
659 .BR Control s
660 (\f2column\fP, \f2row\fP, and \f2stack\fP) pass the
661 request down to their constituent
662 .BR Control s.
663 .PD
664 .PP
665 Many messages are common between multiple
666 .BR Control s.
667 Such messages are described in detail here to avoid repetition.
668 In the individual descriptions, only the syntax is presented.
669 .TF "\fLformat fmt"
670 .TP
671 .BI align " n
672 Specify the alignment of (some part of) the
673 .BR Control 's
674 display within its rectangle.
675 For textual
676 .BR control s,
677 the alignment specifies where the text should appear.
678 For multiline text, the alignment refers to each line within its box,
679 and only the
680 horizontal part is honored.
681 For other
682 .BR Control s,
683 the alignment affects the appearance of the display in
684 a reasonable way.
685 The valid alignments are words with obvious interpretations:
686 .BR upperleft ,
687 .BR uppercenter ,
688 .BR upperright ,
689 .BR centerleft ,
690 .BR center ,
691 .BR centerright ,
692 .BR lowerleft, 
693 .BR lowercenter ,
694 and
695 .BR lowerright .
696 .TP
697 .BI border " n
698 Inset the
699 .B Control
700 (or separate constituent
701 .BR Control s
702 in
703 .IR boxbox ,
704 .I column
705 and
706 .I row
707 .BR Control s
708 after the next
709 .I rect
710 command) within its rectangle by
711 .I n
712 pixels, default zero.
713 .TP
714 .BI bordercolor " name
715 Paint the border of the control with the named color, default black.
716 .TP
717 .BI focus " n
718 The
719 .B Control
720 now has (if
721 .I n
722 is non-zero) or does not have ( if
723 .I n
724 is zero) focus.
725 Most
726 .BR Control s
727 ignore the message; there are plans to make them react.
728 .TP
729 .BI format " fmt
730 Set the format of `value' messages sent on the
731 .B event
732 channel.
733 By default, the format is
734 .B \&"%q: value %q"
735 for string-valued
736 .BR Control s,
737 .B \&"%q: value %d"
738 for integer-valued
739 .B Control s
740 such as buttons,
741 and
742 .B \&"%q: value 0x%x"
743 for the keyboard and scribble
744 .BR Control s.
745 The
746 .B %q
747 prints the name of the
748 .BR Control ;
749 the rest the value.
750 Any supplied format string must be type-equivalent to the default for that
751 .BR Control . 
752 .TP
753 .BI image " name
754 .TP
755 .BI light " name
756 .TP
757 .BI mask " name
758 Many controls set a background image or color for display.
759 The
760 .B image
761 message sets the image.
762 The
763 .B mask
764 and
765 .B light
766 images together specify how the
767 .B Control
768 shows it is enabled:
769 the
770 .B light
771 is printed through the
772 .B mask
773 when the state is `on' or `pressed'.
774 Otherwise, the image appears unmodified.
775 The default image is white; mask opaque; light yellow.
776 .TP
777 .BI font " name
778 .TP
779 .BI textcolor " name
780 These commands set the font and color for displaying text.
781 The defaults are the default
782 .B font
783 set up by the draw library, and black.
784 .TP
785 .BI value " v
786 Set the value of the
787 .BR Control .
788 Textual images accept an arbitrary string;
789 others an integral value.
790 .SS Box
791 A box is a trivial control that does nothing more than pass keyboard, mouse,
792 and focus messages back on its
793 .B event
794 channel.
795 Keyboard characters are sent in the format
796 .IP
797 .EX
798 boxname: key 0x\f2nn
799 .EE
800 .PP
801 where
802 .I nn
803 is the hexadecimal value of the character.
804 Mouse messages are sent in the format
805 .IP
806 .EX
807 boxname: mouse [\f2x\fP \f2y\fP] \f2but\fP \f2msec\fP
808 .EE
809 .PP
810 where
811 .IR x ,
812 .IR y ,
813 .IR but ,
814 and
815 .I msec
816 are the various fields of the
817 .B Mouse
818 structure.
819 The focus message is just
820 .IP
821 .EX
822 boxname: focus \f2n\f1
823 .EE
824 .PP
825 where
826 .I n
827 is 0 if the box has lost focus, 1 if it has acquired it.
828 .PP
829 The box displays within its rectangle
830 an image, under mask, with specified alignment.
831 The control messages it accepts are:
832 .TF "\fLalign a"
833 .TP
834 .BI align " a
835 Controls the placement of the image in the rectangle (unimplemented).
836 .TP
837 .BI border " b
838 .TP
839 .BI bordercolor " name
840 .TP
841 .BI focus " n
842 .TP
843 .BI hide
844 .TP
845 .BI image " name
846 .TP
847 .BI rect " minx miny maxx maxy
848 .TP
849 .BI reveal
850 .TP
851 .BI show
852 .TP
853 .BI size " minΔx minΔy maxΔx maxΔy
854 .PD
855 .SS Boxbox
856 A
857 .B boxbox
858 allows a set of controls (``boxes'')
859 to be displayed in rows and columns within the
860 rectangle of the
861 .IR boxbox .
862 The maximum of the minimum heights of the constituent controls determines the
863 number of rows to be displayed.  The number of columns is the minimum that
864 allows all
865 .BR Control s
866 to be displayed.  This aggregator works well for collections
867 of buttons, labels, or textbuttons that all have a fixed height.
868 .TF "\fLadd name ..."
869 .TP
870 .BI add " name ...
871 adds the named control to the box of controls.  The display order
872 is determined by the order of adding.  The first named control is top left,
873 the second goes below it, etc.
874 It is possible to add one control to multiple grouping controls but
875 the layout of the result will be quite unpredictable.
876 .TP
877 .BI border " width
878 .TP
879 .BI bordercolor " color
880 .TP
881 .B hide
882 This command is passed on to the member controls.
883 .TP
884 .BR image " color
885 Background color displayed between member controls.
886 .TP
887 .B reveal
888 This command is passed on to the member controls.
889 .TP
890 .BI separation " width
891 Set the separation between member controls to
892 .I n
893 pixels.
894 .TP
895 .BI rect " minx miny maxx maxy
896 The member controls are layed out within the given rectangle according to
897 the minimum and maximum sizes given.  If the rectangle is not large enough
898 for the minimum a fatal error is currently generated.
899 If the controls at their maximum size are not big enough to fit, they are top-left justified
900 at their maximum size in the space given.
901 Otherwise, controls will get their minimum size and be enlarged proportional
902 to the extra size given by the maximum until they fit given rectangle.
903 The members are separated by borders of the width established by
904 .IR borderwidth .
905 .TP
906 .BI remove " name
907 Remove the named
908 control from the box.
909 .TP
910 .B show
911 This command is passed on to the member controls.
912 Show also (re)displays background and borders.
913 .TP
914 .BR size " \f2minΔx minΔy maxΔx maxΔy\fP
915 .PD
916 .SS Button
917 A button is a simple control that toggles its state when mouse button 1 is pressed on its rectangle.
918 Each state change triggers an event message:
919 .IP
920 .EX
921 buttonname: value \f2n\fP
922 .EE
923 where
924 .I n
925 encodes the mouse buttons used to make the selection.
926 .PP
927 The button displays an image (which may of course be a simple color)
928 and illuminates in the standard way when it is `on'.
929 The control messages it accepts are:
930 .TF "\fLborder b"
931 .TP
932 .BI align " a
933 Controls the placement of the image in the rectangle (unimplemented).
934 .TP
935 .BI border " b
936 .TP
937 .BI bordercolor " name
938 .TP
939 .BI focus " n
940 .TP
941 .BI format " fmt
942 .TP
943 .BI hide
944 .TP
945 .BI image " name
946 .TP
947 .BI light " name
948 .TP
949 .BI mask " name
950 .TP
951 .BI rect " minx miny maxx maxy
952 .TP
953 .BI reveal
954 .TP
955 .B show
956 .TP
957 .BI size " minΔx minΔy maxΔx maxΔy
958 .TP
959 .BI value " n
960 Set the button to `on' (if
961 .I n
962 is non-zero) or `off' (if
963 .I n
964 is zero).
965 .PD
966 .SS Column
967 A column is a grouping control which lays out its members vertically,
968 from top to bottom.  Currently, columns ignore mouse and keyboard
969 events, but there are plans to allow dragging the borders (when they
970 have non-zero width) between constituent members.
971 .TF "\fLadd name .."
972 .TP
973 .BI add " name ...
974 adds the named control to the column of controls.  The vertical order
975 is determined by the order of adding.  The first named control goes at
976 the top.  It is possible to add one control to multiple grouping controls but
977 the layout of the result will be quite unpredictable.
978 .TP
979 .BI border " width
980 Set the border between members to the width given.
981 .TP
982 .BI bordercolor " color
983 .TP
984 .B hide
985 .TP
986 .BR image " color
987 Background color displayed between member controls.
988 .TP
989 .B reveal
990 .TP
991 .BI separation " width
992 Set the separation between member controls to
993 .I n
994 pixels.
995 .TP
996 .B show
997 These three commands are passed on to the member controls.
998 Show also (re)displays the borders between members.
999 .TP
1000 .BI rect " minx miny maxx maxy
1001 The member controls are layed out within the given rectangle according to
1002 the minimum and maximum sizes given.  If the rectangle is not large enough
1003 for the minimum a fatal error is currently generated.  However, see the example
1004 at the end of this man page.
1005 If the controls at their maximum size are not big enough to fit, they are centered
1006 at their maximum size in the space given.
1007 Otherwise, controls will get their minimum size and be enlarged proportional
1008 to the extra size given by the maximum until they fit given rectangle.
1009 The members are separated by borders of the width established by
1010 .IR borderwidth .
1011 .TP
1012 .BI remove " name
1013 Remove the named control from the column.
1014 .TP
1015 .BR size " [ \f2minΔx minΔy maxΔx maxΔy\fP ]
1016 Without arguments, this command computes the minimum and
1017 maximum size of a column by adding the minimum and maximum
1018 heights to set
1019 .I minΔy
1020 and
1021 .IR maxΔy ,
1022 and it finds the largest minimum and maximum widths to set
1023 .I minΔy
1024 and
1025 .IR maxΔy .
1026 When called with arguments, it simply sets the minimum and maximum
1027 sizes to those given.
1028 .PD
1029 .SS Entry
1030 The entry control manages a single line of editable text.
1031 When the user hits a carriage return anywhere
1032 in the text, the control generates the event message,
1033 .IP
1034 .EX
1035 entryname: value \f2s\fP
1036 .EE
1037 .PP
1038 with
1039 .I s
1040 the complete text of the entry box.
1041 .PP
1042 The cursor can be moved by clicking button 1; at the moment,
1043 there is no way to select characters, only a typing position.
1044 Some control characters have special actions:
1045 control-H (backspace) deletes the character before the cursor;
1046 control-U clears the line; and
1047 control-V pastes the snarf buffer at the typing position.
1048 Most important, carriage return sends the text to the event channel.
1049 .PP
1050 To enter passwords and other secret text without displaying the
1051 contents, set the font to one in which all characters are the same.
1052 The easiest way to do this is to make a font containing only one character,
1053 at position 0 (NUL), since that position is used to render all
1054 characters not otherwise defined in the font (see
1055 .IR draw (2)).
1056 The file
1057 .B /lib/font/bit/lucm/passwd.9.font
1058 defines such a font.
1059 .PP
1060 The control messages the entry control accepts are:
1061 .TF "\fLborder b"
1062 .TP
1063 .BI align " a
1064 Controls the placement of the text in the rectangle.
1065 .TP
1066 .BI border " b
1067 .TP
1068 .BI bordercolor " name
1069 .TP
1070 .BI data
1071 After receiving this message, the entry will send its value to its
1072 .B data
1073 channel as an unadorned, unquoted string.
1074 .TP
1075 .BI focus " n
1076 When it receives focus, the entry box displays a typing cursor.
1077 When it does not have focus, the cursor is not displayed.
1078 .TP
1079 .BI font " name
1080 .TP
1081 .BI format " fmt
1082 .TP
1083 .BI hide
1084 .TP
1085 .BI image " name
1086 .TP
1087 .BI rect " minx miny maxx maxy
1088 .TP
1089 .B reveal
1090 .TP
1091 .B show
1092 .TP
1093 .BI size " minΔx minΔy maxΔx maxΔy
1094 .TP
1095 .BI textcolor " name
1096 .TP
1097 .BI value " s
1098 Set the string displayed in the entry box.
1099 .PD
1100 .SS Keyboard
1101 The keyboard control implements a simulated keyboard useful on palmtop devices.
1102 Keystrokes, generated by mouse button 1 on the simulated keys,
1103 are sent as event messages:
1104 .IP
1105 .EX
1106 keyboardname: value 0x\f2nn\f1
1107 .EE
1108 .PP
1109 where
1110 .I nn
1111 is the hexadecimal Unicode value of the character.
1112 Shift, control, and caps lock are handled by the keyboard control itself;
1113 shift and control affect only the next regular keystroke.
1114 The Alt key is unimplemented; it will become equivalent to the standard Plan 9
1115 key for synthesizing non-ASCII characters.
1116 .PP
1117 There are two special keys,
1118 .B Scrib
1119 and
1120 .BR Menu ,
1121 which return values
1122 .B 0x10000
1123 and
1124 .BR 0x10001 .
1125 .PP
1126 The image, mask, light rules are used to indicate that a key is pressed,
1127 but to aid clumsy fingers the keystroke is not generated until the key is released,
1128 so it is possible to slide the pointer to a different key to correct for bad aim.
1129 .PP
1130 The control messages the keyboard accepts are:
1131 .TF "\fLfont"
1132 .TP
1133 .BI border " b
1134 .TP
1135 .BI bordercolor " name
1136 .TP
1137 .BI focus " n
1138 .TP
1139 .BI font " name1 name2
1140 Sets the font for the keys.
1141 If only one font is named, it is used for all keys.
1142 If two are named, the second is used for key caps with special names such
1143 as Shift and Enter.
1144 (Good choices on the Bitsy are
1145 .B /lib/font/bit/lucidasans/boldlatin1.6.font
1146 for the first and
1147 .B /lib/font/bit/lucidasans/unicode.6.font
1148 for the second argument.)
1149 If neither is specified, both will be set to the default global font.
1150 .TP
1151 .BI format " fmt
1152 .TP
1153 .BI hide
1154 .TP
1155 .BI image " name
1156 .TP
1157 .BI light " name
1158 .TP
1159 .BI mask " name
1160 .TP
1161 .BI rect " minx miny maxx maxy
1162 .TP
1163 .BI reveal
1164 .TP
1165 .B show
1166 .TP
1167 .BI size " minx miny maxx maxy
1168 .PD
1169 .SS Label
1170 A label is like a textbutton
1171 .RI ( q.v. )
1172 that does not react, but whose value is the text it displays.
1173 The control messages it accepts are:
1174 .TF "\fLvalue s"
1175 .TP
1176 .BI align " a
1177 Controls the placement of the image in the rectangle.
1178 .TP
1179 .BI border " b
1180 .TP
1181 .BI bordercolor " name
1182 .TP
1183 .BI focus " n
1184 .TP
1185 .BI font " name
1186 .TP
1187 .BI hide
1188 .TP
1189 .BI image " name
1190 .TP
1191 .BI rect " minx miny maxx maxy
1192 .TP
1193 .BI reveal
1194 .TP
1195 .B show
1196 .TP
1197 .BI size " minx miny maxx maxy
1198 .TP
1199 .BI textcolor " name
1200 .TP
1201 .BI value " s
1202 The value is a string that can be modified only by sending this message to the
1203 .B ctl
1204 file.
1205 .PD
1206 .SS Menu
1207 A menu is a pop-up window containing a set of textual selections.
1208 When a selection is made, it removes itself from the screen and reports the selection
1209 by value:
1210 .IP
1211 .EX
1212 menuname: value \f2n\fP
1213 .EE
1214 .PP
1215 If no selection is made, no message is reported.
1216 Because it creates a window, programs using a menu must have their
1217 .B screen
1218 variable (see
1219 .IR graphics (2)
1220 and
1221 .IR window (2))
1222 set up to be refreshed properly.
1223 The easiest way to do this is to call
1224 .B getwindow
1225 with refresh argument
1226 .B Refbackup
1227 (see
1228 .IR graphics (2));
1229 most programs use
1230 .BR Refnone .
1231 .PP
1232 The control messages accepted by a menu are:
1233 .TF "\fLwindow n"
1234 .TP
1235 .BI add " text
1236 Add a line of
1237 .I text
1238 to the end of the menu.
1239 .TP
1240 .BI align " a
1241 Controls the left-right placement of the text in its rectangle.
1242 .TP
1243 .BI border " b
1244 .TP
1245 .BI bordercolor " name
1246 .TP
1247 .BI focus " n
1248 .TP
1249 .BI font " name
1250 .TP
1251 .BI format " fmt
1252 .TP
1253 .BI hide
1254 .TP
1255 .BI image " name
1256 .TP
1257 .BI rect " minx miny maxx maxy
1258 .TP
1259 .BI reveal
1260 .TP
1261 .BI size " minx miny maxx maxy
1262 Only the origin of the rectangle is significant; menus calculate the appropriate size.
1263 .TP
1264 .BI selectcolor " name
1265 Set the color in which to highlight selected lines; default yellow.
1266 .TP
1267 .BI selecttextcolor " name
1268 Set the color in which to draw the text in selected lines; default black.
1269 .TP
1270 .B show
1271 Display the menu. Not usually needed unless the menu is changed while visible; use
1272 .I window
1273 instead.
1274 .TP
1275 .B window
1276 .TP
1277 .BI window " n
1278 With no arguments, toggle the menu's visibility; otherwise make it visible (1) or invisible (0).
1279 When the selection is made, the menu will remove its window automatically.
1280 .PD
1281 .SS Radiobutton
1282 The radiobutton assembles a group of buttons or textbuttons into a
1283 single control with a numeric value.
1284 Its value is \-1 if none of the constituent buttons is pressed; otherwise
1285 it is the index, starting at zero, of the button that is pressed.
1286 Only one button may be pressed; the radiobutton manipulates its
1287 buttons to guarantee this.
1288 State changes trigger an event message:
1289 .IP
1290 .EX
1291 radiobuttonname: value \f2n\fP
1292 .EE
1293 .PP
1294 Buttons are added to the radio button using the
1295 .B add
1296 message; there is no way to remove them, although they may be turned off
1297 independently using
1298 .IR deactivate .
1299 The index reported in the value is defined by the order
1300 in which the buttons are added.
1301 The constituent buttons should be configured and layed out in the usual way;
1302 the rectangle of the radiobutton is used only to `catch' mouse events and
1303 should almost always correspond to the bounding box of the constituent
1304 buttons.
1305 In other words, the geometry is not maintained automatically.
1306 .PP
1307 The control messages the radiobutton accepts are:
1308 .TF "\fLadd name"
1309 .TP
1310 .BI add " name
1311 Add the control with the specified
1312 .I name
1313 to the radiobutton.
1314 .TP
1315 .BI focus " n
1316 .TP
1317 .BI format " fmt
1318 .TP
1319 .BI hide
1320 .TP
1321 .BI rect " minx miny maxx maxy
1322 .TP
1323 .BI reveal
1324 .TP
1325 .BI size " minx miny maxx maxy
1326 .TP
1327 .B show
1328 .TP
1329 .BI value " n
1330 .PD
1331 .SS Row
1332 A row groups a number of member controls left to right in a rectangle.
1333 Rows behave exactly like columns with the roles of
1334 .I x
1335 and
1336 .I y
1337 interchanged.
1338 .PP
1339 The control messages it accepts are:
1340 .TF "\fLfont"
1341 .TP
1342 .BI add " name ...
1343 .TP
1344 .BI border " width
1345 .TP
1346 .BI bordercolor " color
1347 .TP
1348 .BI hide
1349 .TP
1350 .BR image " color
1351 .TP
1352 .BI rect " minx miny maxx maxy
1353 .TP
1354 .BI remove " name
1355 .TP
1356 .BI reveal
1357 .TP
1358 .BI separation " width
1359 .TP
1360 .BI show
1361 .TP
1362 .BR size " [ \f2minΔx minΔy maxΔx maxΔy\fP ]
1363 .PD
1364 .SS Scribble
1365 The scribble control provides a region in which strokes drawn with mouse button
1366 1 are interpreted as characters in the manner of
1367 .IR scribble (2).
1368 In most respects, including the format of its event messages, it is equivalent
1369 to a keyboard control.
1370 .PP
1371 The control messages it accepts are:
1372 .TF "\fLlinecolor \fIname\f(CW "
1373 .TP
1374 .BI align " a
1375 Controls the placement of the image in the rectangle (unimplemented).
1376 .TP
1377 .BI border " b
1378 .TP
1379 .BI bordercolor " name
1380 .TP
1381 .BI focus " n
1382 .TP
1383 .BI font " name
1384 Used to display the indicia.
1385 .TP
1386 .BI hide
1387 .TP
1388 .BI image " name
1389 .TP
1390 .BI linecolor " name
1391 The color in which to draw the strokes; default black.
1392 .TP
1393 .BI rect " minx miny maxx maxy
1394 .TP
1395 .BI reveal
1396 .TP
1397 .BI size " minx miny maxx maxy
1398 .TP
1399 .B show
1400 .PD
1401 .SS Stack
1402 A stack groups a number of member controls in the same shared rectangle.
1403 Only one of these controls will be visible (revealed), the others are hidden.
1404 .PP
1405 The control messages it accepts are:
1406 .TF "\fLreveal [\f2n\fP]"
1407 .TP
1408 .BI hide
1409 .TP
1410 .BI rect " minx miny maxx maxy
1411 .TP
1412 .BI remove " name
1413 .TP
1414 .BR reveal " [ \f2n\fP ]
1415 Without argument,
1416 .B reveal
1417 is the opposite of
1418 .BR hide :
1419 it makes its selected control visible after it was hidden.
1420 With an argument, it makes the
1421 .IR n 'th
1422 added control visible, hiding all others.
1423 .TP
1424 .BI show
1425 .TP
1426 .BR size " [ \f2minΔx minΔy maxΔx maxΔy\fP ]
1427 Without argument,
1428 .I size
1429 computes the maximum of the minimum and maximum sizes of
1430 its constituent controls.  With arguments, it sets the size to the
1431 given values.
1432 .PD
1433 .SS Slider
1434 A slider controls an integer value by dragging the mouse with a button.
1435 Configured appropriately, it can serve as a scroll bar with the standard
1436 Plan 9 behavior.
1437 When the value changes, an event message is sent:
1438 .IP
1439 .EX
1440 slidername: value \f2n\f1
1441 .EE
1442 .PP
1443 The slider is a good candidate for connecting to another control
1444 by setting its format and rewiring its
1445 .B event
1446 channel to the other's
1447 .B ctl
1448 channel.
1449 .PP
1450 The geometry of the slider is defined by three numbers:
1451 .B max
1452 is a number representing the range of the slider;
1453 .B vis
1454 is a number representing how much of what is being controlled is visible;
1455 and
1456 .B value
1457 is a number representing the value of the slider within its range.
1458 For example, if the slider is managing a textual display of 1000 lines, with
1459 18 visible, and the first visible line (numbered starting form 0) is 304,
1460 .B max
1461 will be 1000,
1462 .B vis
1463 will be 18, and
1464 .B value
1465 will be 304.
1466 The
1467 .I indicator
1468 is the visual representation of the
1469 .I vis
1470 portion of the controlled object.
1471 .PP
1472 The control messages the slider accepts are:
1473 .TF "\fLabsolute n"
1474 .TP
1475 .BI absolute " n
1476 If
1477 .I n
1478 is zero,
1479 the slider behaves like a Plan 9 scroll bar:
1480 button 2 sets absolute position, button 1 decreases the value,
1481 and button 3 increases it.
1482 If
1483 .I n
1484 is non-zero, all buttons behave like button 2, setting the absolute value.
1485 .TP
1486 .BI border " b
1487 .TP
1488 .BI bordercolor " name
1489 .TP
1490 .BI clamp " end n
1491 The
1492 .I end
1493 is either the word
1494 .B high
1495 or
1496 .BR low ;
1497 .I n
1498 sets whether that end is clamped or not.
1499 If it is clamped, that end of the indicator is always at its supremum.
1500 A standard scroll bar has neither end clamped; a volume slider would
1501 have its low end clamped.
1502 If the low end is clamped, the value of the slider is represented by the
1503 high end of the indicator; otherwise it is represented by the low end.
1504 .TP
1505 .BI focus " n
1506 .TP
1507 .BI format " fmt
1508 .TP
1509 .BI hide
1510 .TP
1511 .BI image " name
1512 .TP
1513 .BI indicatorcolor " name
1514 Set the color in which to draw the indicator; default black.
1515 .TP
1516 .BI max " n
1517 Set the maximum value of the range covered by the slider.
1518 .TP
1519 .BI orient " dir
1520 The string
1521 .I dir
1522 begins either
1523 .B hor
1524 or
1525 .B ver
1526 to specify the orientation of the slider.
1527 The default is vertical.
1528 The value always increases to the right for horizontal sliders and
1529 downwards for vertical sliders.
1530 .TP
1531 .BI rect " minx miny maxx maxy
1532 .TP
1533 .BI reveal
1534 .TP
1535 .BI size " minx miny maxx maxy
1536 .TP
1537 .B show
1538 .TP
1539 .BI value " n
1540 .TP
1541 .BI vis " n
1542 Set the visible area shown by the indicator.
1543 .PD
1544 .SS Tab
1545 A tab control combines radiobottuns with a stack of windows giving the
1546 appearance of tabbed controls.  Currently, the tabs are positioned at the
1547 top of the stack.  The radiobutton consists of textbuttons, the stack
1548 can be composed of any type of control.
1549 .PP
1550 Control messages are
1551 .TF "\fLformat fmt"
1552 .TP
1553 .BI add " button control button control ...
1554 Adds a button to the radiobutton, and an associated control to the stack.
1555 Buttons and controls are numbered in the order of addition.  There is
1556 no remove operation.
1557 .TP
1558 .BI border " b
1559 .TP
1560 .BI bordercolor " color
1561 .TP
1562 .BI focus " n
1563 .TP
1564 .BI format " fmt
1565 When a format string is defined, the tab control reports which tab
1566 is selected using the format string (which must print a
1567 .B char*
1568 and an
1569 .BR int ). 
1570 .TP
1571 .BI image " color
1572 Color between member controls.
1573 .TP
1574 .BI separation " n
1575 Spacing between buttons in the radiobutton and between the row of
1576 buttons and the stack below it.
1577 .TP
1578 .BI rect " n n n n
1579 .TP
1580 .B hide
1581 .TP
1582 .B reveal
1583 .TP
1584 .BI size " n n n n
1585 .TP
1586 .B show
1587 .TP
1588 .BI value " n
1589 Value must be an integer indicating which tab to bring to the top.
1590 .PD
1591 .SS Text
1592 A text control presents a set of lines of text.
1593 The text cannot be edited with the keyboard, but can be
1594 changed by control messages.
1595 (A more interactive text control will be created eventually.)
1596 The mouse can be used to select lines of text.
1597 The only event message reports a state change in the selection of a line:
1598 .IP
1599 .EX
1600 textname: select \f2n\f1 \f2s\f1
1601 .EE
1602 .PP
1603 states that line
1604 .I n
1605 has changed its selection state to
1606 .IR s ,
1607 either zero (unselected) or non-zero (selected).
1608 The non-zero value encodes the mouse buttons that were down
1609 when the selection occurred.
1610 .PP
1611 The control messages the text control accepts are:
1612 .TF "\fLselectmode \fIs\fP "
1613 .TP
1614 .BI accumulate " s
1615 .TP
1616 .BI accumulate " n s
1617 .TP
1618 .BI add " s
1619 .TP
1620 .BI add " n s
1621 With one argument, append the string
1622 .I s
1623 as a new last line of the control; if
1624 .I n
1625 is specified, add the line
1626 .I before
1627 the current line
1628 .IR n ,
1629 making the new line number
1630 .IR n.
1631 The lines are zero indexed and
1632 .I n
1633 can be no greater than the current number of lines.
1634 .I Add
1635 refreshes the display, but
1636 .I accumulate
1637 does not, to avoid n-squared behavior when assembling a piece of text.
1638 .TP
1639 .BI align " a
1640 Controls the placement of each line of text left-to-right in its rectangle.
1641 Vertically, lines are tightly packed with separation set by the font's interline
1642 spacing.
1643 .TP
1644 .BI border " b
1645 .TP
1646 .BI bordercolor " name
1647 .TP
1648 .BI clear
1649 Delete all text.
1650 .TP
1651 .BI delete " n
1652 Delete line
1653 .IR n .
1654 .TP
1655 .BI focus " n
1656 .TP
1657 .BI font " name
1658 .TP
1659 .BI image " name
1660 .TP
1661 .BI rect " minx miny maxx maxy
1662 .TP
1663 .BI replace " n s
1664 Replace line
1665 .I n
1666 by the string
1667 .IR s .
1668 .TP
1669 .BI reveal
1670 .TP
1671 .BI scroll " n
1672 If
1673 .I n
1674 is non-zero, the text will automatically scroll so the last line is always visible
1675 when new text is added.
1676 .TP
1677 .BI select " n m
1678 Set the selection state of line
1679 .I n
1680 to
1681 .IR m .
1682 .TP
1683 .BI selectcolor " name
1684 Set the color in which to highlight selected lines; default yellow.
1685 .TP
1686 .BI selectmode " s
1687 The string
1688 .I s
1689 is either
1690 .B single
1691 or
1692 .BR multi .
1693 If
1694 .BR single ,
1695 the default,
1696 only one line may be selected at a time; when a line is selected,
1697 other lines are unselected.
1698 If
1699 .BR multi ,
1700 the selection state of individual lines can be toggled independently.
1701 .TP
1702 .BI size " minx miny maxx maxy
1703 .TP
1704 .B show
1705 .TP
1706 .BI textcolor " name
1707 .TP
1708 .BI topline " n
1709 Scroll the text so the top visible line is number
1710 .IR n .
1711 .TP
1712 .BI value " s
1713 Delete all the text in the control and then add the single line
1714 .IR s .
1715 .PD
1716 .SS Textbutton
1717 A textbutton is a textual variant of a plain button.
1718 Each state change triggers an event message:
1719 .IP
1720 .EX
1721 textbuttonname: value \f2n\fP
1722 .EE
1723 .LP
1724 where
1725 .I n
1726 encodes the mouse buttons used to make the selection.
1727 .PP
1728 Like a regular button, the value of a textbutton is an integer; the
1729 .I text
1730 is the string that appears in the button.
1731 It uses the image, light, mask method of indicating its state;
1732 moreover, the color of the text can be set to change when the button is pressed.
1733 The control messages it accepts are:
1734 .TF "\fLalign a"
1735 .TP
1736 .BI align " a
1737 Controls the placement of the text in the rectangle.
1738 .TP
1739 .BI border " b
1740 .TP
1741 .BI bordercolor " name
1742 .TP
1743 .BI focus " n
1744 .TP
1745 .BI font " name
1746 .TP
1747 .BI format " fmt
1748 .TP
1749 .B hide
1750 .TP
1751 .BI image " name
1752 .TP
1753 .BI light " name
1754 .TP
1755 .BI mask " name
1756 .TP
1757 .BI pressedtextcolor " name
1758 Set the color in which to display text when the textbutton is pressed.
1759 .TP
1760 .BI rect " minx miny maxx maxy
1761 .TP
1762 .B reveal
1763 .TP
1764 .BI size " minx miny maxx maxy
1765 .TP
1766 .B show
1767 .TP
1768 .BI text " s
1769 Set the text displayed in the button.
1770 .TP
1771 .BI textcolor " name
1772 .TP
1773 .BI value " n
1774 Set the button to `on' (if
1775 .I n
1776 is non-zero) or `off' (if
1777 .I n
1778 is zero).
1779 .SS "Helper functions
1780 The function
1781 .I ctlerror
1782 is called when the library encounters an error.
1783 It prints the formatted message and exits the program.
1784 .PP
1785 The functions
1786 .IR ctlmalloc ,
1787 .IR ctlrealloc ,
1788 .IR ctlstrdup ,
1789 and
1790 .I ctlrunestrdup
1791 are packagings of the corresponding C library functions.
1792 They call
1793 .I ctlerror
1794 if they fail to allocate memory, and
1795 .I ctlmalloc
1796 zeros the memory it returns.
1797 .PP
1798 Finally, for debugging, if the global variable
1799 .I ctldeletequits
1800 is set to a non-zero value, typing a
1801 .SM DEL
1802 will cause the program to call
1803 .IP
1804 .EX
1805 ctlerror("delete");
1806 .EE
1807 .SS Caveat
1808 This library is very new and is still missing a number of important features.
1809 The details are all subject to change.
1810 Another level of library that handles geometry and has sensible default
1811 appearances for the controls would be useful.
1812 .PP
1813 One unusual design goal of this library was to make the controls themselves
1814 easy to implement.
1815 The reader is encouraged
1816 to create new controls by adapting the source to existing ones.
1817 .SH EXAMPLES
1818 This example creates two entry boxes,
1819 .BR top
1820 and
1821 .BR bot ,
1822 and copies the contents of one to the other whenever a newline is typed.
1823 .PP
1824 .EX
1825 #include <u.h>
1826 #include <libc.h>
1827 #include <thread.h>
1828 #include <draw.h>
1829 #include <mouse.h>
1830 #include <keyboard.h>
1831 #include <control.h>
1832 .sp 0.4v
1833 Controlset *cs;
1834 .sp 0.4v
1835 int ctldeletequits = 1;
1836 .sp 0.4v
1837 void
1838 resizecontrolset(Controlset*)
1839 {
1840         int i;
1841         Rectangle r, r1, r2;
1842 .sp 0.4v
1843         if(getwindow(display, Refnone) < 0)
1844                 sysfatal("resize failed: %r");
1845         r = insetrect(screen->r, 10);
1846         r1 = r;
1847         r2 = r;
1848         r1.max.y = r1.min.y+1+font->height+1;
1849         r2.min.y = r1.max.y+10;
1850         r2.max.y = r2.min.y+1+font->height+1;
1851         chanprint(cs->ctl, "top rect %R\entop show", r1);
1852         chanprint(cs->ctl, "bot rect %R\enbot show", r2);
1853 }
1854 .sp 0.4v
1855 void
1856 threadmain(int argc, char *argv[])
1857 {
1858         char *s, *args[3];
1859         Channel *c;
1860         Control *top, *bot;
1861         int n;
1862 .sp 0.4v
1863         initdraw(0, 0, "example");
1864         initcontrols();
1865         cs = newcontrolset(screen, nil, nil, nil);
1866         cs->clicktotype = 1;
1867 .sp 0.4v
1868         top = createentry(cs, "top");
1869         chanprint(cs->ctl, "top image paleyellow");
1870         chanprint(cs->ctl, "top border 1");
1871         bot = createentry(cs, "bot");
1872         chanprint(cs->ctl, "bot image paleyellow");
1873         chanprint(cs->ctl, "bot border 1");
1874 .sp 0.4v
1875         c = chancreate(sizeof(char*), 0);
1876         controlwire(top, "event", c);
1877         controlwire(bot, "event", c);
1878 .sp 0.4v
1879         activate(top);
1880         activate(bot);
1881         resizecontrolset(cs);
1882 .sp 0.4v
1883         for(;;){
1884                 s = recvp(c);
1885                 n = tokenize(s, args, nelem(args));
1886                 if(n==3 && strcmp(args[1], "value")==0){
1887                         if(strcmp(args[0], "top:") == 0)
1888                                 chanprint(cs->ctl, "bot value %q", args[2]);
1889                         else
1890                                 chanprint(cs->ctl, "top value %q", args[2]);
1891                 }
1892         }
1893         threadexitsall(nil);
1894 }
1895 .EE
1896 .PP
1897 A richer variant couples a text entry box to a slider.
1898 Since the value of a slider is its numerical setting, as a decimal number,
1899 all that needs changing is the setup of
1900 .BR bot :
1901 .PP
1902 .EX
1903         bot = createslider(cs, "bot");
1904         chanprint(cs->ctl, "bot border 1");
1905         chanprint(cs->ctl, "bot image paleyellow");
1906         chanprint(cs->ctl, "bot indicatorcolor red");
1907         chanprint(cs->ctl, "bot max 100");
1908         chanprint(cs->ctl, "bot clamp low 1");
1909         chanprint(cs->ctl, "bot orient horizontal");
1910 .EE
1911 .PP
1912 The rest is the same.
1913 Of course, the value of the entry box is only meaningful to the slider
1914 if it is also a decimal number.
1915 .PP
1916 Finally, we can avoid processing events altogether by cross-coupling
1917 the controls.  Replace the rest of
1918 .B threadmain
1919 with this:
1920 .PP
1921 .EX
1922         chanprint(cs->ctl, "bot format %q", "%q: top value %q");
1923         chanprint(cs->ctl, "top format %q", "%q: bot value %q");
1924 .sp 0.4v
1925         controlwire(top, "event", cs->ctl);
1926         controlwire(bot, "event", cs->ctl);
1927 .sp 0.4v
1928         activate(top);
1929         activate(bot);
1930         resizecontrolset(cs);
1931 .sp 0.4v
1932         for(;;)
1933                 yield();
1934         threadexitsall(nil);
1935 .EE
1936 .SH SOURCE
1937 .B /sys/src/libcontrol
1938 .SH SEE ALSO
1939 .IR draw (2),
1940 .IR frame (2),
1941 .IR graphics (2),
1942 .IR quote (2),
1943 .IR thread (2)
1944 .SH BUGS
1945 The library is strict about matters of formatting, argument count in messages,
1946 etc., and calls
1947 .I ctlerror
1948 in situations where it may be fine to ignore the error and continue.