Current Dir: /usr/include/

[DIR]  arpa [ delete | rename ]
[DIR]  asm [ delete | rename ]
[DIR]  asm-generic [ delete | rename ]
[DIR]  bind9 [ delete | rename ]
[DIR]  bits [ delete | rename ]
[DIR]  blkid [ delete | rename ]
[DIR]  brotli [ delete | rename ]
[DIR]  bsock [ delete | rename ]
[DIR]  c++ [ delete | rename ]
[DIR]  criu-lve [ delete | rename ]
[DIR]  drm [ delete | rename ]
[DIR]  e2p [ delete | rename ]
[DIR]  et [ delete | rename ]
[DIR]  event2 [ delete | rename ]
[DIR]  ext2fs [ delete | rename ]
[DIR]  finclude [ delete | rename ]
[DIR]  fontconfig [ delete | rename ]
[DIR]  freetype2 [ delete | rename ]
[DIR]  fstrm [ delete | rename ]
[DIR]  fwctl [ delete | rename ]
[DIR]  gdbm [ delete | rename ]
[DIR]  gio-unix-2.0 [ delete | rename ]
[DIR]  GL [ delete | rename ]
[DIR]  glib-2.0 [ delete | rename ]
[DIR]  gnu [ delete | rename ]
[DIR]  google [ delete | rename ]
[DIR]  graphite2 [ delete | rename ]
[DIR]  gssapi [ delete | rename ]
[DIR]  gssrpc [ delete | rename ]
[DIR]  harfbuzz [ delete | rename ]
[DIR]  json-c [ delete | rename ]
[DIR]  kadm5 [ delete | rename ]
[DIR]  krb5 [ delete | rename ]
[DIR]  libexslt [ delete | rename ]
[DIR]  libltdl [ delete | rename ]
[DIR]  libmount [ delete | rename ]
[DIR]  libpng16 [ delete | rename ]
[DIR]  libxml2 [ delete | rename ]
[DIR]  libxslt [ delete | rename ]
[DIR]  linux [ delete | rename ]
[DIR]  lve [ delete | rename ]
[DIR]  lzma [ delete | rename ]
[DIR]  misc [ delete | rename ]
[DIR]  mtd [ delete | rename ]
[DIR]  mysql [ delete | rename ]
[DIR]  ncurses [ delete | rename ]
[DIR]  ncursesw [ delete | rename ]
[DIR]  net [ delete | rename ]
[DIR]  netash [ delete | rename ]
[DIR]  netatalk [ delete | rename ]
[DIR]  netax25 [ delete | rename ]
[DIR]  neteconet [ delete | rename ]
[DIR]  netinet [ delete | rename ]
[DIR]  netipx [ delete | rename ]
[DIR]  netiucv [ delete | rename ]
[DIR]  netpacket [ delete | rename ]
[DIR]  netrom [ delete | rename ]
[DIR]  netrose [ delete | rename ]
[DIR]  nfs [ delete | rename ]
[DIR]  openssl [ delete | rename ]
[DIR]  pcp [ delete | rename ]
[DIR]  protobuf-c [ delete | rename ]
[DIR]  protocols [ delete | rename ]
[DIR]  python3.9 [ delete | rename ]
[DIR]  rdma [ delete | rename ]
[DIR]  rpc [ delete | rename ]
[DIR]  rpcsvc [ delete | rename ]
[DIR]  scsi [ delete | rename ]
[DIR]  security [ delete | rename ]
[DIR]  selinux [ delete | rename ]
[DIR]  sepol [ delete | rename ]
[DIR]  sound [ delete | rename ]
[DIR]  sys [ delete | rename ]
[DIR]  sysprof-4 [ delete | rename ]
[DIR]  tirpc [ delete | rename ]
[DIR]  unicode [ delete | rename ]
[DIR]  video [ delete | rename ]
[DIR]  webp [ delete | rename ]
[DIR]  X11 [ delete | rename ]
[DIR]  xcb [ delete | rename ]
[DIR]  xen [ delete | rename ]
[FILE] a.out.h [ edit | delete | rename ]
[FILE] aio.h [ edit | delete | rename ]
[FILE] aliases.h [ edit | delete | rename ]
[FILE] alloca.h [ edit | delete | rename ]
[FILE] ar.h [ edit | delete | rename ]
[FILE] argp.h [ edit | delete | rename ]
[FILE] argz.h [ edit | delete | rename ]
[FILE] assert.h [ edit | delete | rename ]
[FILE] autosprintf.h [ edit | delete | rename ]
[FILE] byteswap.h [ edit | delete | rename ]
[FILE] bzlib.h [ edit | delete | rename ]
[FILE] complex.h [ edit | delete | rename ]
[FILE] com_err.h [ edit | delete | rename ]
[FILE] cpio.h [ edit | delete | rename ]
[FILE] cpuidle.h [ edit | delete | rename ]
[FILE] crypt.h [ edit | delete | rename ]
[FILE] ctype.h [ edit | delete | rename ]
[FILE] curses.h [ edit | delete | rename ]
[FILE] cursesapp.h [ edit | delete | rename ]
[FILE] cursesf.h [ edit | delete | rename ]
[FILE] cursesm.h [ edit | delete | rename ]
[FILE] cursesp.h [ edit | delete | rename ]
[FILE] cursesw.h [ edit | delete | rename ]
[FILE] cursslk.h [ edit | delete | rename ]
[FILE] dbm.h [ edit | delete | rename ]
[FILE] dirent.h [ edit | delete | rename ]
[FILE] dlfcn.h [ edit | delete | rename ]
[FILE] elf.h [ edit | delete | rename ]
[FILE] endian.h [ edit | delete | rename ]
[FILE] entities.h [ edit | delete | rename ]
[FILE] envz.h [ edit | delete | rename ]
[FILE] err.h [ edit | delete | rename ]
[FILE] errno.h [ edit | delete | rename ]
[FILE] error.h [ edit | delete | rename ]
[FILE] eti.h [ edit | delete | rename ]
[FILE] etip.h [ edit | delete | rename ]
[FILE] evdns.h [ edit | delete | rename ]
[FILE] event.h [ edit | delete | rename ]
[FILE] evhttp.h [ edit | delete | rename ]
[FILE] evrpc.h [ edit | delete | rename ]
[FILE] evutil.h [ edit | delete | rename ]
[FILE] execinfo.h [ edit | delete | rename ]
[FILE] expat.h [ edit | delete | rename ]
[FILE] expat_config.h [ edit | delete | rename ]
[FILE] expat_external.h [ edit | delete | rename ]
[FILE] fcntl.h [ edit | delete | rename ]
[FILE] features-time64.h [ edit | delete | rename ]
[FILE] features.h [ edit | delete | rename ]
[FILE] fenv.h [ edit | delete | rename ]
[FILE] ffi-x86_64.h [ edit | delete | rename ]
[FILE] ffi.h [ edit | delete | rename ]
[FILE] ffitarget-x86_64.h [ edit | delete | rename ]
[FILE] ffitarget.h [ edit | delete | rename ]
[FILE] FlexLexer.h [ edit | delete | rename ]
[FILE] fmtmsg.h [ edit | delete | rename ]
[FILE] fnmatch.h [ edit | delete | rename ]
[FILE] form.h [ edit | delete | rename ]
[FILE] fpu_control.h [ edit | delete | rename ]
[FILE] fstab.h [ edit | delete | rename ]
[FILE] fstrm.h [ edit | delete | rename ]
[FILE] fts.h [ edit | delete | rename ]
[FILE] ftw.h [ edit | delete | rename ]
[FILE] gconv.h [ edit | delete | rename ]
[FILE] gd.h [ edit | delete | rename ]
[FILE] gdbm.h [ edit | delete | rename ]
[FILE] gdcache.h [ edit | delete | rename ]
[FILE] gdfontg.h [ edit | delete | rename ]
[FILE] gdfontl.h [ edit | delete | rename ]
[FILE] gdfontmb.h [ edit | delete | rename ]
[FILE] gdfonts.h [ edit | delete | rename ]
[FILE] gdfontt.h [ edit | delete | rename ]
[FILE] gdfx.h [ edit | delete | rename ]
[FILE] gdpp.h [ edit | delete | rename ]
[FILE] gd_color_map.h [ edit | delete | rename ]
[FILE] gd_errors.h [ edit | delete | rename ]
[FILE] gd_io.h [ edit | delete | rename ]
[FILE] gelf.h [ edit | delete | rename ]
[FILE] getopt.h [ edit | delete | rename ]
[FILE] gettext-po.h [ edit | delete | rename ]
[FILE] glob.h [ edit | delete | rename ]
[FILE] gnu-versions.h [ edit | delete | rename ]
[FILE] gnumake.h [ edit | delete | rename ]
[FILE] gpg-error.h [ edit | delete | rename ]
[FILE] gpgrt.h [ edit | delete | rename ]
[FILE] grp.h [ edit | delete | rename ]
[FILE] gshadow.h [ edit | delete | rename ]
[FILE] gssapi.h [ edit | delete | rename ]
[FILE] iconv.h [ edit | delete | rename ]
[FILE] idn-free.h [ edit | delete | rename ]
[FILE] idn-int.h [ edit | delete | rename ]
[FILE] idna.h [ edit | delete | rename ]
[FILE] ieee754.h [ edit | delete | rename ]
[FILE] ifaddrs.h [ edit | delete | rename ]
[FILE] inttypes.h [ edit | delete | rename ]
[FILE] jconfig-64.h [ edit | delete | rename ]
[FILE] jconfig.h [ edit | delete | rename ]
[FILE] jerror.h [ edit | delete | rename ]
[FILE] jmorecfg.h [ edit | delete | rename ]
[FILE] jpegint.h [ edit | delete | rename ]
[FILE] jpeglib.h [ edit | delete | rename ]
[FILE] kdb.h [ edit | delete | rename ]
[FILE] keyutils.h [ edit | delete | rename ]
[FILE] krad.h [ edit | delete | rename ]
[FILE] krb5.h [ edit | delete | rename ]
[FILE] langinfo.h [ edit | delete | rename ]
[FILE] lastlog.h [ edit | delete | rename ]
[FILE] libaio.h [ edit | delete | rename ]
[FILE] libelf.h [ edit | delete | rename ]
[FILE] libgen.h [ edit | delete | rename ]
[FILE] libintl.h [ edit | delete | rename ]
[FILE] libtasn1.h [ edit | delete | rename ]
[FILE] limits.h [ edit | delete | rename ]
[FILE] link.h [ edit | delete | rename ]
[FILE] lmdb.h [ edit | delete | rename ]
[FILE] locale.h [ edit | delete | rename ]
[FILE] ltdl.h [ edit | delete | rename ]
[FILE] lzma.h [ edit | delete | rename ]
[FILE] malloc.h [ edit | delete | rename ]
[FILE] math.h [ edit | delete | rename ]
[FILE] maxminddb.h [ edit | delete | rename ]
[FILE] maxminddb_config-64.h [ edit | delete | rename ]
[FILE] maxminddb_config.h [ edit | delete | rename ]
[FILE] mcheck.h [ edit | delete | rename ]
[FILE] memory.h [ edit | delete | rename ]
[FILE] menu.h [ edit | delete | rename ]
[FILE] mntent.h [ edit | delete | rename ]
[FILE] monetary.h [ edit | delete | rename ]
[FILE] mqueue.h [ edit | delete | rename ]
[FILE] ncurses.h [ edit | delete | rename ]
[FILE] ncurses_dll.h [ edit | delete | rename ]
[FILE] nc_tparm.h [ edit | delete | rename ]
[FILE] ndbm.h [ edit | delete | rename ]
[FILE] netdb.h [ edit | delete | rename ]
[FILE] nlist.h [ edit | delete | rename ]
[FILE] nl_types.h [ edit | delete | rename ]
[FILE] nss.h [ edit | delete | rename ]
[FILE] obstack.h [ edit | delete | rename ]
[FILE] panel.h [ edit | delete | rename ]
[FILE] paths.h [ edit | delete | rename ]
[FILE] pcre.h [ edit | delete | rename ]
[FILE] pcre2.h [ edit | delete | rename ]
[FILE] pcre2posix.h [ edit | delete | rename ]
[FILE] pcrecpp.h [ edit | delete | rename ]
[FILE] pcrecpparg.h [ edit | delete | rename ]
[FILE] pcreposix.h [ edit | delete | rename ]
[FILE] pcre_scanner.h [ edit | delete | rename ]
[FILE] pcre_stringpiece.h [ edit | delete | rename ]
[FILE] png.h [ edit | delete | rename ]
[FILE] pngconf.h [ edit | delete | rename ]
[FILE] pnglibconf.h [ edit | delete | rename ]
[FILE] poll.h [ edit | delete | rename ]
[FILE] powercap.h [ edit | delete | rename ]
[FILE] pr29.h [ edit | delete | rename ]
[FILE] printf.h [ edit | delete | rename ]
[FILE] proc_service.h [ edit | delete | rename ]
[FILE] profile.h [ edit | delete | rename ]
[FILE] pthread.h [ edit | delete | rename ]
[FILE] pty.h [ edit | delete | rename ]
[FILE] punycode.h [ edit | delete | rename ]
[FILE] pwd.h [ edit | delete | rename ]
[FILE] regex.h [ edit | delete | rename ]
[FILE] regexp.h [ edit | delete | rename ]
[FILE] resolv.h [ edit | delete | rename ]
[FILE] re_comp.h [ edit | delete | rename ]
[FILE] sched.h [ edit | delete | rename ]
[FILE] search.h [ edit | delete | rename ]
[FILE] semaphore.h [ edit | delete | rename ]
[FILE] setjmp.h [ edit | delete | rename ]
[FILE] sgtty.h [ edit | delete | rename ]
[FILE] shadow.h [ edit | delete | rename ]
[FILE] signal.h [ edit | delete | rename ]
[FILE] spawn.h [ edit | delete | rename ]
[FILE] stab.h [ edit | delete | rename ]
[FILE] stdc-predef.h [ edit | delete | rename ]
[FILE] stdint.h [ edit | delete | rename ]
[FILE] stdio.h [ edit | delete | rename ]
[FILE] stdio_ext.h [ edit | delete | rename ]
[FILE] stdlib.h [ edit | delete | rename ]
[FILE] string.h [ edit | delete | rename ]
[FILE] stringprep.h [ edit | delete | rename ]
[FILE] strings.h [ edit | delete | rename ]
[FILE] syscall.h [ edit | delete | rename ]
[FILE] sysexits.h [ edit | delete | rename ]
[FILE] syslog.h [ edit | delete | rename ]
[FILE] tar.h [ edit | delete | rename ]
[FILE] term.h [ edit | delete | rename ]
[FILE] termcap.h [ edit | delete | rename ]
[FILE] termio.h [ edit | delete | rename ]
[FILE] termios.h [ edit | delete | rename ]
[FILE] term_entry.h [ edit | delete | rename ]
[FILE] tgmath.h [ edit | delete | rename ]
[FILE] threads.h [ edit | delete | rename ]
[FILE] thread_db.h [ edit | delete | rename ]
[FILE] tic.h [ edit | delete | rename ]
[FILE] tiff.h [ edit | delete | rename ]
[FILE] tiffconf-64.h [ edit | delete | rename ]
[FILE] tiffconf.h [ edit | delete | rename ]
[FILE] tiffio.h [ edit | delete | rename ]
[FILE] tiffio.hxx [ edit | delete | rename ]
[FILE] tiffvers.h [ edit | delete | rename ]
[FILE] time.h [ edit | delete | rename ]
[FILE] tld.h [ edit | delete | rename ]
[FILE] ttyent.h [ edit | delete | rename ]
[FILE] uchar.h [ edit | delete | rename ]
[FILE] ucontext.h [ edit | delete | rename ]
[FILE] ulimit.h [ edit | delete | rename ]
[FILE] unctrl.h [ edit | delete | rename ]
[FILE] unistd.h [ edit | delete | rename ]
[FILE] utime.h [ edit | delete | rename ]
[FILE] utmp.h [ edit | delete | rename ]
[FILE] utmpx.h [ edit | delete | rename ]
[FILE] values.h [ edit | delete | rename ]
[FILE] verto-module.h [ edit | delete | rename ]
[FILE] verto.h [ edit | delete | rename ]
[FILE] wait.h [ edit | delete | rename ]
[FILE] wchar.h [ edit | delete | rename ]
[FILE] wctype.h [ edit | delete | rename ]
[FILE] wordexp.h [ edit | delete | rename ]
[FILE] zconf.h [ edit | delete | rename ]
[FILE] zdict.h [ edit | delete | rename ]
[FILE] zlib.h [ edit | delete | rename ]
[FILE] zstd.h [ edit | delete | rename ]
[FILE] zstd_errors.h [ edit | delete | rename ]

