set_top_row(MENU * menu, int row) { ITEM *item; T((T_CALLED("set_top_row(%p,%d)"), menu, row)); if (menu) { if (menu->status & _IN_DRIVER) RETURN(E_BAD_STATE); if (menu->items == (ITEM **) 0) RETURN(E_NOT_CONNECTED); if ((row < 0) || (row > (menu->rows - menu->arows))) RETURN(E_BAD_ARGUMENT); } else RETURN(E_BAD_ARGUMENT); if (row != menu->toprow) { if (menu->status & _LINK_NEEDED) _nc_Link_Items(menu); item = menu->items[(menu->opt & O_ROWMAJOR) ? (row * menu->cols) : row]; assert(menu->pattern); Reset_Pattern(menu); _nc_New_TopRow_and_CurrentItem(menu, row, item); } RETURN(E_OK); }
set_current_item(MENU * menu, ITEM * item) { T((T_CALLED("set_current_item(%p,%p)"), menu, item)); if (menu && item && (item->imenu == menu)) { if (menu->status & _IN_DRIVER) RETURN(E_BAD_STATE); assert(menu->curitem); if (item != menu->curitem) { if (menu->status & _LINK_NEEDED) { /* * Items are available, but they are not linked together. * So we have to link here. */ _nc_Link_Items(menu); } assert(menu->pattern); Reset_Pattern(menu); /* adjust the window to make item visible and update the menu */ Adjust_Current_Item(menu, menu->toprow, item); } } else RETURN(E_BAD_ARGUMENT); 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); }
set_menu_pattern(MENU * menu, const char *p) { ITEM *matchitem; int matchpos; T((T_CALLED("set_menu_pattern(%p,%s)"), menu, _nc_visbuf(p))); if (!menu || !p) RETURN(E_BAD_ARGUMENT); if (!(menu->items)) RETURN(E_NOT_CONNECTED); if (menu->status & _IN_DRIVER) RETURN(E_BAD_STATE); Reset_Pattern(menu); if (!(*p)) { pos_menu_cursor(menu); RETURN(E_OK); } if (menu->status & _LINK_NEEDED) _nc_Link_Items(menu); matchpos = menu->toprow; matchitem = menu->curitem; assert(matchitem); while (*p) { if (!isprint(UChar(*p)) || (_nc_Match_Next_Character_In_Item_Name(menu, *p, &matchitem) != E_OK)) { Reset_Pattern(menu); pos_menu_cursor(menu); RETURN(E_NO_MATCH); } p++; } /* This is reached if there was a match. So we position to the new item */ Adjust_Current_Item(menu, matchpos, matchitem); RETURN(E_OK); }