Введення

Колись давно у часи телетайпових терміналів, термінали знаходились на віддалі від комп'ютерів і сполучалися з ними через послідовні кабелі. Термінали можна було конфігурувати посилаючи певну послідовність байтів. До всіх можливостей (такі як переміщення курсору на нове місце, стирання частини екрану, прокрутка екрану, зміна режимів тощо) терміналів можна було мати доступ через цей набір байтів. Ці керівні послідовності також часто називаються екранованими послідовностями, оскільки вони починаються зі знаку екранування (0x1B). Навіть сьогодні, з відповідною емуляцією, ми в змозі надсилати керівні екрановані послідовності емулятору і отримати той самий ефект у вікні терміналу.

Скажімо, вам необхідно вивести кольоровий рядок. Спробуйте ввести наступне у вашій консолі:

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

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

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

Тепер, щодо того, що саме ці загадкові знаки означають. Важко зрозуміти, так? Вони навіть можуть відрізнятися для різних терміналів. Тож розробники UNIX саме з-за цього створили механізм під назвою termcap. Це файл, що перераховує усі можливості певного терміналу, разом із керівними послідовностями, необхідними для досягнення певного ефекту. Пізніше, цей файл змінено на terminfo. Щоби не занадто заглиблюватись у деталі, даний механізм дозволяє прикладним програмам переглядати базу даних terminfo і добувати керівні послідовності для надсилання терміналу або термінальному емуляторові.

Що таке NCURSES?

Вас може цікавити, який сенс усієї цієї технічної нісенітниці. З вищесказаного випливає, що кожна прикладна програма повинна була звиритися з terminfo для здійснення необхідних дій (надсилання керівних послідовностей тощо). Згодом, стало важко справлятися зі складністю усього цього, і тому з'явилися 'CURSES'. Curses - це каламбур від "cursor optimization". Бібліотека Curses створює обгортку для роботи з необробленими кодами терміналу, і надає надзвичайно гнучкий та ефективний Інтерфейс Прикладного Програмування (API - Application Programming Interface). Вона передбачає функції для переміщення курсору, створення вікон, відображення кольорів, взаємодії з мишкою тощо. Таким чином, прикладні програми не повинні хвилюватися щодо можливостей підставового терміналу.

Тож, що таке NCURSES? NCURSES - це аналог оригінального System V 4.0 (SVr4) curses. Це вільно розповсюджувана бібліотека, повністю сумісна зі старою версією curses. Словом, це бібліотека функцій, які керують відображенням прикладних програм на символьно-клітинчастих терміналах. У решті цього документу, терміни curses і ncurses вживаються взаємозамінно.

Повну історію NCURSES ви можете знайти у файлі NEWS вихідних текстів бібліотеки. На даний час, пакет підтримується в робочому стані Томасом Дікі. Ви можете контактувати утримувачів за адресою bug-ncurses@gnu.org.

Що ми можемо здійснити за допомогою NCURSES?

NCURSES не тільки створює обгортку навколо здатності терміналів, але також надає надійну структуру для створення привабливих Користувацьких Інтерфейсів (UI - User Interface) у текстовому режимі. Вона передбачає функції для створення вікон, і.т.п. Споріднені з нею бібліотеки panel, menu та form забезпечують розширенням основної бібліотеки curses. Тож, ви в змозі створювати прикладні програми з чисельними вікнами, меню, панелями (планшетами) та формами. Вікнами можна керувати незалежно одне від одного, їх можна забезпечити можливістю прокрутки, або навіть властивістю бути прихованими.

Бібліотека menu надає користувачам легку можливість вибору команд. Бібліотека form - можливість введення даних у форми і вікна. Бібліотека panels розширює можливості ncurses обробки перекритних і накладених вікон.

Це тільки деякі з основних речей, які нам дозволяє здійснити ncurses. Впродовж цього тексту, ми ознайомимося зі всіма можливостями цих бібліотек.

Де завантажити бібліотеку?

Гаразд, тепер як дізналися, що дозволяє нам 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<версія>                 # заходимо до каталогу
./configure                        # виконуємо скрипт конфігурації
make                               # здійснюємо побудову пакету
su root                            # стаємо надкористувачем
make install                       # інсталюємо бібліотеку

Використовуючи RPM

NCURSES RPM можна знайти та завантажити з http://rpmfind.net. Самий RPM-пакет інсталюється наступною командою, після того як ви станете root-користувачем.

rpm -i <завантажений rpm>

Мета цього документу

Цей документ задумано як "усе в одному" посібник по програмуванню з ncurses і спорідненими бібліотеками. Ми розпочнемо наше навчання з найпростішої програми "Hello World", і закінчимо більш складним маніпулюванням форм. Жодного попереднього досвіду з ncurses не передбачається. Стиль викладу не є формальним, зате надається дуже детальний опис кожного прикладу.

Про програми

Усі програми цього документу доступні у архівованому вигляді тут. Розтисніть і розархівуйте їх. Структура каталогів виглядатиме наступним чином.

