Amit Daniel Kachhap | e6a01f5 | 2011-07-20 11:45:59 +0530 | [diff] [blame] | 1 | Writing Programs with NCURSES |
| 2 | |
| 3 | by Eric S. Raymond and Zeyd M. Ben-Halim |
| 4 | updates since release 1.9.9e by Thomas Dickey |
| 5 | |
| 6 | Contents |
| 7 | |
| 8 | * Introduction |
| 9 | + A Brief History of Curses |
| 10 | + Scope of This Document |
| 11 | + Terminology |
| 12 | * The Curses Library |
| 13 | + An Overview of Curses |
| 14 | o Compiling Programs using Curses |
| 15 | o Updating the Screen |
| 16 | o Standard Windows and Function Naming Conventions |
| 17 | o Variables |
| 18 | + Using the Library |
| 19 | o Starting up |
| 20 | o Output |
| 21 | o Input |
| 22 | o Using Forms Characters |
| 23 | o Character Attributes and Color |
| 24 | o Mouse Interfacing |
| 25 | o Finishing Up |
| 26 | + Function Descriptions |
| 27 | o Initialization and Wrapup |
| 28 | o Causing Output to the Terminal |
| 29 | o Low-Level Capability Access |
| 30 | o Debugging |
| 31 | + Hints, Tips, and Tricks |
| 32 | o Some Notes of Caution |
| 33 | o Temporarily Leaving ncurses Mode |
| 34 | o Using ncurses under xterm |
| 35 | o Handling Multiple Terminal Screens |
| 36 | o Testing for Terminal Capabilities |
| 37 | o Tuning for Speed |
| 38 | o Special Features of ncurses |
| 39 | + Compatibility with Older Versions |
| 40 | o Refresh of Overlapping Windows |
| 41 | o Background Erase |
| 42 | + XSI Curses Conformance |
| 43 | * The Panels Library |
| 44 | + Compiling With the Panels Library |
| 45 | + Overview of Panels |
| 46 | + Panels, Input, and the Standard Screen |
| 47 | + Hiding Panels |
| 48 | + Miscellaneous Other Facilities |
| 49 | * The Menu Library |
| 50 | + Compiling with the menu Library |
| 51 | + Overview of Menus |
| 52 | + Selecting items |
| 53 | + Menu Display |
| 54 | + Menu Windows |
| 55 | + Processing Menu Input |
| 56 | + Miscellaneous Other Features |
| 57 | * The Forms Library |
| 58 | + Compiling with the forms Library |
| 59 | + Overview of Forms |
| 60 | + Creating and Freeing Fields and Forms |
| 61 | + Fetching and Changing Field Attributes |
| 62 | o Fetching Size and Location Data |
| 63 | o Changing the Field Location |
| 64 | o The Justification Attribute |
| 65 | o Field Display Attributes |
| 66 | o Field Option Bits |
| 67 | o Field Status |
| 68 | o Field User Pointer |
| 69 | + Variable-Sized Fields |
| 70 | + Field Validation |
| 71 | o TYPE_ALPHA |
| 72 | o TYPE_ALNUM |
| 73 | o TYPE_ENUM |
| 74 | o TYPE_INTEGER |
| 75 | o TYPE_NUMERIC |
| 76 | o TYPE_REGEXP |
| 77 | + Direct Field Buffer Manipulation |
| 78 | + Attributes of Forms |
| 79 | + Control of Form Display |
| 80 | + Input Processing in the Forms Driver |
| 81 | o Page Navigation Requests |
| 82 | o Inter-Field Navigation Requests |
| 83 | o Intra-Field Navigation Requests |
| 84 | o Scrolling Requests |
| 85 | o Field Editing Requests |
| 86 | o Order Requests |
| 87 | o Application Commands |
| 88 | + Field Change Hooks |
| 89 | + Field Change Commands |
| 90 | + Form Options |
| 91 | + Custom Validation Types |
| 92 | o Union Types |
| 93 | o New Field Types |
| 94 | o Validation Function Arguments |
| 95 | o Order Functions For Custom Types |
| 96 | o Avoiding Problems |
| 97 | _________________________________________________________________ |
| 98 | |
| 99 | Introduction |
| 100 | |
| 101 | This document is an introduction to programming with curses. It is not |
| 102 | an exhaustive reference for the curses Application Programming |
| 103 | Interface (API); that role is filled by the curses manual pages. |
| 104 | Rather, it is intended to help C programmers ease into using the |
| 105 | package. |
| 106 | |
| 107 | This document is aimed at C applications programmers not yet |
| 108 | specifically familiar with ncurses. If you are already an experienced |
| 109 | curses programmer, you should nevertheless read the sections on Mouse |
| 110 | Interfacing, Debugging, Compatibility with Older Versions, and Hints, |
| 111 | Tips, and Tricks. These will bring you up to speed on the special |
| 112 | features and quirks of the ncurses implementation. If you are not so |
| 113 | experienced, keep reading. |
| 114 | |
| 115 | The curses package is a subroutine library for terminal-independent |
| 116 | screen-painting and input-event handling which presents a high level |
| 117 | screen model to the programmer, hiding differences between terminal |
| 118 | types and doing automatic optimization of output to change one screen |
| 119 | full of text into another. Curses uses terminfo, which is a database |
| 120 | format that can describe the capabilities of thousands of different |
| 121 | terminals. |
| 122 | |
| 123 | The curses API may seem something of an archaism on UNIX desktops |
| 124 | increasingly dominated by X, Motif, and Tcl/Tk. Nevertheless, UNIX |
| 125 | still supports tty lines and X supports xterm(1); the curses API has |
| 126 | the advantage of (a) back-portability to character-cell terminals, and |
| 127 | (b) simplicity. For an application that does not require bit-mapped |
| 128 | graphics and multiple fonts, an interface implementation using curses |
| 129 | will typically be a great deal simpler and less expensive than one |
| 130 | using an X toolkit. |
| 131 | |
| 132 | A Brief History of Curses |
| 133 | |
| 134 | Historically, the first ancestor of curses was the routines written to |
| 135 | provide screen-handling for the game rogue; these used the |
| 136 | already-existing termcap database facility for describing terminal |
| 137 | capabilities. These routines were abstracted into a documented library |
| 138 | and first released with the early BSD UNIX versions. |
| 139 | |
| 140 | System III UNIX from Bell Labs featured a rewritten and much-improved |
| 141 | curses library. It introduced the terminfo format. Terminfo is based |
| 142 | on Berkeley's termcap database, but contains a number of improvements |
| 143 | and extensions. Parameterized capabilities strings were introduced, |
| 144 | making it possible to describe multiple video attributes, and colors |
| 145 | and to handle far more unusual terminals than possible with termcap. |
| 146 | In the later AT&T System V releases, curses evolved to use more |
| 147 | facilities and offer more capabilities, going far beyond BSD curses in |
| 148 | power and flexibility. |
| 149 | |
| 150 | Scope of This Document |
| 151 | |
| 152 | This document describes ncurses, a free implementation of the System V |
| 153 | curses API with some clearly marked extensions. It includes the |
| 154 | following System V curses features: |
| 155 | * Support for multiple screen highlights (BSD curses could only |
| 156 | handle one `standout' highlight, usually reverse-video). |
| 157 | * Support for line- and box-drawing using forms characters. |
| 158 | * Recognition of function keys on input. |
| 159 | * Color support. |
| 160 | * Support for pads (windows of larger than screen size on which the |
| 161 | screen or a subwindow defines a viewport). |
| 162 | |
| 163 | Also, this package makes use of the insert and delete line and |
| 164 | character features of terminals so equipped, and determines how to |
| 165 | optimally use these features with no help from the programmer. It |
| 166 | allows arbitrary combinations of video attributes to be displayed, |
| 167 | even on terminals that leave ``magic cookies'' on the screen to mark |
| 168 | changes in attributes. |
| 169 | |
| 170 | The ncurses package can also capture and use event reports from a |
| 171 | mouse in some environments (notably, xterm under the X window system). |
| 172 | This document includes tips for using the mouse. |
| 173 | |
| 174 | The ncurses package was originated by Pavel Curtis. The original |
| 175 | maintainer of this package is Zeyd Ben-Halim <zmbenhal@netcom.com>. |
| 176 | Eric S. Raymond <esr@snark.thyrsus.com> wrote many of the new features |
| 177 | in versions after 1.8.1 and wrote most of this introduction. Juergen |
| 178 | Pfeifer wrote all of the menu and forms code as well as the Ada95 |
| 179 | binding. Ongoing work is being done by Thomas Dickey (maintainer). |
| 180 | Contact the current maintainers at bug-ncurses@gnu.org. |
| 181 | |
| 182 | This document also describes the panels extension library, similarly |
| 183 | modeled on the SVr4 panels facility. This library allows you to |
| 184 | associate backing store with each of a stack or deck of overlapping |
| 185 | windows, and provides operations for moving windows around in the |
| 186 | stack that change their visibility in the natural way (handling window |
| 187 | overlaps). |
| 188 | |
| 189 | Finally, this document describes in detail the menus and forms |
| 190 | extension libraries, also cloned from System V, which support easy |
| 191 | construction and sequences of menus and fill-in forms. |
| 192 | |
| 193 | Terminology |
| 194 | |
| 195 | In this document, the following terminology is used with reasonable |
| 196 | consistency: |
| 197 | |
| 198 | window |
| 199 | A data structure describing a sub-rectangle of the screen |
| 200 | (possibly the entire screen). You can write to a window as |
| 201 | though it were a miniature screen, scrolling independently of |
| 202 | other windows on the physical screen. |
| 203 | |
| 204 | screens |
| 205 | A subset of windows which are as large as the terminal screen, |
| 206 | i.e., they start at the upper left hand corner and encompass |
| 207 | the lower right hand corner. One of these, stdscr, is |
| 208 | automatically provided for the programmer. |
| 209 | |
| 210 | terminal screen |
| 211 | The package's idea of what the terminal display currently looks |
| 212 | like, i.e., what the user sees now. This is a special screen. |
| 213 | |
| 214 | The Curses Library |
| 215 | |
| 216 | An Overview of Curses |
| 217 | |
| 218 | Compiling Programs using Curses |
| 219 | |
| 220 | In order to use the library, it is necessary to have certain types and |
| 221 | variables defined. Therefore, the programmer must have a line: |
| 222 | #include <curses.h> |
| 223 | |
| 224 | at the top of the program source. The screen package uses the Standard |
| 225 | I/O library, so <curses.h> includes <stdio.h>. <curses.h> also |
| 226 | includes <termios.h>, <termio.h>, or <sgtty.h> depending on your |
| 227 | system. It is redundant (but harmless) for the programmer to do these |
| 228 | includes, too. In linking with curses you need to have -lncurses in |
| 229 | your LDFLAGS or on the command line. There is no need for any other |
| 230 | libraries. |
| 231 | |
| 232 | Updating the Screen |
| 233 | |
| 234 | In order to update the screen optimally, it is necessary for the |
| 235 | routines to know what the screen currently looks like and what the |
| 236 | programmer wants it to look like next. For this purpose, a data type |
| 237 | (structure) named WINDOW is defined which describes a window image to |
| 238 | the routines, including its starting position on the screen (the (y, |
| 239 | x) coordinates of the upper left hand corner) and its size. One of |
| 240 | these (called curscr, for current screen) is a screen image of what |
| 241 | the terminal currently looks like. Another screen (called stdscr, for |
| 242 | standard screen) is provided by default to make changes on. |
| 243 | |
| 244 | A window is a purely internal representation. It is used to build and |
| 245 | store a potential image of a portion of the terminal. It doesn't bear |
| 246 | any necessary relation to what is really on the terminal screen; it's |
| 247 | more like a scratchpad or write buffer. |
| 248 | |
| 249 | To make the section of physical screen corresponding to a window |
| 250 | reflect the contents of the window structure, the routine refresh() |
| 251 | (or wrefresh() if the window is not stdscr) is called. |
| 252 | |
| 253 | A given physical screen section may be within the scope of any number |
| 254 | of overlapping windows. Also, changes can be made to windows in any |
| 255 | order, without regard to motion efficiency. Then, at will, the |
| 256 | programmer can effectively say ``make it look like this,'' and let the |
| 257 | package implementation determine the most efficient way to repaint the |
| 258 | screen. |
| 259 | |
| 260 | Standard Windows and Function Naming Conventions |
| 261 | |
| 262 | As hinted above, the routines can use several windows, but two are |
| 263 | automatically given: curscr, which knows what the terminal looks like, |
| 264 | and stdscr, which is what the programmer wants the terminal to look |
| 265 | like next. The user should never actually access curscr directly. |
| 266 | Changes should be made to through the API, and then the routine |
| 267 | refresh() (or wrefresh()) called. |
| 268 | |
| 269 | Many functions are defined to use stdscr as a default screen. For |
| 270 | example, to add a character to stdscr, one calls addch() with the |
| 271 | desired character as argument. To write to a different window. use the |
| 272 | routine waddch() (for `w'indow-specific addch()) is provided. This |
| 273 | convention of prepending function names with a `w' when they are to be |
| 274 | applied to specific windows is consistent. The only routines which do |
| 275 | not follow it are those for which a window must always be specified. |
| 276 | |
| 277 | In order to move the current (y, x) coordinates from one point to |
| 278 | another, the routines move() and wmove() are provided. However, it is |
| 279 | often desirable to first move and then perform some I/O operation. In |
| 280 | order to avoid clumsiness, most I/O routines can be preceded by the |
| 281 | prefix 'mv' and the desired (y, x) coordinates prepended to the |
| 282 | arguments to the function. For example, the calls |
| 283 | move(y, x); |
| 284 | addch(ch); |
| 285 | |
| 286 | can be replaced by |
| 287 | mvaddch(y, x, ch); |
| 288 | |
| 289 | and |
| 290 | wmove(win, y, x); |
| 291 | waddch(win, ch); |
| 292 | |
| 293 | can be replaced by |
| 294 | mvwaddch(win, y, x, ch); |
| 295 | |
| 296 | Note that the window description pointer (win) comes before the added |
| 297 | (y, x) coordinates. If a function requires a window pointer, it is |
| 298 | always the first parameter passed. |
| 299 | |
| 300 | Variables |
| 301 | |
| 302 | The curses library sets some variables describing the terminal |
| 303 | capabilities. |
| 304 | type name description |
| 305 | ------------------------------------------------------------------ |
| 306 | int LINES number of lines on the terminal |
| 307 | int COLS number of columns on the terminal |
| 308 | |
| 309 | The curses.h also introduces some #define constants and types of |
| 310 | general usefulness: |
| 311 | |
| 312 | bool |
| 313 | boolean type, actually a `char' (e.g., bool doneit;) |
| 314 | |
| 315 | TRUE |
| 316 | boolean `true' flag (1). |
| 317 | |
| 318 | FALSE |
| 319 | boolean `false' flag (0). |
| 320 | |
| 321 | ERR |
| 322 | error flag returned by routines on a failure (-1). |
| 323 | |
| 324 | OK |
| 325 | error flag returned by routines when things go right. |
| 326 | |
| 327 | Using the Library |
| 328 | |
| 329 | Now we describe how to actually use the screen package. In it, we |
| 330 | assume all updating, reading, etc. is applied to stdscr. These |
| 331 | instructions will work on any window, providing you change the |
| 332 | function names and parameters as mentioned above. |
| 333 | |
| 334 | Here is a sample program to motivate the discussion: |
| 335 | #include <curses.h> |
| 336 | #include <signal.h> |
| 337 | |
| 338 | static void finish(int sig); |
| 339 | |
| 340 | int |
| 341 | main(int argc, char *argv[]) |
| 342 | { |
| 343 | int num = 0; |
| 344 | |
| 345 | /* initialize your non-curses data structures here */ |
| 346 | |
| 347 | (void) signal(SIGINT, finish); /* arrange interrupts to terminate */ |
| 348 | |
| 349 | (void) initscr(); /* initialize the curses library */ |
| 350 | keypad(stdscr, TRUE); /* enable keyboard mapping */ |
| 351 | (void) nonl(); /* tell curses not to do NL->CR/NL on output */ |
| 352 | (void) cbreak(); /* take input chars one at a time, no wait for \n */ |
| 353 | (void) echo(); /* echo input - in color */ |
| 354 | |
| 355 | if (has_colors()) |
| 356 | { |
| 357 | start_color(); |
| 358 | |
| 359 | /* |
| 360 | * Simple color assignment, often all we need. Color pair 0 cannot |
| 361 | * be redefined. This example uses the same value for the color |
| 362 | * pair as for the foreground color, though of course that is not |
| 363 | * necessary: |
| 364 | */ |
| 365 | init_pair(1, COLOR_RED, COLOR_BLACK); |
| 366 | init_pair(2, COLOR_GREEN, COLOR_BLACK); |
| 367 | init_pair(3, COLOR_YELLOW, COLOR_BLACK); |
| 368 | init_pair(4, COLOR_BLUE, COLOR_BLACK); |
| 369 | init_pair(5, COLOR_CYAN, COLOR_BLACK); |
| 370 | init_pair(6, COLOR_MAGENTA, COLOR_BLACK); |
| 371 | init_pair(7, COLOR_WHITE, COLOR_BLACK); |
| 372 | } |
| 373 | |
| 374 | for (;;) |
| 375 | { |
| 376 | int c = getch(); /* refresh, accept single keystroke of input */ |
| 377 | attrset(COLOR_PAIR(num % 8)); |
| 378 | num++; |
| 379 | |
| 380 | /* process the command keystroke */ |
| 381 | } |
| 382 | |
| 383 | finish(0); /* we're done */ |
| 384 | } |
| 385 | |
| 386 | static void finish(int sig) |
| 387 | { |
| 388 | endwin(); |
| 389 | |
| 390 | /* do your non-curses wrapup here */ |
| 391 | |
| 392 | exit(0); |
| 393 | } |
| 394 | |
| 395 | Starting up |
| 396 | |
| 397 | In order to use the screen package, the routines must know about |
| 398 | terminal characteristics, and the space for curscr and stdscr must be |
| 399 | allocated. These function initscr() does both these things. Since it |
| 400 | must allocate space for the windows, it can overflow memory when |
| 401 | attempting to do so. On the rare occasions this happens, initscr() |
| 402 | will terminate the program with an error message. initscr() must |
| 403 | always be called before any of the routines which affect windows are |
| 404 | used. If it is not, the program will core dump as soon as either |
| 405 | curscr or stdscr are referenced. However, it is usually best to wait |
| 406 | to call it until after you are sure you will need it, like after |
| 407 | checking for startup errors. Terminal status changing routines like |
| 408 | nl() and cbreak() should be called after initscr(). |
| 409 | |
| 410 | Once the screen windows have been allocated, you can set them up for |
| 411 | your program. If you want to, say, allow a screen to scroll, use |
| 412 | scrollok(). If you want the cursor to be left in place after the last |
| 413 | change, use leaveok(). If this isn't done, refresh() will move the |
| 414 | cursor to the window's current (y, x) coordinates after updating it. |
| 415 | |
| 416 | You can create new windows of your own using the functions newwin(), |
| 417 | derwin(), and subwin(). The routine delwin() will allow you to get rid |
| 418 | of old windows. All the options described above can be applied to any |
| 419 | window. |
| 420 | |
| 421 | Output |
| 422 | |
| 423 | Now that we have set things up, we will want to actually update the |
| 424 | terminal. The basic functions used to change what will go on a window |
| 425 | are addch() and move(). addch() adds a character at the current (y, x) |
| 426 | coordinates. move() changes the current (y, x) coordinates to whatever |
| 427 | you want them to be. It returns ERR if you try to move off the window. |
| 428 | As mentioned above, you can combine the two into mvaddch() to do both |
| 429 | things at once. |
| 430 | |
| 431 | The other output functions, such as addstr() and printw(), all call |
| 432 | addch() to add characters to the window. |
| 433 | |
| 434 | After you have put on the window what you want there, when you want |
| 435 | the portion of the terminal covered by the window to be made to look |
| 436 | like it, you must call refresh(). In order to optimize finding |
| 437 | changes, refresh() assumes that any part of the window not changed |
| 438 | since the last refresh() of that window has not been changed on the |
| 439 | terminal, i.e., that you have not refreshed a portion of the terminal |
| 440 | with an overlapping window. If this is not the case, the routine |
| 441 | touchwin() is provided to make it look like the entire window has been |
| 442 | changed, thus making refresh() check the whole subsection of the |
| 443 | terminal for changes. |
| 444 | |
| 445 | If you call wrefresh() with curscr as its argument, it will make the |
| 446 | screen look like curscr thinks it looks like. This is useful for |
| 447 | implementing a command which would redraw the screen in case it get |
| 448 | messed up. |
| 449 | |
| 450 | Input |
| 451 | |
| 452 | The complementary function to addch() is getch() which, if echo is |
| 453 | set, will call addch() to echo the character. Since the screen package |
| 454 | needs to know what is on the terminal at all times, if characters are |
| 455 | to be echoed, the tty must be in raw or cbreak mode. Since initially |
| 456 | the terminal has echoing enabled and is in ordinary ``cooked'' mode, |
| 457 | one or the other has to changed before calling getch(); otherwise, the |
| 458 | program's output will be unpredictable. |
| 459 | |
| 460 | When you need to accept line-oriented input in a window, the functions |
| 461 | wgetstr() and friends are available. There is even a wscanw() function |
| 462 | that can do scanf()(3)-style multi-field parsing on window input. |
| 463 | These pseudo-line-oriented functions turn on echoing while they |
| 464 | execute. |
| 465 | |
| 466 | The example code above uses the call keypad(stdscr, TRUE) to enable |
| 467 | support for function-key mapping. With this feature, the getch() code |
| 468 | watches the input stream for character sequences that correspond to |
| 469 | arrow and function keys. These sequences are returned as |
| 470 | pseudo-character values. The #define values returned are listed in the |
| 471 | curses.h The mapping from sequences to #define values is determined by |
| 472 | key_ capabilities in the terminal's terminfo entry. |
| 473 | |
| 474 | Using Forms Characters |
| 475 | |
| 476 | The addch() function (and some others, including box() and border()) |
| 477 | can accept some pseudo-character arguments which are specially defined |
| 478 | by ncurses. These are #define values set up in the curses.h header; |
| 479 | see there for a complete list (look for the prefix ACS_). |
| 480 | |
| 481 | The most useful of the ACS defines are the forms-drawing characters. |
| 482 | You can use these to draw boxes and simple graphs on the screen. If |
| 483 | the terminal does not have such characters, curses.h will map them to |
| 484 | a recognizable (though ugly) set of ASCII defaults. |
| 485 | |
| 486 | Character Attributes and Color |
| 487 | |
| 488 | The ncurses package supports screen highlights including standout, |
| 489 | reverse-video, underline, and blink. It also supports color, which is |
| 490 | treated as another kind of highlight. |
| 491 | |
| 492 | Highlights are encoded, internally, as high bits of the |
| 493 | pseudo-character type (chtype) that curses.h uses to represent the |
| 494 | contents of a screen cell. See the curses.h header file for a complete |
| 495 | list of highlight mask values (look for the prefix A_). |
| 496 | |
| 497 | There are two ways to make highlights. One is to logical-or the value |
| 498 | of the highlights you want into the character argument of an addch() |
| 499 | call, or any other output call that takes a chtype argument. |
| 500 | |
| 501 | The other is to set the current-highlight value. This is logical-or'ed |
| 502 | with any highlight you specify the first way. You do this with the |
| 503 | functions attron(), attroff(), and attrset(); see the manual pages for |
| 504 | details. Color is a special kind of highlight. The package actually |
| 505 | thinks in terms of color pairs, combinations of foreground and |
| 506 | background colors. The sample code above sets up eight color pairs, |
| 507 | all of the guaranteed-available colors on black. Note that each color |
| 508 | pair is, in effect, given the name of its foreground color. Any other |
| 509 | range of eight non-conflicting values could have been used as the |
| 510 | first arguments of the init_pair() values. |
| 511 | |
| 512 | Once you've done an init_pair() that creates color-pair N, you can use |
| 513 | COLOR_PAIR(N) as a highlight that invokes that particular color |
| 514 | combination. Note that COLOR_PAIR(N), for constant N, is itself a |
| 515 | compile-time constant and can be used in initializers. |
| 516 | |
| 517 | Mouse Interfacing |
| 518 | |
| 519 | The ncurses library also provides a mouse interface. |
| 520 | |
| 521 | NOTE: this facility is specific to ncurses, it is not part of |
| 522 | either the XSI Curses standard, nor of System V Release 4, nor BSD |
| 523 | curses. System V Release 4 curses contains code with similar |
| 524 | interface definitions, however it is not documented. Other than by |
| 525 | disassembling the library, we have no way to determine exactly how |
| 526 | that mouse code works. Thus, we recommend that you wrap |
| 527 | mouse-related code in an #ifdef using the feature macro |
| 528 | NCURSES_MOUSE_VERSION so it will not be compiled and linked on |
| 529 | non-ncurses systems. |
| 530 | |
| 531 | Presently, mouse event reporting works in the following environments: |
| 532 | * xterm and similar programs such as rxvt. |
| 533 | * Linux console, when configured with gpm(1), Alessandro Rubini's |
| 534 | mouse server. |
| 535 | * FreeBSD sysmouse (console) |
| 536 | * OS/2 EMX |
| 537 | |
| 538 | The mouse interface is very simple. To activate it, you use the |
| 539 | function mousemask(), passing it as first argument a bit-mask that |
| 540 | specifies what kinds of events you want your program to be able to |
| 541 | see. It will return the bit-mask of events that actually become |
| 542 | visible, which may differ from the argument if the mouse device is not |
| 543 | capable of reporting some of the event types you specify. |
| 544 | |
| 545 | Once the mouse is active, your application's command loop should watch |
| 546 | for a return value of KEY_MOUSE from wgetch(). When you see this, a |
| 547 | mouse event report has been queued. To pick it off the queue, use the |
| 548 | function getmouse() (you must do this before the next wgetch(), |
| 549 | otherwise another mouse event might come in and make the first one |
| 550 | inaccessible). |
| 551 | |
| 552 | Each call to getmouse() fills a structure (the address of which you'll |
| 553 | pass it) with mouse event data. The event data includes zero-origin, |
| 554 | screen-relative character-cell coordinates of the mouse pointer. It |
| 555 | also includes an event mask. Bits in this mask will be set, |
| 556 | corresponding to the event type being reported. |
| 557 | |
| 558 | The mouse structure contains two additional fields which may be |
| 559 | significant in the future as ncurses interfaces to new kinds of |
| 560 | pointing device. In addition to x and y coordinates, there is a slot |
| 561 | for a z coordinate; this might be useful with touch-screens that can |
| 562 | return a pressure or duration parameter. There is also a device ID |
| 563 | field, which could be used to distinguish between multiple pointing |
| 564 | devices. |
| 565 | |
| 566 | The class of visible events may be changed at any time via |
| 567 | mousemask(). Events that can be reported include presses, releases, |
| 568 | single-, double- and triple-clicks (you can set the maximum |
| 569 | button-down time for clicks). If you don't make clicks visible, they |
| 570 | will be reported as press-release pairs. In some environments, the |
| 571 | event mask may include bits reporting the state of shift, alt, and |
| 572 | ctrl keys on the keyboard during the event. |
| 573 | |
| 574 | A function to check whether a mouse event fell within a given window |
| 575 | is also supplied. You can use this to see whether a given window |
| 576 | should consider a mouse event relevant to it. |
| 577 | |
| 578 | Because mouse event reporting will not be available in all |
| 579 | environments, it would be unwise to build ncurses applications that |
| 580 | require the use of a mouse. Rather, you should use the mouse as a |
| 581 | shortcut for point-and-shoot commands your application would normally |
| 582 | accept from the keyboard. Two of the test games in the ncurses |
| 583 | distribution (bs and knight) contain code that illustrates how this |
| 584 | can be done. |
| 585 | |
| 586 | See the manual page curs_mouse(3X) for full details of the |
| 587 | mouse-interface functions. |
| 588 | |
| 589 | Finishing Up |
| 590 | |
| 591 | In order to clean up after the ncurses routines, the routine endwin() |
| 592 | is provided. It restores tty modes to what they were when initscr() |
| 593 | was first called, and moves the cursor down to the lower-left corner. |
| 594 | Thus, anytime after the call to initscr, endwin() should be called |
| 595 | before exiting. |
| 596 | |
| 597 | Function Descriptions |
| 598 | |
| 599 | We describe the detailed behavior of some important curses functions |
| 600 | here, as a supplement to the manual page descriptions. |
| 601 | |
| 602 | Initialization and Wrapup |
| 603 | |
| 604 | initscr() |
| 605 | The first function called should almost always be initscr(). |
| 606 | This will determine the terminal type and initialize curses |
| 607 | data structures. initscr() also arranges that the first call to |
| 608 | refresh() will clear the screen. If an error occurs a message |
| 609 | is written to standard error and the program exits. Otherwise |
| 610 | it returns a pointer to stdscr. A few functions may be called |
| 611 | before initscr (slk_init(), filter(), ripoffline(), use_env(), |
| 612 | and, if you are using multiple terminals, newterm().) |
| 613 | |
| 614 | endwin() |
| 615 | Your program should always call endwin() before exiting or |
| 616 | shelling out of the program. This function will restore tty |
| 617 | modes, move the cursor to the lower left corner of the screen, |
| 618 | reset the terminal into the proper non-visual mode. Calling |
| 619 | refresh() or doupdate() after a temporary escape from the |
| 620 | program will restore the ncurses screen from before the escape. |
| 621 | |
| 622 | newterm(type, ofp, ifp) |
| 623 | A program which outputs to more than one terminal should use |
| 624 | newterm() instead of initscr(). newterm() should be called once |
| 625 | for each terminal. It returns a variable of type SCREEN * which |
| 626 | should be saved as a reference to that terminal. (NOTE: a |
| 627 | SCREEN variable is not a screen in the sense we are describing |
| 628 | in this introduction, but a collection of parameters used to |
| 629 | assist in optimizing the display.) The arguments are the type |
| 630 | of the terminal (a string) and FILE pointers for the output and |
| 631 | input of the terminal. If type is NULL then the environment |
| 632 | variable $TERM is used. endwin() should called once at wrapup |
| 633 | time for each terminal opened using this function. |
| 634 | |
| 635 | set_term(new) |
| 636 | This function is used to switch to a different terminal |
| 637 | previously opened by newterm(). The screen reference for the |
| 638 | new terminal is passed as the parameter. The previous terminal |
| 639 | is returned by the function. All other calls affect only the |
| 640 | current terminal. |
| 641 | |
| 642 | delscreen(sp) |
| 643 | The inverse of newterm(); deallocates the data structures |
| 644 | associated with a given SCREEN reference. |
| 645 | |
| 646 | Causing Output to the Terminal |
| 647 | |
| 648 | refresh() and wrefresh(win) |
| 649 | These functions must be called to actually get any output on |
| 650 | the terminal, as other routines merely manipulate data |
| 651 | structures. wrefresh() copies the named window to the physical |
| 652 | terminal screen, taking into account what is already there in |
| 653 | order to do optimizations. refresh() does a refresh of stdscr. |
| 654 | Unless leaveok() has been enabled, the physical cursor of the |
| 655 | terminal is left at the location of the window's cursor. |
| 656 | |
| 657 | doupdate() and wnoutrefresh(win) |
| 658 | These two functions allow multiple updates with more efficiency |
| 659 | than wrefresh. To use them, it is important to understand how |
| 660 | curses works. In addition to all the window structures, curses |
| 661 | keeps two data structures representing the terminal screen: a |
| 662 | physical screen, describing what is actually on the screen, and |
| 663 | a virtual screen, describing what the programmer wants to have |
| 664 | on the screen. wrefresh works by first copying the named window |
| 665 | to the virtual screen (wnoutrefresh()), and then calling the |
| 666 | routine to update the screen (doupdate()). If the programmer |
| 667 | wishes to output several windows at once, a series of calls to |
| 668 | wrefresh will result in alternating calls to wnoutrefresh() and |
| 669 | doupdate(), causing several bursts of output to the screen. By |
| 670 | calling wnoutrefresh() for each window, it is then possible to |
| 671 | call doupdate() once, resulting in only one burst of output, |
| 672 | with fewer total characters transmitted (this also avoids a |
| 673 | visually annoying flicker at each update). |
| 674 | |
| 675 | Low-Level Capability Access |
| 676 | |
| 677 | setupterm(term, filenum, errret) |
| 678 | This routine is called to initialize a terminal's description, |
| 679 | without setting up the curses screen structures or changing the |
| 680 | tty-driver mode bits. term is the character string representing |
| 681 | the name of the terminal being used. filenum is the UNIX file |
| 682 | descriptor of the terminal to be used for output. errret is a |
| 683 | pointer to an integer, in which a success or failure indication |
| 684 | is returned. The values returned can be 1 (all is well), 0 (no |
| 685 | such terminal), or -1 (some problem locating the terminfo |
| 686 | database). |
| 687 | |
| 688 | The value of term can be given as NULL, which will cause the |
| 689 | value of TERM in the environment to be used. The errret pointer |
| 690 | can also be given as NULL, meaning no error code is wanted. If |
| 691 | errret is defaulted, and something goes wrong, setupterm() will |
| 692 | print an appropriate error message and exit, rather than |
| 693 | returning. Thus, a simple program can call setupterm(0, 1, 0) |
| 694 | and not worry about initialization errors. |
| 695 | |
| 696 | After the call to setupterm(), the global variable cur_term is |
| 697 | set to point to the current structure of terminal capabilities. |
| 698 | By calling setupterm() for each terminal, and saving and |
| 699 | restoring cur_term, it is possible for a program to use two or |
| 700 | more terminals at once. Setupterm() also stores the names |
| 701 | section of the terminal description in the global character |
| 702 | array ttytype[]. Subsequent calls to setupterm() will overwrite |
| 703 | this array, so you'll have to save it yourself if need be. |
| 704 | |
| 705 | Debugging |
| 706 | |
| 707 | NOTE: These functions are not part of the standard curses API! |
| 708 | |
| 709 | trace() |
| 710 | This function can be used to explicitly set a trace level. If |
| 711 | the trace level is nonzero, execution of your program will |
| 712 | generate a file called `trace' in the current working directory |
| 713 | containing a report on the library's actions. Higher trace |
| 714 | levels enable more detailed (and verbose) reporting -- see |
| 715 | comments attached to TRACE_ defines in the curses.h file for |
| 716 | details. (It is also possible to set a trace level by assigning |
| 717 | a trace level value to the environment variable NCURSES_TRACE). |
| 718 | |
| 719 | _tracef() |
| 720 | This function can be used to output your own debugging |
| 721 | information. It is only available only if you link with |
| 722 | -lncurses_g. It can be used the same way as printf(), only it |
| 723 | outputs a newline after the end of arguments. The output goes |
| 724 | to a file called trace in the current directory. |
| 725 | |
| 726 | Trace logs can be difficult to interpret due to the sheer volume of |
| 727 | data dumped in them. There is a script called tracemunch included with |
| 728 | the ncurses distribution that can alleviate this problem somewhat; it |
| 729 | compacts long sequences of similar operations into more succinct |
| 730 | single-line pseudo-operations. These pseudo-ops can be distinguished |
| 731 | by the fact that they are named in capital letters. |
| 732 | |
| 733 | Hints, Tips, and Tricks |
| 734 | |
| 735 | The ncurses manual pages are a complete reference for this library. In |
| 736 | the remainder of this document, we discuss various useful methods that |
| 737 | may not be obvious from the manual page descriptions. |
| 738 | |
| 739 | Some Notes of Caution |
| 740 | |
| 741 | If you find yourself thinking you need to use noraw() or nocbreak(), |
| 742 | think again and move carefully. It's probably better design to use |
| 743 | getstr() or one of its relatives to simulate cooked mode. The noraw() |
| 744 | and nocbreak() functions try to restore cooked mode, but they may end |
| 745 | up clobbering some control bits set before you started your |
| 746 | application. Also, they have always been poorly documented, and are |
| 747 | likely to hurt your application's usability with other curses |
| 748 | libraries. |
| 749 | |
| 750 | Bear in mind that refresh() is a synonym for wrefresh(stdscr). Don't |
| 751 | try to mix use of stdscr with use of windows declared by newwin(); a |
| 752 | refresh() call will blow them off the screen. The right way to handle |
| 753 | this is to use subwin(), or not touch stdscr at all and tile your |
| 754 | screen with declared windows which you then wnoutrefresh() somewhere |
| 755 | in your program event loop, with a single doupdate() call to trigger |
| 756 | actual repainting. |
| 757 | |
| 758 | You are much less likely to run into problems if you design your |
| 759 | screen layouts to use tiled rather than overlapping windows. |
| 760 | Historically, curses support for overlapping windows has been weak, |
| 761 | fragile, and poorly documented. The ncurses library is not yet an |
| 762 | exception to this rule. |
| 763 | |
| 764 | There is a panels library included in the ncurses distribution that |
| 765 | does a pretty good job of strengthening the overlapping-windows |
| 766 | facilities. |
| 767 | |
| 768 | Try to avoid using the global variables LINES and COLS. Use getmaxyx() |
| 769 | on the stdscr context instead. Reason: your code may be ported to run |
| 770 | in an environment with window resizes, in which case several screens |
| 771 | could be open with different sizes. |
| 772 | |
| 773 | Temporarily Leaving NCURSES Mode |
| 774 | |
| 775 | Sometimes you will want to write a program that spends most of its |
| 776 | time in screen mode, but occasionally returns to ordinary `cooked' |
| 777 | mode. A common reason for this is to support shell-out. This behavior |
| 778 | is simple to arrange in ncurses. |
| 779 | |
| 780 | To leave ncurses mode, call endwin() as you would if you were |
| 781 | intending to terminate the program. This will take the screen back to |
| 782 | cooked mode; you can do your shell-out. When you want to return to |
| 783 | ncurses mode, simply call refresh() or doupdate(). This will repaint |
| 784 | the screen. |
| 785 | |
| 786 | There is a boolean function, isendwin(), which code can use to test |
| 787 | whether ncurses screen mode is active. It returns TRUE in the interval |
| 788 | between an endwin() call and the following refresh(), FALSE otherwise. |
| 789 | |
| 790 | Here is some sample code for shellout: |
| 791 | addstr("Shelling out..."); |
| 792 | def_prog_mode(); /* save current tty modes */ |
| 793 | endwin(); /* restore original tty modes */ |
| 794 | system("sh"); /* run shell */ |
| 795 | addstr("returned.\n"); /* prepare return message */ |
| 796 | refresh(); /* restore save modes, repaint screen */ |
| 797 | |
| 798 | Using NCURSES under XTERM |
| 799 | |
| 800 | A resize operation in X sends SIGWINCH to the application running |
| 801 | under xterm. The easiest way to handle SIGWINCH is to do an endwin, |
| 802 | followed by an refresh and a screen repaint you code yourself. The |
| 803 | refresh will pick up the new screen size from the xterm's environment. |
| 804 | |
| 805 | That is the standard way, of course (it even works with some vendor's |
| 806 | curses implementations). Its drawback is that it clears the screen to |
| 807 | reinitialize the display, and does not resize subwindows which must be |
| 808 | shrunk. Ncurses provides an extension which works better, the |
| 809 | resizeterm function. That function ensures that all windows are |
| 810 | limited to the new screen dimensions, and pads stdscr with blanks if |
| 811 | the screen is larger. |
| 812 | |
| 813 | The ncurses library provides a SIGWINCH signal handler, which pushes a |
| 814 | KEY_RESIZE via the wgetch() calls. When ncurses returns that code, it |
| 815 | calls resizeterm to update the size of the standard screen's window, |
| 816 | repainting that (filling with blanks or truncating as needed). It also |
| 817 | resizes other windows, but its effect may be less satisfactory because |
| 818 | it cannot know how you want the screen re-painted. You will usually |
| 819 | have to write special-purpose code to handle KEY_RESIZE yourself. |
| 820 | |
| 821 | Handling Multiple Terminal Screens |
| 822 | |
| 823 | The initscr() function actually calls a function named newterm() to do |
| 824 | most of its work. If you are writing a program that opens multiple |
| 825 | terminals, use newterm() directly. |
| 826 | |
| 827 | For each call, you will have to specify a terminal type and a pair of |
| 828 | file pointers; each call will return a screen reference, and stdscr |
| 829 | will be set to the last one allocated. You will switch between screens |
| 830 | with the set_term call. Note that you will also have to call |
| 831 | def_shell_mode and def_prog_mode on each tty yourself. |
| 832 | |
| 833 | Testing for Terminal Capabilities |
| 834 | |
| 835 | Sometimes you may want to write programs that test for the presence of |
| 836 | various capabilities before deciding whether to go into ncurses mode. |
| 837 | An easy way to do this is to call setupterm(), then use the functions |
| 838 | tigetflag(), tigetnum(), and tigetstr() to do your testing. |
| 839 | |
| 840 | A particularly useful case of this often comes up when you want to |
| 841 | test whether a given terminal type should be treated as `smart' |
| 842 | (cursor-addressable) or `stupid'. The right way to test this is to see |
| 843 | if the return value of tigetstr("cup") is non-NULL. Alternatively, you |
| 844 | can include the term.h file and test the value of the macro |
| 845 | cursor_address. |
| 846 | |
| 847 | Tuning for Speed |
| 848 | |
| 849 | Use the addchstr() family of functions for fast screen-painting of |
| 850 | text when you know the text doesn't contain any control characters. |
| 851 | Try to make attribute changes infrequent on your screens. Don't use |
| 852 | the immedok() option! |
| 853 | |
| 854 | Special Features of NCURSES |
| 855 | |
| 856 | The wresize() function allows you to resize a window in place. The |
| 857 | associated resizeterm() function simplifies the construction of |
| 858 | SIGWINCH handlers, for resizing all windows. |
| 859 | |
| 860 | The define_key() function allows you to define at runtime function-key |
| 861 | control sequences which are not in the terminal description. The |
| 862 | keyok() function allows you to temporarily enable or disable |
| 863 | interpretation of any function-key control sequence. |
| 864 | |
| 865 | The use_default_colors() function allows you to construct applications |
| 866 | which can use the terminal's default foreground and background colors |
| 867 | as an additional "default" color. Several terminal emulators support |
| 868 | this feature, which is based on ISO 6429. |
| 869 | |
| 870 | Ncurses supports up 16 colors, unlike SVr4 curses which defines only |
| 871 | 8. While most terminals which provide color allow only 8 colors, about |
| 872 | a quarter (including XFree86 xterm) support 16 colors. |
| 873 | |
| 874 | Compatibility with Older Versions |
| 875 | |
| 876 | Despite our best efforts, there are some differences between ncurses |
| 877 | and the (undocumented!) behavior of older curses implementations. |
| 878 | These arise from ambiguities or omissions in the documentation of the |
| 879 | API. |
| 880 | |
| 881 | Refresh of Overlapping Windows |
| 882 | |
| 883 | If you define two windows A and B that overlap, and then alternately |
| 884 | scribble on and refresh them, the changes made to the overlapping |
| 885 | region under historic curses versions were often not documented |
| 886 | precisely. |
| 887 | |
| 888 | To understand why this is a problem, remember that screen updates are |
| 889 | calculated between two representations of the entire display. The |
| 890 | documentation says that when you refresh a window, it is first copied |
| 891 | to the virtual screen, and then changes are calculated to update the |
| 892 | physical screen (and applied to the terminal). But "copied to" is not |
| 893 | very specific, and subtle differences in how copying works can produce |
| 894 | different behaviors in the case where two overlapping windows are each |
| 895 | being refreshed at unpredictable intervals. |
| 896 | |
| 897 | What happens to the overlapping region depends on what wnoutrefresh() |
| 898 | does with its argument -- what portions of the argument window it |
| 899 | copies to the virtual screen. Some implementations do "change copy", |
| 900 | copying down only locations in the window that have changed (or been |
| 901 | marked changed with wtouchln() and friends). Some implementations do |
| 902 | "entire copy", copying all window locations to the virtual screen |
| 903 | whether or not they have changed. |
| 904 | |
| 905 | The ncurses library itself has not always been consistent on this |
| 906 | score. Due to a bug, versions 1.8.7 to 1.9.8a did entire copy. |
| 907 | Versions 1.8.6 and older, and versions 1.9.9 and newer, do change |
| 908 | copy. |
| 909 | |
| 910 | For most commercial curses implementations, it is not documented and |
| 911 | not known for sure (at least not to the ncurses maintainers) whether |
| 912 | they do change copy or entire copy. We know that System V release 3 |
| 913 | curses has logic in it that looks like an attempt to do change copy, |
| 914 | but the surrounding logic and data representations are sufficiently |
| 915 | complex, and our knowledge sufficiently indirect, that it's hard to |
| 916 | know whether this is reliable. It is not clear what the SVr4 |
| 917 | documentation and XSI standard intend. The XSI Curses standard barely |
| 918 | mentions wnoutrefresh(); the SVr4 documents seem to be describing |
| 919 | entire-copy, but it is possible with some effort and straining to read |
| 920 | them the other way. |
| 921 | |
| 922 | It might therefore be unwise to rely on either behavior in programs |
| 923 | that might have to be linked with other curses implementations. |
| 924 | Instead, you can do an explicit touchwin() before the wnoutrefresh() |
| 925 | call to guarantee an entire-contents copy anywhere. |
| 926 | |
| 927 | The really clean way to handle this is to use the panels library. If, |
| 928 | when you want a screen update, you do update_panels(), it will do all |
| 929 | the necessary wnoutrefresh() calls for whatever panel stacking order |
| 930 | you have defined. Then you can do one doupdate() and there will be a |
| 931 | single burst of physical I/O that will do all your updates. |
| 932 | |
| 933 | Background Erase |
| 934 | |
| 935 | If you have been using a very old versions of ncurses (1.8.7 or older) |
| 936 | you may be surprised by the behavior of the erase functions. In older |
| 937 | versions, erased areas of a window were filled with a blank modified |
| 938 | by the window's current attribute (as set by wattrset(), wattron(), |
| 939 | wattroff() and friends). |
| 940 | |
| 941 | In newer versions, this is not so. Instead, the attribute of erased |
| 942 | blanks is normal unless and until it is modified by the functions |
| 943 | bkgdset() or wbkgdset(). |
| 944 | |
| 945 | This change in behavior conforms ncurses to System V Release 4 and the |
| 946 | XSI Curses standard. |
| 947 | |
| 948 | XSI Curses Conformance |
| 949 | |
| 950 | The ncurses library is intended to be base-level conformant with the |
| 951 | XSI Curses standard from X/Open. Many extended-level features (in |
| 952 | fact, almost all features not directly concerned with wide characters |
| 953 | and internationalization) are also supported. |
| 954 | |
| 955 | One effect of XSI conformance is the change in behavior described |
| 956 | under "Background Erase -- Compatibility with Old Versions". |
| 957 | |
| 958 | Also, ncurses meets the XSI requirement that every macro entry point |
| 959 | have a corresponding function which may be linked (and will be |
| 960 | prototype-checked) if the macro definition is disabled with #undef. |
| 961 | |
| 962 | The Panels Library |
| 963 | |
| 964 | The ncurses library by itself provides good support for screen |
| 965 | displays in which the windows are tiled (non-overlapping). In the more |
| 966 | general case that windows may overlap, you have to use a series of |
| 967 | wnoutrefresh() calls followed by a doupdate(), and be careful about |
| 968 | the order you do the window refreshes in. It has to be bottom-upwards, |
| 969 | otherwise parts of windows that should be obscured will show through. |
| 970 | |
| 971 | When your interface design is such that windows may dive deeper into |
| 972 | the visibility stack or pop to the top at runtime, the resulting |
| 973 | book-keeping can be tedious and difficult to get right. Hence the |
| 974 | panels library. |
| 975 | |
| 976 | The panel library first appeared in AT&T System V. The version |
| 977 | documented here is the panel code distributed with ncurses. |
| 978 | |
| 979 | Compiling With the Panels Library |
| 980 | |
| 981 | Your panels-using modules must import the panels library declarations |
| 982 | with |
| 983 | #include <panel.h> |
| 984 | |
| 985 | and must be linked explicitly with the panels library using an -lpanel |
| 986 | argument. Note that they must also link the ncurses library with |
| 987 | -lncurses. Many linkers are two-pass and will accept either order, but |
| 988 | it is still good practice to put -lpanel first and -lncurses second. |
| 989 | |
| 990 | Overview of Panels |
| 991 | |
| 992 | A panel object is a window that is implicitly treated as part of a |
| 993 | deck including all other panel objects. The deck has an implicit |
| 994 | bottom-to-top visibility order. The panels library includes an update |
| 995 | function (analogous to refresh()) that displays all panels in the deck |
| 996 | in the proper order to resolve overlaps. The standard window, stdscr, |
| 997 | is considered below all panels. |
| 998 | |
| 999 | Details on the panels functions are available in the man pages. We'll |
| 1000 | just hit the highlights here. |
| 1001 | |
| 1002 | You create a panel from a window by calling new_panel() on a window |
| 1003 | pointer. It then becomes the top of the deck. The panel's window is |
| 1004 | available as the value of panel_window() called with the panel pointer |
| 1005 | as argument. |
| 1006 | |
| 1007 | You can delete a panel (removing it from the deck) with del_panel. |
| 1008 | This will not deallocate the associated window; you have to do that |
| 1009 | yourself. You can replace a panel's window with a different window by |
| 1010 | calling replace_window. The new window may be of different size; the |
| 1011 | panel code will re-compute all overlaps. This operation doesn't change |
| 1012 | the panel's position in the deck. |
| 1013 | |
| 1014 | To move a panel's window, use move_panel(). The mvwin() function on |
| 1015 | the panel's window isn't sufficient because it doesn't update the |
| 1016 | panels library's representation of where the windows are. This |
| 1017 | operation leaves the panel's depth, contents, and size unchanged. |
| 1018 | |
| 1019 | Two functions (top_panel(), bottom_panel()) are provided for |
| 1020 | rearranging the deck. The first pops its argument window to the top of |
| 1021 | the deck; the second sends it to the bottom. Either operation leaves |
| 1022 | the panel's screen location, contents, and size unchanged. |
| 1023 | |
| 1024 | The function update_panels() does all the wnoutrefresh() calls needed |
| 1025 | to prepare for doupdate() (which you must call yourself, afterwards). |
| 1026 | |
| 1027 | Typically, you will want to call update_panels() and doupdate() just |
| 1028 | before accepting command input, once in each cycle of interaction with |
| 1029 | the user. If you call update_panels() after each and every panel |
| 1030 | write, you'll generate a lot of unnecessary refresh activity and |
| 1031 | screen flicker. |
| 1032 | |
| 1033 | Panels, Input, and the Standard Screen |
| 1034 | |
| 1035 | You shouldn't mix wnoutrefresh() or wrefresh() operations with panels |
| 1036 | code; this will work only if the argument window is either in the top |
| 1037 | panel or unobscured by any other panels. |
| 1038 | |
| 1039 | The stsdcr window is a special case. It is considered below all |
| 1040 | panels. Because changes to panels may obscure parts of stdscr, though, |
| 1041 | you should call update_panels() before doupdate() even when you only |
| 1042 | change stdscr. |
| 1043 | |
| 1044 | Note that wgetch automatically calls wrefresh. Therefore, before |
| 1045 | requesting input from a panel window, you need to be sure that the |
| 1046 | panel is totally unobscured. |
| 1047 | |
| 1048 | There is presently no way to display changes to one obscured panel |
| 1049 | without repainting all panels. |
| 1050 | |
| 1051 | Hiding Panels |
| 1052 | |
| 1053 | It's possible to remove a panel from the deck temporarily; use |
| 1054 | hide_panel for this. Use show_panel() to render it visible again. The |
| 1055 | predicate function panel_hidden tests whether or not a panel is |
| 1056 | hidden. |
| 1057 | |
| 1058 | The panel_update code ignores hidden panels. You cannot do top_panel() |
| 1059 | or bottom_panel on a hidden panel(). Other panels operations are |
| 1060 | applicable. |
| 1061 | |
| 1062 | Miscellaneous Other Facilities |
| 1063 | |
| 1064 | It's possible to navigate the deck using the functions panel_above() |
| 1065 | and panel_below. Handed a panel pointer, they return the panel above |
| 1066 | or below that panel. Handed NULL, they return the bottom-most or |
| 1067 | top-most panel. |
| 1068 | |
| 1069 | Every panel has an associated user pointer, not used by the panel |
| 1070 | code, to which you can attach application data. See the man page |
| 1071 | documentation of set_panel_userptr() and panel_userptr for details. |
| 1072 | |
| 1073 | The Menu Library |
| 1074 | |
| 1075 | A menu is a screen display that assists the user to choose some subset |
| 1076 | of a given set of items. The menu library is a curses extension that |
| 1077 | supports easy programming of menu hierarchies with a uniform but |
| 1078 | flexible interface. |
| 1079 | |
| 1080 | The menu library first appeared in AT&T System V. The version |
| 1081 | documented here is the menu code distributed with ncurses. |
| 1082 | |
| 1083 | Compiling With the menu Library |
| 1084 | |
| 1085 | Your menu-using modules must import the menu library declarations with |
| 1086 | #include <menu.h> |
| 1087 | |
| 1088 | and must be linked explicitly with the menus library using an -lmenu |
| 1089 | argument. Note that they must also link the ncurses library with |
| 1090 | -lncurses. Many linkers are two-pass and will accept either order, but |
| 1091 | it is still good practice to put -lmenu first and -lncurses second. |
| 1092 | |
| 1093 | Overview of Menus |
| 1094 | |
| 1095 | The menus created by this library consist of collections of items |
| 1096 | including a name string part and a description string part. To make |
| 1097 | menus, you create groups of these items and connect them with menu |
| 1098 | frame objects. |
| 1099 | |
| 1100 | The menu can then by posted, that is written to an associated window. |
| 1101 | Actually, each menu has two associated windows; a containing window in |
| 1102 | which the programmer can scribble titles or borders, and a subwindow |
| 1103 | in which the menu items proper are displayed. If this subwindow is too |
| 1104 | small to display all the items, it will be a scrollable viewport on |
| 1105 | the collection of items. |
| 1106 | |
| 1107 | A menu may also be unposted (that is, undisplayed), and finally freed |
| 1108 | to make the storage associated with it and its items available for |
| 1109 | re-use. |
| 1110 | |
| 1111 | The general flow of control of a menu program looks like this: |
| 1112 | 1. Initialize curses. |
| 1113 | 2. Create the menu items, using new_item(). |
| 1114 | 3. Create the menu using new_menu(). |
| 1115 | 4. Post the menu using post_menu(). |
| 1116 | 5. Refresh the screen. |
| 1117 | 6. Process user requests via an input loop. |
| 1118 | 7. Unpost the menu using unpost_menu(). |
| 1119 | 8. Free the menu, using free_menu(). |
| 1120 | 9. Free the items using free_item(). |
| 1121 | 10. Terminate curses. |
| 1122 | |
| 1123 | Selecting items |
| 1124 | |
| 1125 | Menus may be multi-valued or (the default) single-valued (see the |
| 1126 | manual page menu_opts(3x) to see how to change the default). Both |
| 1127 | types always have a current item. |
| 1128 | |
| 1129 | From a single-valued menu you can read the selected value simply by |
| 1130 | looking at the current item. From a multi-valued menu, you get the |
| 1131 | selected set by looping through the items applying the item_value() |
| 1132 | predicate function. Your menu-processing code can use the function |
| 1133 | set_item_value() to flag the items in the select set. |
| 1134 | |
| 1135 | Menu items can be made unselectable using set_item_opts() or |
| 1136 | item_opts_off() with the O_SELECTABLE argument. This is the only |
| 1137 | option so far defined for menus, but it is good practice to code as |
| 1138 | though other option bits might be on. |
| 1139 | |
| 1140 | Menu Display |
| 1141 | |
| 1142 | The menu library calculates a minimum display size for your window, |
| 1143 | based on the following variables: |
| 1144 | * The number and maximum length of the menu items |
| 1145 | * Whether the O_ROWMAJOR option is enabled |
| 1146 | * Whether display of descriptions is enabled |
| 1147 | * Whatever menu format may have been set by the programmer |
| 1148 | * The length of the menu mark string used for highlighting selected |
| 1149 | items |
| 1150 | |
| 1151 | The function set_menu_format() allows you to set the maximum size of |
| 1152 | the viewport or menu page that will be used to display menu items. You |
| 1153 | can retrieve any format associated with a menu with menu_format(). The |
| 1154 | default format is rows=16, columns=1. |
| 1155 | |
| 1156 | The actual menu page may be smaller than the format size. This depends |
| 1157 | on the item number and size and whether O_ROWMAJOR is on. This option |
| 1158 | (on by default) causes menu items to be displayed in a `raster-scan' |
| 1159 | pattern, so that if more than one item will fit horizontally the first |
| 1160 | couple of items are side-by-side in the top row. The alternative is |
| 1161 | column-major display, which tries to put the first several items in |
| 1162 | the first column. |
| 1163 | |
| 1164 | As mentioned above, a menu format not large enough to allow all items |
| 1165 | to fit on-screen will result in a menu display that is vertically |
| 1166 | scrollable. |
| 1167 | |
| 1168 | You can scroll it with requests to the menu driver, which will be |
| 1169 | described in the section on menu input handling. |
| 1170 | |
| 1171 | Each menu has a mark string used to visually tag selected items; see |
| 1172 | the menu_mark(3x) manual page for details. The mark string length also |
| 1173 | influences the menu page size. |
| 1174 | |
| 1175 | The function scale_menu() returns the minimum display size that the |
| 1176 | menu code computes from all these factors. There are other menu |
| 1177 | display attributes including a select attribute, an attribute for |
| 1178 | selectable items, an attribute for unselectable items, and a pad |
| 1179 | character used to separate item name text from description text. These |
| 1180 | have reasonable defaults which the library allows you to change (see |
| 1181 | the menu_attribs(3x) manual page. |
| 1182 | |
| 1183 | Menu Windows |
| 1184 | |
| 1185 | Each menu has, as mentioned previously, a pair of associated windows. |
| 1186 | Both these windows are painted when the menu is posted and erased when |
| 1187 | the menu is unposted. |
| 1188 | |
| 1189 | The outer or frame window is not otherwise touched by the menu |
| 1190 | routines. It exists so the programmer can associate a title, a border, |
| 1191 | or perhaps help text with the menu and have it properly refreshed or |
| 1192 | erased at post/unpost time. The inner window or subwindow is where the |
| 1193 | current menu page is displayed. |
| 1194 | |
| 1195 | By default, both windows are stdscr. You can set them with the |
| 1196 | functions in menu_win(3x). |
| 1197 | |
| 1198 | When you call post_menu(), you write the menu to its subwindow. When |
| 1199 | you call unpost_menu(), you erase the subwindow, However, neither of |
| 1200 | these actually modifies the screen. To do that, call wrefresh() or |
| 1201 | some equivalent. |
| 1202 | |
| 1203 | Processing Menu Input |
| 1204 | |
| 1205 | The main loop of your menu-processing code should call menu_driver() |
| 1206 | repeatedly. The first argument of this routine is a menu pointer; the |
| 1207 | second is a menu command code. You should write an input-fetching |
| 1208 | routine that maps input characters to menu command codes, and pass its |
| 1209 | output to menu_driver(). The menu command codes are fully documented |
| 1210 | in menu_driver(3x). |
| 1211 | |
| 1212 | The simplest group of command codes is REQ_NEXT_ITEM, REQ_PREV_ITEM, |
| 1213 | REQ_FIRST_ITEM, REQ_LAST_ITEM, REQ_UP_ITEM, REQ_DOWN_ITEM, |
| 1214 | REQ_LEFT_ITEM, REQ_RIGHT_ITEM. These change the currently selected |
| 1215 | item. These requests may cause scrolling of the menu page if it only |
| 1216 | partially displayed. |
| 1217 | |
| 1218 | There are explicit requests for scrolling which also change the |
| 1219 | current item (because the select location does not change, but the |
| 1220 | item there does). These are REQ_SCR_DLINE, REQ_SCR_ULINE, |
| 1221 | REQ_SCR_DPAGE, and REQ_SCR_UPAGE. |
| 1222 | |
| 1223 | The REQ_TOGGLE_ITEM selects or deselects the current item. It is for |
| 1224 | use in multi-valued menus; if you use it with O_ONEVALUE on, you'll |
| 1225 | get an error return (E_REQUEST_DENIED). |
| 1226 | |
| 1227 | Each menu has an associated pattern buffer. The menu_driver() logic |
| 1228 | tries to accumulate printable ASCII characters passed in in that |
| 1229 | buffer; when it matches a prefix of an item name, that item (or the |
| 1230 | next matching item) is selected. If appending a character yields no |
| 1231 | new match, that character is deleted from the pattern buffer, and |
| 1232 | menu_driver() returns E_NO_MATCH. |
| 1233 | |
| 1234 | Some requests change the pattern buffer directly: REQ_CLEAR_PATTERN, |
| 1235 | REQ_BACK_PATTERN, REQ_NEXT_MATCH, REQ_PREV_MATCH. The latter two are |
| 1236 | useful when pattern buffer input matches more than one item in a |
| 1237 | multi-valued menu. |
| 1238 | |
| 1239 | Each successful scroll or item navigation request clears the pattern |
| 1240 | buffer. It is also possible to set the pattern buffer explicitly with |
| 1241 | set_menu_pattern(). |
| 1242 | |
| 1243 | Finally, menu driver requests above the constant MAX_COMMAND are |
| 1244 | considered application-specific commands. The menu_driver() code |
| 1245 | ignores them and returns E_UNKNOWN_COMMAND. |
| 1246 | |
| 1247 | Miscellaneous Other Features |
| 1248 | |
| 1249 | Various menu options can affect the processing and visual appearance |
| 1250 | and input processing of menus. See menu_opts(3x) for details. |
| 1251 | |
| 1252 | It is possible to change the current item from application code; this |
| 1253 | is useful if you want to write your own navigation requests. It is |
| 1254 | also possible to explicitly set the top row of the menu display. See |
| 1255 | mitem_current(3x). If your application needs to change the menu |
| 1256 | subwindow cursor for any reason, pos_menu_cursor() will restore it to |
| 1257 | the correct location for continuing menu driver processing. |
| 1258 | |
| 1259 | It is possible to set hooks to be called at menu initialization and |
| 1260 | wrapup time, and whenever the selected item changes. See |
| 1261 | menu_hook(3x). |
| 1262 | |
| 1263 | Each item, and each menu, has an associated user pointer on which you |
| 1264 | can hang application data. See mitem_userptr(3x) and menu_userptr(3x). |
| 1265 | |
| 1266 | The Forms Library |
| 1267 | |
| 1268 | The form library is a curses extension that supports easy programming |
| 1269 | of on-screen forms for data entry and program control. |
| 1270 | |
| 1271 | The form library first appeared in AT&T System V. The version |
| 1272 | documented here is the form code distributed with ncurses. |
| 1273 | |
| 1274 | Compiling With the form Library |
| 1275 | |
| 1276 | Your form-using modules must import the form library declarations with |
| 1277 | #include <form.h> |
| 1278 | |
| 1279 | and must be linked explicitly with the forms library using an -lform |
| 1280 | argument. Note that they must also link the ncurses library with |
| 1281 | -lncurses. Many linkers are two-pass and will accept either order, but |
| 1282 | it is still good practice to put -lform first and -lncurses second. |
| 1283 | |
| 1284 | Overview of Forms |
| 1285 | |
| 1286 | A form is a collection of fields; each field may be either a label |
| 1287 | (explanatory text) or a data-entry location. Long forms may be |
| 1288 | segmented into pages; each entry to a new page clears the screen. |
| 1289 | |
| 1290 | To make forms, you create groups of fields and connect them with form |
| 1291 | frame objects; the form library makes this relatively simple. |
| 1292 | |
| 1293 | Once defined, a form can be posted, that is written to an associated |
| 1294 | window. Actually, each form has two associated windows; a containing |
| 1295 | window in which the programmer can scribble titles or borders, and a |
| 1296 | subwindow in which the form fields proper are displayed. |
| 1297 | |
| 1298 | As the form user fills out the posted form, navigation and editing |
| 1299 | keys support movement between fields, editing keys support modifying |
| 1300 | field, and plain text adds to or changes data in a current field. The |
| 1301 | form library allows you (the forms designer) to bind each navigation |
| 1302 | and editing key to any keystroke accepted by curses Fields may have |
| 1303 | validation conditions on them, so that they check input data for type |
| 1304 | and value. The form library supplies a rich set of pre-defined field |
| 1305 | types, and makes it relatively easy to define new ones. |
| 1306 | |
| 1307 | Once its transaction is completed (or aborted), a form may be unposted |
| 1308 | (that is, undisplayed), and finally freed to make the storage |
| 1309 | associated with it and its items available for re-use. |
| 1310 | |
| 1311 | The general flow of control of a form program looks like this: |
| 1312 | 1. Initialize curses. |
| 1313 | 2. Create the form fields, using new_field(). |
| 1314 | 3. Create the form using new_form(). |
| 1315 | 4. Post the form using post_form(). |
| 1316 | 5. Refresh the screen. |
| 1317 | 6. Process user requests via an input loop. |
| 1318 | 7. Unpost the form using unpost_form(). |
| 1319 | 8. Free the form, using free_form(). |
| 1320 | 9. Free the fields using free_field(). |
| 1321 | 10. Terminate curses. |
| 1322 | |
| 1323 | Note that this looks much like a menu program; the form library |
| 1324 | handles tasks which are in many ways similar, and its interface was |
| 1325 | obviously designed to resemble that of the menu library wherever |
| 1326 | possible. |
| 1327 | |
| 1328 | In forms programs, however, the `process user requests' is somewhat |
| 1329 | more complicated than for menus. Besides menu-like navigation |
| 1330 | operations, the menu driver loop has to support field editing and data |
| 1331 | validation. |
| 1332 | |
| 1333 | Creating and Freeing Fields and Forms |
| 1334 | |
| 1335 | The basic function for creating fields is new_field(): |
| 1336 | FIELD *new_field(int height, int width, /* new field size */ |
| 1337 | int top, int left, /* upper left corner */ |
| 1338 | int offscreen, /* number of offscreen rows */ |
| 1339 | int nbuf); /* number of working buffers */ |
| 1340 | |
| 1341 | Menu items always occupy a single row, but forms fields may have |
| 1342 | multiple rows. So new_field() requires you to specify a width and |
| 1343 | height (the first two arguments, which mist both be greater than |
| 1344 | zero). |
| 1345 | |
| 1346 | You must also specify the location of the field's upper left corner on |
| 1347 | the screen (the third and fourth arguments, which must be zero or |
| 1348 | greater). Note that these coordinates are relative to the form |
| 1349 | subwindow, which will coincide with stdscr by default but need not be |
| 1350 | stdscr if you've done an explicit set_form_win() call. |
| 1351 | |
| 1352 | The fifth argument allows you to specify a number of off-screen rows. |
| 1353 | If this is zero, the entire field will always be displayed. If it is |
| 1354 | nonzero, the form will be scrollable, with only one screen-full |
| 1355 | (initially the top part) displayed at any given time. If you make a |
| 1356 | field dynamic and grow it so it will no longer fit on the screen, the |
| 1357 | form will become scrollable even if the offscreen argument was |
| 1358 | initially zero. |
| 1359 | |
| 1360 | The forms library allocates one working buffer per field; the size of |
| 1361 | each buffer is ((height + offscreen)*width + 1, one character for each |
| 1362 | position in the field plus a NUL terminator. The sixth argument is the |
| 1363 | number of additional data buffers to allocate for the field; your |
| 1364 | application can use them for its own purposes. |
| 1365 | FIELD *dup_field(FIELD *field, /* field to copy */ |
| 1366 | int top, int left); /* location of new copy */ |
| 1367 | |
| 1368 | The function dup_field() duplicates an existing field at a new |
| 1369 | location. Size and buffering information are copied; some attribute |
| 1370 | flags and status bits are not (see the form_field_new(3X) for |
| 1371 | details). |
| 1372 | FIELD *link_field(FIELD *field, /* field to copy */ |
| 1373 | int top, int left); /* location of new copy */ |
| 1374 | |
| 1375 | The function link_field() also duplicates an existing field at a new |
| 1376 | location. The difference from dup_field() is that it arranges for the |
| 1377 | new field's buffer to be shared with the old one. |
| 1378 | |
| 1379 | Besides the obvious use in making a field editable from two different |
| 1380 | form pages, linked fields give you a way to hack in dynamic labels. If |
| 1381 | you declare several fields linked to an original, and then make them |
| 1382 | inactive, changes from the original will still be propagated to the |
| 1383 | linked fields. |
| 1384 | |
| 1385 | As with duplicated fields, linked fields have attribute bits separate |
| 1386 | from the original. |
| 1387 | |
| 1388 | As you might guess, all these field-allocations return NULL if the |
| 1389 | field allocation is not possible due to an out-of-memory error or |
| 1390 | out-of-bounds arguments. |
| 1391 | |
| 1392 | To connect fields to a form, use |
| 1393 | FORM *new_form(FIELD **fields); |
| 1394 | |
| 1395 | This function expects to see a NULL-terminated array of field |
| 1396 | pointers. Said fields are connected to a newly-allocated form object; |
| 1397 | its address is returned (or else NULL if the allocation fails). |
| 1398 | |
| 1399 | Note that new_field() does not copy the pointer array into private |
| 1400 | storage; if you modify the contents of the pointer array during forms |
| 1401 | processing, all manner of bizarre things might happen. Also note that |
| 1402 | any given field may only be connected to one form. |
| 1403 | |
| 1404 | The functions free_field() and free_form are available to free field |
| 1405 | and form objects. It is an error to attempt to free a field connected |
| 1406 | to a form, but not vice-versa; thus, you will generally free your form |
| 1407 | objects first. |
| 1408 | |
| 1409 | Fetching and Changing Field Attributes |
| 1410 | |
| 1411 | Each form field has a number of location and size attributes |
| 1412 | associated with it. There are other field attributes used to control |
| 1413 | display and editing of the field. Some (for example, the O_STATIC bit) |
| 1414 | involve sufficient complications to be covered in sections of their |
| 1415 | own later on. We cover the functions used to get and set several basic |
| 1416 | attributes here. |
| 1417 | |
| 1418 | When a field is created, the attributes not specified by the new_field |
| 1419 | function are copied from an invisible system default field. In |
| 1420 | attribute-setting and -fetching functions, the argument NULL is taken |
| 1421 | to mean this field. Changes to it persist as defaults until your forms |
| 1422 | application terminates. |
| 1423 | |
| 1424 | Fetching Size and Location Data |
| 1425 | |
| 1426 | You can retrieve field sizes and locations through: |
| 1427 | int field_info(FIELD *field, /* field from which to fetch */ |
| 1428 | int *height, *int width, /* field size */ |
| 1429 | int *top, int *left, /* upper left corner */ |
| 1430 | int *offscreen, /* number of offscreen rows */ |
| 1431 | int *nbuf); /* number of working buffers */ |
| 1432 | |
| 1433 | This function is a sort of inverse of new_field(); instead of setting |
| 1434 | size and location attributes of a new field, it fetches them from an |
| 1435 | existing one. |
| 1436 | |
| 1437 | Changing the Field Location |
| 1438 | |
| 1439 | It is possible to move a field's location on the screen: |
| 1440 | int move_field(FIELD *field, /* field to alter */ |
| 1441 | int top, int left); /* new upper-left corner */ |
| 1442 | |
| 1443 | You can, of course. query the current location through field_info(). |
| 1444 | |
| 1445 | The Justification Attribute |
| 1446 | |
| 1447 | One-line fields may be unjustified, justified right, justified left, |
| 1448 | or centered. Here is how you manipulate this attribute: |
| 1449 | int set_field_just(FIELD *field, /* field to alter */ |
| 1450 | int justmode); /* mode to set */ |
| 1451 | |
| 1452 | int field_just(FIELD *field); /* fetch mode of field */ |
| 1453 | |
| 1454 | The mode values accepted and returned by this functions are |
| 1455 | preprocessor macros NO_JUSTIFICATION, JUSTIFY_RIGHT, JUSTIFY_LEFT, or |
| 1456 | JUSTIFY_CENTER. |
| 1457 | |
| 1458 | Field Display Attributes |
| 1459 | |
| 1460 | For each field, you can set a foreground attribute for entered |
| 1461 | characters, a background attribute for the entire field, and a pad |
| 1462 | character for the unfilled portion of the field. You can also control |
| 1463 | pagination of the form. |
| 1464 | |
| 1465 | This group of four field attributes controls the visual appearance of |
| 1466 | the field on the screen, without affecting in any way the data in the |
| 1467 | field buffer. |
| 1468 | int set_field_fore(FIELD *field, /* field to alter */ |
| 1469 | chtype attr); /* attribute to set */ |
| 1470 | |
| 1471 | chtype field_fore(FIELD *field); /* field to query */ |
| 1472 | |
| 1473 | int set_field_back(FIELD *field, /* field to alter */ |
| 1474 | chtype attr); /* attribute to set */ |
| 1475 | |
| 1476 | chtype field_back(FIELD *field); /* field to query */ |
| 1477 | |
| 1478 | int set_field_pad(FIELD *field, /* field to alter */ |
| 1479 | int pad); /* pad character to set */ |
| 1480 | |
| 1481 | chtype field_pad(FIELD *field); |
| 1482 | |
| 1483 | int set_new_page(FIELD *field, /* field to alter */ |
| 1484 | int flag); /* TRUE to force new page */ |
| 1485 | |
| 1486 | chtype new_page(FIELD *field); /* field to query */ |
| 1487 | |
| 1488 | The attributes set and returned by the first four functions are normal |
| 1489 | curses(3x) display attribute values (A_STANDOUT, A_BOLD, A_REVERSE |
| 1490 | etc). The page bit of a field controls whether it is displayed at the |
| 1491 | start of a new form screen. |
| 1492 | |
| 1493 | Field Option Bits |
| 1494 | |
| 1495 | There is also a large collection of field option bits you can set to |
| 1496 | control various aspects of forms processing. You can manipulate them |
| 1497 | with these functions: |
| 1498 | int set_field_opts(FIELD *field, /* field to alter */ |
| 1499 | int attr); /* attribute to set */ |
| 1500 | |
| 1501 | int field_opts_on(FIELD *field, /* field to alter */ |
| 1502 | int attr); /* attributes to turn on */ |
| 1503 | |
| 1504 | int field_opts_off(FIELD *field, /* field to alter */ |
| 1505 | int attr); /* attributes to turn off */ |
| 1506 | |
| 1507 | int field_opts(FIELD *field); /* field to query */ |
| 1508 | |
| 1509 | By default, all options are on. Here are the available option bits: |
| 1510 | |
| 1511 | O_VISIBLE |
| 1512 | Controls whether the field is visible on the screen. Can be |
| 1513 | used during form processing to hide or pop up fields depending |
| 1514 | on the value of parent fields. |
| 1515 | |
| 1516 | O_ACTIVE |
| 1517 | Controls whether the field is active during forms processing |
| 1518 | (i.e. visited by form navigation keys). Can be used to make |
| 1519 | labels or derived fields with buffer values alterable by the |
| 1520 | forms application, not the user. |
| 1521 | |
| 1522 | O_PUBLIC |
| 1523 | Controls whether data is displayed during field entry. If this |
| 1524 | option is turned off on a field, the library will accept and |
| 1525 | edit data in that field, but it will not be displayed and the |
| 1526 | visible field cursor will not move. You can turn off the |
| 1527 | O_PUBLIC bit to define password fields. |
| 1528 | |
| 1529 | O_EDIT |
| 1530 | Controls whether the field's data can be modified. When this |
| 1531 | option is off, all editing requests except REQ_PREV_CHOICE and |
| 1532 | REQ_NEXT_CHOICE will fail. Such read-only fields may be useful |
| 1533 | for help messages. |
| 1534 | |
| 1535 | O_WRAP |
| 1536 | Controls word-wrapping in multi-line fields. Normally, when any |
| 1537 | character of a (blank-separated) word reaches the end of the |
| 1538 | current line, the entire word is wrapped to the next line |
| 1539 | (assuming there is one). When this option is off, the word will |
| 1540 | be split across the line break. |
| 1541 | |
| 1542 | O_BLANK |
| 1543 | Controls field blanking. When this option is on, entering a |
| 1544 | character at the first field position erases the entire field |
| 1545 | (except for the just-entered character). |
| 1546 | |
| 1547 | O_AUTOSKIP |
| 1548 | Controls automatic skip to next field when this one fills. |
| 1549 | Normally, when the forms user tries to type more data into a |
| 1550 | field than will fit, the editing location jumps to next field. |
| 1551 | When this option is off, the user's cursor will hang at the end |
| 1552 | of the field. This option is ignored in dynamic fields that |
| 1553 | have not reached their size limit. |
| 1554 | |
| 1555 | O_NULLOK |
| 1556 | Controls whether validation is applied to blank fields. |
| 1557 | Normally, it is not; the user can leave a field blank without |
| 1558 | invoking the usual validation check on exit. If this option is |
| 1559 | off on a field, exit from it will invoke a validation check. |
| 1560 | |
| 1561 | O_PASSOK |
| 1562 | Controls whether validation occurs on every exit, or only after |
| 1563 | the field is modified. Normally the latter is true. Setting |
| 1564 | O_PASSOK may be useful if your field's validation function may |
| 1565 | change during forms processing. |
| 1566 | |
| 1567 | O_STATIC |
| 1568 | Controls whether the field is fixed to its initial dimensions. |
| 1569 | If you turn this off, the field becomes dynamic and will |
| 1570 | stretch to fit entered data. |
| 1571 | |
| 1572 | A field's options cannot be changed while the field is currently |
| 1573 | selected. However, options may be changed on posted fields that are |
| 1574 | not current. |
| 1575 | |
| 1576 | The option values are bit-masks and can be composed with logical-or in |
| 1577 | the obvious way. |
| 1578 | |
| 1579 | Field Status |
| 1580 | |
| 1581 | Every field has a status flag, which is set to FALSE when the field is |
| 1582 | created and TRUE when the value in field buffer 0 changes. This flag |
| 1583 | can be queried and set directly: |
| 1584 | int set_field_status(FIELD *field, /* field to alter */ |
| 1585 | int status); /* mode to set */ |
| 1586 | |
| 1587 | int field_status(FIELD *field); /* fetch mode of field */ |
| 1588 | |
| 1589 | Setting this flag under program control can be useful if you use the |
| 1590 | same form repeatedly, looking for modified fields each time. |
| 1591 | |
| 1592 | Calling field_status() on a field not currently selected for input |
| 1593 | will return a correct value. Calling field_status() on a field that is |
| 1594 | currently selected for input may not necessarily give a correct field |
| 1595 | status value, because entered data isn't necessarily copied to buffer |
| 1596 | zero before the exit validation check. To guarantee that the returned |
| 1597 | status value reflects reality, call field_status() either (1) in the |
| 1598 | field's exit validation check routine, (2) from the field's or form's |
| 1599 | initialization or termination hooks, or (3) just after a |
| 1600 | REQ_VALIDATION request has been processed by the forms driver. |
| 1601 | |
| 1602 | Field User Pointer |
| 1603 | |
| 1604 | Each field structure contains one character pointer slot that is not |
| 1605 | used by the forms library. It is intended to be used by applications |
| 1606 | to store private per-field data. You can manipulate it with: |
| 1607 | int set_field_userptr(FIELD *field, /* field to alter */ |
| 1608 | char *userptr); /* mode to set */ |
| 1609 | |
| 1610 | char *field_userptr(FIELD *field); /* fetch mode of field */ |
| 1611 | |
| 1612 | (Properly, this user pointer field ought to have (void *) type. The |
| 1613 | (char *) type is retained for System V compatibility.) |
| 1614 | |
| 1615 | It is valid to set the user pointer of the default field (with a |
| 1616 | set_field_userptr() call passed a NULL field pointer.) When a new |
| 1617 | field is created, the default-field user pointer is copied to |
| 1618 | initialize the new field's user pointer. |
| 1619 | |
| 1620 | Variable-Sized Fields |
| 1621 | |
| 1622 | Normally, a field is fixed at the size specified for it at creation |
| 1623 | time. If, however, you turn off its O_STATIC bit, it becomes dynamic |
| 1624 | and will automatically resize itself to accommodate data as it is |
| 1625 | entered. If the field has extra buffers associated with it, they will |
| 1626 | grow right along with the main input buffer. |
| 1627 | |
| 1628 | A one-line dynamic field will have a fixed height (1) but variable |
| 1629 | width, scrolling horizontally to display data within the field area as |
| 1630 | originally dimensioned and located. A multi-line dynamic field will |
| 1631 | have a fixed width, but variable height (number of rows), scrolling |
| 1632 | vertically to display data within the field area as originally |
| 1633 | dimensioned and located. |
| 1634 | |
| 1635 | Normally, a dynamic field is allowed to grow without limit. But it is |
| 1636 | possible to set an upper limit on the size of a dynamic field. You do |
| 1637 | it with this function: |
| 1638 | int set_max_field(FIELD *field, /* field to alter (may not be NULL) */ |
| 1639 | int max_size); /* upper limit on field size */ |
| 1640 | |
| 1641 | If the field is one-line, max_size is taken to be a column size limit; |
| 1642 | if it is multi-line, it is taken to be a line size limit. To disable |
| 1643 | any limit, use an argument of zero. The growth limit can be changed |
| 1644 | whether or not the O_STATIC bit is on, but has no effect until it is. |
| 1645 | |
| 1646 | The following properties of a field change when it becomes dynamic: |
| 1647 | * If there is no growth limit, there is no final position of the |
| 1648 | field; therefore O_AUTOSKIP and O_NL_OVERLOAD are ignored. |
| 1649 | * Field justification will be ignored (though whatever justification |
| 1650 | is set up will be retained internally and can be queried). |
| 1651 | * The dup_field() and link_field() calls copy dynamic-buffer sizes. |
| 1652 | If the O_STATIC option is set on one of a collection of links, |
| 1653 | buffer resizing will occur only when the field is edited through |
| 1654 | that link. |
| 1655 | * The call field_info() will retrieve the original static size of |
| 1656 | the field; use dynamic_field_info() to get the actual dynamic |
| 1657 | size. |
| 1658 | |
| 1659 | Field Validation |
| 1660 | |
| 1661 | By default, a field will accept any data that will fit in its input |
| 1662 | buffer. However, it is possible to attach a validation type to a |
| 1663 | field. If you do this, any attempt to leave the field while it |
| 1664 | contains data that doesn't match the validation type will fail. Some |
| 1665 | validation types also have a character-validity check for each time a |
| 1666 | character is entered in the field. |
| 1667 | |
| 1668 | A field's validation check (if any) is not called when |
| 1669 | set_field_buffer() modifies the input buffer, nor when that buffer is |
| 1670 | changed through a linked field. |
| 1671 | |
| 1672 | The form library provides a rich set of pre-defined validation types, |
| 1673 | and gives you the capability to define custom ones of your own. You |
| 1674 | can examine and change field validation attributes with the following |
| 1675 | functions: |
| 1676 | int set_field_type(FIELD *field, /* field to alter */ |
| 1677 | FIELDTYPE *ftype, /* type to associate */ |
| 1678 | ...); /* additional arguments*/ |
| 1679 | |
| 1680 | FIELDTYPE *field_type(FIELD *field); /* field to query */ |
| 1681 | |
| 1682 | The validation type of a field is considered an attribute of the |
| 1683 | field. As with other field attributes, Also, doing set_field_type() |
| 1684 | with a NULL field default will change the system default for |
| 1685 | validation of newly-created fields. |
| 1686 | |
| 1687 | Here are the pre-defined validation types: |
| 1688 | |
| 1689 | TYPE_ALPHA |
| 1690 | |
| 1691 | This field type accepts alphabetic data; no blanks, no digits, no |
| 1692 | special characters (this is checked at character-entry time). It is |
| 1693 | set up with: |
| 1694 | int set_field_type(FIELD *field, /* field to alter */ |
| 1695 | TYPE_ALPHA, /* type to associate */ |
| 1696 | int width); /* maximum width of field */ |
| 1697 | |
| 1698 | The width argument sets a minimum width of data. Typically you'll want |
| 1699 | to set this to the field width; if it's greater than the field width, |
| 1700 | the validation check will always fail. A minimum width of zero makes |
| 1701 | field completion optional. |
| 1702 | |
| 1703 | TYPE_ALNUM |
| 1704 | |
| 1705 | This field type accepts alphabetic data and digits; no blanks, no |
| 1706 | special characters (this is checked at character-entry time). It is |
| 1707 | set up with: |
| 1708 | int set_field_type(FIELD *field, /* field to alter */ |
| 1709 | TYPE_ALNUM, /* type to associate */ |
| 1710 | int width); /* maximum width of field */ |
| 1711 | |
| 1712 | The width argument sets a minimum width of data. As with TYPE_ALPHA, |
| 1713 | typically you'll want to set this to the field width; if it's greater |
| 1714 | than the field width, the validation check will always fail. A minimum |
| 1715 | width of zero makes field completion optional. |
| 1716 | |
| 1717 | TYPE_ENUM |
| 1718 | |
| 1719 | This type allows you to restrict a field's values to be among a |
| 1720 | specified set of string values (for example, the two-letter postal |
| 1721 | codes for U.S. states). It is set up with: |
| 1722 | int set_field_type(FIELD *field, /* field to alter */ |
| 1723 | TYPE_ENUM, /* type to associate */ |
| 1724 | char **valuelist; /* list of possible values */ |
| 1725 | int checkcase; /* case-sensitive? */ |
| 1726 | int checkunique); /* must specify uniquely? */ |
| 1727 | |
| 1728 | The valuelist parameter must point at a NULL-terminated list of valid |
| 1729 | strings. The checkcase argument, if true, makes comparison with the |
| 1730 | string case-sensitive. |
| 1731 | |
| 1732 | When the user exits a TYPE_ENUM field, the validation procedure tries |
| 1733 | to complete the data in the buffer to a valid entry. If a complete |
| 1734 | choice string has been entered, it is of course valid. But it is also |
| 1735 | possible to enter a prefix of a valid string and have it completed for |
| 1736 | you. |
| 1737 | |
| 1738 | By default, if you enter such a prefix and it matches more than one |
| 1739 | value in the string list, the prefix will be completed to the first |
| 1740 | matching value. But the checkunique argument, if true, requires prefix |
| 1741 | matches to be unique in order to be valid. |
| 1742 | |
| 1743 | The REQ_NEXT_CHOICE and REQ_PREV_CHOICE input requests can be |
| 1744 | particularly useful with these fields. |
| 1745 | |
| 1746 | TYPE_INTEGER |
| 1747 | |
| 1748 | This field type accepts an integer. It is set up as follows: |
| 1749 | int set_field_type(FIELD *field, /* field to alter */ |
| 1750 | TYPE_INTEGER, /* type to associate */ |
| 1751 | int padding, /* # places to zero-pad to */ |
| 1752 | int vmin, int vmax); /* valid range */ |
| 1753 | |
| 1754 | Valid characters consist of an optional leading minus and digits. The |
| 1755 | range check is performed on exit. If the range maximum is less than or |
| 1756 | equal to the minimum, the range is ignored. |
| 1757 | |
| 1758 | If the value passes its range check, it is padded with as many leading |
| 1759 | zero digits as necessary to meet the padding argument. |
| 1760 | |
| 1761 | A TYPE_INTEGER value buffer can conveniently be interpreted with the C |
| 1762 | library function atoi(3). |
| 1763 | |
| 1764 | TYPE_NUMERIC |
| 1765 | |
| 1766 | This field type accepts a decimal number. It is set up as follows: |
| 1767 | int set_field_type(FIELD *field, /* field to alter */ |
| 1768 | TYPE_NUMERIC, /* type to associate */ |
| 1769 | int padding, /* # places of precision */ |
| 1770 | double vmin, double vmax); /* valid range */ |
| 1771 | |
| 1772 | Valid characters consist of an optional leading minus and digits. |
| 1773 | possibly including a decimal point. If your system supports locale's, |
| 1774 | the decimal point character used must be the one defined by your |
| 1775 | locale. The range check is performed on exit. If the range maximum is |
| 1776 | less than or equal to the minimum, the range is ignored. |
| 1777 | |
| 1778 | If the value passes its range check, it is padded with as many |
| 1779 | trailing zero digits as necessary to meet the padding argument. |
| 1780 | |
| 1781 | A TYPE_NUMERIC value buffer can conveniently be interpreted with the C |
| 1782 | library function atof(3). |
| 1783 | |
| 1784 | TYPE_REGEXP |
| 1785 | |
| 1786 | This field type accepts data matching a regular expression. It is set |
| 1787 | up as follows: |
| 1788 | int set_field_type(FIELD *field, /* field to alter */ |
| 1789 | TYPE_REGEXP, /* type to associate */ |
| 1790 | char *regexp); /* expression to match */ |
| 1791 | |
| 1792 | The syntax for regular expressions is that of regcomp(3). The check |
| 1793 | for regular-expression match is performed on exit. |
| 1794 | |
| 1795 | Direct Field Buffer Manipulation |
| 1796 | |
| 1797 | The chief attribute of a field is its buffer contents. When a form has |
| 1798 | been completed, your application usually needs to know the state of |
| 1799 | each field buffer. You can find this out with: |
| 1800 | char *field_buffer(FIELD *field, /* field to query */ |
| 1801 | int bufindex); /* number of buffer to query */ |
| 1802 | |
| 1803 | Normally, the state of the zero-numbered buffer for each field is set |
| 1804 | by the user's editing actions on that field. It's sometimes useful to |
| 1805 | be able to set the value of the zero-numbered (or some other) buffer |
| 1806 | from your application: |
| 1807 | int set_field_buffer(FIELD *field, /* field to alter */ |
| 1808 | int bufindex, /* number of buffer to alter */ |
| 1809 | char *value); /* string value to set */ |
| 1810 | |
| 1811 | If the field is not large enough and cannot be resized to a |
| 1812 | sufficiently large size to contain the specified value, the value will |
| 1813 | be truncated to fit. |
| 1814 | |
| 1815 | Calling field_buffer() with a null field pointer will raise an error. |
| 1816 | Calling field_buffer() on a field not currently selected for input |
| 1817 | will return a correct value. Calling field_buffer() on a field that is |
| 1818 | currently selected for input may not necessarily give a correct field |
| 1819 | buffer value, because entered data isn't necessarily copied to buffer |
| 1820 | zero before the exit validation check. To guarantee that the returned |
| 1821 | buffer value reflects on-screen reality, call field_buffer() either |
| 1822 | (1) in the field's exit validation check routine, (2) from the field's |
| 1823 | or form's initialization or termination hooks, or (3) just after a |
| 1824 | REQ_VALIDATION request has been processed by the forms driver. |
| 1825 | |
| 1826 | Attributes of Forms |
| 1827 | |
| 1828 | As with field attributes, form attributes inherit a default from a |
| 1829 | system default form structure. These defaults can be queried or set by |
| 1830 | of these functions using a form-pointer argument of NULL. |
| 1831 | |
| 1832 | The principal attribute of a form is its field list. You can query and |
| 1833 | change this list with: |
| 1834 | int set_form_fields(FORM *form, /* form to alter */ |
| 1835 | FIELD **fields); /* fields to connect */ |
| 1836 | |
| 1837 | char *form_fields(FORM *form); /* fetch fields of form */ |
| 1838 | |
| 1839 | int field_count(FORM *form); /* count connect fields */ |
| 1840 | |
| 1841 | The second argument of set_form_fields() may be a NULL-terminated |
| 1842 | field pointer array like the one required by new_form(). In that case, |
| 1843 | the old fields of the form are disconnected but not freed (and |
| 1844 | eligible to be connected to other forms), then the new fields are |
| 1845 | connected. |
| 1846 | |
| 1847 | It may also be null, in which case the old fields are disconnected |
| 1848 | (and not freed) but no new ones are connected. |
| 1849 | |
| 1850 | The field_count() function simply counts the number of fields |
| 1851 | connected to a given from. It returns -1 if the form-pointer argument |
| 1852 | is NULL. |
| 1853 | |
| 1854 | Control of Form Display |
| 1855 | |
| 1856 | In the overview section, you saw that to display a form you normally |
| 1857 | start by defining its size (and fields), posting it, and refreshing |
| 1858 | the screen. There is an hidden step before posting, which is the |
| 1859 | association of the form with a frame window (actually, a pair of |
| 1860 | windows) within which it will be displayed. By default, the forms |
| 1861 | library associates every form with the full-screen window stdscr. |
| 1862 | |
| 1863 | By making this step explicit, you can associate a form with a declared |
| 1864 | frame window on your screen display. This can be useful if you want to |
| 1865 | adapt the form display to different screen sizes, dynamically tile |
| 1866 | forms on the screen, or use a form as part of an interface layout |
| 1867 | managed by panels. |
| 1868 | |
| 1869 | The two windows associated with each form have the same functions as |
| 1870 | their analogues in the menu library. Both these windows are painted |
| 1871 | when the form is posted and erased when the form is unposted. |
| 1872 | |
| 1873 | The outer or frame window is not otherwise touched by the form |
| 1874 | routines. It exists so the programmer can associate a title, a border, |
| 1875 | or perhaps help text with the form and have it properly refreshed or |
| 1876 | erased at post/unpost time. The inner window or subwindow is where the |
| 1877 | current form page is actually displayed. |
| 1878 | |
| 1879 | In order to declare your own frame window for a form, you'll need to |
| 1880 | know the size of the form's bounding rectangle. You can get this |
| 1881 | information with: |
| 1882 | int scale_form(FORM *form, /* form to query */ |
| 1883 | int *rows, /* form rows */ |
| 1884 | int *cols); /* form cols */ |
| 1885 | |
| 1886 | The form dimensions are passed back in the locations pointed to by the |
| 1887 | arguments. Once you have this information, you can use it to declare |
| 1888 | of windows, then use one of these functions: |
| 1889 | int set_form_win(FORM *form, /* form to alter */ |
| 1890 | WINDOW *win); /* frame window to connect */ |
| 1891 | |
| 1892 | WINDOW *form_win(FORM *form); /* fetch frame window of form */ |
| 1893 | |
| 1894 | int set_form_sub(FORM *form, /* form to alter */ |
| 1895 | WINDOW *win); /* form subwindow to connect */ |
| 1896 | |
| 1897 | WINDOW *form_sub(FORM *form); /* fetch form subwindow of form */ |
| 1898 | |
| 1899 | Note that curses operations, including refresh(), on the form, should |
| 1900 | be done on the frame window, not the form subwindow. |
| 1901 | |
| 1902 | It is possible to check from your application whether all of a |
| 1903 | scrollable field is actually displayed within the menu subwindow. Use |
| 1904 | these functions: |
| 1905 | int data_ahead(FORM *form); /* form to be queried */ |
| 1906 | |
| 1907 | int data_behind(FORM *form); /* form to be queried */ |
| 1908 | |
| 1909 | The function data_ahead() returns TRUE if (a) the current field is |
| 1910 | one-line and has undisplayed data off to the right, (b) the current |
| 1911 | field is multi-line and there is data off-screen below it. |
| 1912 | |
| 1913 | The function data_behind() returns TRUE if the first (upper left hand) |
| 1914 | character position is off-screen (not being displayed). |
| 1915 | |
| 1916 | Finally, there is a function to restore the form window's cursor to |
| 1917 | the value expected by the forms driver: |
| 1918 | int pos_form_cursor(FORM *) /* form to be queried */ |
| 1919 | |
| 1920 | If your application changes the form window cursor, call this function |
| 1921 | before handing control back to the forms driver in order to |
| 1922 | re-synchronize it. |
| 1923 | |
| 1924 | Input Processing in the Forms Driver |
| 1925 | |
| 1926 | The function form_driver() handles virtualized input requests for form |
| 1927 | navigation, editing, and validation requests, just as menu_driver does |
| 1928 | for menus (see the section on menu input handling). |
| 1929 | int form_driver(FORM *form, /* form to pass input to */ |
| 1930 | int request); /* form request code */ |
| 1931 | |
| 1932 | Your input virtualization function needs to take input and then |
| 1933 | convert it to either an alphanumeric character (which is treated as |
| 1934 | data to be entered in the currently-selected field), or a forms |
| 1935 | processing request. |
| 1936 | |
| 1937 | The forms driver provides hooks (through input-validation and |
| 1938 | field-termination functions) with which your application code can |
| 1939 | check that the input taken by the driver matched what was expected. |
| 1940 | |
| 1941 | Page Navigation Requests |
| 1942 | |
| 1943 | These requests cause page-level moves through the form, triggering |
| 1944 | display of a new form screen. |
| 1945 | |
| 1946 | REQ_NEXT_PAGE |
| 1947 | Move to the next form page. |
| 1948 | |
| 1949 | REQ_PREV_PAGE |
| 1950 | Move to the previous form page. |
| 1951 | |
| 1952 | REQ_FIRST_PAGE |
| 1953 | Move to the first form page. |
| 1954 | |
| 1955 | REQ_LAST_PAGE |
| 1956 | Move to the last form page. |
| 1957 | |
| 1958 | These requests treat the list as cyclic; that is, REQ_NEXT_PAGE from |
| 1959 | the last page goes to the first, and REQ_PREV_PAGE from the first page |
| 1960 | goes to the last. |
| 1961 | |
| 1962 | Inter-Field Navigation Requests |
| 1963 | |
| 1964 | These requests handle navigation between fields on the same page. |
| 1965 | |
| 1966 | REQ_NEXT_FIELD |
| 1967 | Move to next field. |
| 1968 | |
| 1969 | REQ_PREV_FIELD |
| 1970 | Move to previous field. |
| 1971 | |
| 1972 | REQ_FIRST_FIELD |
| 1973 | Move to the first field. |
| 1974 | |
| 1975 | REQ_LAST_FIELD |
| 1976 | Move to the last field. |
| 1977 | |
| 1978 | REQ_SNEXT_FIELD |
| 1979 | Move to sorted next field. |
| 1980 | |
| 1981 | REQ_SPREV_FIELD |
| 1982 | Move to sorted previous field. |
| 1983 | |
| 1984 | REQ_SFIRST_FIELD |
| 1985 | Move to the sorted first field. |
| 1986 | |
| 1987 | REQ_SLAST_FIELD |
| 1988 | Move to the sorted last field. |
| 1989 | |
| 1990 | REQ_LEFT_FIELD |
| 1991 | Move left to field. |
| 1992 | |
| 1993 | REQ_RIGHT_FIELD |
| 1994 | Move right to field. |
| 1995 | |
| 1996 | REQ_UP_FIELD |
| 1997 | Move up to field. |
| 1998 | |
| 1999 | REQ_DOWN_FIELD |
| 2000 | Move down to field. |
| 2001 | |
| 2002 | These requests treat the list of fields on a page as cyclic; that is, |
| 2003 | REQ_NEXT_FIELD from the last field goes to the first, and |
| 2004 | REQ_PREV_FIELD from the first field goes to the last. The order of the |
| 2005 | fields for these (and the REQ_FIRST_FIELD and REQ_LAST_FIELD requests) |
| 2006 | is simply the order of the field pointers in the form array (as set up |
| 2007 | by new_form() or set_form_fields() |
| 2008 | |
| 2009 | It is also possible to traverse the fields as if they had been sorted |
| 2010 | in screen-position order, so the sequence goes left-to-right and |
| 2011 | top-to-bottom. To do this, use the second group of four |
| 2012 | sorted-movement requests. |
| 2013 | |
| 2014 | Finally, it is possible to move between fields using visual directions |
| 2015 | up, down, right, and left. To accomplish this, use the third group of |
| 2016 | four requests. Note, however, that the position of a form for purposes |
| 2017 | of these requests is its upper-left corner. |
| 2018 | |
| 2019 | For example, suppose you have a multi-line field B, and two |
| 2020 | single-line fields A and C on the same line with B, with A to the left |
| 2021 | of B and C to the right of B. A REQ_MOVE_RIGHT from A will go to B |
| 2022 | only if A, B, and C all share the same first line; otherwise it will |
| 2023 | skip over B to C. |
| 2024 | |
| 2025 | Intra-Field Navigation Requests |
| 2026 | |
| 2027 | These requests drive movement of the edit cursor within the currently |
| 2028 | selected field. |
| 2029 | |
| 2030 | REQ_NEXT_CHAR |
| 2031 | Move to next character. |
| 2032 | |
| 2033 | REQ_PREV_CHAR |
| 2034 | Move to previous character. |
| 2035 | |
| 2036 | REQ_NEXT_LINE |
| 2037 | Move to next line. |
| 2038 | |
| 2039 | REQ_PREV_LINE |
| 2040 | Move to previous line. |
| 2041 | |
| 2042 | REQ_NEXT_WORD |
| 2043 | Move to next word. |
| 2044 | |
| 2045 | REQ_PREV_WORD |
| 2046 | Move to previous word. |
| 2047 | |
| 2048 | REQ_BEG_FIELD |
| 2049 | Move to beginning of field. |
| 2050 | |
| 2051 | REQ_END_FIELD |
| 2052 | Move to end of field. |
| 2053 | |
| 2054 | REQ_BEG_LINE |
| 2055 | Move to beginning of line. |
| 2056 | |
| 2057 | REQ_END_LINE |
| 2058 | Move to end of line. |
| 2059 | |
| 2060 | REQ_LEFT_CHAR |
| 2061 | Move left in field. |
| 2062 | |
| 2063 | REQ_RIGHT_CHAR |
| 2064 | Move right in field. |
| 2065 | |
| 2066 | REQ_UP_CHAR |
| 2067 | Move up in field. |
| 2068 | |
| 2069 | REQ_DOWN_CHAR |
| 2070 | Move down in field. |
| 2071 | |
| 2072 | Each word is separated from the previous and next characters by |
| 2073 | whitespace. The commands to move to beginning and end of line or field |
| 2074 | look for the first or last non-pad character in their ranges. |
| 2075 | |
| 2076 | Scrolling Requests |
| 2077 | |
| 2078 | Fields that are dynamic and have grown and fields explicitly created |
| 2079 | with offscreen rows are scrollable. One-line fields scroll |
| 2080 | horizontally; multi-line fields scroll vertically. Most scrolling is |
| 2081 | triggered by editing and intra-field movement (the library scrolls the |
| 2082 | field to keep the cursor visible). It is possible to explicitly |
| 2083 | request scrolling with the following requests: |
| 2084 | |
| 2085 | REQ_SCR_FLINE |
| 2086 | Scroll vertically forward a line. |
| 2087 | |
| 2088 | REQ_SCR_BLINE |
| 2089 | Scroll vertically backward a line. |
| 2090 | |
| 2091 | REQ_SCR_FPAGE |
| 2092 | Scroll vertically forward a page. |
| 2093 | |
| 2094 | REQ_SCR_BPAGE |
| 2095 | Scroll vertically backward a page. |
| 2096 | |
| 2097 | REQ_SCR_FHPAGE |
| 2098 | Scroll vertically forward half a page. |
| 2099 | |
| 2100 | REQ_SCR_BHPAGE |
| 2101 | Scroll vertically backward half a page. |
| 2102 | |
| 2103 | REQ_SCR_FCHAR |
| 2104 | Scroll horizontally forward a character. |
| 2105 | |
| 2106 | REQ_SCR_BCHAR |
| 2107 | Scroll horizontally backward a character. |
| 2108 | |
| 2109 | REQ_SCR_HFLINE |
| 2110 | Scroll horizontally one field width forward. |
| 2111 | |
| 2112 | REQ_SCR_HBLINE |
| 2113 | Scroll horizontally one field width backward. |
| 2114 | |
| 2115 | REQ_SCR_HFHALF |
| 2116 | Scroll horizontally one half field width forward. |
| 2117 | |
| 2118 | REQ_SCR_HBHALF |
| 2119 | Scroll horizontally one half field width backward. |
| 2120 | |
| 2121 | For scrolling purposes, a page of a field is the height of its visible |
| 2122 | part. |
| 2123 | |
| 2124 | Editing Requests |
| 2125 | |
| 2126 | When you pass the forms driver an ASCII character, it is treated as a |
| 2127 | request to add the character to the field's data buffer. Whether this |
| 2128 | is an insertion or a replacement depends on the field's edit mode |
| 2129 | (insertion is the default. |
| 2130 | |
| 2131 | The following requests support editing the field and changing the edit |
| 2132 | mode: |
| 2133 | |
| 2134 | REQ_INS_MODE |
| 2135 | Set insertion mode. |
| 2136 | |
| 2137 | REQ_OVL_MODE |
| 2138 | Set overlay mode. |
| 2139 | |
| 2140 | REQ_NEW_LINE |
| 2141 | New line request (see below for explanation). |
| 2142 | |
| 2143 | REQ_INS_CHAR |
| 2144 | Insert space at character location. |
| 2145 | |
| 2146 | REQ_INS_LINE |
| 2147 | Insert blank line at character location. |
| 2148 | |
| 2149 | REQ_DEL_CHAR |
| 2150 | Delete character at cursor. |
| 2151 | |
| 2152 | REQ_DEL_PREV |
| 2153 | Delete previous word at cursor. |
| 2154 | |
| 2155 | REQ_DEL_LINE |
| 2156 | Delete line at cursor. |
| 2157 | |
| 2158 | REQ_DEL_WORD |
| 2159 | Delete word at cursor. |
| 2160 | |
| 2161 | REQ_CLR_EOL |
| 2162 | Clear to end of line. |
| 2163 | |
| 2164 | REQ_CLR_EOF |
| 2165 | Clear to end of field. |
| 2166 | |
| 2167 | REQ_CLEAR_FIELD |
| 2168 | Clear entire field. |
| 2169 | |
| 2170 | The behavior of the REQ_NEW_LINE and REQ_DEL_PREV requests is |
| 2171 | complicated and partly controlled by a pair of forms options. The |
| 2172 | special cases are triggered when the cursor is at the beginning of a |
| 2173 | field, or on the last line of the field. |
| 2174 | |
| 2175 | First, we consider REQ_NEW_LINE: |
| 2176 | |
| 2177 | The normal behavior of REQ_NEW_LINE in insert mode is to break the |
| 2178 | current line at the position of the edit cursor, inserting the portion |
| 2179 | of the current line after the cursor as a new line following the |
| 2180 | current and moving the cursor to the beginning of that new line (you |
| 2181 | may think of this as inserting a newline in the field buffer). |
| 2182 | |
| 2183 | The normal behavior of REQ_NEW_LINE in overlay mode is to clear the |
| 2184 | current line from the position of the edit cursor to end of line. The |
| 2185 | cursor is then moved to the beginning of the next line. |
| 2186 | |
| 2187 | However, REQ_NEW_LINE at the beginning of a field, or on the last line |
| 2188 | of a field, instead does a REQ_NEXT_FIELD. O_NL_OVERLOAD option is |
| 2189 | off, this special action is disabled. |
| 2190 | |
| 2191 | Now, let us consider REQ_DEL_PREV: |
| 2192 | |
| 2193 | The normal behavior of REQ_DEL_PREV is to delete the previous |
| 2194 | character. If insert mode is on, and the cursor is at the start of a |
| 2195 | line, and the text on that line will fit on the previous one, it |
| 2196 | instead appends the contents of the current line to the previous one |
| 2197 | and deletes the current line (you may think of this as deleting a |
| 2198 | newline from the field buffer). |
| 2199 | |
| 2200 | However, REQ_DEL_PREV at the beginning of a field is instead treated |
| 2201 | as a REQ_PREV_FIELD. |
| 2202 | |
| 2203 | If the O_BS_OVERLOAD option is off, this special action is disabled |
| 2204 | and the forms driver just returns E_REQUEST_DENIED. |
| 2205 | |
| 2206 | See Form Options for discussion of how to set and clear the overload |
| 2207 | options. |
| 2208 | |
| 2209 | Order Requests |
| 2210 | |
| 2211 | If the type of your field is ordered, and has associated functions for |
| 2212 | getting the next and previous values of the type from a given value, |
| 2213 | there are requests that can fetch that value into the field buffer: |
| 2214 | |
| 2215 | REQ_NEXT_CHOICE |
| 2216 | Place the successor value of the current value in the buffer. |
| 2217 | |
| 2218 | REQ_PREV_CHOICE |
| 2219 | Place the predecessor value of the current value in the buffer. |
| 2220 | |
| 2221 | Of the built-in field types, only TYPE_ENUM has built-in successor and |
| 2222 | predecessor functions. When you define a field type of your own (see |
| 2223 | Custom Validation Types), you can associate our own ordering |
| 2224 | functions. |
| 2225 | |
| 2226 | Application Commands |
| 2227 | |
| 2228 | Form requests are represented as integers above the curses value |
| 2229 | greater than KEY_MAX and less than or equal to the constant |
| 2230 | MAX_COMMAND. If your input-virtualization routine returns a value |
| 2231 | above MAX_COMMAND, the forms driver will ignore it. |
| 2232 | |
| 2233 | Field Change Hooks |
| 2234 | |
| 2235 | It is possible to set function hooks to be executed whenever the |
| 2236 | current field or form changes. Here are the functions that support |
| 2237 | this: |
| 2238 | typedef void (*HOOK)(); /* pointer to function returning void */ |
| 2239 | |
| 2240 | int set_form_init(FORM *form, /* form to alter */ |
| 2241 | HOOK hook); /* initialization hook */ |
| 2242 | |
| 2243 | HOOK form_init(FORM *form); /* form to query */ |
| 2244 | |
| 2245 | int set_form_term(FORM *form, /* form to alter */ |
| 2246 | HOOK hook); /* termination hook */ |
| 2247 | |
| 2248 | HOOK form_term(FORM *form); /* form to query */ |
| 2249 | |
| 2250 | int set_field_init(FORM *form, /* form to alter */ |
| 2251 | HOOK hook); /* initialization hook */ |
| 2252 | |
| 2253 | HOOK field_init(FORM *form); /* form to query */ |
| 2254 | |
| 2255 | int set_field_term(FORM *form, /* form to alter */ |
| 2256 | HOOK hook); /* termination hook */ |
| 2257 | |
| 2258 | HOOK field_term(FORM *form); /* form to query */ |
| 2259 | |
| 2260 | These functions allow you to either set or query four different hooks. |
| 2261 | In each of the set functions, the second argument should be the |
| 2262 | address of a hook function. These functions differ only in the timing |
| 2263 | of the hook call. |
| 2264 | |
| 2265 | form_init |
| 2266 | This hook is called when the form is posted; also, just after |
| 2267 | each page change operation. |
| 2268 | |
| 2269 | field_init |
| 2270 | This hook is called when the form is posted; also, just after |
| 2271 | each field change |
| 2272 | |
| 2273 | field_term |
| 2274 | This hook is called just after field validation; that is, just |
| 2275 | before the field is altered. It is also called when the form is |
| 2276 | unposted. |
| 2277 | |
| 2278 | form_term |
| 2279 | This hook is called when the form is unposted; also, just |
| 2280 | before each page change operation. |
| 2281 | |
| 2282 | Calls to these hooks may be triggered |
| 2283 | 1. When user editing requests are processed by the forms driver |
| 2284 | 2. When the current page is changed by set_current_field() call |
| 2285 | 3. When the current field is changed by a set_form_page() call |
| 2286 | |
| 2287 | See Field Change Commands for discussion of the latter two cases. |
| 2288 | |
| 2289 | You can set a default hook for all fields by passing one of the set |
| 2290 | functions a NULL first argument. |
| 2291 | |
| 2292 | You can disable any of these hooks by (re)setting them to NULL, the |
| 2293 | default value. |
| 2294 | |
| 2295 | Field Change Commands |
| 2296 | |
| 2297 | Normally, navigation through the form will be driven by the user's |
| 2298 | input requests. But sometimes it is useful to be able to move the |
| 2299 | focus for editing and viewing under control of your application, or |
| 2300 | ask which field it currently is in. The following functions help you |
| 2301 | accomplish this: |
| 2302 | int set_current_field(FORM *form, /* form to alter */ |
| 2303 | FIELD *field); /* field to shift to */ |
| 2304 | |
| 2305 | FIELD *current_field(FORM *form); /* form to query */ |
| 2306 | |
| 2307 | int field_index(FORM *form, /* form to query */ |
| 2308 | FIELD *field); /* field to get index of */ |
| 2309 | |
| 2310 | The function field_index() returns the index of the given field in the |
| 2311 | given form's field array (the array passed to new_form() or |
| 2312 | set_form_fields()). |
| 2313 | |
| 2314 | The initial current field of a form is the first active field on the |
| 2315 | first page. The function set_form_fields() resets this. |
| 2316 | |
| 2317 | It is also possible to move around by pages. |
| 2318 | int set_form_page(FORM *form, /* form to alter */ |
| 2319 | int page); /* page to go to (0-origin) */ |
| 2320 | |
| 2321 | int form_page(FORM *form); /* return form's current page */ |
| 2322 | |
| 2323 | The initial page of a newly-created form is 0. The function |
| 2324 | set_form_fields() resets this. |
| 2325 | |
| 2326 | Form Options |
| 2327 | |
| 2328 | Like fields, forms may have control option bits. They can be changed |
| 2329 | or queried with these functions: |
| 2330 | int set_form_opts(FORM *form, /* form to alter */ |
| 2331 | int attr); /* attribute to set */ |
| 2332 | |
| 2333 | int form_opts_on(FORM *form, /* form to alter */ |
| 2334 | int attr); /* attributes to turn on */ |
| 2335 | |
| 2336 | int form_opts_off(FORM *form, /* form to alter */ |
| 2337 | int attr); /* attributes to turn off */ |
| 2338 | |
| 2339 | int form_opts(FORM *form); /* form to query */ |
| 2340 | |
| 2341 | By default, all options are on. Here are the available option bits: |
| 2342 | |
| 2343 | O_NL_OVERLOAD |
| 2344 | Enable overloading of REQ_NEW_LINE as described in Editing |
| 2345 | Requests. The value of this option is ignored on dynamic fields |
| 2346 | that have not reached their size limit; these have no last |
| 2347 | line, so the circumstances for triggering a REQ_NEXT_FIELD |
| 2348 | never arise. |
| 2349 | |
| 2350 | O_BS_OVERLOAD |
| 2351 | Enable overloading of REQ_DEL_PREV as described in Editing |
| 2352 | Requests. |
| 2353 | |
| 2354 | The option values are bit-masks and can be composed with logical-or in |
| 2355 | the obvious way. |
| 2356 | |
| 2357 | Custom Validation Types |
| 2358 | |
| 2359 | The form library gives you the capability to define custom validation |
| 2360 | types of your own. Further, the optional additional arguments of |
| 2361 | set_field_type effectively allow you to parameterize validation types. |
| 2362 | Most of the complications in the validation-type interface have to do |
| 2363 | with the handling of the additional arguments within custom validation |
| 2364 | functions. |
| 2365 | |
| 2366 | Union Types |
| 2367 | |
| 2368 | The simplest way to create a custom data type is to compose it from |
| 2369 | two preexisting ones: |
| 2370 | FIELD *link_fieldtype(FIELDTYPE *type1, |
| 2371 | FIELDTYPE *type2); |
| 2372 | |
| 2373 | This function creates a field type that will accept any of the values |
| 2374 | legal for either of its argument field types (which may be either |
| 2375 | predefined or programmer-defined). If a set_field_type() call later |
| 2376 | requires arguments, the new composite type expects all arguments for |
| 2377 | the first type, than all arguments for the second. Order functions |
| 2378 | (see Order Requests) associated with the component types will work on |
| 2379 | the composite; what it does is check the validation function for the |
| 2380 | first type, then for the second, to figure what type the buffer |
| 2381 | contents should be treated as. |
| 2382 | |
| 2383 | New Field Types |
| 2384 | |
| 2385 | To create a field type from scratch, you need to specify one or both |
| 2386 | of the following things: |
| 2387 | * A character-validation function, to check each character as it is |
| 2388 | entered. |
| 2389 | * A field-validation function to be applied on exit from the field. |
| 2390 | |
| 2391 | Here's how you do that: |
| 2392 | typedef int (*HOOK)(); /* pointer to function returning int */ |
| 2393 | |
| 2394 | FIELDTYPE *new_fieldtype(HOOK f_validate, /* field validator */ |
| 2395 | HOOK c_validate) /* character validator */ |
| 2396 | |
| 2397 | |
| 2398 | int free_fieldtype(FIELDTYPE *ftype); /* type to free */ |
| 2399 | |
| 2400 | At least one of the arguments of new_fieldtype() must be non-NULL. The |
| 2401 | forms driver will automatically call the new type's validation |
| 2402 | functions at appropriate points in processing a field of the new type. |
| 2403 | |
| 2404 | The function free_fieldtype() deallocates the argument fieldtype, |
| 2405 | freeing all storage associated with it. |
| 2406 | |
| 2407 | Normally, a field validator is called when the user attempts to leave |
| 2408 | the field. Its first argument is a field pointer, from which it can |
| 2409 | get to field buffer 0 and test it. If the function returns TRUE, the |
| 2410 | operation succeeds; if it returns FALSE, the edit cursor stays in the |
| 2411 | field. |
| 2412 | |
| 2413 | A character validator gets the character passed in as a first |
| 2414 | argument. It too should return TRUE if the character is valid, FALSE |
| 2415 | otherwise. |
| 2416 | |
| 2417 | Validation Function Arguments |
| 2418 | |
| 2419 | Your field- and character- validation functions will be passed a |
| 2420 | second argument as well. This second argument is the address of a |
| 2421 | structure (which we'll call a pile) built from any of the |
| 2422 | field-type-specific arguments passed to set_field_type(). If no such |
| 2423 | arguments are defined for the field type, this pile pointer argument |
| 2424 | will be NULL. |
| 2425 | |
| 2426 | In order to arrange for such arguments to be passed to your validation |
| 2427 | functions, you must associate a small set of storage-management |
| 2428 | functions with the type. The forms driver will use these to synthesize |
| 2429 | a pile from the trailing arguments of each set_field_type() argument, |
| 2430 | and a pointer to the pile will be passed to the validation functions. |
| 2431 | |
| 2432 | Here is how you make the association: |
| 2433 | typedef char *(*PTRHOOK)(); /* pointer to function returning (char *) */ |
| 2434 | typedef void (*VOIDHOOK)(); /* pointer to function returning void */ |
| 2435 | |
| 2436 | int set_fieldtype_arg(FIELDTYPE *type, /* type to alter */ |
| 2437 | PTRHOOK make_str, /* make structure from args */ |
| 2438 | PTRHOOK copy_str, /* make copy of structure */ |
| 2439 | VOIDHOOK free_str); /* free structure storage */ |
| 2440 | |
| 2441 | Here is how the storage-management hooks are used: |
| 2442 | |
| 2443 | make_str |
| 2444 | This function is called by set_field_type(). It gets one |
| 2445 | argument, a va_list of the type-specific arguments passed to |
| 2446 | set_field_type(). It is expected to return a pile pointer to a |
| 2447 | data structure that encapsulates those arguments. |
| 2448 | |
| 2449 | copy_str |
| 2450 | This function is called by form library functions that allocate |
| 2451 | new field instances. It is expected to take a pile pointer, |
| 2452 | copy the pile to allocated storage, and return the address of |
| 2453 | the pile copy. |
| 2454 | |
| 2455 | free_str |
| 2456 | This function is called by field- and type-deallocation |
| 2457 | routines in the library. It takes a pile pointer argument, and |
| 2458 | is expected to free the storage of that pile. |
| 2459 | |
| 2460 | The make_str and copy_str functions may return NULL to signal |
| 2461 | allocation failure. The library routines will that call them will |
| 2462 | return error indication when this happens. Thus, your validation |
| 2463 | functions should never see a NULL file pointer and need not check |
| 2464 | specially for it. |
| 2465 | |
| 2466 | Order Functions For Custom Types |
| 2467 | |
| 2468 | Some custom field types are simply ordered in the same well-defined |
| 2469 | way that TYPE_ENUM is. For such types, it is possible to define |
| 2470 | successor and predecessor functions to support the REQ_NEXT_CHOICE and |
| 2471 | REQ_PREV_CHOICE requests. Here's how: |
| 2472 | typedef int (*INTHOOK)(); /* pointer to function returning int */ |
| 2473 | |
| 2474 | int set_fieldtype_arg(FIELDTYPE *type, /* type to alter */ |
| 2475 | INTHOOK succ, /* get successor value */ |
| 2476 | INTHOOK pred); /* get predecessor value */ |
| 2477 | |
| 2478 | The successor and predecessor arguments will each be passed two |
| 2479 | arguments; a field pointer, and a pile pointer (as for the validation |
| 2480 | functions). They are expected to use the function field_buffer() to |
| 2481 | read the current value, and set_field_buffer() on buffer 0 to set the |
| 2482 | next or previous value. Either hook may return TRUE to indicate |
| 2483 | success (a legal next or previous value was set) or FALSE to indicate |
| 2484 | failure. |
| 2485 | |
| 2486 | Avoiding Problems |
| 2487 | |
| 2488 | The interface for defining custom types is complicated and tricky. |
| 2489 | Rather than attempting to create a custom type entirely from scratch, |
| 2490 | you should start by studying the library source code for whichever of |
| 2491 | the pre-defined types seems to be closest to what you want. |
| 2492 | |
| 2493 | Use that code as a model, and evolve it towards what you really want. |
| 2494 | You will avoid many problems and annoyances that way. The code in the |
| 2495 | ncurses library has been specifically exempted from the package |
| 2496 | copyright to support this. |
| 2497 | |
| 2498 | If your custom type defines order functions, have do something |
| 2499 | intuitive with a blank field. A useful convention is to make the |
| 2500 | successor of a blank field the types minimum value, and its |
| 2501 | predecessor the maximum. |