Viewing: /usr/include/cursesm.h

// * This makes emacs happy -*-Mode: C++;-*-
/****************************************************************************
 * Copyright 2019,2020 Thomas E. Dickey                                     *
 * Copyright 1998-2012,2014 Free Software Foundation, Inc.                  *
 *                                                                          *
 * Permission is hereby granted, free of charge, to any person obtaining a  *
 * copy of this software and associated documentation files (the            *
 * "Software"), to deal in the Software without restriction, including      *
 * without limitation the rights to use, copy, modify, merge, publish,      *
 * distribute, distribute with modifications, sublicense, and/or sell       *
 * copies of the Software, and to permit persons to whom the Software is    *
 * furnished to do so, subject to the following conditions:                 *
 *                                                                          *
 * The above copyright notice and this permission notice shall be included  *
 * in all copies or substantial portions of the Software.                   *
 *                                                                          *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
 *                                                                          *
 * Except as contained in this notice, the name(s) of the above copyright   *
 * holders shall not be used in advertising or otherwise to promote the     *
 * sale, use or other dealings in this Software without prior written       *
 * authorization.                                                           *
 ****************************************************************************/

/****************************************************************************
 *   Author: Juergen Pfeifer, 1997                                          *
 ****************************************************************************/

// $Id: cursesm.h,v 1.34 2020/05/24 01:40:20 anonymous.maarten Exp $

