Skip to content

1. Введение

lomaster edited this page Apr 13, 2023 · 1 revision

В старые добрые времена телетайпных терминалов терминалы находились вдали от компьютеров и подключались к ним через последовательные кабели. Терминалы можно было конфигурировать, посылая серию байтов. Все возможности терминалов (такие как перемещение курсора на новое место, стирание части экрана, прокрутка экрана, изменение режимов и т.д.) могли быть доступны через эти серии байтов. Эти управляющие последовательности обычно называют управляющими последовательностями, поскольку они начинаются с символа escape(0x1B). Даже сегодня, при соответствующей эмуляции, мы можем посылать управляющие последовательности в эмулятор и добиваться того же эффекта в окне терминала.

Предположим, вы хотите напечатать строку цветом. Попробуйте набрать на консоли следующее:

echo "^[[0;31;40mIn Color"

Первый символ - это символ эвакуации, который выглядит как два символа ^ и [. Чтобы напечатать его, нужно нажать CTRL+V, а затем клавишу ESC. Все остальные - обычные печатаемые символы. Вы должны увидеть строку "In Color" красного цвета. Она так и останется, а чтобы вернуться в исходный режим, введите следующее.

echo "^[[0;37;40m"

Итак, что означают эти магические символы? Сложные для понимания? Они даже могут быть разными для разных терминалов. Поэтому разработчики UNIX придумали механизм под названием termcap. Это файл, в котором перечислены все возможности конкретного терминала, а также управляющие последовательности, необходимые для достижения определенного эффекта. В более поздние годы он был заменен на terminfo. Не вдаваясь в подробности, этот механизм позволяет прикладным программам запрашивать базу данных terminfo и получать управляющие символы для отправки на терминал или эмулятор терминала

1.1. Что такое NCURSES?

Возможно, вы задаетесь вопросом, зачем нужна вся эта техническая белиберда. В описанном выше сценарии каждая прикладная программа должна запрашивать terminfo и выполнять необходимые действия (отправка управляющих символов и т.д.). Вскоре стало трудно управлять этой сложностью, и это привело к появлению 'CURSES'. Curses это каламбур от названия "оптимизация курсора". Библиотека Curses формирует обертку над работой с необработанными терминальными кодами и предоставляет очень гибкий и эффективный API (интерфейс прикладного программирования). Она предоставляет функции для перемещения курсора, создания окон, создания цветов, игры с мышью и т.д. Прикладным программам не нужно беспокоиться о базовых возможностях терминала.

Так что же такое NCURSES?
NCURSES - это клон оригинальной версии System V

Release 4.0 (SVr4) curses - Это свободно распространяемая библиотека, полностью совместимая со старыми версиями curses. Вкратце, это библиотека функций, которая управляет отображением приложения на терминалах с символьными ячейками. В остальной части документа термины curses и ncurses используются как взаимозаменяемые. Подробную историю NCURSES можно найти в файле NEWS из исходного дистрибутива. Текущий пакет поддерживается Томасом Дики. Вы можете связаться с сопровождающим по адресу bug-ncurses@gnu.org.

1.2. Что мы можем сделать с помощью NCURSES

NCURSES не только создает обертку над возможностями терминала, но и предоставляет надежную основу для создания красивого пользовательского интерфейса (UI) в текстовом режиме. Она предоставляет функции для создания окон и т.д. Его родственные библиотеки panel, menu и form обеспечивают расширение базовой библиотеки curses. Эти библиотеки обычно поставляются вместе с curses. Можно создавать приложения, содержащие множество окон, меню, панелей и форм. Окнами можно управлять независимо, они могут обеспечивать "прокрутку" и даже могут быть скрыты.

Меню предоставляют пользователю возможность легкого выбора команд. Формы позволяют создавать простые в использовании окна ввода данных и отображения. Панели расширяют возможности ncurses для работы с перекрывающимися и сложенными окнами.

Это лишь некоторые из основных возможностей ncurses. По мере продвижения мы увидим все возможности этих библиотек.

1.3. Где взять?

Комментарий lomaster (для c++ через vcpkg)

 ./vcpkg install ncurses:x64-linux
 ./vcpkg integrate install

(Оригинал дальше)

Итак, теперь, когда вы знаете, что можно делать с помощью ncurses, вы, должно быть, готовы приступить к работе. NCURSES обычно поставляется вместе с вашей установкой. Если у вас нет этой библиотеки или вы хотите скомпилировать ее самостоятельно, читайте дальше.

Компиляция пакета NCURSES можно получить с сайта ftp://ftp.gnu.org/pub/gnu/ncurses/ncurses.tar.gz или любого из ftp-сайтов, упомянутых в http://www.gnu.org/order/ftp.html. Прочитайте файлы README и INSTALL для получения подробной информации о том, как его установить. Обычно это включает в себя следующие операции.

tar zxvf ncurses<version>.tar.gz    # Распакуйте и извлеките архив
cd ncurses<version>                 # Перейдите в директорию ncurses
./configure                         # Cконфигурируйте сборку в соответствии с вашими

make                                # Соберите его
su root                             # Перейдите в root
make install                        # Установите

Использование RPM
NCURSES RPM можно найти и загрузить с сайта http://rpmfind.net. RPM может быть установлен с помощью следующей команды после получения прав root.

rpm -i <downloaded rpm>

1.4. Назначение/область применения документа

Этот документ должен стать руководством "Все в одном" по программированию с помощью ncurses и родственных ему библиотек. Мы переходим от простой программы "Hello World" к более сложным манипуляциям с формами. Никакого предварительного опыта работы с ncurses не предполагается. Изложение ведется в неформальной манере, но для каждого примера приводится много подробностей.

1.5. О программах

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

ncurses
|
|----> JustForFun     -- программы для развлечения
|----> basics         -- базовые программы
|----> demo           -- выходные файлы попадают в эту директорию после make
| |
| |----> exe          -- exe-файлы всех программ-примеров
|----> forms          -- программы, связанные с библиотекой форм
|----> menus          -- программы, относящиеся к библиотеке меню
|----> panels         -- программы, связанные с библиотекой panels
|----> perl           -- perl-эквиваленты примеров (предоставлены | Анурадха Ратнавира)
|----> Makefile       -- Makefile верхнего уровня
|----> README         -- файл README верхнего уровня, содержит инструкции
|----> COPYING        -- уведомление об авторских правах

Отдельные каталоги содержат следующие файлы.

JustForFun
|
|----> hanoi.c              -- Решатель игры Towers of Hanoi
|----> life.c               -- Демо-версия игры "Игра жизни
|----> magic.c              -- Построитель магических квадратов нечетного порядка
|----> queens.c             -- Знаменитый N-Queens Solver
|----> shuffle.c            -- Увлекательная игра, если у вас есть время, чтобы убить время
|----> tt.c                 -- Очень тривиальный самоучитель набора текста
basics
|
|----> acs_vars.c           -- Пример ACS_ переменных
|----> hello_world.c        -- Простая программа "Hello World"
|----> init_func_example.c  -- Пример функций инициализации
|----> key_code.c           -- Показывает скан-код нажатой клавиши
|----> mouse_menu.c         -- Меню, доступное с помощью мыши
|----> other_border.c       -- Показывает использование других функций границы apa
| -- rt из box()
|----> printw_example.c     -- Очень простой пример printw()
|----> scanw_example.c      -- Очень простой пример getstr()
|----> simple_attr.c        -- Программа, которая может распечатать файл c
| -- комментариями в атрибуте
|----> simple_color.c       -- Простой пример, демонстрирующий цвета
|----> simple_key.c         -- Меню, доступное с помощью клавиатурных UP, DOWN
| -- стрелками
|----> temp_leave.c         -- Демонстрация временного выхода из режима curses
|----> win_border.c         -- Демонстрирует создание окон и границ
|----> with_chgat.c         -- пример использования chgat()
forms
|
|----> form_attrib.c        -- Использование атрибутов полей
|----> form_options.c       -- Использование опций поля
|----> form_simple.c        -- Пример простой формы
|----> form_win.c           -- Демонстрация окон, связанных с формами
menus
|
|----> menu_attrib.c        -- Использование атрибутов меню
|----> menu_item_data.c     -- Использование функций item_name() и т.д..
|----> menu_multi_column.c  -- Создание многоколоночных меню
|----> menu_scroll.c        -- Демонстрирует возможность прокрутки меню
|----> menu_simple.c        -- Простое меню, доступ к которому осуществляется с помощью клавиш со стрелками
|----> menu_toggle.c        -- Создает многозначные меню и объясняет их работу
| -- REQ_TOGGLE_ITEM
|----> menu_userptr.c       -- Использование пользовательского указателя
|----> menu_win.c           -- Демонстрация окон, связанных с меню
panels
|
|----> panel_browse.c       -- Просмотр панели через вкладку. Использование пользовательского
| -- указателя
|----> panel_hide.c         -- Скрытие и не скрытие панелей
|----> panel_resize.c       -- Перемещение и изменение размеров панелей
|----> panel_simple.c       -- Пример простой панели
perl
|----> 01-10.pl             -- Perl-эквиваленты первых десяти примеров программ

В основной каталог включен Makefile верхнего уровня. Он собирает все файлы и помещает готовые к использованию exes в каталог demo/exe. Вы также можете выполнить выборочный make, зайдя в соответствующий каталог. Каждый каталог содержит файл README, объясняющий назначение каждого c-файла в каталоге.

Для каждого примера я указал путь к файлу относительно каталога примеров. Если вы предпочитаете просматривать отдельные программы, направьте свой браузер на http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/ncurses_programs/.

Все программы выпускаются под той же лицензией, что и ncurses (в стиле MIT). Это дает вам возможность делать практически все, что угодно, кроме того, чтобы заявить, что они ваши. Не стесняйтесь использовать их в своих программах по мере необходимости.

1.6. Другие форматы документа

Это руководство также доступно в различных других форматах на сайте tldp.org. Вот ссылки на другие форматы этого документа.

1.6.1. Легкодоступные форматы с сайта tldp.org

  • Acrobat PDF Format
  • PostScript Format
  • In Multiple HTML pages
  • In One big HTML format

1.6.2. Сборка из исходных текстов

Если приведенные выше ссылки не работают или если вы хотите поэкспериментировать с sgml, читайте дальше.

Get both the source and the tar,gzipped programs, available at
http://cvsview.tldp.org/index.cgi/LDP/howto/docbook/
NCURSES-HOWTO/NCURSES-Programming-HOWTO.sgml
http://cvsview.tldp.org/index.cgi/LDP/howto/docbook/
NCURSES-HOWTO/ncurses_programs.tar.gz
Unzip ncurses_programs.tar.gz with
tar zxvf ncurses_programs.tar.gz
Use jade to create various formats. For example if you just want to create
the multiple html files, you would use
jade -t sgml -i html -d <path to docbook html stylesheet>
NCURSES-Programming-HOWTO.sgml
to get pdf, first create a single html file of the HOWTO with
jade -t sgml -i html -d <path to docbook html stylesheet> -V nochunks
NCURSES-Programming-HOWTO.sgml > NCURSES-ONE-BIG-FILE.html
then use htmldoc to get pdf file with
htmldoc --size universal -t pdf --firstpage p1 -f <output file name.pdf>
NCURSES-ONE-BIG-FILE.html
for ps, you would use
htmldoc --size universal -t ps --firstpage p1 -f <output file name.ps>
NCURSES-ONE-BIG-FILE.html

Более подробную информацию см. в руководстве для авторов LDP. Если все остальное не помогает, напишите мне по адресу ppadala@gmail.com.
(Комментарий lomaster) - я думаю не стоит :)

