Faydalı Kullanıcı Göstericisi

Menüdeki her öğeye bir kullanıcı göstericisi atayabiliriz. Panellerdeki kullanıcı göstericisi ile aynı şekilde çalışmaktadır. Menü sistemi tarafından kullanılmazlar. Bunlar içerisine istediğiniz herhangi bir şeyi koyabilirsiniz. Ben genelde menü seçeneği seçildiğinde çalışacak işlevi (seçilen ve muhtemelen kullanıcının <ENTER>'ladığı) tutmak için kullanırım.

Örnek 5.29. Menü Kullanıcı Göstericilerinin Kullanımı

#include <curses.h>
#include <menu.h>

#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
#define CTRLD   4

char *choices[] = {
  "Choice 1",
  "Choice 2",
  "Choice 3",
  "Choice 4",
  "Choice 5",
  "Choice 6",
  "Choice 7",
  "Exit",
};
void func(char *name);

int main()
{ ITEM **my_items;
  int c;
  MENU *my_menu;
  int n_choices, i;
  ITEM *cur_item;

  /* Curses Kipi İlklendir */
  initscr();
  start_color();
  cbreak();
  noecho();
  keypad(stdscr, TRUE);
  init_pair(1, COLOR_RED, COLOR_BLACK);
  init_pair(2, COLOR_GREEN, COLOR_BLACK);
  init_pair(3, COLOR_MAGENTA, COLOR_BLACK);

  /* Öğeleri İlklendir */
  n_choices = ARRAY_SIZE(choices);
  my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));
  for(i = 0; i < n_choices; ++i)
  { my_items[i] = new_item(choices[i], choices[i]);
    /* Set the user pointer */
    set_item_userptr(my_items[i], func);
  }
  my_items[n_choices] = (ITEM *)NULL;

  /* Menüyü oluştur */
  my_menu = new_menu((ITEM **)my_items);

  /* Menüyü ekrana yaz */
  mvprintw(LINES - 3, 0,
    "Seçili öğeyi görmek için <ENTER>'a basın");
  mvprintw(LINES - 2, 0,
    "Hareket etmek için Yukarı ve Aşağı ok tuşlarını kullanın "
    "(Çıkmak için F1)");
  post_menu(my_menu);
  refresh();

  while((c = getch()) != KEY_F(1))
  { switch(c)
    { case KEY_DOWN:
        menu_driver(my_menu, REQ_DOWN_ITEM);
        break;
      case KEY_UP:
        menu_driver(my_menu, REQ_UP_ITEM);
        break;
      case 10: /* Enter */
      { ITEM *cur;
        void (*p)(char *);

        cur = current_item(my_menu);
        p = item_userptr(cur);
        p((char *)item_name(cur));
        pos_menu_cursor(my_menu);
        break;
      }
      break;
    }
  }
  unpost_menu(my_menu);
  for(i = 0; i < n_choices; ++i)
    free_item(my_items[i]);
  free_menu(my_menu);
  endwin();
}

void func(char *name)
{ move(20, 0);
  clrtoeol();
  mvprintw(20, 0, "Seçili öge: %s", name);
}