-
Notifications
You must be signed in to change notification settings - Fork 1
1. Введение
В старые добрые времена телетайпных терминалов терминалы находились вдали от
компьютеров и подключались к ним через последовательные кабели. Терминалы
можно было конфигурировать, посылая серию байтов. Все возможности терминалов
(такие как перемещение курсора на новое место, стирание части экрана, прокрутка
экрана, изменение режимов и т.д.) могли быть доступны через эти серии байтов. Эти
управляющие последовательности обычно называют управляющими
последовательностями, поскольку они начинаются с символа escape(0x1B)
. Даже
сегодня, при соответствующей эмуляции, мы можем посылать управляющие
последовательности в эмулятор и добиваться того же эффекта в окне терминала.
Предположим, вы хотите напечатать строку цветом. Попробуйте набрать на консоли следующее:
echo "^[[0;31;40mIn Color"
Первый символ - это символ эвакуации, который выглядит как два символа ^
и [
. Чтобы
напечатать его, нужно нажать CTRL+V
, а затем клавишу ESC
. Все остальные - обычные
печатаемые символы. Вы должны увидеть строку "In Color"
красного цвета. Она так и
останется, а чтобы вернуться в исходный режим, введите следующее.
echo "^[[0;37;40m"
Итак, что означают эти магические символы? Сложные для понимания? Они даже могут
быть разными для разных терминалов. Поэтому разработчики UNIX
придумали
механизм под названием termcap
. Это файл, в котором перечислены все возможности
конкретного терминала, а также управляющие последовательности, необходимые для
достижения определенного эффекта. В более поздние годы он был заменен на terminfo
.
Не вдаваясь в подробности, этот механизм позволяет прикладным программам
запрашивать базу данных terminfo
и получать управляющие символы для отправки на
терминал или эмулятор терминала
Возможно, вы задаетесь вопросом, зачем нужна вся эта техническая белиберда. В
описанном выше сценарии каждая прикладная программа должна запрашивать terminfo
и выполнять необходимые действия (отправка управляющих символов и т.д.). Вскоре
стало трудно управлять этой сложностью, и это привело к появлению 'CURSES'
.
Curses
это каламбур от названия "оптимизация курсора". Библиотека Curses
формирует
обертку над работой с необработанными терминальными кодами и предоставляет
очень гибкий и эффективный API
(интерфейс прикладного программирования). Она
предоставляет функции для перемещения курсора, создания окон, создания цветов,
игры с мышью и т.д. Прикладным программам не нужно беспокоиться о базовых
возможностях терминала.
Так что же такое NCURSES?
NCURSES
- это клон оригинальной версии System V
Release 4.0 (SVr4) curses
- Это свободно распространяемая библиотека, полностью
совместимая со старыми версиями curses. Вкратце, это библиотека функций, которая
управляет отображением приложения на терминалах с символьными ячейками. В
остальной части документа термины curses
и ncurses
используются как
взаимозаменяемые.
Подробную историю NCURSES
можно найти в файле NEWS
из исходного
дистрибутива. Текущий пакет поддерживается Томасом Дики. Вы можете связаться с
сопровождающим по адресу bug-ncurses@gnu.org
.
NCURSES не только создает обертку над возможностями терминала, но и
предоставляет надежную основу для создания красивого пользовательского
интерфейса (UI)
в текстовом режиме. Она предоставляет функции для создания окон и
т.д. Его родственные библиотеки panel
, menu
и form
обеспечивают расширение базовой
библиотеки curses
. Эти библиотеки обычно поставляются вместе с curses
. Можно
создавать приложения, содержащие множество окон, меню, панелей и форм. Окнами
можно управлять независимо, они могут обеспечивать "прокрутку" и даже могут быть
скрыты.
Меню предоставляют пользователю возможность легкого выбора команд. Формы
позволяют создавать простые в использовании окна ввода данных и отображения.
Панели расширяют возможности ncurses
для работы с перекрывающимися и
сложенными окнами.
Это лишь некоторые из основных возможностей ncurses
. По мере продвижения мы
увидим все возможности этих библиотек.
Комментарий 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>
Этот документ должен стать руководством "Все в одном" по программированию с помощью ncurses и родственных ему библиотек. Мы переходим от простой программы "Hello World" к более сложным манипуляциям с формами. Никакого предварительного опыта работы с ncurses не предполагается. Изложение ведется в неформальной манере, но для каждого примера приводится много подробностей.
Все программы в документе доступны в заархивированном виде здесь. Разархивируйте и распакуйте его. Структура каталогов выглядит следующим образом.
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
). Это
дает вам возможность делать практически все, что угодно, кроме того, чтобы заявить,
что они ваши. Не стесняйтесь использовать их в своих программах по мере
необходимости.
Это руководство также доступно в различных других форматах на сайте tldp.org. Вот ссылки на другие форматы этого документа.
- Acrobat PDF Format
- PostScript Format
- In Multiple HTML pages
- In One big HTML format
Если приведенные выше ссылки не работают или если вы хотите
поэкспериментировать с 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) - я думаю не стоит :)
Я благодарю Шарата и Эмре Акбаса за помощь в написании некоторых разделов.
Введение было первоначально написано Шаратом. Я переписал его, взяв несколько
выдержек из его первоначальной работы. Эмре помог в написании разделов printw
и
scanw
.
Perl
-эквиваленты примеров программ предоставлены Анурадхой Ратнавирой.
Далее идет Рави Парими, мой самый дорогой друг, который участвовал в этом проекте
еще до того, как была написана хоть одна строчка. Он постоянно заваливал меня
предложениями и терпеливо просматривал весь текст. Он также проверил каждую
программу на Linux
и Solaris
.
Это список пожеланий, в порядке приоритета. Если у вас есть пожелание или вы хотите поработать над его выполнением, напишите мне.
- Добавить примеры в последние части раздела форм.
Подготовьте демонстрацию, показывающую все программы, и дайте пользователю возможность просмотреть описание каждой программы. Дайте пользователю возможность скомпилировать и увидеть программу в действии. Предпочтителен диалоговый интерфейс.
- Добавьте отладочную информацию.
_tracef
,_tracemouse
. - Доступ к
termcap
,terminfo
с помощью функций, предоставляемых пакетомncurses
. - Работа на двух терминалах одновременно.
- Добавление дополнительных материалов в раздел
miscellaneous
.
Copyright © 2001 by Pradeep Padala. Настоящим предоставляется бесплатное разрешение любому лицу, получившему копию данного программного обеспечения и связанных с ним файлов документации ("Программное обеспечение"), работать с Программным обеспечением без ограничений, включая, без ограничения, права на использование, копирование, изменение, объединение, публикацию, распространение, распространение с изменениями, сублицензирование и/или продажу копий Программного обеспечения, а также разрешать лицам, которым предоставляется Программное обеспечение, делать это при соблюдении следующих условий:
Приведенное выше уведомление об авторском праве и данное уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОГО СОСТОЯНИЯ, ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ ВЫШЕУКАЗАННЫЕ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ЛЮБЫМ ПРЕТЕНЗИЯМ, УБЫТКАМ ИЛИ ДРУГИМ ОБЯЗАТЕЛЬСТВАМ, БУДЬ ТО В РАМКАХ ДОГОВОРНОГО, ДЕЛИКТНОГО ИЛИ ИНОГО ИСКА, ВОЗНИКАЮЩИМ ИЗ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, В СВЯЗИ С НИМ ИЛИ В РЕЗУЛЬТАТЕ ЕГО ИСПОЛЬЗОВАНИЯ ИЛИ ДРУГИХ ОПЕРАЦИЙ С НИМ.
За исключением случаев, содержащихся в настоящем уведомлении, имя (имена) вышеуказанных правообладателей не должно использоваться в рекламе или иным образом для продвижения продажи, использования или других операций с данным Программным обеспечением без предварительного письменного разрешения.
Перевод lomaster & oldteam