Go to the first, previous, next, last section, table of contents.

# Curses-based classes

The `CursesWindow` class is a repackaging of standard curses library features into a class. It relies on ``curses.h'`.

The supplied ``curses.h'` is a fairly conservative declaration of curses library features, and does not include features like "screen" or X-window support. It is, for the most part, an adaptation, rather than an improvement of C-based ``curses.h'` files. The only substantive changes are the declarations of many functions as inline functions rather than macros, which was done solely to allow overloading.

The `CursesWindow` class encapsulates curses window functions within a class. Only those functions that control windows are included: Terminal control functions and macros like `cbreak` are not part of the class. All `CursesWindows` member functions have names identical to the corresponding curses library functions, except that the "w" prefix is generally dropped. Descriptions of these functions may be found in your local curses library documentation.

A `CursesWindow` may be declared via

`CursesWindow w(WINDOW* win)`
  attaches w to the existing WINDOW* win. This is constructor is normally used only in the following special case.
`CursesWindow w(stdscr)`
  attaches w to the default curses library standard screen window.
`CursesWindow w(int lines, int cols, int begin_y, int begin_x)`
  attaches to an allocated curses window with the indicated size and screen position.
`CursesWindow sub(CursesWindow& w,int l,int c,int by,int bx,char ar='a')`
  attaches to a subwindow of w created via the curses `subwin' command. If ar is sent as `r', the origin (by, bx) is relative to the parent window, else it is absolute.

The class maintains a static counter that is used in order to automatically call the curses library `initscr` and `endscr` functions at the proper times. These need not, and should not be called "manually".

`CursesWindow`s maintain a tree of their subwindows. Upon destruction of a `CursesWindow`, all of their subwindows are also invalidated if they had not previously been destroyed.

It is possible to traverse trees of subwindows via the following member functions

`CursesWindow* w.parent()`
  returns a pointer to the parent of the subwindow, or 0 if there is none.
`CursesWindow* w.child()`
  returns the first child subwindow of the window, or 0 if there is none.
`CursesWindow* w.sibling()`
  returns the next sibling of the subwindow, or 0 if there is none.

For example, to call some function `visit` for all subwindows of a window, you could write

    void traverse(CursesWindow& w)
    {
      visit(w);
      if (w.child() != 0) traverse(*w.child);
      if (w.sibling() != 0) traverse(*w.sibling);
    }

Go to the first, previous, next, last section, table of contents.