#ifndef NCURSES_CURSESM_H_incl
#define NCURSES_CURSESM_H_incl 1

#include <cursesp.h>

extern "C" {
#  include <menu.h>
}
//
// -------------------------------------------------------------------------
// This wraps the ITEM type of <menu.h>
// -------------------------------------------------------------------------
//
class NCURSES_CXX_IMPEXP NCursesMenuItem
{
  friend class NCursesMenu;

protected:
  ITEM *item;

  inline void OnError (int err) const THROW2(NCursesException const, NCursesMenuException) {
    if (err != E_OK)
      THROW(new NCursesMenuException (err));
  }

public:
  NCursesMenuItem (const char* p_name     = NULL,
		   const char* p_descript = NULL)
    : item(0)
  {
    item = p_name ? ::new_item (p_name, p_descript) : STATIC_CAST(ITEM*)(0);
    if (p_name && !item)
      OnError (E_SYSTEM_ERROR);
  }
  // Create an item. If you pass both parameters as NULL, a delimiting
  // item is constructed which can be used to terminate a list of
  // NCursesMenu objects.

  NCursesMenuItem& operator=(const NCursesMenuItem& rhs)
  {
    if (this != &rhs) {
      *this = rhs;
    }
    return *this;
  }

  NCursesMenuItem(const NCursesMenuItem& rhs)
    : item(0)
  {
    (void) rhs;
  }

