Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #58, ОКТЯБРЬ 2003 г.

Новые проклятия для С-кодеров под Linux

Иван Скляров

Xakep, номер #058, стр. 058-086-5


Программы, использующие библиотеку меню, должны компилиться с дополнительным ключом -lmenu, т.е. в нашем случае: gcc idiot.c -o idiot -lmenu -lncurses, и включать заголовочный файл <menu.h>. Этот заголовочный файл автоматически подключает хедер <curses.h>, поэтому повторно его включать не следует.

В общем случае программы, использующие меню, создаются по таким правилам:

1. Инициализировать ncurses.

2. Создать элементы меню, используя new_item().

3. Создать меню, используя new_menu().

4. Поместить меню, используя menu_post().

5. Регенерировать экран.

6. Обработать пользовательские запросы в цикле.

7. Убрать меню, используя menu_unpost().

8. Удалить меню, используя free_menu().

9. Удалить элементы меню, используя free_item().

10. Завершить ncurses.

Прежде чем выполнять второй пункт, мы должны определить элементы меню в массиве (у нас это *choice[]) и подготовить для него память (с помощью calloc). В программе мы создаем окно, а в этом окне с помощью subwin подокно, за которым закрепляем меню (set_menu_win). Это сделано для того, чтобы удобно было выдерживать отступы от края окна.

Чтобы вставить заголовок программы и надпись "F1 to exit" с цветами, отличающимися от установленных функцией wbkgd, мы воспользовались инструкциями wattron и wattroff, работающими в паре.

В цикле, с помощью инструкции выбора switch, определяется нажатие клавиш. Если это "стрелка вниз", то вызывается специальная функция библиотеки меню menu_driver с атрибутом REQ_DOWN_ITEM. Это провоцирует перемещение указателя меню вниз на одну позицию. Аналогично происходит со "стрелкой вверх" (см. man menu_driver). Если нажата ENTER, с помощью функции item_name(current_item()) определяется название пункта меню и выбирается соответствующая команда, которая будет выполнена в функции system. За деталями обращайся к man.

Надо сказать, несмотря на то, что Idiot написан в учебных целях, сейчас я его юзаю постоянно :). Действительно, быстрее нажать один раз кнопку, чем набирать утомительные команды. Поверь, тебе он тоже понравится, особенно если заточишь его под себя. Это ведь ты теперь тоже умеешь ;). Пиши, если возникнут какие-то вопросы/осложнения. Помогу.

Что такое ncurses?

Ncurses - это библиотека с огромными возможностями, которая позволяет создавать программы, не зависящие от типа терминала. Ncurses поддерживается любой UNIX-like системой. Наглядным примером работы библиотеки является Midnight Commander.

Рекомендуется к изучению

Eric S. Raymond и Zeyd M. Ben-Halim "nCurses Intro".

Перевод: http://spslug.sposad.ru/doc/man/ncurses/ncurses-intro.html (там же ищи russian маны ncurses).

Sven Goldt и пр. "Linux Programmer's Guide".

Перевод: http://ufalug.rb.ru/books/lpg.koi8-r.txt

www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/ - HOWTO по ncurses (перевода не встречал).

Назад на стр. 058-086-4  Содержание