Добавить в цитаты Настройки чтения

Страница 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 &lt;term.h&gt;</i>

<i>#include &lt;curses.h&gt;</i>

<i>static FILE* output_stream = (FILE *)0;</i>

char *menu[] = {

 &quot;a — add new record&quot;,

 &quot;d — delete record&quot;,

 &quot;q - quit&quot;,

 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(&quot;cup&quot;);</i>

<i> clear = tigetstr(&quot;clear&quot;);</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, &quot;Choice: %s&quot;, 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, &quot;%s&quot;, *option);</i>

<i>  screenrow++;</i>

<i>  option++</i>

<i> }</i>

<i> fprintf(out, &quot;n&quot;);</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, &quot;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>