Читаем Основы программирования в Linux полностью

  if (!chosen) {

   tputs(tparm(cursor, screenrow, screencol), 1, char_to_terminal);

   fprintf(out, "Incorrect choice, select again\n");

  }

 } while (!chosen);

 tputs(clear, 1, char_to_terminal);

 return selected;

}

int char_to_terminal(int char_to_write) {

 if (output_stream) putc(char_to_write, output_stream);

 return 0;

}

Сохраните эту программу как menu5.с.

Как это работает

Переписанная функция getchoice выводит то же меню, что и в предыдущих примерах, но подпрограммы вывода изменены так, чтобы можно было воспользоваться характеристиками из базы данных terminfo. Если вы хотите видеть на экране сообщение "You have chosen:" дольше, чем одно мгновение перед очисткой экрана и подготовкой его к следующему выбору пункта меню, добавьте в функцию main вызов sleep:

do {

 choice = getchoice("Please select an action", menu, input, output);

 printf("\nYou have chosen: %c\n", choice);

 sleep(1);

} while (choice != 'q');

Последняя функция в этой программе char_to_terminal включает в себя вызов функции putc, которую мы упоминали в главе 3.

В завершение этой главы бегло рассмотрим пример определения нажатий клавиш.

<p>Обнаружение нажатий клавиш</p>

Пользователи, программировавшие в ОС MS-DOS, часто ищут в ОС Linux эквивалент функции kbhit, которая определяет, была ли нажата клавиша, без реального ее считывания. К сожалению, их поиски оказываются безуспешными, поскольку прямого аналога нет. Программисты в среде UNIX не ощущают этого отсутствия, т.к. UNIX запрограммирована так, что программы очень редко (если когда-либо вообще) озабочены ожиданием события. Поскольку это обычный способ применения kbhit, ее нехватка редко ощущается в системах UNIX и Linux.

Однако, когда вы переносите программы из MS-DOS, часто удобно эмулировать функцию kbhit, которую можно применять на деле в неканоническом режиме ввода (упражнение 5.7).

Упражнение 5.7. Исключительно ваша собственная kbhit

1. Начните со стандартной заголовочной информации и пары структур для установки параметров терминала. peek_character применяется для проверки нажатия клавиши. Далее описываются функции, которые будут использоваться позже:

#include

#include

#include

#include

#include

#include

static struct termios initial_settings, new_settings;

static int peek_character = -1;

void init_keyboard();

void close_keyboard();

int kbhit();

int readch();

2. Функция main вызывает функцию init_keyboard для настройки терминала, затем выполняет цикл один раз в секунду, каждый раз вызывая в нем функцию kbhit. Если нажата клавиша , функция close_keyboard восстанавливает нормальный режим и программа завершается:

int main() {

 int ch = 0;

 init_keyboard();

 while (ch != 'q') {

  printf("looping\n");

  sleep(1);

  if (kbhit()) {

   ch = readch();

   printf("you hit %c\n", ch);

  }

 }

 close_keyboard();

 exit(0);

}

3. Функции init_keyboard и close_keyboard настраивают терминал в начале и конце программы:

void init_keyboard() {

 tcgetattr(0, &initial_settings);

 new_settings = initial_settings;

 new_settings.c_lflag &= ~ICANON;

 new_settings.c_lflag &= ~ECHO;

 new_settings.c_lflag &= ~ISIG;

 new_settings.c_cc[VMIN] = 1;

 new_settings.c_cc[VTIME] = 0;

 tcsetattr(0, TCSANOW, &new_settings);

}

void close_keyboard() {

 tcsetattr(0, TCSANOW, &initial_settings);

}

4. Теперь функция, проверяющая нажатие клавиши:

int kbhit() {

 char ch;

 int nread;

 if (peek_character != -1) return 1;

 new_settings.c_cc[VMIN] = 0;

 tcsetattr(0, TCSANOW, &new_settings);

 nread = read(0, sch, 1);

 newrsettings.c_cc[VMIN] = 1;

 tcsetattr(0, TCSANOW, &new_settings);

Перейти на страницу:

Похожие книги

Полное руководство по Microsoft Windows XP
Полное руководство по Microsoft Windows XP

В книге известного американского автора описывается среда ОС Windows XP и принципы ее функционирования, приведен сравнительный анализ Windows XP с предшествующими версиями операционной системы Windows. Рассматриваются вопросы применения и модификации нового интерфейса с целью получения прямого доступа ко всем функциям Windows XP обсуждаются варианты подключения к компьютерным сетям. Несколько разделов посвящены работе с реестром и конфигурационными файлами, мультимедийным функциям и разнообразным системным службам, а также методам решения проблем с программным обеспечением и оборудованием. Особое внимание уделено обеспечению безопасности операционной системы.Издание адресовано пользователям и сетевым администраторам, желающим активно применять возможности операционной системы Windows XP (в том числе и недокументированные).

Джон Поль Мюллер , Питер Нортон

ОС и Сети / Книги по IT