Книга: Основы программирования в Linux
Панели
Панели
При написании более сложных программ с использованием curses порой бывает легче построить логический экран и затем позже вывести весь или часть экрана на физический экран. В некоторых случаях лучше иметь логический экран большего размера, чем физический экран и отображать только часть логического экрана в любой конкретный момент времени.
Это нелегко сделать с помощью функций библиотеки curses, с которыми вы познакомились к этому моменту, т.к. все окна должны быть не больше физического экрана. Библиотека curses предоставляет специальную структуру данных, панель (pad), для манипулирования данными логического экрана, которые не умещаются в стандартном окне.
Структура панели похожа на структуру WINDOW
, и все функции библиотеки curses, написанные для работы с окнами, можно применять и к панелям. Но у панелей есть и собственные функции для создания и обновления.
Панели создаются во многом так же, как и обычные окна.
#include <curses.h>
WINDOW *newpad(int number_of_lines, int number_of_columns);
Обратите внимание на то, что возвращаемое значение — указатель на структуру типа WINDOW
, такое же, как у функции newwin
. Удаляются панели, как и окна, функцией delwin
.
Но к панелям применяются другие подпрограммы обновления. Поскольку панель не привязана к конкретной точке экрана, вы должны задать область панели, которую хотите поместить на экран, и ее положение на экране. Делайте это с помощью функции prefresh.
#include <сurses.h>
int prefresh(WINDOW *pad_ptr, int pad_row, int pad_column, int screen_row_min, int screen_col_min, int screen_row_max, int screen_соl_max);
Функция выполняет запись области панели, начинающейся в точке (pad_row
, pad_column
), в область экрана, определенную от (screen_row_min
, screen_col_min
) до (screen_row_max
, screen_col_max
).
Есть и дополнительная подпрограмма pnoutrefresh
. Она действует так же, как функция wnoutrefresh
, обеспечивая более производительное обновление экрана.
Давайте проверим это на практике с помощью программы pad.с (упражнение 6.8).
Упражнение 6.8. Применение панели
1. В начале этой программы вы инициализируете структуру панели и затем формируете панель с помощью функции, которая возвращает указатель на нее. Вставьте символы, заполняющие структуру панели (панель на 50 символов шире и выше экрана терминала):
#include <unistd.h>
#include <stdlib.h>
#include <curses.h>
int main() {
WINDOW *pad_ptr;
int x, y;
int pad_lines;
int pad_cols;
char disp_char;
initscr();
pad_lines = LINES + 50;
pad_cols = COLS + 50;
pad_ptr = newpad(pad_lines, padcols);
disp_char = 'a';
for (x = 0; x < pad_lines; x++) {
for (у = 0; у < pad_cols; y++) {
mvwaddch(pad_ptr, x, y, disp_char);
if (disp_char == 'z') disp_char = 'a';
else disp_char++;
}
}
2. Теперь перед завершением программы нарисуйте разные области панели в разных местах экрана:
prefresh(pad_ptr, 5, 7, 2, 2, 9, 9);
sleep(1);
prefresh(pad_ptr, LINES + 5, COLS + 7, -5, 5, 21, 19);
sleep(1);
delwin(pad_ptr);
endwin();
exit(EXIT_SUCCESS);
}
Выполнив эту программу, вы увидите нечто подобное показанному на рис. 6.8.
Рис. 6.8