Управление терминалом (1114938), страница 4
Текст из файла (страница 4)
Чтобы содержимое буфера отобразилось натерминал, нужно явно вызвать одну из функций перерисовки терминала. При перерисовкеокна библиотека старается минимизировать количество данных, пересылаемых на терминал(как было сказано выше, предполагается, что терминал связан с компьютером достаточномедленным каналом), и выполняет оптимизации перерисовки, исходя из своих представлений о текущем содержимом экрана терминала.Заметьте, что окна сами по себе не имеют иерархии окно-подокно и не поддерживаютперекрытия друг друга.
Для этих целей применяются панели.1.8.1 Начало работы программыВ начале работы программа, использующая библиотеку ncurses, должна выполнитьнесколько инициализационных вызовов. Типичное начало программы, использующей библиотеку ncurses, выглядит следующим образом:11if (!(initscr())) return 1;cbreak();noecho();nonl();meta(stdscr, TRUE);intrflush(stdscr, FALSE);keypad(stdscr, TRUE);if (has_colors()) {start_color();init_pair(1, COLOR_WHITE, COLOR_BLUE);init_pair(2, COLOR_YELLOW, COLOR_BLUE);init_pair(3, COLOR_BLUE, COLOR_WHITE);init_pair(4, COLOR_YELLOW, COLOR_RED);wattrset(stdscr, COLOR_PAIR(1));wbkgdset(stdscr, COLOR_PAIR(1));}clear();refresh();Функция initscr выполняет начальную инициализацию терминала и внутренних структур данных библиотеки.
Если при инициализации возникла ошибка, на стандартный потокошибок печатается диагностическое сообщение, а функция возвращает NULL. При успехевозвращается указатель на структуру, описывающую корневое окно (то есть возвращаетсязначение, равное stdscr).Дальнейшая группа вызовов функций включает «неканонический» режим работы терминала.• Вызов cbreak отключает построчную буферизацию ввода и обработку символовочистки строки и удаления последнего символа.• Вызов noecho отключает эхо-режим, то есть вывод всех вводимых символов обратнона терминал.• Вызов nonl отключает автоматический перевод символа ’\r’ в символ ’\n’ привводе и перевод ’\n’ в последовательность ’\r’, ’\n’ при выводе.• Вызов функции meta позволяет изменить режим обработки 8-го бита кодов символовпри вводе-выводе.
По умолчанию 8-й бит отбрасывается. Если второй параметр функции равен TRUE, 8-й бит искажатся не будет. Первый параметр функции игнорируется.• Вызов функции intrflush позволяет изменить режим «быстрой» реакции на символы прерывания (Ctrl-C и др.). Если второй параметр функции равен TRUE, при поступлении символа прерывания все данные, ещё не переданные на терминал, будут потеряны. Это может приводить к тому, что после прерывания с клавиатуры внутреннийбуфер окна будет не совпадать с отображаемым на экране.
Если второй параметр равенFALSE, используется медленная, но надёжная схема реакции на символы прерывания.Первый параметр функции игнорируется.• Функция keypad позволяет изменить режим трансляции специальных многобайтныхкодов, поступающих с терминала (например, кодов функциональных клавиш или кла12виш управления курсором). Если второй параметр функции установлен в TRUE, вводимые с терминала последовательности символов, соответствующие специальным клавишам, преобразуются в специальные целые константы, которые возвращаются программе. Например, при нажатии клавиши «стрелка влево», программа получит константу KEY_LEFT.
Если второй параметр функции равен FALSE, многобайтные последовательности символов при вводе не транслируются. Первый параметр функцииигнорируется.Следующая группа команд выполняется, если терминал поддерживает переключениецветов символов и фона. В этом случае функция has_colors возвращает ненулевое значение. Функция start_color включает цветной режим терминала (изначально он можетбыть выключен). Далее вызовы функции init_pair каждой паре (цвет символа, цвет фона) ставят в соответствие номер этой пары в палитре атрибутов.
Функция wattrset устанавливает атрибут выводимых символов для последующих операций, а функция wbkgdsetустанавливает атрибут, которым будет очищаться окно.В нашем случае создаётся палитра атрибутов из четырёх элементов. Первый элемент палитры определяет белый цвет текста и синий цвет фона, второй — жёлтый цвет текста исиний цвет фона и т. д. Далее вызовом функции wattrset устанавливается атрибут номер1 из палитры атрибутов для выводимых в корневое окно символов, то есть все последующиесимволы будут выводится белыми на синем фоне. Вызов функции wbkgdset устанавливаетатрибут номер 1 из палитры атрибутов для очистки корневого окна, то есть при очистке окна(или его части) будет использоваться синий цвет фона.Вызов функции clear очищает корневое окно (точнее, очищает его буфер в памяти),а вызов функции refresh синхронизирует состояние окна в памяти с состоянием окна натерминале.1.8.2 Завершение работы программыВ конце работы программа должна восстановить стандартный режим работы терминала.
Кроме того, она может очистить после себя экран. Для этих целей можно использоватьследующую последовательность вызовов функций:// установить стандартные атрибуты фона для окна stdscrbkgdset(COLOR_PAIR(0));// очистить окно stdscrclear();// синхронизовать буферrefresh();// установить все режимы терминала в исходное состояниеendwin();1.8.3 Соглашения об именовании функцийДля многих действий, которые можно выполнить с окном, предусмотрены два варианта функций: с указанием окна и с окном stdscr по умолчанию.
Те функции, которые требуют указания окна имеют префикс w в своём имени. Например, уже упомянутая функция bkgdset устанавливает атрибут фона для корневого окна stdscr, а чтобы установитьатрибут фона у произвольного окна, необходимо использовать функцию wbkgdset.13Для функций вывода текста в окно помимо префикса w допускается префикс mv, которыйуказывает, что соответствующая функция принимает дополнительно два параметра, указывающие координату позиции в окне, в которую должен выводиться текст. Координаты отсчитываются, как обычно, от левого верхнего угла окна, и первой всегда указывается строка, а за ней столбец, то есть пара (y, x). Точка начала отсчёта имеет координаты (0, 0). Например, функция printw выводит форматную строку в текущую позицию корневого окна,функция wprintw выводит форматную строку в текущую позицию заданного окна, функцияmvprintw выводит форматную строку в указанную позицию корневого окна stdscr, и, наконец, функция mvwprintw выводит форматную строку в указанную позицию указанногоокна.1.8.4 Синхронизация окна и терминалаКак уже было упомянуто, для каждого окна в памяти хранится его текущий образ.
Всефункции работы с окном модифицируют этот образ окна в памяти. Для того, чтобы изменённое содержимое окна было показано на экране, необходим явный вызов одной из функцииобновления экрана. Кроме того, для всего экрана терминала в памяти хранится его образ.Поэтому функции обновления окна refresh и wrefresh работают в две стадии: вначалеизменённые ячейки окна копируются в виртуальный буфер экрана, затем изменённые ячейкивиртуального буфера экрана выводятся на физический экран. Для более тонкого управленияобновлением экрана могут оказаться полезными следующие функции:intintintintintintrefresh(void);wrefresh(WINDOW *win);wnoutrefresh(WINDOW *win);doupdate(void);redrawwin(WINDOW *win);wredrawln(WINDOW *win, int beg_line, int num_lines);Функция refresh копирует изменённые ячейки корневого окна stdscr в буфер экрана, затем изменённые ячейки буфера экрана выводятся на физический экран.
Функцияwrefresh копирует изменённые ячейки заданного окна в буфер экрана, затем изменённыеячейки буфера экрана выводятся на физический экран. Обратите внимание, что даже еслисодержимое окна изменилось, реального вывода на экран может не произойти, если новоесодержимое окна совпадает с тем, что находится в данной ячейке буфера экрана.При работе программы может возникнуть ситуация, когда реальное содержимое экранане соответствует буферу экрана.
Например, программа может запустить другую программу,которая что-то вывела на экран. В этом случае предусмотрены средства для принудительного обновления физического экрана. Так, функция wredrawln позволяет указать, что строкиэкрана, соответствующие указанным строкам окна win должны быть обязательно перерисованы, поскольку их содержимое на экране не соответствует содержимому буфера экрана.Параметр beg_line указывает первую строку окна, а параметр num_lines позволяет указать количество строк1 . Функция redrawwin задаёт, что всё окно win должно быть перерисовано.
И функция wredrawln, и функция redrawwin не изменяют физического экрана,а манипулируют внутренними структурами библиотеки ncurses. Собственно обновление физического экрана будет выполнено при вызове refresh, wrefresh или doupdate.1 Заметим,что информация о рассинхронизации буфера экрана и физического экрана редко бывает такойточной.14Другой способ принудительного обновления экрана состоит в вызове функцииwrefresh со специальным параметром curscr. В этом случае физический экраннемедленно очищается и полностью перерисовывается заново.Когда функция wrefresh используется для обновления нескольких окон подряд, операция вывода обновлённых ячеек буфера экрана на физический экран выполняется за короткий промежуток времени несколько раз. Ускорить операции можно, если выводить буфер экрана на физический экран только один раз в конце всех обновлений буфера экрана. В этом случае должны применяться функции wnoutrefresh и doupdate.
Функцияwnoutrefresh копирует изменённые ячейки заданного окна в буфер экрана, но не выводит буфер экрана на физический экран, а функция doupdate выводит все накопленные вбуфере экрана изменения на физический экран. Таким образом, вызов функции wrefreshэквивалентен последовательному вызову wnoutrefresh и doupdate.1.8.5 Очистка окнаСледующие функции очищают окно или его часть. Ячейки окна заполняются символами пробела. Атрибут символа (то есть цвет фона) можно изменить при помощи функцииwbkgdset.intintintintintintintinterase(void);werase(WINDOW *win);clear(void);wclear(WINDOW *win);clrtobot(void);wclrtobot(WINDOW *win);clrtoeol(void);wclrtoeol(WINDOW *win);Функции erase и werase записывают символ пробела в каждую ячейку окна, очищаяего.Функции clear и wclear делают то же, что и функции erase, werase, но дополнительно устанавливают флаг принудительного обновления физического экрана.