  virtual ~NCursesMenuItem () THROWS(NCursesException);
  // Release the items memory

  inline const char* name () const {
    return ::item_name (item);
  }
  // Name of the item

  inline const char* description () const {
    return ::item_description (item);
  }
  // Description of the item

  inline int (index) (void) const {
    return ::item_index (item);
  }
  // Index of the item in an item array (or -1)

  inline void options_on (Item_Options opts) {
    OnError (::item_opts_on (item, opts));
  }
  // Switch on the items options

  inline void options_off (Item_Options opts) {
    OnError (::item_opts_off (item, opts));
  }
  // Switch off the item's option

  inline Item_Options options () const {
    return ::item_opts (item);
  }
  // Retrieve the items options

  inline void set_options (Item_Options opts) {
    OnError (::set_item_opts (item, opts));
  }
  // Set the items options

  inline void set_value (bool f) {
    OnError (::set_item_value (item,f));
  }
  // Set/Reset the items selection state

  inline bool value () const {
    return ::item_value (item);
  }
  // Retrieve the items selection state

  inline bool visible () const {
    return ::item_visible (item);
  }
  // Retrieve visibility of the item

  virtual bool action();
  // Perform an action associated with this item; you may use this in an
  // user supplied driver for a menu; you may derive from this class and
  // overload action() to supply items with different actions.
  // If an action returns true, the menu will be exited. The default action
  // is to do nothing.
};