ncurses
  |
  |----> JustForFun     -- програми, просто для забави
  |----> basics         -- основні програми
  |----> demo           -- файли виводу програми make
  |          |
  |          |----> exe -- exe-файли всіх програм-прикладів
  |----> forms          -- програми, пов'язані з бібліотекою form
  |----> menus          -- програми, пов'язані з бібліотекою menus
  |----> panels         -- програми, пов'язані з бібліотекою panels
  |----> perl           -- perl-еквіваленти прикладів (внесок
  |                        Anuradha Ratnaweera)
  |----> Makefile       -- Makefile верхнього рівня
  |----> README         -- README верхнього рівня; включає інструкції
  |----> COPYING        -- авторські права

Окремі каталоги містять наступні файли.

Опис файлів у кожному каталозі

JustForFun
  |
  |----> hanoi.c   -- гра The Towers of Hanoi
  |----> life.c    -- демо The Game of Life
  |----> magic.c   -- Odd Order Magic Square
  |----> queens.c  -- N-Queens
  |----> 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        -- інші функції облямівки, окрім 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 верхнього рівня. Він побудує всі програми і розмістить їх у каталозі demo/exe. Ви можете також вибірково будувати, якщо зайдете у відповідний каталог і виконаєте make. Кожний каталог включає файл README, який пояснює зміст усіх c-файлів цього каталогу.

Для перегляду окремих програм, направте ваш навігатор на http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/ncurses_programs/

Усі програми випущено із тією самою ліцензією, що й ncurses (ліцензія стилю MIT). Це надає вам право робити з ними що завгодно, окрім стверджувати, що вони написані вами. Можете вільно використовувати їх у ваших програмах.

Інші формати цього документу

Цей ЧАП можна також знайти в інших форматах на майданчику tldp.org. Ось посилання на різноманітні формати цього документу.

1.6.1 Готові до використання формати з tldp.org

  • Формат Acrobat PDF
  • Формат PostScript
  • Чисельні сторінки HTML
  • Одна велика HTML-сторінка

1.6.2 Побудова з вихідного тексту

Якщо вищенаведені посилання не працюють, або якщо ви хотіли би поекперементувати з sgml, читайте далі.

Завантажте вихідний текст документу і архівовані приклади програм з наступних адрес

Розпакуйте ncurses_programs.tar.gz командою

tar zxvf ncurses_programs.tar.gz

Скористайтеся з програми jade для створення різноманітних форматів. Так наприклад, якщо би вам хотілося створити багаточисельні html-файли, виконайте

jade -t sgml -i html -d <шлях до стильової сторінки docbook html>
NCURSES-Programming-HOWTO.sgml

щоб отримати pdf, спершу створіть єдиний html-файл командою

jade -t sgml -i html -d <шлях до стильової сторінки docbook html> 
-V nochunks NCURSES-Programming-HOWTO.sgml > НАЗВА_ФАЙЛУ.html

після цього, використайте htmldoc для генерації pdf-файлу

htmldoc --size universal -t pdf --firstpage p1 -f <назва_файлу.pdf>
НАЗВА_ФАЙЛУ.html

для формату ps, вам потрібно би було

htmldoc --size universal -t ps --firstpage p1 -f <назва_файлу.ps>
НАЗВА_ФАЙЛУ.html

Дивіться "LDP Author guide" для додаткових подробиць. Якщо нічого з вищенаведеного не працює, повідомте мене за адресою ppadala@gmail.com.

Подяки

Я хочу подякувати Sharath й Emre Akbas за допомогу з декількома розділами. Вступ, початково, написано Sharath. Я переписав його наново із запозиченнями з оригінального. Emre допоміг у написанні розділів про printw і scanw.

Perl-еквіваленти програм надано Anuradha Ratnaweera.

І, нарешті, дякую моєму приятелеві Ravi Parimi, який знаходився поруч у цьому проекті, ще до того як було написано хоч один рядок. Він буквально завалив мене порадами і терпляче переглянув цілий текст. Він також перевірив кожну програму на Лінуксі та Солярисі.

Список побажань

Наступне є переліком побажань, у порядку пріоритету. Якщо у ви хочете, щоб щось було зроблено, або бажаєте допомогти у втіленні чогось, надішліть мені повідомлення електронною поштою.

  • Додати приклади до останньої частини розділу про форми.
  • Підготувати демо зі всіма програмами, надаючи користувачеві можливість перегляду опису кожної програми. Дозволити користувачеві компілювати та переглянути дію програми. Бажано інтерфейс, оснований на діалозі.
  • Додати зневаджувальну інформацію, tracef і tracemouse.
  • Доступ до termcap, terminfo за допомогою функцій ncurses.
  • Робота одночасно на двох терміналах.
  • Додати до розділу "Додатково".

Авторські права

Copyright (c) 2001 by Pradeep Padala.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, distribute with modifications, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization.