<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<!-- 
  * t
  ****************************************************************************
  * Copyright (c) 1998-2006,2007 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.                                                           *
  ****************************************************************************
  * @Id: menu_hook.3x,v 1.9 2007/02/24 17:34:08 tom Exp @
-->
<HTML>
<HEAD>
<TITLE>menu_hook 3x</TITLE>
<link rev=made href="mailto:bug-ncurses@gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</HEAD>
<BODY>
<H1>menu_hook 3x</H1>
<HR>
<PRE>
<!-- Manpage converted by man2html 3.0.1 -->
<STRONG><A HREF="menu_hook.3x.html">menu_hook(3x)</A></STRONG>                                             <STRONG><A HREF="menu_hook.3x.html">menu_hook(3x)</A></STRONG>




</PRE>
<H2>NAME</H2><PRE>
       <STRONG>menu_hook</STRONG> - set hooks for automatic invocation by applica-
       tions


</PRE>
<H2>SYNOPSIS</H2><PRE>
       <STRONG>#include</STRONG> <STRONG>&lt;menu.h&gt;</STRONG>
       int set_item_init(MENU *menu, Menu_Hook func);
       Menu_Hook item_init(const MENU *menu);
       int set_item_term(MENU *menu, Menu_Hook func);
       Menu_Hook item_term(const MENU *menu);
       int set_menu_init(MENU *menu, Menu_Hook func);
       Menu_Hook menu_init(const MENU *menu);
       int set_menu_term(MENU *menu, Menu_Hook func);
       Menu_Hook menu_term(const MENU *menu);


</PRE>
<H2>DESCRIPTION</H2><PRE>
       These functions make it possible to set hook functions  to
       be called at various points in the automatic processing of
       input event codes by <STRONG>menu_driver</STRONG>.

       The function <STRONG>set_item_init</STRONG> sets a hook  to  be  called  at
       menu-post  time  and  each  time the selected item changes
       (after the change).  <STRONG>item_init</STRONG> returns  the  current  item
       init hook, if any (<STRONG>NULL</STRONG> if there is no such hook).

       The  function  <STRONG>set_item_term</STRONG>  sets  a hook to be called at
       menu-unpost time and each time the selected  item  changes
       (before  the  change).  <STRONG>item_term</STRONG> returns the current item
       term hook, if any (<STRONG>NULL</STRONG> if there is no such hook).

       The function <STRONG>set_menu_init</STRONG> sets a hook  to  be  called  at
       menu-post  time  and  just  after  the top row on the menu
       changes once it is posted.  <STRONG>menu_init</STRONG> returns the  current
       menu init hook, if any (<STRONG>NULL</STRONG> if there is no such hook).

       The  function  <STRONG>set_menu_term</STRONG>  sets  a hook to be called at
       menu-unpost time and just before the top row on  the  menu
       changes  once it is posted.  <STRONG>menu_term</STRONG> returns the current
       menu term hook, if any (<STRONG>NULL</STRONG> if there is no such hook).


</PRE>
<H2>RETURN VALUE</H2><PRE>
       Routines that return pointers return <STRONG>NULL</STRONG> on error.  Other
       routines return one of the following:

       <STRONG>E_OK</STRONG> The routine succeeded.

       <STRONG>E_SYSTEM_ERROR</STRONG>
            System error occurred (see <STRONG>errno</STRONG>).


</PRE>
<H2>SEE ALSO</H2><PRE>
       <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="menu.3x.html">menu(3x)</A></STRONG>.


</PRE>
<H2>NOTES</H2><PRE>
       The header file <STRONG>&lt;menu.h&gt;</STRONG> automatically includes the header
       file <STRONG>&lt;curses.h&gt;</STRONG>.


</PRE>
<H2>PORTABILITY</H2><PRE>
       These routines emulate the System V  menu  library.   They
       were not supported on Version 7 or BSD versions.


</PRE>
<H2>AUTHORS</H2><PRE>
       Juergen  Pfeifer.   Manual  pages  and  adaptation for new
       curses by Eric S. Raymond.



                                                          <STRONG><A HREF="menu_hook.3x.html">menu_hook(3x)</A></STRONG>
</PRE>
<HR>
<ADDRESS>
Man(1) output converted with
<a href="http://www.oac.uci.edu/indiv/ehood/man2html.html">man2html</a>
</ADDRESS>
</BODY>
</HTML>
