Страница 92 из 324
Имейте в виду, что в некоторых старых дистрибутивах Linux последний параметр функции tputs определен как int (*putfunc)(char), что заставит вас изменить определение функции char_to_terminal из упражнения 5.6.
Если вы обратитесь к страницам интерактивного справочного руководства за информацией о функции tparm и характеристиках терминалов, то можете встретить функцию tgoto. Причина, по которой мы не используем эту функцию, хотя она, очевидно, предлагает более легкий способ перемещения курсора, заключается в том, что она не включена в стандарт X/Open (Single UNIX Specification Version 2) по данным издания 1997 г. Следовательно, мы не рекомендуем применять любую из этих функций в ваших новых программах.
Вы почти готовы добавить обработку экрана в вашу функцию выбора пункта меню. Единственно, что осталось, — очистить экран просто с помощью свойства clear. Некоторые терминалы не поддерживают характеристику clear, которая помещает курсор в левый верхний угол экрана. В этом случае вы можете поместить курсор в левый верхний угол и применить команду ed — удалить до конца экрана.
Для того чтобы собрать всю полученную информацию вместе, напишем окончательную версию примера программы выбора пункта меню screenmenu.c, в которой вы "нарисуете" варианты пунктов меню на экране для того, чтобы пользователь выбрал нужный пункт (упражнение 5.6).
Вы можете переписать функцию getchoice из программы menu4.c для предоставления полного управления терминалом. В этом листинге функция main пропущена, потому что она не меняется. Другие отличия от программы menu4.c выделены цветом.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <termios.h>
<i>#include <term.h></i>
<i>#include <curses.h></i>
<i>static FILE* output_stream = (FILE *)0;</i>
char *menu[] = {
"a — add new record",
"d — delete record",
"q - quit",
NULL,
};
int getchoice(char *greet, char *choices[], FILE *in, FILE *out);
<i>int char_to_terminal(int_char_to_write);</i>
int main() {
...
}
<i>int getchoice(char *greet, char* choices[], FILE[]* in, FILE* out) {</i>
<i> int chosen = 0;</i>
<i> int selected;</i>
<i> int screenrow, screencol = 10;</i>
<i> char **option;</i>
<i> char* cursor, *clear;</i>
<i> output_stream = out;</i>
<i> setupterm(NULL, fileno(out), (int*)0);</i>
<i> cursor = tigetstr("cup");</i>
<i> clear = tigetstr("clear");</i>
<i> screenrow =4;</i>
<i> tputs(clear, 1, (int*)char_to_terminal);</i>
<i> tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);</i>
<i> fprintf(out, "Choice: %s", greet);</i>
<i> screenrow += 2;</i>
<i> option = choices;</i>
<i> while (*option) {</i>
<i> ftputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);</i>
<i> fprintf(out, "%s", *option);</i>
<i> screenrow++;</i>
<i> option++</i>
<i> }</i>
<i> fprintf(out, "n");</i>
<i> do {</i>
<i> fflush(out);</i>
<i> selected = fgetc(in);</i>
<i> option = choices;</i>
<i> while (*option) {</i>
<i> if (selected == *option[0]) {</i>
<i> chosen = 1;</i>
<i> break;</i>
<i> }</i>
<i> option++;</i>
<i> }</i>
<i> if (!chosen) {</i>
<i> tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);</i>
<i> fprintf(out, "Incorrect choice, select agai
<i> }</i>
<i> } while (!chosen);</i>
<i> tputs(clear, 1, char_to_terminal);</i>
<i> return selected;</i>
<i>}</i>
<i>int char_to_terminal(int char_to_write) {</i>
<i> if (output_stream) putc(char_to_write, output_stream);</i>
<i> return 0;</i>