set_menu_mark (MENU * menu, const char * mark) { int l; if ( mark && (*mark != '\0') && Is_Printable_String(mark) ) l = strlen(mark); else l = 0; if ( menu ) { char *old_mark = menu->mark; unsigned short old_status = menu->status; if (menu->status & _POSTED) { /* If the menu is already posted, the geometry is fixed. Then we can only accept a mark with exactly the same length */ if (menu->marklen != l) RETURN(E_BAD_ARGUMENT); } menu->marklen = l; if (l) { menu->mark = (char *)malloc(l+1); if (menu->mark) { strcpy(menu->mark, mark); if (menu != &_nc_Default_Menu) menu->status |= _MARK_ALLOCATED; } else { menu->mark = old_mark; RETURN(E_SYSTEM_ERROR); } } else menu->mark = (char *)0; if ((old_status & _MARK_ALLOCATED) && old_mark) free(old_mark); if (menu->status & _POSTED) { _nc_Draw_Menu( menu ); _nc_Show_Menu( menu ); } else { /* Recalculate the geometry */ _nc_Calculate_Item_Length_and_Width( menu ); } } else { return set_menu_mark(&_nc_Default_Menu, mark); } RETURN(E_OK); }
post_menu(MENU * menu) { T((T_CALLED("post_menu(%p)"), (void *)menu)); if (!menu) RETURN(E_BAD_ARGUMENT); if (menu->status & _IN_DRIVER) RETURN(E_BAD_STATE); if (menu->status & _POSTED) RETURN(E_POSTED); if (menu->items && *(menu->items)) { int y; int h = 1 + menu->spc_rows * (menu->rows - 1); WINDOW *win = Get_Menu_Window(menu); int maxy = getmaxy(win); if ((menu->win = newpad(h, menu->width))) { y = (maxy >= h) ? h : maxy; if (y >= menu->height) y = menu->height; if (!(menu->sub = subpad(menu->win, y, menu->width, 0, 0))) RETURN(E_SYSTEM_ERROR); } else RETURN(E_SYSTEM_ERROR); if (menu->status & _LINK_NEEDED) _nc_Link_Items(menu); } else RETURN(E_NOT_CONNECTED); menu->status |= _POSTED; if (!(menu->opt & O_ONEVALUE)) { ITEM **items; for (items = menu->items; *items; items++) { (*items)->value = FALSE; } } _nc_Draw_Menu(menu); Call_Hook(menu, menuinit); Call_Hook(menu, iteminit); _nc_Show_Menu(menu); RETURN(E_OK); }