1.7. Кредиты

Я благодарю Шарата и Эмре Акбаса за помощь в написании некоторых разделов. Введение было первоначально написано Шаратом. Я переписал его, взяв несколько выдержек из его первоначальной работы. Эмре помог в написании разделов printw и scanw.

Perl-эквиваленты примеров программ предоставлены Анурадхой Ратнавирой. Далее идет Рави Парими, мой самый дорогой друг, который участвовал в этом проекте еще до того, как была написана хоть одна строчка. Он постоянно заваливал меня предложениями и терпеливо просматривал весь текст. Он также проверил каждую программу на Linux и Solaris.

1.8. Список пожеланий

Это список пожеланий, в порядке приоритета. Если у вас есть пожелание или вы хотите поработать над его выполнением, напишите мне.

  • Добавить примеры в последние части раздела форм.

Подготовьте демонстрацию, показывающую все программы, и дайте пользователю возможность просмотреть описание каждой программы. Дайте пользователю возможность скомпилировать и увидеть программу в действии. Предпочтителен диалоговый интерфейс.

  • Добавьте отладочную информацию. _tracef, _tracemouse.
  • Доступ к termcap, terminfo с помощью функций, предоставляемых пакетом ncurses.
  • Работа на двух терминалах одновременно.
  • Добавление дополнительных материалов в раздел miscellaneous.

