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

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

Иван Скляров

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


Функция wbkgd устанавливает атрибуты окна. Во-первых, с помощью COLOR_PAIR(1) мы инициализируем определенную ранее цветовую пару, а во-вторых, с помощью символа OR '|' (хотя в данном случае его правильно было бы назвать AND) добавляем другие атрибуты. Таким образом, наше окно является окном повышенной яркости (A_BOLD) и мерцающим (A_BLINK). Список других атрибутов можно найти в man curs_attr. В качестве атрибута можно указать и символ в одинарных кавычках, он станет фоновым символом.

Функция mvwaddstr помещает строку по середине окна. Существует огромное количество других функций для вывода символов и строк, как, впрочем, и для ввода. Смотри man addch, addchstr, echochar, printw, scanw...

После всех приготовлений мы вызываем wrefresh(win) для отображения окна на экране и завершаем работу. Надо сказать, что такой выход не совсем корректен, т.к. сначала нужно удалять все окна (точнее, освобождать память, отведенную под них) с помощью оператора delwin(win).

Работаем с клавой

OK, окна "рисовать" научились, а что насчет клавиатуры? Посмотрим второй пример (см. программу keeper.c на нашем сайте www.xakep.ru или на диске к журналу). Эта программа - хранитель экрана, который захламляет экран разноцветными окнами в случайном порядке (см. Рис.3), пока не будет нажата клавиша F10.

Компиляция: gcc keeper.c -o keeper -lncurses. Большинство инструкций нам знакомы из первого примера, поэтому рассмотрим только новые, которые так или иначе связаны с клавой:

curs_set(0) - скрывает физический курсор.

noecho() - отключает отображение ввода пользователя. Функция echo(), наоборот, включает.

cbreak() - когда эта функция активна, читаемый ввод немедленно доступен программе, иначе он будет буферизироваться до получения целой строки.

timeout(13) - работает в паре с функцией getch(), блокирует работу программы на 13 миллисекунд для принятия ввода.

keypad(stdscr, TRUE) - позволяет использовать цифровую клавиатуру, клавиши перемещения курсора и функциональные клавиши.

В бесконечном цикле мы считываем одиночное нажатие клавиши с помощью getch(). Если нажата F10 (KEY_F(10)), то выходим из цикла и завершаем работу. Макросы других клавиш (KEY_) можно посмотреть в man curs_getch.

Хочу заметить, что каждое окно в цикле после появления на экране удаляется из памяти (delwin). Это важно запомнить.

Перед выходом из программы функция clear() с последующим refresh() полностью очищает экран.

IDIOT

Пожалуй, самое частое применение ncurses - это создание меню в программах. Для этого в ней даже имеется специальная библиотека меню. Посмотрим работу этой библиотеки на третьем примере (программу idiot.c также бери с нашего сайта www.xakep.ru или с диска). Idiot выводит меню из 4 пунктов и позволяет одним нажатием клавиши замаунтить CD-ROM или дисковод, вывести все процессы на экран или показать текущую дату и время (см. Рис.4).

Т.к. прога предназначена для лентяев и чайников, которые не знают команд, то отсюда и ее название - Idiot.

Назад на стр. 058-086-3  Содержание  Вперед на стр. 058-086-5