Руководство программиста для Linux
4b61df3a

Введение в ncurses


В этом разделе будем пользоваться следующей терминологией.

  • окно (window) - внутреннее представление, содержащее изображение части экрана. WINDOW определен в ncurses.h.
  • экран (screen) - это окно размером в целый экран (с верхнего левого до нижнего правого угла). Экранами являются stdscr и curscr.
  • терминал (terminal) - специальный экран с информацией о том, как выглядит экран на данный момент.
  • переменные - следующие переменные и константы, определенные в ncurses.h:

  • WINDOW *curscr - текущий экран
  • WINDOW *stdscr - стандартный экран
  • int LINES - полосы на терминале
  • int COLS - колонки на терминале
  • bool TRUE - флаг истины, 1
  • bool FALSE - флаг лжи, 0
  • int ERR - флаг ошибки, -1
  • int OK - флаг ok, 0


  • функции - в описаниях функций аргументы будут следующих типов:
  • win - WINDOW*
  • bf - bool
  • ch - chtype
  • str - char*
  • chstr - chtype*
  • fmt - char*
  • иначе int
  • Обычно программа, использующая ncurses, выглядит так: #include ... main() { ... initscr(); /* вызов функции ncurses */ endwin(); ... }

    Подключение ncurses.h определит переменные и типы для ncurses, такие как WINDOW, и прототипы функций. Автоматически подключатся stdio.h, stdarg.h, termios.h, unctrl.h.

    initscr() используется для инициализации структур данных ncurses и для чтения файла terminfo. Будет захвачена память под stdscr и curscr. Если произойдет ошибка, то initscr вернет ERR. В противном случае возвращается указатель на stdscr. Кроме этого, экран будет очищен и будут проинициализированы LINES и COLS.

    endwin() очистит все выделенные ресурсы ncurses и восстановит режимы tty, какими они были до вызова initscr(). Функция endwin() должна вызываться перед любой другой функцией из библиотеки ncurses и перед выходом из вашей программы. Если вы хотите использовать для вывода более чем один терминал, используйте newterm(...) вместо initscr().

    Компилируйте программу посредством: gcc [flags] files -lncurses

    Вы можете устанавливать любые флаги (см. gcc(1)). Если путь к ncurses.h изменился, вы должны включить следующую строку, иначе ncurses.h, nterm.h, termcap.h и unctrl.h не будут найдены: -I/usr/include/ncurses




    Другие возможные в Linux-е флаги: -O2 -ansi -Wall -m486. O2 скажет gcc произвести некоторую оптимизацию; -ansi - для ANSI си-кода; -Wall выведет все предупреждения; -m486 оптимизирует код для Intel 486 (можно и для Intel 386).
    Библиотека ncurses находится в /usr/lib/. Существует 3 версии библиотеки:

    1. libncurses.a - обычная ncurses

    2. libdcurses.a - ncurses для отладки

    3. libpcurses.a - ncurses для профилирования (существует ли что-нибудь после 1.8.6libcurses.a?)

    4. libcurses.a - не четвертая версия, это первоначальная BSD curses

    5. Структуры данных для экрана называются windows и определены в ncurses.h. Окно - это нечто типа литерного массива в памяти, которым программист может манипулировать без вывода на терминал. При помощи newwin(...) вы можете создать другие окна.
      Чтобы оптимально обновить физический терминал, ncurses имеет другое окно, curscr. Это изображение, реально выводимое на экран. Для отображения stdscr на экране используется функция refresh(). После этого ncurses обновит curscr и физический терминал содержимым stdscr. Библиотечные функции произведут внутреннюю оптимизацию для процесса обновления, поэтому вы можете менять различные окна и затем обновлять экран сразу самым оптимальным способом.
      Функциями ncurses вы можете работать со структурой данных window. Функции, начинающиеся с w, позволяют назначать окно window, тогда как остальные обычно имеют дело с stdscr. Функции, начинающиеся с mv, прежде всего переместят курсор на позицию y,x.
      Символы имеют тип chtype, который является long unsigned int, чтобы сохранять дополнительную информацию о себе (атрибуты и т.д.).
      Библиотека ncurses использует базу данных terminfo. Обычно она находится в usr/lib/terminfo/, и ncurses обращается туда за локальными определениями терминала. Если вы хотите проверить некоторые другие определения для терминала, не исправляя первоначальную terminfo, установите соответственно переменную среды TERMINFO. Эта переменная будет протестирована ncurses, и вместо usr/lib/terminfo/ сохранятся ваши определения.
      Tекущей версией ncurses является 1.8.6.
      В конце этого раздела вы найдете обзорную таблицу для BSD-Curses, ncurses и Sun-OS 5.4 curses.

      Содержание раздела