1.9. Авторское право

Copyright © 2001 by Pradeep Padala. Настоящим предоставляется бесплатное разрешение любому лицу, получившему копию данного программного обеспечения и связанных с ним файлов документации ("Программное обеспечение"), работать с Программным обеспечением без ограничений, включая, без ограничения, права на использование, копирование, изменение, объединение, публикацию, распространение, распространение с изменениями, сублицензирование и/или продажу копий Программного обеспечения, а также разрешать лицам, которым предоставляется Программное обеспечение, делать это при соблюдении следующих условий:

Приведенное выше уведомление об авторском праве и данное уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОГО СОСТОЯНИЯ, ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ВЫШЕУКАЗАННЫЕ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ЛЮБЫМ ПРЕТЕНЗИЯМ, УБЫТКАМ ИЛИ ДРУГИМ ОБЯЗАТЕЛЬСТВАМ, БУДЬ ТО В РАМКАХ ДОГОВОРНОГО, ДЕЛИКТНОГО ИЛИ ИНОГО ИСКА, ВОЗНИКАЮЩИМ ИЗ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, В СВЯЗИ С НИМ ИЛИ В РЕЗУЛЬТАТЕ ЕГО ИСПОЛЬЗОВАНИЯ ИЛИ ДРУГИХ ОПЕРАЦИЙ С НИМ.

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

Clone this wiki locally