// Prototype for an items callback function.
typedef bool ITEMCALLBACK(NCursesMenuItem&);

// If you don't like to create a child class for individual items to
// overload action(), you may use this class and provide a callback
// function pointer for items.
class NCURSES_CXX_IMPEXP NCursesMenuCallbackItem : public NCursesMenuItem
{
private:
  ITEMCALLBACK* p_fct;

public:
  NCursesMenuCallbackItem(ITEMCALLBACK* fct       = NULL,
			  const char* p_name      = NULL,
			  const char* p_descript  = NULL )
    : NCursesMenuItem (p_name, p_descript),
      p_fct (fct) {
  }

  NCursesMenuCallbackItem& operator=(const NCursesMenuCallbackItem& rhs)
  {
    if (this != &rhs) {
      *this = rhs;
    }
    return *this;
  }

  NCursesMenuCallbackItem(const NCursesMenuCallbackItem& rhs)
    : NCursesMenuItem(rhs),
      p_fct(0)
  {
  }

  virtual ~NCursesMenuCallbackItem() THROWS(NCursesException);

  bool action();
};

  // This are the built-in hook functions in this C++ binding. In C++ we use
  // virtual member functions (see below On_..._Init and On_..._Termination)
  // to provide this functionality in an object oriented manner.
extern "C" {
  void _nc_xx_mnu_init(MENU *);
  void _nc_xx_mnu_term(MENU *);
  void _nc_xx_itm_init(MENU *);
  void _nc_xx_itm_term(MENU *);
}

