Управление терминалом (1114938), страница 5
Текст из файла (страница 5)
Таким образом, при следующем вызове refresh, wrefresh или doupdate физический экран будеточищен и перерисован.Функции clrtobot и wclrtobot очищают окно от текущей позиции курсора и до концаокна. Очищаются все символы справа от курсора, включая текущую позицию курсора, натекущей строке и все строки ниже текущей строки.Функции clrtoeol и wclrtoeol очищают текущую строку окна справа от текущейпозиции, включая её.1.8.6 Вывод в окноСтрока выводится в окно с помощью одной из следующих функций:intintintintintintintaddstr(const char *str);addnstr(const char *str, int n);waddstr(WINDOW *win, const char *str);waddnstr(WINDOW *win, const char *str, int n);mvaddstr(int y, int x, const char *str);mvaddnstr(int y, int x, const char *str, int n);mvwaddstr(WINDOW *win, int y, int x, const char *str);15int mvwaddnstr(WINDOW *win, int y, int x, const char *str, int n);Здесь win — окно, в которое выводится строка, y, x — координаты в окне, str — выводимая строка, n — максимальное количество выводимых символов.
Если функция не принимает параметр win, строка добавляется в окно stdscr. Если функция не принимает параметры x, y, строка выводится, начиная с текущей позиции.Если выводимая символьная строка не помещается на текущей строке окна вывода, остаток переносится на следующую строку окна вывода, которое при необходимости прокручивается.
Если в качестве параметра n указать -1, будет выведена только та часть строки, которая умещается в текущей строке окна вывода. После вывода строки текущая позиция вокне соответствующим образом изменяется.Для вывода одного символа используются следующие функции:intintintintaddch(const char ch);waddch(WINDOW *win, const char ch);mvaddch(int y, int x, const char ch);mvwaddch(WINDOW *win, int y, int x, const char ch);Функции позволяют задавать окно вывода win, координаты вывода y, x.Для форматного вывода используются функции:intintintintintprintw(char *fmt, ...);wprintw(WINDOW *win, char *fmt, ...);mvprintw(int y, int x, char *fmt, ...);mvwprintw(WINDOW *win, int y, int x, char *fmt, ...);vw_printw(WINDOW *win, char *fmt, va_list varglist);Параметр fmt — это строка, определяющая форматное преобразование вывода. Спецификации преобразования в точности совпадают со спецификациями преобразования функций семейства printf.
Параметр win позволяет указать окно вывода, параметры y, x определяют координаты вывода.1.8.7 Ввод с клавиатурыintintintintgetch(void);mvgetch(int y, int x);ungetch(int ch);has_key(int ch);Функция getch возвращает код очередной нажатой клавиши в буфере ввода терминала.Если включён неблокирующийся режим, и буфер ввода пуст, возвращается значение ERR(константа, определённая как -1). Если неблокирующийся режим не включён, и буфер вводапуст, программа приостанавливается до поступления информации в буфер ввода. Функцияmvgetch перемещает курсор в указанную позицию окна, затем выполняет функцию getch.Если включён режим распознавания специальных клавиш, соответствующие им последовательности байтов распознаются и заменяются на целые значения, находящиеся вне диапазона допустимых кодов символов. Этим значениям соответствуют констнты KEY_, определённые библиотекой.
Некоторые из таких специальных кодов клавиш перечислены в таблице4. Обратите внимание, что последовательности байтов, кодирующие специальные клавиши,как правило, начинаются с байта \033. Этот же байт используется для кодирования клавиши ESC, поэтому нажатие на клавишу ESC клавиатуры будет передано в программу после16KEY_DOWNKEY_UPKEY_LEFTKEY_RIGHTKEY_HOMEKEY_ENDKEY_ICKEY_DCKEY_NPAGEKEY_PPAGEKEY_BACKSPACEKEY_FnКлавиша «стрелка вниз»Клавиша «стрелка вверх»Клавиша «стрелка влево»Клавиша «стрелка вправо»Клавиша HomeКлавиша EndКлавиша InsertКлавиша DeleteКлавиша Page DownКлавиша Page UpКлавиша BackspaceФункциональная клавиша Fn, 0 6 n 6 63Таблица 4: Константы, соответствующие некоторым специальным клавишамнекоторого интервала времени, в течение которого библиотека ожидает поступления другихбайтов в последовательности, задающей специальную клавишу.Функция ungetch возвращает один код клавиши обратно во входную очередь терминала.
Следующий вызов getch вернёт этот код.Функция has_key принимает код специальной клавиши, одной из определённых в таблице 4, и возвращает TRUE или FALSE в зависимости от того, распознаётся ли эта клавишатерминалом.1.9 Пример программыПриведённая ниже программа перемещает символ ’*’ по экрану. При компиляции в командной строке редактора связей нужно указать -lcurses — подключение библиотеки.#include <curses.h>#include <locale.h>int main(void){int prev_x = 0, prev_y = 0, caret_y = 0, caret_x = 0, c;int flag = 1;setlocale(LC_ALL, "");if (!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);}17attrset(COLOR_PAIR(1));bkgdset(COLOR_PAIR(1));clear();while (flag) {mvaddch(prev_y, prev_x, ’ ’);mvaddch(caret_y, caret_x, ’*’);move(caret_y, caret_x);refresh();prev_x = caret_x;prev_y = caret_y;c = getch();switch (c) {case 033:flag = 0;break;case KEY_UP:if (caret_y > 0) caret_y--;break;case KEY_DOWN:if (caret_y < LINES - 1) caret_y++;break;case KEY_LEFT:if (caret_x > 0) caret_x--;break;case KEY_RIGHT:if (caret_x < COLS - 2) caret_x++;break;}}bkgdset(COLOR_PAIR(0));clear();refresh();endwin();return 0;}18.