There is also a large collection of field option bits you can set to
control various aspects of forms processing. You can manipulate them
with the procedures
set-field-opts! can be used to directly set
attributes of a field or you can chose to switch a few attributes on
and off with
field-opts-off!. You can
query the attributes of a field with
field-opts. The following
is a list of available options. By default, all options are on.
Controls whether the field is visible on the screen. Can be used during form processing to hide or pop up fields depending on the value of parent fields.
Controls whether the field is active during forms processing (i.e. visited by form navigation keys). Can be used to make labels or derived fields with buffer values alterable by the forms application, not the user.
Controls whether data is displayed during field entry. If this option
is turned off on a field, the library will accept and edit data in
that field, but it will not be displayed and the visible field cursor
will not move. You can turn off the
O_PUBLIC bit to define
Controls whether the field’s data can be modified. When this option
is off, all editing requests except
REQ_NEXT_CHOICE will fail. Such read-only fields may be useful
for help messages.
Controls word-wrapping in multiline fields. Normally, when any character of a (blank-separated) word reaches the end of the current line, the entire word is wrapped to the next line (assuming there is one). When this option is off, the word will be split across the line break.
Controls field blanking. When this option is on, entering a character at the first field position erases the entire field (except for the just-entered character).
Controls automatic skip to next field when this one fills. Normally, when the forms user tries to type more data into a field than will fit, the editing location jumps to the next field. When this option is off, the user’s cursor will hang at the end of the field. This option is ignored in dynamic fields that have not reached their size limit.
Controls whether validation is applied to blank fields. Normally, it is not; the user can leave a field blank without invoking the usual validation check on exit. If this option is off on a field, exit from it will invoke a validation check.
Controls whether validation occurs on every exit, or only after the
field is modified. Normally the latter is true. Setting
O_PASSOK may be useful if your field’s validation function may
change during forms processing.
Controls whether the field is fixed to its initial dimensions. If you turn this off, the field becomes dynamic and will stretch to fit entered data.
A field’s options cannot be changed while the field is currently selected. However, options may be changed on posted fields that are not current.
The option values are bit-masks and can be composed with
in the obvious way. You have seen the usage of watching off
O_AUTOSKIP option. The following example clarified usage of
some more options. One field is a constant, uneditable field, that
you cannot move to by using the arrow keys. The other field is a
password-like field where the characters are hidden from view.
#!/usr/local/bin/guile !# (use-modules (srfi srfi-1) (ncurses curses) (ncurses form)) ;; Constants (define STARTX 15) (define STARTY 4) (define WIDTH 25) (define N_FIELDS 2) ;; Initialize curses (define stdscr (initscr)) (cbreak!) (noecho!) (keypad! stdscr #t) ;; Initialize the fields (define field (map-in-order (lambda (y) (new-field 1 WIDTH (+ (* y 2) STARTY) STARTX 0 0)) (iota N_FIELDS))) ;; Set field options (set-field-back! (first field) A_UNDERLINE) ;; Don't go to the next field when this field is filled up ;; This field is a static label (field-opts-off! (first field) O_ACTIVE) ;; This field is like a password field (field-opts-off! (second field) O_PUBLIC) (field-opts-off! (second field) O_AUTOSKIP) ;; Create the new form and post it (define my-form (new-form field)) (post-form my-form) (refresh) (set-field-just! (first field) JUSTIFY_CENTER) (set-field-buffer! (first field) 0 "This is a static field") (addstr "Field 1:" #:y STARTY #:x (- STARTX 10)) (addstr "Field 2:" #:y (+ STARTY 2) #:x (- STARTX 10)) (refresh) ;; Loop through to get user requests (let loop ((ch (getch))) (if (not (eqv? ch (key-f 1))) (cond ((eqv? ch KEY_DOWN) (begin ;; Go to the end of the next field (form-driver my-form REQ_NEXT_FIELD) (form-driver my-form REQ_END_LINE) (loop (getch)))) ((eqv? ch KEY_UP) (begin ;; Go to the end of the previous field (form-driver my-form REQ_PREV_FIELD) (form-driver my-form REQ_END_LINE) (loop (getch)))) (else (begin ;; Print any normal character (form-driver my-form ch) (loop (getch))))))) ;; Unpost the form (unpost-form my-form) (endwin)