//
// -------------------------------------------------------------------------
// This wraps the MENU type of <menu.h>
// -------------------------------------------------------------------------
//
class NCURSES_CXX_IMPEXP NCursesMenu : public NCursesPanel
{
protected:
  MENU *menu;

private:
  NCursesWindow* sub;   // the subwindow object
  bool b_sub_owner;     // is this our own subwindow?
  bool b_framed;        // has the menu a border?
  bool b_autoDelete;    // Delete items when deleting menu?

  NCursesMenuItem** my_items; // The array of items for this menu

  // This structure is used for the menu's user data field to link the
  // MENU* to the C++ object and to provide extra space for a user pointer.
  typedef struct {
    void*              m_user;      // the pointer for the user's data
    const NCursesMenu* m_back;      // backward pointer to C++ object
    const MENU*        m_owner;
  } UserHook;

  // Get the backward pointer to the C++ object from a MENU
  static inline NCursesMenu* getHook(const MENU *m) {
    UserHook* hook = STATIC_CAST(UserHook*)(::menu_userptr(m));
    assert(hook != 0 && hook->m_owner==m);
    return const_cast<NCursesMenu*>(hook->m_back);
  }

  friend void _nc_xx_mnu_init(MENU *);
  friend void _nc_xx_mnu_term(MENU *);
  friend void _nc_xx_itm_init(MENU *);
  friend void _nc_xx_itm_term(MENU *);

  // Calculate ITEM* array for the menu
  ITEM** mapItems(NCursesMenuItem* nitems[]);

protected:
  // internal routines
  inline void set_user(void *user) {
    UserHook* uptr = STATIC_CAST(UserHook*)(::menu_userptr (menu));
    assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==menu);
    uptr->m_user = user;
  }

  inline void *get_user() {
    UserHook* uptr = STATIC_CAST(UserHook*)(::menu_userptr (menu));
    assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==menu);
    return uptr->m_user;
  }

  void InitMenu (NCursesMenuItem* menu[],
		 bool with_frame,
		 bool autoDeleteItems);

  inline void OnError (int err) const THROW2(NCursesException const, NCursesMenuException) {
    if (err != E_OK)
      THROW(new NCursesMenuException (this, err));
  }

  // this wraps the menu_driver call.
  virtual int driver (int c) ;

  // 'Internal' constructor to create a menu without association to
  // an array of items.
  NCursesMenu( int  nlines,
	       int  ncols,
	       int  begin_y = 0,
	       int  begin_x = 0)
    : NCursesPanel(nlines,ncols,begin_y,begin_x),
      menu (STATIC_CAST(MENU*)(0)),
      sub(0),
      b_sub_owner(0),
      b_framed(0),
      b_autoDelete(0),
      my_items(0)
  {
  }

