X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=menu%2Fm_new.c;h=be175581ba193f3924d61159419353a0a6c9e838;hp=ba2b90cffe193f5997baa4a6dc618b1daa4cf825;hb=HEAD;hpb=0eb88fc5281804773e2a0c7a488a4452463535ce diff --git a/menu/m_new.c b/menu/m_new.c index ba2b90cf..be175581 100644 --- a/menu/m_new.c +++ b/menu/m_new.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998 Free Software Foundation, Inc. * + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2009,2010 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 * @@ -27,7 +28,7 @@ ****************************************************************************/ /**************************************************************************** - * Author: Juergen Pfeifer 1995,1997 * + * Author: Juergen Pfeifer, 1995,1997 * ****************************************************************************/ /*************************************************************************** @@ -37,12 +38,12 @@ #include "menu.priv.h" -MODULE_ID("$Id: m_new.c,v 1.10 1999/05/16 17:26:59 juergen Exp $") +MODULE_ID("$Id: m_new.c,v 1.27 2021/06/17 21:26:02 tom Exp $") /*--------------------------------------------------------------------------- -| Facility : libnmenu -| Function : MENU *new_menu(ITEM **items) -| +| Facility : libnmenu +| Function : MENU* _nc_new_menu(SCREEN*, ITEM **items) +| | Description : Creates a new menu connected to the item pointer | array items and returns a pointer to the new menu. | The new menu is initialized with the values from the @@ -50,54 +51,89 @@ MODULE_ID("$Id: m_new.c,v 1.10 1999/05/16 17:26:59 juergen Exp $") | | Return Values : NULL on error +--------------------------------------------------------------------------*/ -MENU *new_menu(ITEM ** items) +MENU_EXPORT(MENU *) +NCURSES_SP_NAME(new_menu) (NCURSES_SP_DCLx ITEM **items) { - MENU *menu = (MENU *)calloc(1,sizeof(MENU)); - + int err = E_SYSTEM_ERROR; + MENU *menu = typeCalloc(MENU, 1); + + T((T_CALLED("new_menu(%p,%p)"), (void *)SP_PARM, (void *)items)); if (menu) { + T((T_CREATE("menu %p"), (void *)menu)); *menu = _nc_Default_Menu; menu->status = 0; menu->rows = menu->frows; menu->cols = menu->fcols; +#if NCURSES_SP_FUNCS + /* This ensures userwin and usersub are always non-null, + so we can derive always the SCREEN that this menu is + running on. */ + menu->userwin = SP_PARM->_stdscr; + menu->usersub = SP_PARM->_stdscr; +#endif if (items && *items) { - if (!_nc_Connect_Items(menu,items)) + if (!_nc_Connect_Items(menu, items)) { + err = E_NOT_CONNECTED; free(menu); menu = (MENU *)0; } + else + err = E_OK; } } if (!menu) - SET_ERROR(E_SYSTEM_ERROR); + SET_ERROR(err); + + returnMenu(menu); +} - return(menu); +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : MENU *new_menu(ITEM **items) +| +| Description : Creates a new menu connected to the item pointer +| array items and returns a pointer to the new menu. +| The new menu is initialized with the values from the +| default menu. +| +| Return Values : NULL on error ++--------------------------------------------------------------------------*/ +#if NCURSES_SP_FUNCS +MENU_EXPORT(MENU *) +new_menu(ITEM **items) +{ + return NCURSES_SP_NAME(new_menu) (CURRENT_SCREEN, items); } +#endif /*--------------------------------------------------------------------------- -| Facility : libnmenu -| Function : int free_menu(MENU *menu) -| -| Description : Disconnects menu from its associated item pointer +| Facility : libnmenu +| Function : int free_menu(MENU *menu) +| +| Description : Disconnects menu from its associated item pointer | array and frees the storage allocated for the menu. | | Return Values : E_OK - success | E_BAD_ARGUMENT - Invalid menu pointer passed | E_POSTED - Menu is already posted +--------------------------------------------------------------------------*/ -int free_menu(MENU * menu) +MENU_EXPORT(int) +free_menu(MENU *menu) { + T((T_CALLED("free_menu(%p)"), (void *)menu)); if (!menu) RETURN(E_BAD_ARGUMENT); - - if ( menu->status & _POSTED ) + + if (menu->status & _POSTED) RETURN(E_POSTED); - - if (menu->items) + + if (menu->items) _nc_Disconnect_Items(menu); - + if ((menu->status & _MARK_ALLOCATED) && menu->mark) free(menu->mark);