public:
  // Make a full window size menu
  NCursesMenu (NCursesMenuItem* Items[],
	       bool with_frame=FALSE,        // Reserve space for a frame?
	       bool autoDelete_Items=FALSE)  // Autocleanup of Items?
    : NCursesPanel(),
      menu(0),
      sub(0),
      b_sub_owner(0),
      b_framed(0),
      b_autoDelete(0),
      my_items(0)
  {
      InitMenu(Items, with_frame, autoDelete_Items);
  }

  // Make a menu with a window of this size.
  NCursesMenu (NCursesMenuItem* Items[],
	       int  nlines,
	       int  ncols,
	       int  begin_y = 0,
	       int  begin_x = 0,
	       bool with_frame=FALSE,        // Reserve space for a frame?
	       bool autoDelete_Items=FALSE)  // Autocleanup of Items?
    : NCursesPanel(nlines, ncols, begin_y, begin_x),
      menu(0),
      sub(0),
      b_sub_owner(0),
      b_framed(0),
      b_autoDelete(0),
      my_items(0)
  {
      InitMenu(Items, with_frame, autoDelete_Items);
  }

  NCursesMenu& operator=(const NCursesMenu& rhs)
  {
    if (this != &rhs) {
      *this = rhs;
      NCursesPanel::operator=(rhs);
    }
    return *this;
  }

  NCursesMenu(const NCursesMenu& rhs)
    : NCursesPanel(rhs),
      menu(rhs.menu),
      sub(rhs.sub),
      b_sub_owner(rhs.b_sub_owner),
      b_framed(rhs.b_framed),
      b_autoDelete(rhs.b_autoDelete),
      my_items(rhs.my_items)
  {
  }

  virtual ~NCursesMenu () THROWS(NCursesException);

  // Retrieve the menus subwindow
  inline NCursesWindow& subWindow() const {
    assert(sub!=NULL);
    return *sub;
  }

  // Set the menus subwindow
  void setSubWindow(NCursesWindow& sub);

  // Set these items for the menu
  inline void setItems(NCursesMenuItem* Items[]) {
    OnError(::set_menu_items(menu,mapItems(Items)));
  }

  // Remove the menu from the screen
  inline void unpost (void) {
    OnError (::unpost_menu (menu));
  }

  // Post the menu to the screen if flag is true, unpost it otherwise
  inline void post(bool flag = TRUE) {
    flag ? OnError (::post_menu(menu)) : OnError (::unpost_menu (menu));
  }

  // Get the number of rows and columns for this menu
  inline void scale (int& mrows, int& mcols) const  {
    OnError (::scale_menu (menu, &mrows, &mcols));
  }

  // Set the format of this menu
  inline void set_format(int mrows, int mcols) {
    OnError (::set_menu_format(menu, mrows, mcols));
  }

  // Get the format of this menu
  inline void menu_format(int& rows,int& ncols) {
    ::menu_format(menu,&rows,&ncols);
  }

  // Items of the menu
  inline NCursesMenuItem* items() const {
    return *my_items;
  }

  // Get the number of items in this menu
  inline int count() const {
    return ::item_count(menu);
  }

  // Get the current item (i.e. the one the cursor is located)
  inline NCursesMenuItem* current_item() const {
    return my_items[::item_index(::current_item(menu))];
  }

  // Get the marker string
  inline const char* mark() const {
    return ::menu_mark(menu);
  }

  // Set the marker string
  inline void set_mark(const char *marker) {
    OnError (::set_menu_mark (menu, marker));
  }

  // Get the name of the request code c
  inline static const char* request_name(int c) {
    return ::menu_request_name(c);
  }

  // Get the current pattern
  inline char* pattern() const {
    return ::menu_pattern(menu);
  }

  // true if there is a pattern match, false otherwise.
  bool set_pattern (const char *pat);

  // set the default attributes for the menu
  // i.e. set fore, back and grey attribute
  virtual void setDefaultAttributes();

  // Get the menus background attributes
  inline chtype back() const {
    return ::menu_back(menu);
  }

  // Get the menus foreground attributes
  inline chtype fore() const {
    return ::menu_fore(menu);
  }

  // Get the menus grey attributes (used for unselectable items)
  inline chtype grey() const {
    return ::menu_grey(menu);
  }

  // Set the menus background attributes
  inline chtype set_background(chtype a) {
    return ::set_menu_back(menu,a);
  }

  // Set the menus foreground attributes
  inline chtype set_foreground(chtype a) {
    return ::set_menu_fore(menu,a);
  }

  // Set the menus grey attributes (used for unselectable items)
  inline chtype set_grey(chtype a) {
    return ::set_menu_grey(menu,a);
  }

  inline void options_on (Menu_Options opts) {
    OnError (::menu_opts_on (menu,opts));
  }

  inline void options_off(Menu_Options opts) {
    OnError (::menu_opts_off(menu,opts));
  }

  inline Menu_Options options() const {
    return ::menu_opts(menu);
  }

  inline void set_options (Menu_Options opts) {
    OnError (::set_menu_opts (menu,opts));
  }

  inline int pad() const {
    return ::menu_pad(menu);
  }

  inline void set_pad (int padch) {
    OnError (::set_menu_pad (menu, padch));
  }

  // Position the cursor to the current item
  inline void position_cursor () const {
    OnError (::pos_menu_cursor (menu));
  }

  // Set the current item
  inline void set_current(NCursesMenuItem& I) {
    OnError (::set_current_item(menu, I.item));
  }

  // Get the current top row of the menu
  inline int top_row (void) const {
    return ::top_row (menu);
  }

  // Set the current top row of the menu
  inline void set_top_row (int row) {
    OnError (::set_top_row (menu, row));
  }

  // spacing control
  // Set the spacing for the menu
  inline void setSpacing(int spc_description,
			 int spc_rows,
			 int spc_columns) {
    OnError(::set_menu_spacing(menu,
			       spc_description,
			       spc_rows,
			       spc_columns));
  }

  // Get the spacing info for the menu
  inline void Spacing(int& spc_description,
		      int& spc_rows,
		      int& spc_columns) const {
    OnError(::menu_spacing(menu,
			   &spc_description,
			   &spc_rows,
			   &spc_columns));
  }

  // Decorations
  inline void frame(const char *title=NULL, const char* btitle=NULL) {
    if (b_framed)
      NCursesPanel::frame(title,btitle);
    else
      OnError(E_SYSTEM_ERROR);
  }

  inline void boldframe(const char *title=NULL, const char* btitle=NULL) {
    if (b_framed)
      NCursesPanel::boldframe(title,btitle);
    else
      OnError(E_SYSTEM_ERROR);
  }

  inline void label(const char *topLabel, const char *bottomLabel) {
    if (b_framed)
      NCursesPanel::label(topLabel,bottomLabel);
    else
      OnError(E_SYSTEM_ERROR);
  }

  // -----
  // Hooks
  // -----

  // Called after the menu gets repositioned in its window.
  // This is especially true if the menu is posted.
  virtual void On_Menu_Init();

  // Called before the menu gets repositioned in its window.
  // This is especially true if the menu is unposted.
  virtual void On_Menu_Termination();

  // Called after the item became the current item
  virtual void On_Item_Init(NCursesMenuItem& item);

  // Called before this item is left as current item.
  virtual void On_Item_Termination(NCursesMenuItem& item);

  // Provide a default key virtualization. Translate the keyboard
  // code c into a menu request code.
  // The default implementation provides a hopefully straightforward
  // mapping for the most common keystrokes and menu requests.
  virtual int virtualize(int c);


  // Operators
  inline NCursesMenuItem* operator[](int i) const {
    if ( (i < 0) || (i >= ::item_count (menu)) )
      OnError (E_BAD_ARGUMENT);
    return (my_items[i]);
  }

  // Perform the menu's operation
  // Return the item where you left the selection mark for a single
  // selection menu, or NULL for a multivalued menu.
  virtual NCursesMenuItem* operator()(void);

  // --------------------
  // Exception handlers
  // Called by operator()
  // --------------------

  // Called if the request is denied
  virtual void On_Request_Denied(int c) const;

  // Called if the item is not selectable
  virtual void On_Not_Selectable(int c) const;

  // Called if pattern doesn't match
  virtual void On_No_Match(int c) const;

  // Called if the command is unknown
  virtual void On_Unknown_Command(int c) const;

};
//
// -------------------------------------------------------------------------
// This is the typical C++ typesafe way to allow to attach
// user data to an item of a menu. Its assumed that the user
// data belongs to some class T. Use T as template argument
// to create a UserItem.
// -------------------------------------------------------------------------
//
template<class T> class NCURSES_CXX_IMPEXP NCursesUserItem : public NCursesMenuItem
{
public:
  NCursesUserItem (const char* p_name,
		   const char* p_descript = NULL,
		   const T* p_UserData    = STATIC_CAST(T*)(0))
    : NCursesMenuItem (p_name, p_descript) {
      if (item)
	OnError (::set_item_userptr (item, const_cast<void *>(reinterpret_cast<const void*>(p_UserData))));
  }

  virtual ~NCursesUserItem() THROWS(NCursesException) {}

  inline const T* UserData (void) const {
    return reinterpret_cast<const T*>(::item_userptr (item));
  };

  inline virtual void setUserData(const T* p_UserData) {
    if (item)
      OnError (::set_item_userptr (item, const_cast<void *>(reinterpret_cast<const void *>(p_UserData))));
  }
};
//
// -------------------------------------------------------------------------
// The same mechanism is used to attach user data to a menu
// -------------------------------------------------------------------------
//
template<class T> class NCURSES_CXX_IMPEXP NCursesUserMenu : public NCursesMenu
{
protected:
  NCursesUserMenu( int  nlines,
		   int  ncols,
		   int  begin_y = 0,
		   int  begin_x = 0,
		   const T* p_UserData = STATIC_CAST(T*)(0))
    : NCursesMenu(nlines,ncols,begin_y,begin_x) {
      if (menu)
	set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData)));
  }

public:
  NCursesUserMenu (NCursesMenuItem* Items[],
		   const T* p_UserData = STATIC_CAST(T*)(0),
		   bool with_frame=FALSE,
		   bool autoDelete_Items=FALSE)
    : NCursesMenu (Items, with_frame, autoDelete_Items) {
      if (menu)
	set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData)));
  };

  NCursesUserMenu (NCursesMenuItem* Items[],
		   int nlines,
		   int ncols,
		   int begin_y = 0,
		   int begin_x = 0,
		   const T* p_UserData = STATIC_CAST(T*)(0),
		   bool with_frame=FALSE)
    : NCursesMenu (Items, nlines, ncols, begin_y, begin_x, with_frame) {
      if (menu)
	set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData)));
  };

  virtual ~NCursesUserMenu() THROWS(NCursesException) {
  };

  inline T* UserData (void) {
    return reinterpret_cast<T*>(get_user ());
  };

  inline virtual void setUserData (const T* p_UserData) {
    if (menu)
      set_user (const_cast<void *>(reinterpret_cast<const void*>(p_UserData)));
  }
};

#endif /* NCURSES_CURSESM_H_incl */

Upload File: