Функции управления экраном терминала ncurses


Содержание

Функции управления экраном терминала ncurses

Reha is a student of computer engineering in Istanbul, Turkey. He loves the freedom Linux provides as a software development platform. He spends much of his time in front of his computer, writing programms. He wishes to become a smart programmer someday.

Перевод на Русский:
Иванов Ю.А.

Содержание:

  • Что такое Ncurses?
  • Где взять?
  • Основы
  • Обновление экрана: refresh
  • Создание новых окон
  • Запись в окно и чтение из окна
  • Физический и логический курсоры
  • Очистка окна
  • Использование цветов
  • Рамки вокруг окон
  • Функциональные клавиши
  • Пример
  • Заключение
  • Ссылки
  • Страница отзывов

Введение в Ncurses

Ncurses это библиотека, которая реализует для текстовых терминалов многооконный интерфейс с большими возможностями.

Что такое Ncurses?

Вы хотите, чтобы ваша консольная программа имела цветной оконный интерфейс? Если да, то вам нужна ncurses, библиотека, которая реализует оконный интерфейс для текстовых терминалов. С помощью ncurses вы сможете:

  • использовать весь экран по своему устмотрению;
  • создавать окна и управлять ими;
  • использовать 8 различных цветов;
  • предоставить своей программе поддержку «мыши»;
  • использовать функциональные клавиши клавиатуры.

Ncurses можно использовать на любой UNIX системе, поддерживающей стандарт ANSI/ POSIX. Кроме того, библиотеку отличает способность определять свойства терминала через системную базу и реализовывать, таким образом, терминально-независимый интерфейс. Для вашей программы это означает, первое, кросс-платформенную переносимость и, второе, независимость от типа используемого терминала.

В качестве живых примеров использования библиотеки можно привести всем известный Midnight Commander и программу, используемую при конфигурации ядра системы. Их «скриншоты» вы можете увидеть ниже

Где взять?

Ncurses разработана по открытой лицензии и поэтому, чтобы скачать ее последний релиз, получить более подробную информацию или найти другие соответствующие ссылки, мы смело посещаем www.gnu.org/software/ncurses/.

Основы

Для того, чтобы использовать библиотеку, вам следует включить в исходный код своей программы заголовочный файл curses.h и при «линковке» программы не забыть указать компилятору gcc параметр -lcurses.

При работе с библиотекой необходимо иметь понятие о такой фундаментальной структуре данных, как WINDOW. Как вы можете легко догадаться, она используется для описания создаваемого окна. Почти все функции библиотеки получают в качестве параметра указатель на эту структуру.

Наиболее часто используемыми компонентами ncurses являются окна. Даже если вы в своей программе не создаете окон, сам экран считается окном. Также как и файловый дескриптор stdout стандартной библиотеки I/O представляет экран ( когда нет других перенаправлений ), ncurses имеет свой указатель stdscr, который делает аналогичную работу. Кроме stdscr, библиотека имеет еще один похожий указатель — curscr. В то время как stdscr представляет экран, curscr представляет текущий экран. Вы можете спросить: «Так в чем отличие?». Читайте дальше.

Для того, чтобы использовать функции и переменные ncurses в своих программах, вы должны обратиться к функции initscr. Эта функция выделяет память для таких переменных как stdscr, curscr и делает библиотеку готовой к использованию. Другими словами, все функции библиотеки должны использоваться только после initscr. Очень похожим образом, вам следует обратиться к функции endwin, когда работа с ncurses закончена. Эта функция освобождает память, выделенную для ncurses. После вызова endwin, вы не сможете воспользоваться функциями ncurses до тех пор, пока снова не обратитесь к initscr.

Между обращениями к initscr и endwin, вам следует быть уверенным, что для работы с экраном не используются функции стандарьной библиотеки I/O. В противном случае, вы столкнетесь с нежелательным и, обычно, некорректным выводом на экран. Когда ncurses активна, используйте только ее функции. Перед обращением к initscr или после вызова endwin, вы можете делать что хотите.

Обновление экрана: refresh

Структура WINDOW не толлько хранит высоту, ширину и позицию окна, но также его контекст. Когда вы пишите в окно, его контекст меняется, но это не значит, что это сразу же отражается на экране. Для обновления экрана необходимо вызвать refresh или wrefresh.

Вот здесь и лежит различие между stdscr и curscr. В то время как curscr хранит контекст текущего экрана, stdscr, после обращения к фукнциям вывода библиотеки, может содержать уже другую информацию. Если вы хотите, чтобы последние изменения, отраженные в stdscr были перенесена в curscr, необходимо вызвать функцию refresh. Другими словами, refresh является единственной функцией связанной с curscr. И настоятельно рекомендуется, во избежание недоразумений с curscr, выполнять его обновление только с помощью этой функции.

В refresh реализован механизм обновления экрана с максимально возможной скоростью. При своем вызове, функция обновляет только те строки экрана, которые были изменены. Это бережет процессорное время, поскольку отпадает необходимость в повторном перезаписыании информации на экране. Это механизм как раз и является причиной несовместимости функций ncurses и стандартной библиотеки I/O при совместном использовании; при своем вызове функции библиотеки ncurses устанавливают флаг, который указывает refresh на измененнные строки экрана, при вызове функций стандартной библиотеки I/O ничего подобного не происходит.

refresh и wrefresh, в основном, делают одно и то же. wrefresh получает в качестве параметра указатель на структуру WINDOW и обновляет контекст только укзанного окна. refresh() является эквивалентом wrefresh(stdscr). Как я расскажу позднее, большинство функций ncurses, аналогично wrefresh, имеют подобные макросы, связывающие их с stdscr.

Создание новых окон

Давайте теперь поговорим о subwin и newwin, функциях, которые создают новые окна. Обе эти функции в качестве параметров получают высоту, ширину и координаты верхнего левого угла нового окна. В свою очередь, они возвращают указатель на структуру WINDOW, представляющую вновь созданное окно. Вы можете использовать этот указатель с wrefresh и другими функциями о которых я расскажу чуть позже.

«Если они делают одно и то же, зачем их дублировать?» можете вы спросить. И будете правы, они отличаются не сильно. subwin создает новое окно, как подокно в другом окне. Окно, созданное таким образом, наследует свойства родительского окна. Эти унаследованные свойства в дальнейшем могут быть изменены без влияния на родительское окно.

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

В противоположность subwin, newwin создает совершенно новое окно. Это окно, до тех пор пока в нем не будут созданы подокна, не разделяет свой символьный массив с другим окном. Преимущество использования subwin выражается в том, что общий символьный массив использует меньше памяти. Однако, когда окна накладываются одно на другое, использование newwin имеет свои положительные стороны.

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

Когда вы сделали все что хотели с созданным окном, вы можете его удалить. В этом вам поможет функция delwin. Я полагаю, что вы сами можете более подробно ознакомиться с вышеперечисленными функциями обратившись к документации.

Запись в окно и чтение из окна

Мы поговорили о stdscr, curscr, обновлении экрана и создании новых окон. Но как мы можем что-либо записать в окно? Или как мы прочитать данные из окна?

Функции, которые используются для этих целей очень похожи на своих собратьев из стандартной библиотеки I/O. Среди этих функций printw ( аналог printf ), scanw ( аналог scanf ), addch ( аналог putc или putchar ), getch ( аналог getc или getchar ). Они используются как обычно, разница только в именах. Аналогично, addstr можно использовать для записи в, а getstr для чтения строки из окна. Все эти функции с добавленной буквой ‘w’ впереди имени и указателем на структуру WINDOW в качестве первого передаваемого параметра, делают свою работу с различными окнами из stdscr. Например, printw(. ) и wprintw(stdscr, . ) эквивалентны, также как refresh() и wrefresh(stdscr).

Можно бесконечно вникать в детали этих функций. Лучшим подспорьем в этом деле, конечно же, служит документация. Заключительная часть этой статьи, где я представлю пример программы, также может послужить руководством по использованию указанных функций.

Физический и логический курсоры

После рассказа о записи в и чтении из окон настало время поговорить о физических и логичеких курсорах. Под физическим курсором мы понимаем тот мерцающий курсор, который всегда виден на экране. Он всегда в единственном экземпляре. С другой стороны, логический курсор принадлежит окну, созданному с помощью библиотеки ncurses и, следовательно, каждое окно будет иметь свой курсор. Таким образом, логических курсоров может быть несколько.

Логический курсор находится в области окна, где начнется процедура записи или чтения. Таким образом, имея возможность перемещать логический курсор практически повсюду, вы можете выводить информацию в любом месте экрана или окна в любое время. В этом заключается преимущество ncurses перед стандартной библиотекой I/O.

Функция, которая перемещает логический курсор это move или, как вы можете легко догадаться, wmove. move является макросом wmove, написанным для stdscr.

Теперь мы рассмотрим вопрос координации физического и логического курсоров. Позиция физического курсора, о которой можно говорить после завершения операции записи, определяется флагом _leave ( определен в структуре WINDOW ). Если _leave установлен, после операции записи, логический курсор будет перемещен в позицию физического курсора ( где был записан последний символ ). Если _leave не установлен, после операции записи, физический курсор возвращается в позицию логического курсора ( где был записан первый символ ). Флагом _leave управляет функция leaveok.

Перемещением физического курсора управляет функция mvcur. В отличие от других функций, работа mvcur отражается на экране мгновенно без ожидания следующего обновления. Если вы хотите, чтобы физический курсор стал невидимым, используйте функцию curs_set. Детали смотри в документации.

Также существуют макросы, которые комбинируют функции перемещения и записи, описанные выше, в один простой вызов. С этими функциями можно знакомится так же в документации.

Очистка окна

Запись в окно произведена. Но как мы можем очистить окно, строку или символы?

В ncurses, операция очистки означает заполнение области, строки или контекста окна пробелами. Функции, о которых я буду рассказывать ниже, заполняют указанные области пробелами и, таким образом, очищают экран.

Сначала, давайте поговорим о функциях, которые связаны с очисткой символа или строки. Функции delch и wdelch удаляют символ, который находится в позиции логического курсора окна и смещают оставшиеся в той же строке символы влево. deleteln и wdeleteln удаляют строку на которой находится логический курсор и смещают все низлежащие строки вверх.

Функции clrtoeol и wclrtoeol удаляют все символы в одной строке справа от логического курсора. clrtobot и wclrtobot, сначала, вызывают wclrtoeol для удаления всех символов справа от логического курсора, а затем удаляют все последующие строки.

Помимо этих функций существуют функции, которые могут очищать экран или окно целиком. Есть два метода подобной очистки экрана. В первом, позиции экрана заполняются пробелами и, затем, вызывается refresh, а, во втором, используется встроенный код управления терминалом. Второй метод быстрее, так как не требует перезаписи позиций экрана и очищает экран практически мгновенно.

erase и werase заполняют символьный массив окна пробелами. И при следующем вызове refresh, окно очищается. Однако, если окно, которое следует очистить, заполняет весь экран, использование этих функций становится не эффективным. Они используют первый вариант очистки, описанный выше. Когда окно, которое нужно очистить, занимает весь экран, имеет смысл использовать функции, рассмотренные ниже.

Перед переходом к описанию других функций, пришло время рассказать о флаге _clear. Этот флаг определен в структуре WINDOW и если установлен, говорит refresh отправить на терминал управляющий код. При вызове, refresh проверяет занимает окно весь экран или нет ( используется флаг _FULLWIN ), если да, то она очищает экран с помощью управляющего кода. Это делает очистку экрана очень быстрой. Причина почему терминальный метод используется только для окон, занимающих весь экран лежит в том, что с помощью управляющего кода очищается экран, а не само окно. Флагом _clear управляет функция clearok.

Функции clear и wclear используются для очистки окон по ширине соответствующих экрану. Но на самом деле, эти функции эквивалентны вызовам werase и clearok. Сначала, они заполняют символьный массив окна пробелами. Затем, после установки флага _clear, очищают экран с помощью управляющего кода, если окно по ширине соответствует экрану или, же, обновляют окно, заполняя его пробелами.

Так что, если вы знаете, что окно, которое нужно очистить, занимает весь экран используйте clear или wclear. Это будет быстрее и эффективнее. Однако, когда окно не занимает экрана целиком, разницы в использовании wclear или werase нет.

Использование цветов

Цвета, которые вы видите на экране следует предсталять в виде пар цветов. Это потому, что каждая область имеет свой «background»- и «foreground»-цвет. Вывод информации в цвете, в ncurses, означает создание своих собственных пар цветов и использовании их в операции записи в окне.

Аналогично тому как initscr необходимо вызывать в начале работы с ncurses, start_color необходимо вызывать для инициализации работы с цветами. Функция, которую необходимо использовать для создания пар цветов это init_pair. Когда вы создаете с помощью init_pair пару цветов, она ассоциируется с числом, которое вы передаете функции в качестве первого параметра. Затем, когда бы вы не захотели использовать эту пару цветов, вы просто сошлетесь на нее с помощью этого числа.

Кроме создания пар цветов, вам необходимы функции, осуществляющие запись с использованием различных цветовых пар. Это осуществляется функциями attron и wattron. Эти функции, пока не будут вызваны attroff или wattroff, заставляют выводиться всю информацию в соответствующее окно выбранной парой цветов.

Также существуют функции bkgd и wbkgd, которые меняют пару цветов, ассоциированную с целым окном. При вызове, они изменяют «background»- и «foreground»-цвета всех областей окна. Это значит, что при следующем вызове refresh, каждая область окна будет перезаписана с помощью новой пары цветов.

Смотрите документацию по поводу доступных цветов и подробной информации о вышеприведенных функциях.

Рамки вокруг окон

Для придания вашей программе еще лучшего вида, вы можете создать вокруг окон рамки. В библиотеке существует макрос box, который и делает это для вас. В отличие от других функций, дял box wbox не существует; в качестве аргумента box получает указатель на структуру WINDOW.

Более подробную информацию о box вы можете найти в документации. Однако, следует упомянуть вот о чем. Обрамление окна рамкой означает просто запись необходимых символов в символьный массив окна, в его граничные области. Если вы позднее запишите в эти области какую-либо информацию, рамка окна будет испорчена. Для предотвращения этого, с помощью subwin вы создаете в исходном окне внутреннее окно, обрамляя, таким образом, исходное окно рамкой и используя внутреннее окно для записи.

Функциональные клавиши

Для того, чтобы использовать функциональные клавиши, для окна с которым вы собираетесь работать необходимо установить флаг _use_keypad. keypad является функцией, которая устанавливает значение _use_keypad. Когда вы устанавливаете _use_keypad, вы можете получить ввод с клавиатуры как обычно, используя функции ввода.

В этом случае, например, при использовании getch для получения данных, вам следует знать, что эти данные нужно хранить в переменной int, а не char. Причина этого заключается в том, что числовые значения функциональных клавиш по величине больше, чем может хранить переменная типа char. Вам не нужно знать этих числовых значений, просто узнайте их символьные имена, обратившись к описанию функции getch.

Пример

Сейчас мы собираемся проанализировать небольшую программу. В этой программе будет продемонстрирована работа с меню, созданным с помощью ncurses. «Скриншоты» вы можете посмотреть ниже:

Программа, как обычно, начинается с включения заголовочных файлов. Затем, мы определяем константы, чьими значениями будут ASCII-значения клавиш enter и escape.

Функция, приведенная ниже, вызывается в программе первой, при старте. В ней первой вызывается initscr для инициализации curses и, затем, start_color, которая делает возможным использование цветов. Пары цветов будут определены позднее. Вызов curs_set(0) делает физический курсор невидимым. noecho останавливает вывод информации с клавиатуры на экран. Функцию noecho можно также использовать для управления вводом с клавиатуры и отображения на экране только необходимой информации. Функция echo может быть вызвана когда нужно отменить действие noecho. И последней вызывается keypad, чтобы разрешить работу функциональных клавиш при получении ввода из stdscr. Это необходимо, так как мы собираемся использовать F1, F2 и клавиши со стрелками.

В следующей функции создается горизонтальное меню в верхней части экрана. Вы можете обратиться к функции main ( см. ниже ) и посмотреть, что это горизонтальное меню, появляющееся в виде одной строки в верхней части экрана, на самом деле определено как subwindow размером в одну строку для stdscr. Функция, приведенная ниже, получает в качестве параметра указатель на это окно, и сначала изменяет его цвет подложки, а затем выводит названия пунктов меню. Мы используем для вывода названий пунктов меню waddstr, хотя здесь можно было применить другую функцию. Обратите внимание на wattron, вызовы которой обычно используются для записи с другой парой цветов ( номер 3 ), а не с установленной по умолчанию ( номер 2 ). Помните, что пара номер 2 была установлена по умолчанию в первой строке wbkgd. wattroff вызывается, когда мы хотим переключиться на цветовую пару, используемую по-умолчанию.

Следующая функция отвечает за вывод меню при нажатии клавиш F1 или F2. Для создания эффекта меню, поверх синего окна, используемого в качестве подложки, создается новое окно с таким же белым цветом как и menubar. Мы не хотим, чтобы этим новым окном, были перезаписаны символы ранее выведенные на подложку. Они должны остаться на своем месте после закрытия меню. Вот почему, окно меню не может быть создано как subwindow stdscr. Как вы можете видеть ниже, окно items[0] создается с помощью newwin, а другие 8 окон items созданы как subwindows для items[0]. Здесь items[0] использовано для отрисовки рамки вокруг меню. Для того, чтобы отметить пункт как выбранный, имеет смысл сделать так, чтобы цвет его подложки отличался от цвета подложки других пунктов. Это то, что сделано в третьей строке снизу; цвет подложки первого пункта меню сделан другим по отношению к остальным пунктам и поэтому когда меню появляется, видно, что выбран первый пункт.

Следующая функция просто удаляет окно меню, созданное функцией выше. В ней, сначала, с помощью функции delwin удаляются окна, образующие пункты меню, а затем освобождается память, выделенная под указатель items.

Функция scroll_menu позволяет нам переключаться между меню и внутри меню. С помощью getch она определяет нажатые на клавиатуре клавиши. И если были нажаты клавиши со стрелками вверх или вниз, тогда становится выбранным пункт меню, расположенный выше или ниже. Это, если вы можете вспомнить, сделано путем изменения цвета подложки выбранного пункта меню отличным от цвета подложки других пунктов. Если были нажаты клавиши со стрелками влево или вправо, открытое меню закрывается и открывается другое. Если нажата клавиша enter, выбранный пункт меню по прежнему остается выбранным. При нажатии ESC, меню закрывается без выбора какого-либо пункта. Все другие клавиши функция игнорирует. В этой функции с помощью getch можно определять нажатие клавиши со стрелками. Позвольте мне напомнить вам, что все это осуществилось благодаря вызову в первой функции программы ( init_curses ) функции keypad(stdscr,TRUE) и тому, что возвращенное функцией getch значение было сохранено в переменной с типом int, а не char ( значения функциональных клавиш по величине больше величины, хранимой в переменной с типом char ).

И вот последняя функция — main. Она является каркасом для всех вышеописанных функций. В ней также происходит чтение с помощью getch нажатых клавиш и если F1 or F2 нажаты, отрисовывается соответствующее окно меню с помощью draw_menu. После этого, в ней вызывается scroll_menu и пользователю дается возможность выбрать какой-либо пункт меню. После отработки scroll_menu, она удаляет окна меню и выводит выбранный пункт в messagebar.

Еще я хочу упомянуть о функции touchwin. Если refresh, после закрытия меню, была вызвана напрямую без touchwin, то последнее открытое меню останется на экране. Причина этого в том, что функции меню не изменяют stdscr вообще, и при вызове refresh тоже, они не перезаписывают никаких символов в stdscr, поскольку полагают, что окно не изменилось. touchwin устанавливает все флаги в структуре WINDOW, которые говорят refresh обо всех измененных в окне строках и поэтому, при следующем вызове refresh, окно перезаписыватеся целиком, даже если контекст окна не изменился. Информация, записанная в stdscr остается там и после закрытия меню, поскольку меню не записывает ничего поверх stdscr, а только во вновь созданных окнах.

Если вы скопируете приведенный код в файл с именем example.c и удалите мои комментарии, то сможете скомпилировать программу следующим образом

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

Заключение

Здесь было рассказано о основах ncurses, которых должно хватить для создания хорошего интерфейса для вашей программы. Однако, возможности библиотеки не ограничиваются вышеизложенным. Вы сами сможете открыть много интересного углубившись в документацию к библиотеке и поймете, что эта статья только начало.

Ссылки

  • Пример программы: example.c
  • The ncurses website:www.gnu.org/software/ncurses/

Страница отзывов

У каждой заметки есть страница отзывов. На этой странице вы можете оставить свой комментарий или просмотреть комментарии других читателей.

talkback page

Webpages maintained by the LinuxFocus Editor team
© Reha K. Gerçeker, FDL
LinuxFocus.org
Click here to report a fault or send a comment to LinuxFocus
Translation information:

tr — : Reha K. Gerçeker
tr en: Reha K. Gerçeker
en ru: Иванов Ю.А.

2002-03-02, generated by lfparser version 2.19

Функции управления экраном терминала ncurses

Ввод символа
int getch()
возвращает введённый символ (аналогична функции getchar) Если включён режим обработки командных клавиш можно узнать о нажатии функциональных клавиш и клавиш управления курсором. Константы соответствующие кодам этих клавиш можно найти в файле curses.h. Вот самые важные из них:
KEY_DOWN, KEY_UP, KEY_LEFT, KEY_RIGHT — клавиши стрелок
KEY_F(n) Функциональные клавиши n может принимать значения от 0 до 63
KEY_BACKSPACE Backspace
KEY_DC Delete
KEY_IC Insert
KEY_HOME Home
KEY_END End
KEY_NPAGE Page Down
KEY_PPAGE Page Up

Ввод строки по формату
int scanw(char *fmt. )
(аналогична функции scanf) Например для ввода пользователем числа в переменную i вызов функции будет выглядеть так:
scanw(«%d», &i);

Режимы ввода

Автоматическое отображение при вводе
int noecho() и int echo()
Функция noecho отключает автоматическое отображение при вводе. Это нужно, если программист сам хочет решать вывоить ему полученный символ или нет. Функция echo отменяет действие функции noecho.

Установка времени ожидания
int halfdelay(int tenths)
По умолчанию такие функции как getch ждут ввода до тех пор пока пользователь не нажмёт клавишу. Функция halfdelay устанавливает режим в котором ввод ожидается tenths десятых долей секунды, затем в getch возращается ERR, если пользователь не нажимал клавиши. Отменить этот режим можно вызвав функцию nocbreak().

Обработка командных клавиш
int keypad(WINDOW *win, bool bf)
По умолчанию обработку таких клавиш, как клавиши управления курсором и функциональные клавиши берёт на себя терминал. Чтобы установить режим обработки командных клавиш нужно вызвать функцию keypad с TRUE в качестве второго параметра. Первый параметр указывает для какого окна Вы хотите установить данный режим. Если Вы не используете окна можно указать stdscr. Для отключения нужно передать FALSE во втором параметре.

Управление курсором

. Внимание: Все координаты в ncurses отсчитываются от верхнего левого угла и начиная с 0. Таким образом верхний левый угол имеет координаты (0,0)

Перемещение курсора
int move(int y, int x)
устанавливает курсор в позицию x,y

Получение текущих координат курсора
void getyx(WINDOW *win, int y, int x)
В переменные x,y записываются текущие координаты окна win. Если Вы не используете окна в качестве первого параметра можно указать stdscr.

Получить размеры экрана можно вызвав функции getmaxx(stdscr) и getmaxy(stdscr) они возвращают максимальное значение x и y соответственно для данного экрана.

Другие полезные функции

Очистка экрана
int clear()
заполняет весь экран пробелами

Очистка от курсора до конца строки
int clrtoeol()
заменяет пробелами интервал от курсора до конца строки

Очистка от курсора до конца экрана
int clrtobot()
заменяет пробелами интервал от курсора до конца экрана

Вставка/удаление строк
int insdelln(int n)
для положительного n вставляет n пустых строк для отрицательного удаляет n строк.

Удаление символа
int delch()
удаляет символ на котором стоит курсор (символы стоящие справа от курсора сдвигаются влево)

Удаление строки
int deleteln()
удаляет строку на которой стоит курсор (строки стоящие ниже сдвигаются вверх)

Окно — прямоугольная область экрана с которой можно работать как с целым экраном (очищать, выводить текст и т.д.). То есть осуществлять вывод только в определённую прямоугольную область экрана.

После инициализации создаётся окно stdscr с максимально возможными для данного терминала размерами. Если окна не будут использоваться во всех функциях требующих окно можно указывать stdscr.

Внутри одного окна также можно создать окна которые будет называться подокнами

Создание окна
WINDOW *newwin(int nlines, int ncols, int begin_y, int begin_x)
создаёт окно в котором nlines строк и ncols столбцов (если nlines или ncols равны 0 то им будет присвоено begin_y или begin_x) с координатами левого верхнего угла (begin_x,begin_y). При вызове с нулевыми аргументами ф-ия создаст окно размером с экран.

Создание подокна
WINDOW *subwin(WINDOW *orig, int nlines, int ncols, int begin_y, int begin_x)
создаёт подокно в котором nlines строк и ncols столбцов (если nlines или ncols равны 0 то им будет присвоено begin_y или begin_x) с координатами левого верхнего угла (begin_x,begin_y) относительно всего экрана. origwin — родительское окно.

Создание подокна 2
WINDOW *derwin(WINDOW *orig, int nlines, int ncols, int begin_y, int begin_x)
делает то же самое что и subwin, за исключением того, что begin_x и begin_y координаты относительно окна родителя origwin.

Удаление окна/подокна
int delwin(WINDOW *win)
удаляет окно/подокно win.

Перемещение окна
int mvwin(WINDOW *win, int y, int x)
перемещает окно win в новую позицию (x,y) левого верхнего угла.

Перемещение подокна
int mvderwin(WINDOW *win, int par_y, int par_x)
перемещает подокно win в новую позицию (x,y) левого верхнего угла относительно родительского окна.

Окно играет роль ограничителя вывод на экран. При вводе-выводе в перекрывающиеся окна данные в одном окне могут быть затёрты данными выводимыми в другое окно в месте перекрытия окон. Если Вам нужно обеспечить вывод в перекрывающиеся окна так чтобы вывод в одно окно не повредил данные другого окна можно воспользоваться панелями.

Панели

Под панелью в библиотеке ncurses понимается окно к которому добавляется глубина. Все панели заносятся в стек панелей. Глубина указывает в каком порядке располагаются панели на экране. Каждую панель можно переместить вверх или вниз всех остальных панелей. Можно скрыть и показать панель.

Для использования панелей нужно подключить библиотеку панелей:
#include

Если вы используете panel.h можно не подключать библиотеку ncurses.h потому, что panel.h сама подключает ncurses.h.

Для компиляции программ использующих панели так же добавляется ключ -lpanel:

gcc имя_файла.c -o имя_файла -lpanel -lncurses

. Внимание: при компиляции с библиотеками зависящими от ncurses (в данном случае panel) ключ подключения ncurses (-lncurses) должен всегда стоять последним.

Создание панели
PANEL *new_panel(WINDOW *win)
Панель создаётся из уже созданного окна win. После создания панель перемещается в вершину стека панелей.

Удаление панели
int del_panel(PANEL *pan)
Удаляет панель pan. Окно связанное с панелью нужно удалять самостоятельно.

Получение окна связанного с панелью
WINDOW *panel_window(const PANEL *pan)
Возвращает указатель на окно связанное с панелью pan.

Обновление панелей
void update_panels()
Обновляет стек панелей. Для реального отображения на экране нужно вызвать функцию doupdate().

Скрытие панели
int hide_panel(PANEL *pan)
Удаляет панель pan из стека панелей. Таким образом при обновлении экрана мы её не увидим.

Отображение панели
int show_panel(PANEL *pan)
Делает скрытую панель pan снова видимой размещая её при этом поверх остальных панелей.

Перемещение панели поверх всех
int top_panel(PANEL *pan)
Перемещает панель в стеке поверх всех оставшихся панелей.

Перемещение панели ниже всех
int bottom_panel(PANEL *pan)
Перемещает панель в стеке ниже всех оставшихся панелей.

Перемещение панели
int move_panel(PANEL *pan, int starty, int startx)
Перемещает панель pan так, чтобы его верхний левый угол оказался в точке (startx,starty). Положение в стеке панелей не изменяется.

Замена окна
int replace_panel(PANEL *pan, WINDOW *window)
Заменяет в панели pan текущее окно на окно window. Используется для таких операций как изменение размеров панели. Положение в стеке панелей не изменяется.

Получение панели выше
PANEL *panel_above(const PANEL *pan)
Позволяет узнать какая панель находится выше панели pan. Если 0 заничит выше pan нет панелей.

Получение панели ниже
PANEL *panel_below(const PANEL *pan)
Позволяет узнать какая панель находится ниже панели pan. Если 0 заничит ниже pan нет панелей.

Установка указателя на пользовательские данные
int set_panel_userptr(PANEL *pan, const void *ptr)
В каждой панели можно установить указатель на любую структуру. Данная функция позволяет установить этот указатель ptr для панели pan.

Получение указателя на пользовательские данные
int set_panel_userptr(PANEL *pan, const void *ptr)
Данная функция позволяет получить на заданный функцией set_panel_userptr указатель ptr для панели pan.

Функции управления экраном терминала ncurses

Sven Goldt, Sven van der Meer, Skott Burkett, Matt Welsh

8. Символьная графика

Эта глава имеет дело с вводом/выводом символов на экран. Когда мы говорим «символ», то подразумеваем композицию пикселов, которая может меняться в зависимости от таблицы представлений символов (charset). Ваша графическая карта уже предлагает одну или более таких таблиц и по умолчанию работает в текстовом (charset) режиме, потому что текст обрабатывается быстрее, чем пиксельная графика. Терминалы можно использовать лучше, чем как простые и скучные текстовые дисплеи. Рассмотрим, как использовать специальные возможности, которые предлагает терминал Linux-а, особенно консоль Linux-а.

printf, sprintf, fprintf, scanf, sscanf, fscanf

С этими функциями libc вы можете выдавать форматированные строки в stdout (стандартный вывод), с stderr (стандартная ошибка) или другие потоки, определенные как FILE *stream (например, файлы). sscanf обеспечивает подобные возможности для чтения форматированного ввода из stdin.

База данных TERMinal CAPabilitie — это таблица элементов описания работы с терминалом в ASCII-файле /etc/termcap. Здесь вы можете найти информацию о том, как выводить специальные символы, как осуществлять операции (удаления, вставки символов или строк и т.д.) и как инициализировать терминал. База данных используется, например, редактором vi. Имеются библиотечные функции для чтения и использования возможностей терминала (смотри termcap(3x)). С этой базой данных программы могут работать с различными терминалами одним и тем же кодом. База данных termcap и библиотечные функции предоставляют только низкоуровневый доступ к терминалу. Изменение атрибутов или цветов, параметризованный вывод и оптимизация остаются программисту.

База данных terminfo

База данных TERMinal INFOrmation построена над базой данных termcap и описывает некоторые возможности терминалов на более высоком уровне. С terminfo программа может легко менять атрибуты экрана, используя специальные клавиши, такие как функциональные клавиши и др. Эта база данных может быть найдена в /usr/lib/terminfo/[A-z,0-9]*. Каждый файл описывает один терминал.

Terminfo — хорошая база для работы с терминалом в программе.

Библиотека (BSD-)curses дает вам высокоуровневый доступ к терминалу, базируясь на terminfo. curses позволяет открывать и манипулировать окнами на экране, предоставляет весь необходимый набор функций ввода/вывода и может изменять видеоатрибуты терминально-независимым образом на более чем 150 терминалах. Библиотека находится в /usr/lib/libcurses.a. Это BSD-версия curses.

ncurses — это развитие curses. В версии 1.8.6 она должна быть совместима с AT&T curses, как это определено в SYSVR4, и иметь несколько расширений, таких как манипулирование цветами, специальная оптимизация для вывода, оптимизации, зависящие от терминала, и др. ncurses была протестирована на множестве систем, таких как Sun-OS, HP и Linux. Автор рекомендует предпочесть ncurses всему остальному. В SYSV Unix системах (например, Solaris) должна существовать библиотека curses с теми же функциональными возможностями, что и ncurses (на самом деле солярисовская curses имеет немного больше функций и поддержку мыши).

В следующих разделах мы рассмотрим, как пользоваться различными пакетами доступа к терминалу. В Linux-е мы имеем GNU-версию termcap и можем пользоваться ncurses вместо curses.

8.1. Функции ввода/вывода в libc

8.1.1. Форматированный вывод

Функции printf(. ) в libc обеспечивают форматированный вывод и позволяют трансформировать аргументы. * int fprintf(FILE *stream, const char *format, . ), преобразует выводимые аргументы в соответствии с шаблоном и записывает его в stream. Формат определяется аргументом format. Функция возвращает число записанных символов или отрицательное число в случае ошибки.

format содержит два типа объектов: обычные символы и информацию, как трансформировать или форматировать аргументы.

Форматная информация должна начинаться с %, за которым следуют значения для формата, дальше идет символ для трансляции (чтобы напечатать знак %, используйте %%). Возможны следующие значения для формата:

Изменяет вывод в зависимости от трансформации для аргумента:

  • Для o первое число будет 0.
  • Для x или X будет напечатано в конце 0x или 0X соответственно.
  • Для e, E, f, F вывод имеет десятичную точку.
  • Для g или G в конце аргумента будут напечатаны нули.

— Число, указывающее минимальную ширину поля

Трансформированный аргумент печатается в поле, ширина которого не меньше, чем сам аргумент. С этим числом вы можете увеличить ширину поля. Если аргумент меньше, то оставшаяся часть поля заполняется пробелами или нулями. — Точка для отделения ширины поля и точности

— Число для точности

Возможные значения для трансформации смотри в таблице 8.1.

То же, что и для вышеописанных функций, только список аргументов находится в arg.

8.1.2. Форматированный ввод

Точно так же, как printf(. ) для форматированного вывода, вы можете использовать scanf(. ) для форматированного ввода.

fscanf(. ) читает из stream и преобразует ввод по правилам, определяемым в format. Результаты помещаются в аргументы, заданные в «. » (эти аргументы должны быть указателями!). Чтение заканчивается, когда в format исчерпаны правила форматирования.

Таблица 8.1: Libc — трансформации printf

fscanf вернет EOF, при первом достижении конца файла или при возникшей ошибке. Если этого не случится, будет возвращено количество трансформированных аргументов.


format может содержать правила форматирования аргументов (см. табл. 8.2)

Он может также включать:

  • пропуски или табуляции, которые игнорируются;
  • любой нормальный символ, кроме %. Символы должны быть во вводе на соответствующих позициях.
  • правила преобразования, заданные с %, необязательный символ * (позволит fscanf(. ) присвоить аргументу), необязательное число, необязательный символ h, l или L (для задания длины считываемой инфомации) и символ трансформации.

* int scanf(const char *format, . )

То же, что fscanf(stdin. )

* int sscanf(char *str, const char *format, . )

То же, что scanf, но ввод производится из строки str.

8.2. Библиотека termcap

8.2.1. Введение

Библиотека termcap — это API для базы данных termcap, которая находится в /etc/termcap/. Библиотечные функции позволяют:

* получить описание текущего терминала: tgetent(. );

Таблица 8.2: libc — трансформации sсanf

* найти описание для информации: tgetnum(. ), tgetflag(. ), tgetstr(. );

* вычислить и произвести поточечный вывод: tputs()

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

Функции termcap терминально-независимые программы, но дают программисту только низкоуровневый доступ к терминалу. Для пакета более высокого уровня потребуется curses или ncurses.

8.2.2. Поиск описания терминала

* int tgetent(vo >В операционной системе Linux текущее имя терминала содержится в переменой среды TERM. Поэтому termtype есть результат вызова getenv(3). Что касается buffer, то в GNU-версии Linux termcap не нужно захватывать память. В других версиях вам придется выделить 2048 байт (прежде buffer требовал 1024 байта, но сейчас размер удвоился).

tgetent(. ) возвращает 1 в случае успеха и 0 когда база данных найдена, но не имеет точки входа для TERM. Другие ошибки возвращают различные значения.

Следующий пример объясняет как использовать getent(. ):

По умолчанию termcap использует /etc/termcap/ как базу данных. Если переменная среды TERMCAP установлена, например, в $HOME/mytermcap, то все функции будут пользоваться mytermcap вместо /etc/termcap. Без начального слэша в TERMCAP определенное значение понимается как имя для терминала.

8.2.3. Описание терминала

Каждый фрагмент информации называется свойством (capability). Каждое свойство — это двухлитерный код, за каждым двухлитерным кодом стоит значение свойства. Возможны следующие типы свойств.

  • Числовой: например, co — число столбцов
  • Логический или флаговый: например, hc — терминал твердой копии (hardcopy terminal)
  • Строковый: например, st — установка табуляции (подробнее см. 8.22.3)

Каждое свойство связано с единственным типом значений (co всегда числовой, hc всегда флаг, а st всегда строка). Три типа значений — и три типа функций, их запрашивающих. char *name — это двухлитерный код свойства.

* int tgetnum(char *name)

Получение свойства с числовым значением, таким как co. Функция tgetnum(. ) возвращает числовое значение, если свойство доступно, 1 в противном случае. (Заметьте, что возвращаемое значение всегда неотрицательно.)

* int tgetflag(char *name)

Получение логического свойства. Возвращает 1, если флаг установлен, 0 в противном случае.

* char *tgetstr(char *name, char **area)

Получение строкового свойства. Возвращает указатель на строку или NULL в случае отсутствия. В GNU-версии, если area есть NULL, termcap выделит память сам. termcap больше не позаботится об этом указателе, если вы не освободите name перед выходом из программы. Такой метод предпочтителен, поскольку вы не знаете сколько памяти потребуется для указателя, поэтому позвольте termcap сделать все за вас.

8.2.4. Свойства termcap

Логические свойства

5i принтер не имеет эха на экране
am автоматические границы, что означает автоматическое форматирование строки
bs Crtl-H представляет backspace
bw backspace на левой границе переносит строку на правую границу предыдущей
da вывести сохраненное над текущим экраном
db вывести сохраненное под текущим экраном
eo пробел стирает литеру на позиции курсора
es esc-последовательности и специальные символы работают в строке состояния
gn родовое устройство
hc это терминал твердой копии (hardcopy terminal)
HC курсор плохо видно, когда он не на последней линии
hs присутствует линия статуса
hz терминал не может напечатать тильды (tilde characters)
in терминал вставляет нули вместо пробелов на пустые места
km терминал имеет мета клавишу
mi режим вставки для курсора
ms режим стандартного вывода / подчеркивания для курсора
NP нет символов-заполнителей
NR ti не обращает teos терминал может забивать ошибки
ul терминал подчеркивает, но ошибки забивать не может
xb сбой, вызванный столпотворением, F1 посылает ESCAPE, F2 посылает ^C
xn сбой новой линии / соединения строк
xo терминал использует xon/xoff протокол
xs текст, напечатанный поверх выделенного, будет выделен
xt сбой телевизионного луча, неверная табуляция и странный режим выделения

Числовые свойства

co число столбцов
dB приостановка на милисекунды для возврата на терминалах твердой копии
dC приостановка на милисекунды для перевода каретки на терминалах твердой копии
dF приостановка на милисекунды для заполнения страницы на терминалах твердой копии
dN приостановка на милисекунды для новой линии на терминалах твердой копии
dT приостановка на милисекунды для табуляции на терминалах твердой копии
dV приостановка на милисекунды для вертикальной табуляции на терминалах твердой копии
it раница между позициями табуляции
lh высота мягких меток
lm линии памяти
lw ширина
li число линий
Nl число мягких меток
pb наименьшая граница, когда требуется дозаполнение
sg сбой режима выделения
ug сбой режима подчеркивания
vt номер виртуального терминала
ws ширина линии статуса, если она отлична от ширины экрана

Строковые свойства

!1 клавиша сохранения в верхнем регистре
!2 клавиша подвешивания в верхнем регистре
!3 клавиша undo в верхнем регистре
#1 клавиша помощи в верхнем регистре
#2 клавиша home в верхнем регистре
#3 клавиша ввода в верхнем регистре
#4 клавиша курсор — влево в верхнем регистре
%0 клавиша redo
%1 клавиша помощи
%2 клавиша пометки
%3 клавиша сообщения
%4 клавиша перемещения
%5 клавиша следующего объекта
%6 клавиша открытия
%7 клавиша опций
%8 клавиша предыдущего объекта
%9 клавиша печати
%a клавиша сообщения в верхнем регистре
%b клавиша перемещения в верхнем регистре
%c клавиша следующего объекта в верхнем регистре
%d клавиша опций в верхнем регистре
%e клавиша предыдущего объекта в верхнем регистре
%f клавиша печати в верхнем регистре
%g клавиша redo в верхнем регистре
%h клавиша перестановки в верхнем регистре
%i клавиша курсор-вправо в верхнем регистре
%j клавиша продолжения в верхнем регистре
&0 клавиша cancel в верхнем регистре
&1 клавиша ссылки
&2 клавиша обновления
&3 клавиша перестановки
&4 клавиша перезапуска
&5 клавиша продолжения
&6 клавиша сохранения
&7 клавиша подвешивания
&8 клавиша undo
&9 клавиша начала в верхнем регистре
*0 клавиша поиска в верхнем регистре
*1 клавиша команды в верхнем регистре
*2 клавиша копирования в верхнем регистре
*3 клавиша создания в верхнем регистре
*4 клавиша удаления символа в верхнем регистре
*5 клавиша удаления строки в верхнем регистре
*6 клавиша выделения
*7 клавиша конца в верхнем регистре
*8 клавиша очистки линии в верхнем регистре
*9 клавиша выхода в верхнем регистре
клавиша поиска1 клавиша начала
2 клавиша cancel
3 клавиша закрытия
4 клавиша команды
5 клавиша копирования
6 клавиша создания
7 клавиша конца
8 клавиша ввода/посылки
9 клавиша выхода
al клавиша вставки одной линии
AL клавиша вставки %1 линий
ac цвет блока символов, отображаемых в другой таблице символов
ae конец множества символов из альтернативной таблицы
as начало блока символов в альтернативной таблице
bc backspace, если не ^H
bl символ звонка
bt переход к предыдущему месту табуляции
cb очистка от начала линии до курсора
cc странный командный символ
cd очистка до конца экрана
ce очистка до конца линии
ch перемещение курсора горизонтально до столбца %1
cl очистка экрана, курсор помещается в начало
cm курсор перемещается на полосу %1 и колонку %2 (на экране)
CM курсор перемещается на линию %1 и колонку %2 (в памяти)
cr возврат каретки
cs область прокрутки от линии %1 до линии %2
ct очистка табуляций
cv вертикальное движение курсора до линии %1
dc удаление 1 символа
DC удаление %1 символов
dl удаление 1 линии
DL удаление %1 линий
dm начало режима удаления
do курсор на 1 линию вниз
DO курсор на %1 линию вниз
ds убрать линию статуса
eA активирование альтернативной символьной таблицы
ec удаление %1 символов начиная с позиции курсора
ed конец режима удаления
ei конец режима вставки
ff символ дозаполнения экрана на терминалах твердой копии
fs возврат символа на его позицию перед переходом на линию статуса
F1 строка послана функциональной клавишей F11
. .
F9 строка послана функциональной клавишей F19
FA строка послана функциональной клавишей F20
. .
FZ строка послана функциональной клавишей F45
Fa строка послана функциональной клавишей F46
. .
Fr строка послана функциональной клавишей F63
hd перемещение курсора на пол-линии вниз
ho курсор в начало
hu перемещение курсора на пол-линии вверх
i1 инициализация строки 1 в начале сеанса
i3 инициализация строки 3 в начале сеанса
is инициализация строки 2 в начале сеанса
ic вставка 1 символа
IC вставка %1 символов
if файл инициализации
im начало режима вставки
ip вставка времени и необходимых специальных символов после вставки
iP программа инициализации
K1 верхняя левая клавиша на keypad
K2 центральная клавиша на keypad
K3 верхняя правая клавиша на keypad
K4 нижняя левая клавиша на keypad
K5 нижняя правая клавиша на keypad
k0 функциональная клавиша 0
. .
k9 функциональная клавиша 9
k; функциональная клавиша 10
ka клавиша очистки всех табуляций
kA клавиша вставки линии
kb клавиша backspace
kB клавиша возврата к предыдущему месту табуляции
kC клавиша очистки экрана
kd клавиша down
kD клавиша удаления символа под курсором
ke отключение keypad
kE клавиша очистки до конца линии
kh клавиша курсор — home
kH клавиша курсор home + down
kI вставка символа / клавиша режима вставки
kl клавиша курсор — left
kL клавиша удаления линии
kM Mклавиша выхода из режима вставки
kN клавиша следующей страницы
kP клавиша предыдущей страницы
kr клавиша курсор — right
kR клавиша прокрутки назад/вверх
ks включение keypad
kS клавиша очистки до конца экрана
kt клавиша очистки данной табуляции
kT клавиша установки табуляции на этом месте
ku клавиша курсор — up
l0 метка для нулевой функциональной клавиши, если не f0
l1 метка для первой функциональной клавиши, если не f1
l2 метка для второй функциональной клавиши, если не f2
.
la метка для десятой функциональной клавиши, если не f10
le курсор влево на 1 символ
ll перемещение курсора в нижний левый угол
LE курсор влево на %1 символов
LF отключение мягких меток
LO включение мягких меток
mb начало мерцания
MC очистка мягких границ
md начало режима верхнего регистра
me конец всех режимов типа so, us, mb, md, mr
mh начало полуяркого режима
mk начало темного режима (символы не видны)
ML установка левой мягкой границы
mm вход терминала в метарежим
mo выход терминала из метарежима
mp включение защищенного атрибута
mr начало режима обращения (reverse mode)
MR установка правой мягкой границы
nd курсор на 1 символ влево
nw команда возврата каретки
pc символ-заполнитель
pf отключение принтера
pk программная клавиша %1 для посылки строки %2, если нажата пользователем
pl программная клавиша %1 для исполнения строки %2 в локальном режиме
pn программная мягкая метка %1 для отображения строки %2
po подключение принтера
pO подключение принтера для %1 ( Если устанавливается TRUE, то каждое изменение в окне вызывает физическое обновление экрана. Это может ухудшить характеристики программы, поэтому значение по умолчанию — FALSE. (Пока не реализована.)

Если bf равен TRUE, то следующий вызов wrefresh(win) очистит экран и полностью его перерисует (Ctrl+L в редакторе vi).

* int leaveok(win, bf)

По умолчанию ncurses ставит курсор там, где он был при последнем обновлении окна. Программы, не использующие курсор, могут установить leaveok(. ) TRUE и сэкономить время, требующееся движения курсора. Кроме того, ncurses попытается сделать курсор терминала невидимым.

Управление переходом на новую строку. После nl() произойдетт возврат каретки и дозаполнение; nonl() отключает контроль. В последнем случае ncurses может ускорить перемещение курсора.

terminal size

Как узнать размер терминала?
Т.е. количество строчек и длину строки?
Желательно стандартными средствами без использования библиотек ncurses и подобных.

Re: тип bool в C

#include
не знаю, устроит или нет, но вроде это не либа, а набор определений.
Вообщем дерзай.
А еще поищи в инете список кодов для ANSI/VT100 терминалов.
Или посмотри свой /etc/termcap (!)
Или напиши мне на мыло oxid@nteam.ru, я тебе документик маленький вышлю.

Re: terminal size

Re: terminal size

вообще поидее нужно что то типа
struct winsize wins;

err = ioctl(fd, TIOCGWINSZ, &wins);
/* TODO: err check here */
printf(«cols=%d rows=%d\n», wins.ws_col, wins.ws_row);

Re: terminal size

> err = ioctl(fd, TIOCGWINSZ, &wins);
А если терминал — не локальный, а подключен через RS232C?

Re: terminal size

Re: terminal size

> какая разница? :)
Работать не будет.

Причем необязательно через RS232C — вообще на любом терминале, кроме локальной консоли linux.

Подумай: ioctl’ы обрабатываются ядром. Как о них узнает терминал (или его эмулятор — xterm, например). Никак. Поэтому и работать такой способ будет только на локальной linux-консоли. То есть на мониторе, подключенном к видеоадаптеру данной машины, и только в том случае, если выводом управляет ядро, а не X Windiw, или Midnight Commander, или какая другая прога, запустившая данную программу на псевдотерминале.

Re: terminal size

какой-то у тебя бессвязный поток сознания. :)
1) ioctl передается драйверу терминала. Можешь сам поглядеть в linux/drivers/char/vt.c
2) это как еще xterm в обход ядра ходит? Вы что-то путаете, батенька

Re: terminal size

> ioctl передается драйверу терминала.
И что? Драйверу _какого_ терминала передается? Драйверу виртуальной консоли linux. Я и не спорю, что на локальной linux-консоли ioctl’ы будут работать. Ты, наверно, не в курсе, что, кроме виртуальных linux-консолей, существуют другие терминалы? Так вот, они существуют. И к linux’у не имеют никакого отношения. Если ты зашел по сети на linux-сервер, куда пойдет твой ioctl? Удаленному хосту? Даже и не надейся на это. Драйверу vt сервера? Ну подумай, как он тебе узнает размеры экрана удаленного хоста?

> это как еще xterm в обход ядра ходит?
В исходники его погляди — увидишь как. Для вывода xterm использует запрос ImageText8 X сервера (не напрямую, а черех Xlib, но это сути не меняет). X сервер делает видеовывод собственными средствами, не используя для этого графические возможности ядра (у которого их нет).

Ну напиши ты простую программу, которая делает какой-нибудь ioctl на STDOUT_FILENO. Запусти ее на виртуальной консоли linux. Убедись, что она работает (под mc не пытайся — не заработает). Запусти X Window. Открой окно xterm. Запусти в нем эту же прогу. Убедись, что она _не_ работает (также как и под mc). Почему? Да потому что ее stdout’ом будет не /dev/ttyN, а /dev/pts/N (где N — какое-то число). Если уж ты способен читать исходники ядра, то погляди, какие ioctl’ы поддерживает псевдотерминал (/usr/src/linux/drivers/char/pty.c).

ЗЫ: если еще раз заявишь про бессвязный поток сознания — ответа не получишь (мне не платят за ответы на твои вопросы, а хамства мне и в реале хватает).

Re: terminal size

уважаемый nobody давайте сделаем проще. размер терминала можно узнать командой stty -a запускаем в консоли и в xterm команду strace -olog stty -a внимательно смотрим в файл log и видим (о чудо!) что размер терминала в том и другом случае вернулся через ioctl TIOCGWINSZ, который отработал нормально. Я это проделал, а вы можете мне поверить на слово если такой занятой человек :)

То, что там иксы повесили на master side pty, и какими средствами они организуют вывод в данном случае никакой роли не играет — все равно все пройдет через драйвер терминала в ядре.

С Уважением SadStork

Re: terminal size

Ok, насчет программного терминала ты оказался прав (щелчок мне по носу). Одна программа вызывает ioctl для установки переменной «размеры_терминала», другая вызовом ioctl может считать эту переменную. В случае vt инициализирует эту переменную драйвер linux-консоли, в случае pts — программа на стороне master.

А как насчет аппаратного терминала? Ведь он не сможет установить эту переменную. Чтобы этот способ работал, должна быть какая-то программа на данной машине, которая знает размеры экрана подключенного терминала и может установить переменную ядра соответствующим образом.

Способ, основанный на кодах управления терминалом (приведенный мной выше) будет работать на любом терминале, потому что эти коды интерпретируются самим терминалом.

Re: terminal size

что-то я вас не понимаю — для того, чтобы слать по линии инициализационные данные о размерах терминала нужна программа, а чтобы ловить esc-последовательности которые интерпретируются «самим терминалом» никакой программы не требуюется? :) Там Святой Дух их перехватывает и интерпретирует, видимо.

Извините за сарказм

Re: terminal size

Дело в том, что ни один терминал не умеет «слать по линии инициализационные данные о размерах терминала». Зато любой совместимый по кодам с vt100 умеет интерпретировать их.

Простой пример. Захожу из дома по модему на рабочую машину. Делаю stty -a. Мне сообщается, что размер терминала = 0 строк и 0 столбцов.

Что делать? Альтернатив тут всего 3:
1) Юзать ncurses (эта либа использует базу данных terminfo для получения информации о терминале, в т.ч. о его размерах).
2) Парсить terminfo вручную.
3) Юзать коды управления терминалом.

Способ #1 не подходит: anonymous, запостивший данный вопрос, явно указал, что ncurses ему не катит.
Способ #2 лично мне кажется сложнее, чем #3, для которого функция состоит из 3 строк:

int get_term_size(int *width, int *height)
<
setvbuf(stdout, NULL, _IONBF, 0);
fputs(«\x1B[255;255H\x1B[6n», stdout);
return scanf(«\x1B[%d;%dR», height, w >>

Реально же будет всего 2 строки, потому что функция setvbuf будет вызвана еще раньше: если программеру нужны размеры экрана, значит он собирается работать в полноэкранном режиме, а значит построчная буферизация stdout должна быть отключена.

Re: terminal size

вообще говоря это недореализация в linux — по идеи все терминальные девайсы(такие как виртуальный, псевдо и сериальный терминалы) должны иметь одинаковый базовый ioctl(как во FreeBSD например) .. вообще говоря у тебя терминал может и не быть vt100 компатабельным и ты все равно не зная ньюансов сможешь узнать размер через TIOCGWINSZ .. так что все зависит от того что надо в конце концов получить ..

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

>1) Юзать ncurses (эта либа использует базу данных
>terminfo для получения информации о терминале, в т.ч. о
>его размерах).
>2) Парсить terminfo вручную.

помоему для получения terminfo используется ioctl

Re: terminal size

> все терминальные девайсы(такие как виртуальный,
> псевдо и сериальный терминалы) должны
> иметь одинаковый базовый ioctl
Непонятно, что ты имеешь в виду под словом `ioctl’ применительно к аппаратному терминалу? ioctl — это системный вызов. Прога из юзерспэйса делает на своей машине int 80h (для linux@PC). Ядро ОС этой же самой машины этот вызов обрабатывает. Дальше этой машины ioctl не уходит. Системные вызова не передаются по кабелям (будь то сетевой кабель или RS232C). Каким образом терминал, подключенный через кабель, узнает о каком-то там ioctl?

Может быть, ты имеешь в виду следующее: ядро, обнаружив на линии терминал, посылает ему Esc-последовательность для получения его размеров и прочей инфы? А потом проги на этой машине могут обращаться по ioctl к ядру для получения этой инфы, так? Если я правильно угадал, то объясни, как ядро может обнаружить подключение терминала? Ведь по RS232C может подключаться все, что угодно. И посылаемые подключенному девайсу коды могут сделать с ним что-то, что юзеру не надо. И потом, зачем все это? Есть база данных terminfo, в которой все существующие терминалы описаны. А если прога не хочет (или не может) юзать terminfo, то пускай и посылает сама Esc-коды терминалу. Зачем ядру эти заморочки?

> в твоем случае ты должен быть уверен
> что терминал заинтерпретирует тебя корректно
Ты обратил внимание на последнюю строку функции?
return scanf(«\x1B[%d;%dR», height, w >Если терминал не поддерживает Esc-коды vt100 (а точнее, ECMA-48 CSI sequences), то функция возвратит 0. В этом случае размеры терминала останутся неизвестными. Ну и что? Если Esc-последовательности не поддерживаются, ты все равно не сможешь работать в полноэкранном режиме (как ты собираешься без них устанавливать курсор в произвольную позицию экрана?).

> помоему для получения terminfo используется ioctl
Неа, обычная юзерспэйсная база данных. В ядре она нафиг не нужна. Хранится на диске. У меня это каталог /usr/share/terminfo. Идет вместе с ncurses (в том же архиве). Устанавливается также вместе с ncurses (по make install).

Кстати, у юзера вполне может оказаться /etc/termcap вместо terminfo. Если не ошибаюсь, на фряхе используется именно он. Его парсить еще веселее — это очень большой текстовый файл. БД terminfo была придумана для замены /etc/termcap (она бинарная, и каждый файл содержит описание только одного терминала, а значит с ней быстрее работать).

Re: terminal size

> Непонятно, что ты имеешь в виду под словом `ioctl’ применительно к
> аппаратному терминалу?

ну батенька .. апаратные терминалы к линуксу вообще отношения не имеют
и я про них ни словом не обмолвился .. а под сериальным терминалом
имелся ввиду псевдо девайс(чарактер девайс) который может слушаться и
обрабатываться каким нибудь getty например при попадании данных в
линию RS232 .. после этого getty устанавливает запрашиваемые размеры
(например по получении соотв ESC-последовательноти) и ты можешь
пользоваться ioctl(на стороне getty) для получения установленных
размеров (то есть получился твой апаратный терминал — это коробка с
линуском и с торчащим RS232 нульмодемом).

> Ты обратил внимание на последнюю строку функции?
> return scanf(«\x1B[%d;%dR», height, w >
обратил .. именно из-за этой последней строчки и может возникнуть
десинхронизация .. например имеем терминал не vt100 компатабельный —
ты послал ему эту ESC-посл для получения размера и висишь в scanfе
ждешь ответа, но он(терминал) не поддерживает эту посл и в этот момент
решил послать тебе какие-то данные — соответсвенно если во время
работы с терминалом ты проделаешь подобное то ты потеряешь эти данные
в отсосанном(вернувшем 0) scanf вызове.

> Неа, обычная юзерспэйсная база данных. В ядре она нафиг не
> нужна. Хранится на диске. У меня это каталог
> /usr/share/terminfo. Идет вместе с ncurses (в том же
> архиве). Устанавли вается также вместе с ncurses (по make install).

а — ну пожалуйста что там получается .. у любого терминала описаного в
terminfo должен быть заранее оговоренный размер? — тухлость.

вобщем не хочу тебя ни в чем убеждать — пользовать
ESC-последовательности в соответствующих местах катируется.

> ioctl — это системный вызов. Прога из
> юзерспэйса делает на своей машине int 80h (для linux@PC). Ядро ОС
> этой же самой машины этот вызов обрабатывает. Дальше этой машины
> ioctl не уходит. Системные вызова не передаются по кабелям (будь то
> сетевой кабель или RS232C). Каким образом терминал, подключенный
> через кабель, узнает о каком-то там ioctl?

:))) прикинь системные вызовы да даже аппаратные прерывания могу
передаваться по кабелям. Кстати если системный вызовы не могут
передаваться через кабеля — то как работает клиентская часть NFS, а
точнее ее RPC часть?

Re: terminal size

> как работает клиентская часть NFS, а точнее ее RPC часть?
А как работает запрос файла у FTP сервера? Сервер делает open, read и close. То есть как минимум 3 сискола. Ты готов считать запрос файла передачей сисколов по сети?

Я вообще-то понимаю, о чем ты говоришь: с точки зрения клиента происходит следующее: приложение обратилось к ядру, а ядро полезло в сеть. По ведь ядро не передает в сеть именно _сискол_. Это просто невозможно — сеть же может быть гетерогенной. Представь: я в вызове open указываю права доступа 755, а сервер работает на Windows. Если считать это именно передачей сискола, то должно быть так: ядро Windows получает от ядра linux сискол open. Опаньки — нет такого сискола. Есть CreateFile — ладно, вызываем его. Но с какими аргументами?

Понимаешь, это не есть передача сискола. Это просто запрос обслуживания по сети. А то что с точки зрения программы-клиента какой-то локальный сискол привел к сетевой активности — ну и что? Когда ты обращаешься к FTP серверу, ты делаешь сискол send, в результате которого на сервере происходит сискол read (или ReadFile, или что-то еще). Та же сетевая активность, только вид сбоку.

> аппаратные прерывания могу передаваться по кабелям.
Ты говоришь об экзотических архитектурах, где несколько машин, связанных сетью, образуют одну большую машину, или что-то типа того? Если да, то в этом случае сеть — уже не сеть, а разновидность системной шины. Я понимаю: шина — она, конечно, тоже провода (даже шина данных персоналки), но я все-таки не имел ее в виду. Когда я говорил про кабеля, то имел в виду связь отдельных устройств, не представляющих собой в связанном виде единое целое с общей шиной данных/адреса/управления/чего-то-еще.

Re: terminal size

функции можно вызывать по сети .. see RPC(Remote Procedure Call) .. во многих ядрах есть kern-rpc. Hа самом деле представь себе картину — все девайсы имеют Ethernet как системную шину .. в том числе и биос и память и винт и все что угодно :)) — или например с помощью FireWire ты _хардверно_ можешь замапить себе чужую память и работать с ней как со своей собственной .. а что если именно в этом куске памяти расположить новый сискол(например насильно запихнуть модуль(который содержит новый сискол) в этот участок памяти)?

Введение в ncurses на C++

В универе задали лабораторную: реализовать элемент интерфейса “всплывающее окно с сообщением” под DOS на C++, используя ООП подход. Ну спасибо тебе за актуальность, дорогой универ, нынче DOS и Turbo Vision наше всё, такой ценный опыт… К счастью, преподаватель отнёсся с пониманием и разрешил использовать современную кроссплатформенную библиотеку ncurses для рисования псевдографики, о ней я сегодня и расскажу.

Что такое ncurses и где оно обитает

Ncurses (произносится “энкёрсиз”) – это библиотека, которая существенно упрощает создание интерфейсов на псевдографике и позволяет при разработке вообще не думать о том, например, какую экранирующую последовательность символов нужно послать терминалу для того, чтобы текст выводился ^[[ 0 ; 31 ; 40 mКРАСНЫМ цветом. Мало того, что эти закорючки тяжело осмыслить, так они еще и для разных терминалов разные бывают. Вообще, чтобы как-то облегчить жизнь, разработчики UNIX решили хранить в специальном файле termcap (а в будущем terminfo) все те возможности, которые предоставляет конкретный терминал. Этот файл позволяет приложениям смотреть, какие экранирующие последовательности можно посылать, в него смотрит и библиотека ncurses, избавляя пользователя-программиста от написания лишнего кода для, так скажем, кросс-терминальности. Пожалуй, самыми известными программами, в которых для интерфейса используется ncurses, являются htop, GNU Midnight Commander и инструмент графической настройки конфигурации ядра Linux, хоть с какой-то из них сталкивался каждый.

Как установить

Linux

Windows

Под Windows и DOS есть PDCurses, которая практически полностью совместима с ncurses. Одной строчкой не ставится, вот тут есть вся необходимая информация по ней.

Написание программ

При компиляции программ важно не забывать приписать флаг -lncurses , чтобы всё нормально залинковалось. Разберем простейшую программу с комментариями и пояснениями, и заглянем глубже.

Hello World!

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

Инициализация

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

raw и cbreak

Обычно, терминал буфферит символы, которые набирает пользователь до переноса строки, но большинству программ набираемые символы требуются сразу же во время их набора. Указанные выше функции позволяют управлять буфферизацией. Разница заключается в том, как будут обрабатывается управляющие последовательности вроде CTRL-Z и CTRL-C. В raw режиме они попадают в программу, не генерируя сигналов, а в cbreak режиме они интерпретируются драйвером терминала и генерируют соответствующие им сигналы.

echo и noecho

Эти функции контролируют вывод напечатанного на экран. noecho отключает вывод, echo наоборот включает. Обычно в программах используется noecho и вывод производится другими, более гибкими средствами.

keypad

Позволяет чтение клавиш F1, F2, стрелок и тд. Чтобы включить для стандартного экрана, вызывается как keypad (stdscr, TRUE) .

curs_set;

Включает и отключает отображения курсора на экране, чтобы отключить курсор вызывается curs_set (FALSE)

Цвета

В ncurses есть удобный механизм для работы с цветами. В первую очередь, для того, чтобы проверить, поддерживается ли в текущем терминале функция цветов вообще, есть функция has_colors () , если вернулась истина, то start_color() и погнали. Важное понятие в ncurses – это цветовые пары, они определяют, каким цветом мы выводим и на каком фоне. Парам присваивают целочисленные значения:

Мы сделали цветовую пару, которая пишет красным по черному, кстати, если лень писать константы, можно писать просто соответствующие им циферки:

Цвет Циферка
COLOR_BLACK
COLOR_RED 1
COLOR_GREEN 2
COLOR_YELLOW 3
COLOR_BLUE 4
COLOR_MAGENTA 5
COLOR_CYAN 6
COLOR_WHITE 7

Ну а если стандартные цвета недостаточно кислотные для вашей хакерской проги, то можно сделать свои! Вот так это делается:

RGB-значения лежат в интервале от 0 до 1000. Если что-то пошло не так, или ваш терминал не умеет работать с цветами, то функция init_color вернет ERR .

Окна – это воображаемые экраны, определенные в curses. Окно в данном контексте не означает то окно с рамочкой в Turbo Pascal, которое можно таскать по экрану. При инициализации ncurses, создается воображаемое окно stdscr , которое является представлением открытого терминала (настоящего экрана) размером с этот терминал. На это окно уже можно сразу выводить строки или другие окна, передавать его как параметр в функцию и тд.

Данный код выведет строку в stdscr в текущей позиции курсора. Аналогично вызов refresh , работает только с stdscr .

После создания нового окна, для выполнения таких же действий с ним, а не с stdscr , вызывают функции, которые начинаются на w и принимают как параметр окно, с которым производятся действия, вот так для окна с именем win :

Окно с именем win имеется в виду, что это имя указателя на память данных с окном в куче. Такая конвенция именования соблюдается во всех функциях, которые можно применить и к stdscr , и к другим окнам.

Таким образом, библиотека предоставляет разработчику все необходимые механизмы для создания интерфейсов в терминале, код своей сделанной лабораторной с комментариями я привел ниже.

Функции Ncurses

Содержание

  • ncurses_addch — Добавить символ в текущую позицию и переместить курсор вперед
  • ncurses_addchnstr — Добавить строку атрибутов с указанной длиной в текущую позицию
  • ncurses_addchstr — Добавить строку атрибутов в текущую позицию
  • ncurses_addnstr — Добавить строку с указанной длиной в текущую позицию
  • ncurses_addstr — Выводить текст в текущей позиции
  • ncurses_assume_default_colors — Определить цвета по умолчанию для цвета 0
  • ncurses_attroff — Отключить заданные атрибуты
  • ncurses_attron — Включить заданные атрибуты
  • ncurses_attrset — Задать заданные атрибуты
  • ncurses_baudrate — Возвращает скорость передачи данных терминала
  • ncurses_beep — Указать терминалу издать звуковой сигнал
  • ncurses_bkgd — Установить свойства фона для экрана терминала
  • ncurses_bkgdset — Управление фоном экрана
  • ncurses_border — Нарисовать границу вокруг экрана с помощью атрибутов
  • ncurses_bottom_panel — Перемещает видимую панель в нижнюю часть стека
  • ncurses_can_change_color — Проверяет, можно ли изменить определения цветов терминала
  • ncurses_cbreak — Выключить буферизацию ввода
  • ncurses_clear — Очистить экран
  • ncurses_clrtobot — Очистить экран с текущей позиции до нижней
  • ncurses_clrtoeol — Очистить экран от текущей позиции до конца строки
  • ncurses_color_content — Извлекает компоненты RGB цвета
  • ncurses_color_set — Set active foreground and background colors
  • ncurses_curs_set — Set cursor state
  • ncurses_def_prog_mode — Сохраняет режим терминалов (программы)
  • ncurses_def_shell_mode — Saves terminals (shell) mode

  • ncurses_define_key — Определить код клавиши
  • ncurses_del_panel — Убрать панель из стека и удалить ее (но не соответствующее окно)
  • ncurses_delay_output — Сделать задержку вывода на терминале с использованием отступов
  • ncurses_delch — Delete character at current position, move rest of line left
  • ncurses_deleteln — Delete line at current position, move rest of screen up
  • ncurses_delwin — Удалить окно ncurses
  • ncurses_doupdate — Write all prepared refreshes to terminal
  • ncurses_echo — Activate keyboard input echo
  • ncurses_echochar — Single character output including refresh
  • ncurses_end — Прекратить использование ncurses и очистить экран
  • ncurses_erase — Erase terminal screen
  • ncurses_erasechar — Возвращает текущий символ стирания
  • ncurses_filter — Установить LINES для iniscr() и newterm() на значение 1
  • ncurses_flash — Flash terminal screen (visual bell)
  • ncurses_flushinp — Flush keyboard input buffer
  • ncurses_getch — Read a character from keyboard
  • ncurses_getmaxyx — Returns the size of a window
  • ncurses_getmouse — Reads mouse event
  • ncurses_getyx — Возвращает текущую позицию курсора для окна
  • ncurses_halfdelay — Put terminal into halfdelay mode
  • ncurses_has_colors — Checks if terminal has color capabilities
  • ncurses_has_ic — Check for insert- and delete-capabilities
  • ncurses_has_il — Check for line insert- and delete-capabilities
  • ncurses_has_key — Check for presence of a function key on terminal keyboard
  • ncurses_hide_panel — Remove panel from the stack, making it invisible
  • ncurses_hline — Рисует горизонтальную линию в окне в текущей позиции с использованием атрибута-символа и определенного максимального количества символов
  • ncurses_inch — Получить символ и атрибут в текущей позиции
  • ncurses_init_color — Define a terminal color
  • ncurses_init_pair — Define a color pair
  • ncurses_init — Initialize ncurses
  • ncurses_insch — Insert character moving rest of line including character at current position
  • ncurses_insdelln — Insert lines before current line scrolling down (negative numbers delete and scroll up)
  • ncurses_insertln — Insert a line, move rest of screen down
  • ncurses_insstr — Insert string at current position, moving rest of line right
  • ncurses_instr — Reads string from terminal screen
  • ncurses_isendwin — Ncurses is in endwin mode, normal screen output may be performed
  • ncurses_keyok — Enable or disable a keycode
  • ncurses_keypad — Turns keypad on or off
  • ncurses_killchar — Returns current line kill character
  • ncurses_longname — Returns terminals description
  • ncurses_meta — Enables/Disable 8-bit meta key information
  • ncurses_mouse_trafo — Преобразует координаты
  • ncurses_mouseinterval — Set timeout for mouse button clicks
  • ncurses_mousemask — Sets mouse options
  • ncurses_move_panel — Moves a panel so that its upper-left corner is at [startx, starty]
  • ncurses_move — Переместить выходную позицию
  • ncurses_mvaddch — Move current position and add character
  • ncurses_mvaddchnstr — Переместить позицию и добавить строку-атрибут с указанной длиной
  • ncurses_mvaddchstr — Move position and add attributed string
  • ncurses_mvaddnstr — Move position and add string with specified length
  • ncurses_mvaddstr — Переместить позицию и добавить строку
  • ncurses_mvcur — Немедленно переместить курсор
  • ncurses_mvdelch — Move position and delete character, shift rest of line left
  • ncurses_mvgetch — Переместить позицию и получить символа в новой позиции
  • ncurses_mvhline — Set new position and draw a horizontal line using an attributed character and max. n characters long
  • ncurses_mvinch — Переместить позицию и получить символ-атрибут в новой позиции
  • ncurses_mvvline — Установить новую позицию и отрисовать вертикальную линию с использованием атрибута и максимального количества символов
  • ncurses_mvwaddstr — Добавить строку в новую позицию окна
  • ncurses_napms — Sleep
  • ncurses_new_panel — Создать новую панель и связать ее с окном
  • ncurses_newpad — Creates a new pad (window)
  • ncurses_newwin — Создать новое окно
  • ncurses_nl — Перевод новой строки и возврата каретки/перевода строки
  • ncurses_nocbreak — Switch terminal to cooked mode
  • ncurses_noecho — Switch off keyboard input echo
  • ncurses_nonl — Do not translate newline and carriage return / line feed
  • ncurses_noqiflush — Do not flush on signal characters
  • ncurses_noraw — Switch terminal out of raw mode
  • ncurses_pair_content — Retrieves foreground and background colors of a color pair
  • ncurses_panel_above — Возвращает панель над панелью
  • ncurses_panel_below — Возвращает панель под панелью
  • ncurses_panel_window — Возвращает окно, связанное с панелью
  • ncurses_pnoutrefresh — Copies a region from a pad into the virtual screen
  • ncurses_prefresh — Copies a region from a pad into the virtual screen
  • ncurses_putp — Apply padding information to the string and output it
  • ncurses_qiflush — Flush on signal characters
  • ncurses_raw — Switch terminal into raw mode
  • ncurses_refresh — Обновить экран
  • ncurses_replace_panel — Replaces the window associated with panel
  • ncurses_reset_prog_mode — Resets the prog mode saved by def_prog_mode
  • ncurses_reset_shell_mode — Resets the shell mode saved by def_shell_mode
  • ncurses_resetty — Restores saved terminal state
  • ncurses_savetty — Saves terminal state
  • ncurses_scr_dump — Dump screen content to file
  • ncurses_scr_init — Initialize screen from file dump
  • ncurses_scr_restore — Восстановить экран из файла дампа
  • ncurses_scr_set — Наследовать экран из файла дампа
  • ncurses_scrl — Прокрутить содержимого окна вверх или вниз без изменения текущего положения
  • ncurses_show_panel — Помещает невидимую панель поверх стека, делая ее видимой
  • ncurses_slk_attr — Returns current soft label key attribute
  • ncurses_slk_attroff — Turn off the given attributes for soft function-key labels
  • ncurses_slk_attron — Turn on the given attributes for soft function-key labels
  • ncurses_slk_attrset — Set given attributes for soft function-key labels
  • ncurses_slk_clear — Clears soft labels from screen
  • ncurses_slk_color — Sets color for soft label keys
  • ncurses_slk_init — Initializes soft label key functions
  • ncurses_slk_noutrefresh — Copies soft label keys to virtual screen
  • ncurses_slk_refresh — Copies soft label keys to screen
  • ncurses_slk_restore — Restores soft label keys
  • ncurses_slk_set — Sets function key labels
  • ncurses_slk_touch — Forces output when ncurses_slk_noutrefresh is performed
  • ncurses_standend — Остановить использование атрибута ‘standout’
  • ncurses_standout — Начать использование атрибута ‘standout’
  • ncurses_start_color — Initializes color functionality
  • ncurses_termattrs — Возвращает логическое ИЛИ всех флагов атрибутов, поддерживаемых терминалом
  • ncurses_termname — Returns terminals (short)-name
  • ncurses_timeout — Set timeout for special key sequences
  • ncurses_top_panel — Перемещает видимую панель в верхнюю часть стека
  • ncurses_typeahead — Указать другой файловый дескриптор для проверки типа
  • ncurses_ungetch — Поставить символ обратно во входной поток
  • ncurses_ungetmouse — Pushes mouse event to queue
  • ncurses_update_panels — Обновляет виртуальной экран для отображения связей между панелями в стеке
  • ncurses_use_default_colors — Назначить цвета терминала по умолчанию на идентификатор цвет -1
  • ncurses_use_env — Управляет использованием информации окружения о размере терминала
  • ncurses_use_extended_names — Управляет использованием расширенных имен в описаниях terminfo
  • ncurses_vidattr — Отобразить строку в терминале в режиме атрибута видео
  • ncurses_vline — Отрисовывает вертикальную линию в текущей позиции, используя символ-атрибут и макс. количество символов
  • ncurses_waddch — Добавляет символ в текущую позицию в окне и перемещает вперед курсор
  • ncurses_waddstr — Выводит текст в текущей позиции в окне
  • ncurses_wattroff — Выключить атрибуты для окна
  • ncurses_wattron — Включить атрибутов для окна
  • ncurses_wattrset — Установить атрибуты для окна
  • ncurses_wborder — Рисует границу вокруг окна с помощью символов-атрубитов
  • ncurses_wclear — Очищает окно
  • ncurses_wcolor_set — Устанавливает цветовые пары окон
  • ncurses_werase — Стереть содержимое окна
  • ncurses_wgetch — Читает символ с клавиатуры (окна)
  • ncurses_whline — Рисует горизонтальную линию в окне в текущей позиции с использованием атрибута-символа и определенного максимального количества символов
  • ncurses_wmouse_trafo — Преобразует координаты окна/stdscr
  • ncurses_wmove — Перемещает позицию вывода окна
  • ncurses_wnoutrefresh — Копирует окно на виртуальный экран
  • ncurses_wrefresh — Обновить окно на экране терминала
  • ncurses_wstandend — End standout mode for a window
  • ncurses_wstandout — Enter standout mode for a window
  • ncurses_wvline — Рисует вертикальную линию в окне в текущей позиции с использованием атрибута-символа и определенного максимального количества символов

User Contributed Notes 16 notes

Not calling ncurses_end() can (will) cause issues with terminals. Although registering a shutdown function which includes ncurses_end() may help, sometimes things go awry and you’re stuck with a terminal that is acting in strange ways.

This can be fixed! *NIX systems (FreeBSD, Linux, UNIX, et al.) usually support the ‘reset’ command which resets the terminal settings and allows you to get things back to normal.

In the example above, if you run resize from a C shell it will output the sizes in C shell syntax, run resize with -u to force Bourne syntax:
The $win parameter is just for future compatibility.

Here is a small example, how to use STDIN to read keys combinations in console.

$stdin = fopen(‘php://stdin’, ‘r’);
stream_set_timeout($stdin, 1);
while (1) <
$temp=»»;
while (1) <
if(stream_select($read = array($stdin), $write = NULL, $except = NULL, 0))
$temp .= ord(fgetc($stdin));
else break;
>

// F1 : $temp == 27914949126
// ALT+F1 : $temp = 2727914949126
// .

Here is a function that takes an associative array, presents a menu in a new window, allows the user to make a choice using up and down arrows and the enter key, and returns the value of the menu item.

Limitations include:
No way of scrolling a long list, either horiontally or vertically;
No arguments for placement on screen, although this is easy to add;
No multiple selection;
Will produce all kinds of errors and warnings if the terminal is smaller than is necessary to create the window.

I’m very new at using the ncurses library; Comments and improvements would be greatly appreciated!

/**
* Create a simple selection menu
* @param array Associative array; The value will be shown on the menu, while the key will be returned when the associated value is selected.
* @return mixed
*/
function ncurses_menu_select ( $menu ) <
$keys = array_keys ( $menu );
$values = array_values ( $menu );

$height = $width = 0 ;
$height = count ( $menu ) + 2 ;
foreach( $values as $value ) <
$width = max ( $width , strlen ( $value ) + 2 );
>

$menu_window = ncurses_newwin ( $height , $width , 5 , 5 );
ncurses_wborder ( $menu_window , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );

$current = 0 ;
for( $a = 0 ; $a count ( $values ); $a ++ ) <
if ( $a == $current ) <
ncurses_wattron ( $menu_window , NCURSES_A_REVERSE );
ncurses_mvwaddstr ( $menu_window , 1 + $a , 1 , $values [ $a ] );
ncurses_wattroff ( $menu_window , NCURSES_A_REVERSE );
> else <
ncurses_mvwaddstr ( $menu_window , 1 + $a , 1 , $values [ $a ] );
>
>
ncurses_wrefresh ( $menu_window );

while( ! in_array ( $key = ncurses_getch ( $menu_window ), array( 13 , 10 ) ) ) <
if ( $key == NCURSES_KEY_UP AND $current > 0 ) <
$move = — 1 ;
> else if ( $key == NCURSES_KEY_DOWN and $current count ( $values ) — 1 ) <
$move = 1 ;
> else <
$move = 0 ;
>
ncurses_mvwaddstr ( $menu_window , 1 + $current , 1 , $values [ $current ] );
$current += $move ;
ncurses_wattron ( $menu_window , NCURSES_A_REVERSE );
ncurses_mvwaddstr ( $menu_window , 1 + $current , 1 , $values [ $current ] );
ncurses_wattroff ( $menu_window , NCURSES_A_REVERSE );
ncurses_wrefresh ( $menu_window );
>
ncurses_delwin ( $menu_window );
return $keys [ $current ];
>
?>

Example Use:

// Initialie ncurses
$ncurse = ncurses_init ();
// A full screen window
$fullscreen = ncurses_newwin ( 0 , 0 , 0 , 0 );
// Add a pretty border
ncurses_border ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
// Draw everything so far
ncurses_refresh ();

// Set up menu array
$menu_items = array(
‘one’ => ‘Menu Item #1’ ,
‘two’ => ‘Menu Item #2’ ,
‘three’ => ‘Menu Item #3’ );
// Display menu and return selection
$selection = ncurses_menu_select ( $menu_items );

// Print selection
ncurses_mvaddstr ( 1 , 1 , ‘You selected ‘ . $menu_items [ $selection ] . ‘ with the value ‘ . $selection );

// Draw updates
ncurses_refresh ( $fullscreen );
// End
ncurses_end ();
?>

Введение в ncurses

Библиотека ncurses обеспечивает программиста функциями для создания текстового интерфейса пользователя (Text-based User Interface — TUI) не зависящего от типа терминала. В частности, ncurses позволяет создавать окна и управлять их характеристиками, задавать экранные координаты, цвет и другие атрибуты выводимых символов. Она также оптимизирует операции по обновлению содержимого окон. ncurses можно рассматривать как аналог библиотеки crt в Turbo Pascal.

ncurses разрабатывается в рамках проекта GNU и работает на POSIX-совместимых системах. Для Windows существует PDCurses — свободная библиотека, реализующая большинство функций ncurses.

Структура программы

Программа, использующая ncurses, обычно имеет вид:

Вызов initscr инициализирует ncurses. Функция endwin очищает все выделенные для ncurses ресурсы и должна вызываться после любой другой функции этой библиотеки.

Выведем на экран традиционную надпись «Hello, World!» :

Заметим, что printw выводит строку не напрямую на экран, а в специальный буфер, содержимое которого отображается на реальном экране после вызова refresh .

Ожидание ввода данных getch нужно для того, чтобы надпись не исчезла с экрана.

Экран и окна

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

Для описания окна (экрана) в ncurses существует структура данных WINDOW . Теперь мы можем описать работу функций библиотеки более подробно. Так, при вызове initscr выделяется память под следующие переменные:

Если произойдет ошибка, то initscr вернет ERR . В противном случае возвращается указатель на stdscr .


stdscr — это буфер, в который выводит данные printw и другие подобные функции, а curscr — изображение, реально выводимое на экран. При вызове функции refresh происходит копирование содержимого stdscr в curscr .

Переделаем наш пример так, чтобы надпись выводилась в окно:

В начале программы мы проверяем инициализацию ncurses, а затем создаем окно с помощью функции newwin :

  • nlines — это число строк;
  • ncols — число столбцов окна;
  • y0 и x0 — координаты верхнего левого угла окна.

При этом начало координат (0,0) находится в левом верхнем углу экрана. Переменные LINES и COLS инициализируются при вызове initscr и задают высоту экрана в строках и ширину в столбцах. В нашем случае окно совпадает с экраном. Все указанные переменные имеют тип int .

Функция delwin(win) удаляет окно win .

Создадим теперь окно размером 20 строк на 50 столбцов и выведем надпись в его центре:

Здесь, для наглядности, границы окна показаны с помощью функции box .

Функции ncurses, начинающиеся с w , предназначены для работы с окнами WINDOW , тогда как остальные имеют дело с stdscr . В нашем случае wrefresh(win) обновляет curscr , помещая в него содержимое окна win , то есть делает с win то же самое, что refresh делает с stdscr .

Функции, начинающиеся с mv , сначала переместят курсор в позицию (y,x) , а затем выполняют какое-то действие. Так, в примере, функция mvaddstr перемещает курсор в середину экрана, учитывая при этом длину строки hello , после чего выводит эту строку.

Символы

В следующем примере с помощью функции mvaddch , выводящей заданный пользователем символ, строится график функции y = x^2 для целочисленных x , лежащих в диапазоне [-4;4]:

Для выводимых символов можно устанавливать цвет символа и цвет фона. Ниже приведен фрагмент программы, в которой надпись «Hello, world!» выводится разными цветами символов и фона:

Чтобы символ ‘X’ был выведен с цветами из цветовой пары номер 4, укажем:

Установить атрибуты для окна можно с помощью функции wattron :

которая задает для окна атрибут (или комбинацию атрибутов) attr . После этого любой текст, выводимый в этом окне с помощью waddch или waddstr будет иметь атрибуты attr .

Например, для вывода на экран сообщения в наиболее ярком режиме, наберем:

Предопределенные значения атрибутов приведены в таблице:

Атрибут Описание
A_NORMAL нормальный, переустановка всего остального
A_STANDOUT наиболее яркий режим
A_UNDERLINE подчеркивание
A_REVERSE обратное изображение
A_BLINK мигание
A_DIM тусклый или полуяркий режим
A_BOLD жирный шрифт
A_ALTCHARSET использование альтернативной символьной таблицы
A_INVIS невидимый режим
A_PROTECT режим защиты
A_CHARTEXT маска для действующих символов (chtype)
A_COLOR маска для цвета
COLOR_PAIR(n) установка цветовой пары n
PAIR_NUMBER(a) получение цветовой пары, лежащей в атрибуте a

Определим для окна атрибуты «мерцание» и «жирный шрифт» и будем выводить символы с заданными ранее цветами

[Код полностью](/images/comp/Comp.NcursesTutorial/nccolor.c](/images/comp/Comp.NcursesTutorial/ncattrr.c)

Остальная часть этой программы — такая же как в примере из раздела «Экран и окна».

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

Для инициализации операций с цветом вызывается функция start_color .

Функция has_colors позволяет узнать, можно ли использовать цвета. Если она возвращает FALSE , то использовать цвета нельзя.

Для создания цветовых пар служит функция init_pair :

foreground — цвет символа; background — цвет фона. pair_number — номер созданной цветовой пары. Каждой паре будет соответствовать номер от 1 до COLOR_PAIRS-1 (0 зарезервирован для стандартного отображения). Для изменения цвета вызывается функция color_set , в которой указывается номер нужной цветовой пары.

Атрибуты

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

Есть два способа использования атрибутов: указывать их для каждого выводимого символа или глобально — для всего окна.

Атрибут символа устанавливается при вызове функции waddch(win, ch) или addch(ch) . Для связывания символа с атрибутом и комбинирования атрибутов служит логическое ИЛИ. Например, A_UNDERLINE — предопределенный атрибут, отвечающий за подчеркивание символа. Для того, чтобы вывести в окно win символ ‘X’ с подчеркиванием нужно указать:

Обратите внимание, что атрибуты окна относятся ко всему содержимому окна, в том числе и к рамке. В то же время надпись «Hello, world!» не мерцает, поскольку выводится не в окне, а на экране, на который не распространяется назначение атрибутов с помощью wattron .

Для чтения символа из stdscr используется функция getch :

По умолчанию введенный символ отображается на экране. Запретить отображение можно функцией noecho .

Вызов функции cbreak позволяет getch считывать поступившие от пользователя данные непосредственно после нажатия клавиши. В противном случае полученные данные поступят в обработку только после того, как будет считан символ новой строки. Тогда данные поступают в getch посимвольно, по принципу FIFO, до тех пор пока буфер ввода не опустеет.

По умолчанию, getch ожидает нажатие клавиши. Это полезно, например, когда нужно притормозить выполнение программы. Отменить это умолчание можно с помощью функции nodelay(stdscr, TRUE) . Такое поведение используются для создания циклов в игровых программах, где требуется оперативная реакция пользователя. Например:

Вызов функции keypad(stdstr, TRUE) , позволяет обрабатывать нажатия специальных клавиш, таких как стрелки, Ctrl или Delete, а также их комбинаций. В результате нажатия генерируется целое число, которое можно считать, обработать и выполнить какое-либо действие.

В таблице ниже приведены коды клавиш:

Код клавиши Описание
KEY_DOWN Клавиши со стрелками
KEY_UP
KEY_LEFT
KEY_RIGHT
KEY_HOME Home
KEY_BACKSPACE Backspace
KEY_F(n) Функциональная клавиша с 0 = 63
KEY_DC Delete
KEY_IC Insert
KEY_ENTER Enter

Считывание и обработка нажатия клавиш выполняется так:

Чтение символов из окна выполняется функцией

Чтение может выполняется вместе с перемещением курсора в заданную позицию:

В следующем пример символ ‘X’ перемещается по экрану клавишами со стрелками:

Ссылки

  • Мэтью Н., Стоунс Р. Основы программирования в Linux. — СПб.: БХВ-Петербург, 2009, Глава 6. — с. 253—301. Ncurses Programming Guide by by X. Li. Еще одно краткое руководство.NCURSES Programming HOWTO, Pradeep Padala. Все, что нужно. *Руководство программиста для Linux, перевод А. Паутнова. Справочник на русском.

Читайте также

Комментарии

Дмитрий Храмов
Компьютерное моделирование и все, что с ним связано: сбор данных, их анализ, разработка математических моделей, софт для моделирования, визуализации и оформления публикаций. Ну и за жизнь немного.

хРТБЧМЕОЙЕ ФЕТНЙОБМБНЙ (curses/terminfo)

упдетцбойе

ртедйумпчйе

нОПЗЙЕ ЛПННЕТЮЕУЛЙЕ РТПЗТБННОЩЕ УЙУФЕНЩ ЙНЕАФ Ч УЧПЕН УПУФБЧЕ РТПЗТБННЩ, ХРТБЧМСАЭЙЕ ЧЧПДПН Й ЧЩЧПДПН ОБ ФЕТНЙОБМ. фБЛБС РТПЗТБННБ НПЦЕФ РЕТЕНЕЭБФШ ЛХТУПТ, РПЛБЪЩЧБФШ НЕОА, ДЕМЙФШ ЬЛТБО ФЕТНЙОБМБ ОБ ПЛОБ ЙМЙ ЖПТНБФЙТПЧБФШ ЬЛТБО ДМС ПВМЕЗЮЕОЙС ЧЧПДБ Й ЙЪЧМЕЮЕОЙС ЙОЖПТНБГЙЙ ЙЪ ВБЪЩ ДБООЩИ.

ч ЬФПК ЗМБЧЕ ПВЯСУОСЕФУС, ЛБЛ ТБЪТБВБФЩЧБФШ РТПЗТБННЩ, ТБВПФБАЭЙЕ У ФЕТНЙОБМПН Ч УЙУФЕНЕ UNIX, ЙУРПМШЪХС РБЛЕФ РПДРТПЗТБНН, ОБЪЩЧБЕНЩК cursescurses/terminfo . ьФПФ РБЛЕФ ЧЛМАЮБЕФ ВЙВМЙПФЕЛХ РПДРТПЗТБНН ОБ СЪЩЛЕ C, ВБЪХ ДБООЩИ Й ОБВПТ ЧУРПНПЗБФЕМШОЩИ УТЕДУФЧ УЙУФЕНЩ UNIX. оБЪОБЮЕОЙЕ ДБООПК ЗМБЧЩ — ОЕ ПРЙУБОЙЕ ЧУЕИ ЛПНРПОЕОФ РБЛЕФБ, Б РТЕДПУФБЧМЕОЙЕ РПМШЪПЧБФЕМА ЧПЪНПЦОПУФЙ ОЕНЕДМЕООП РТЙУФХРЙФШ Л ОБРЙУБОЙА РТПЗТБНН, ТБВПФБАЭЙИ У ФЕТНЙОБМПН. ъДЕУШ ТБУУНБФТЙЧБАФУС ФПМШЛП ОБЙВПМЕЕ ЮБУФП ЙУРПМШЪХЕНЩЕ РПДРТПЗТБННЩ, Ч ПФОПЫЕОЙЙ ЦЕ ПУФБМШОЩИ ДЕМБЕФУС УУЩМЛБ ОБ curses(3X) Й terminfo (4) Ч уРТБЧПЮОЙЛЕ РТПЗТБННЙУФБ. дЕТЦЙФЕ ЬФХ ЛОЙЗХ РПД ТХЛПК ОБ УМХЮБК, ЕУМЙ чБН ОХЦОП ВХДЕФ ХЪОБФШ РПДТПВОПУФЙ П ЛБЛПК-МЙВП ЙЪ ПРЙУБООЩИ (ЙМЙ ОЕ ПРЙУБООЩИ) ЪДЕУШ РПДРТПЗТБНН.

дМС ЙУРПМШЪПЧБОЙС cursescurses/terminfo ОХЦОП ВЩФШ ЪОБЛПНЩН У СЪЩЛПН РТПЗТБННЙТПЧБОЙС C, ФБЛ ЛБЛ РПДРТПЗТБННЩ РБЛЕФБ ОБРЙУБОЩ ЙНЕООП ОБ ОЕН. лТПНЕ ФПЗП, ОЕПВИПДЙНП ЪОБФШ УФБОДБТФОЩК РБЛЕФ УТЕДУФЧ ЧЧПДБ/ЧЩЧПДБ УЙУФЕНЩ UNIX ДМС СЪЩЛБ C [УН. stdio(3S)]. чЩ УНПЦЕФЕ УПЪДБЧБФШ ТБЪОППВТБЪОЩЕ РТПЗТБННЩ ДМС ТБВПФЩ У ФЕТНЙОБМПН, РПМШЪХСУШ ЬФЙНЙ ЪОБОЙСНЙ Й РПОЙНБОЙЕН РТЙОСФПЗП Ч УЙУФЕНЕ UNIX РТЙОГЙРБ ПРПТЩ ОБ ТБВПФХ, ХЦЕ УДЕМБООХА ДТХЗЙНЙ.

дБООБС ЗМБЧБ ДЕМЙФУС ОБ РСФШ ТБЪДЕМПЧ:

  1. чЧЕДЕОЙЕ
    ч ЬФПН ТБЪДЕМЕ ЛТБФЛП ПРЙУЩЧБАФУС curses, terminfo Й ДТХЗЙЕ ЛПНРПОЕОФЩ РБЛЕФБ РПДРТПЗТБНН ДМС ТБВПФЩ У ФЕТНЙОБМПН.
  2. йУРПМШЪПЧБОЙЕ РПДРТПЗТБНН РБЛЕФБ curses
    ч ЬФПН ТБЪДЕМЕ ПРЙУЩЧБАФУС ПУОПЧОЩЕ РПДРТПЗТБННЩ, УПУФБЧМСАЭЙЕ ВЙВМЙПФЕЛХ curses (3X). тБУУЛБЪЩЧБЕФУС П РПДРТПЗТБННБИ ЧЩЧПДБ ОБ ЬЛТБО, ЮФЕОЙС У ЬЛТБОБ, РПУФТПЕОЙС ПЛПО. пРЙУЩЧБАФУС ФБЛЦЕ РПДРТПЗТБННЩ, ТЕБМЙЪХАЭЙЕ ВПМЕЕ УМПЦОЩЕ ЖХОЛГЙЙ — МЙОЕКОХА ЗТБЖЙЛХ, ЙУРПМШЪПЧБОЙЕ ФЕТНЙОБМШОЩИ РТПЗТБННЙТХЕНЩИ НЕФПЛ, ТБВПФХ У ОЕУЛПМШЛЙНЙ ФЕТНЙОБМБНЙ ПДОПЧТЕНЕООП. рТЙЧПДЙФУС НОПЦЕУФЧП РТЙНЕТПЧ, ДЕНПОУФТЙТХАЭЙИ ЬЖЖЕЛФЙЧОПУФШ ЙУРПМШЪПЧБОЙС ЬФЙИ РПДРТПЗТБНН.
  3. йУРПМШЪПЧБОЙЕ РПДРТПЗТБНН РБЛЕФБ terminfo
    ч ЬФПН ТБЪДЕМЕ ПРЙУЩЧБАФУС ФЕ РПДРТПЗТБННЩ РБЛЕФБ curses, ЛПФПТЩЕ ОЕРПУТЕДУФЧЕООП ЧЪБЙНПДЕКУФЧХАФ У ВБЪПК ДБООЩИ terminfo ДМС ТЕБМЙЪБГЙЙ ФБЛЙИ ЧПЪНПЦОПУФЕК, ЛБЛ РТПЗТБННЙТХЕНЩЕ ЖХОЛГЙПОБМШОЩЕ ЛМБЧЙЫЙ.
  4. йУРПМШЪПЧБОЙЕ ВБЪЩ ДБООЩИ terminfo
    ч ЬФПН ТБЪДЕМЕ ПРЙУЩЧБЕФУС ВБЪБ ДБООЩИ terminfo , УППФЧЕФУФЧХАЭЙЕ УТЕДУФЧБ РПДДЕТЦЛЙ Й ЙИ ЧЪБЙНПДЕКУФЧЙЕ У ВЙВМЙПФЕЛПК curses .
  5. рТЙНЕТЩ РТПЗТБНН, ТБВПФБАЭЙИ У curses
    ч ЬФПН ТБЪДЕМЕ РТЙЧЕДЕОЩ ФЕЛУФЩ ЫЕУФЙ РТПЗТБНН, ЙММАУФТЙТХАЭЙЕ ЙУРПМШЪПЧБОЙЕ РПДРТПЗТБНН РБЛЕФБ curses .

1. ччедеойе

1.1. юФП ФБЛПЕ curses?

Curses (3X) — ЬФП ВЙВМЙПФЕЛБ РПДРТПЗТБНН, ЛПФПТЩЕ ЙУРПМШЪХАФУС ДМС ТБЪТБВПФЛЙ РТПЗТБНН, ПУХЭЕУФЧМСАЭЙИ ЧЧПД/ЧЩЧПД ОБ ЬЛТБО ФЕТНЙОБМБ Ч УЙУФЕНЕ UNIX. ьФЙ РПДРТПЗТБННЩ СЧМСАФУС ЖХОЛГЙСНЙ C ЙМЙ НБЛТПУБНЙ. нОПЗЙЕ ЙЪ ОЙИ ОБРПНЙОБАФ РПДРТПЗТБННЩ ЙЪ УФБОДБТФОПК ВЙВМЙПФЕЛЙ СЪЩЛБ C. оБРТЙНЕТ, ЙНЕЕФУС РПДРТПЗТБННБ printw() , ЧЕУШНБ РПИПЦБС ОБ printf (3S) Й РПДРТПЗТБННБ getch() , РПДПВОБС getc (3S). ч чБЫЕН ВБОЛЕ РТПЗТБННБ — БЧФПНБФЙЮЕУЛЙК ЛБУУЙТ НПЦЕФ ЙУРПМШЪПЧБФШ printw() ДМС ЧЩЧПДБ НЕОА Й getch() ДМС РТЙЕНБ чБЫЙИ ЪБРТПУПЧ ОБ ЙЪЯСФЙЕ УХНН (ЙМЙ, ЮФП ДБЦЕ МХЮЫЕ, ОБ ЙИ ЧЛМБД). ьЛТБООЩК ФЕЛУФПЧЩК ТЕДБЛФПТ — ФБЛПК, ОБРТЙНЕТ, ЛБЛ ТЕДБЛФПТ vi (1) УЙУФЕНЩ UNIX, ФБЛЦЕ НПЦЕФ ЙУРПМШЪПЧБФШ ЬФЙ Й ДТХЗЙЕ РПДРТПЗТБННЩ РБЛЕФБ curses.

оБЪЧБОЙЕ curses РТЙОСФП ЙЪ-ЪБ ФПЗП, ЮФП ДБООБС ВЙВМЙПФЕЛБ РПДРТПЗТБНН ПРФЙНЙЪЙТХЕФ ДЧЙЦЕОЙЕ ЛХТУПТБ, ФП ЕУФШ НЙОЙНЙЪЙТХЕФ ЬФП ДЧЙЦЕОЙЕ Ч РТПГЕУУЕ ПВОПЧМЕОЙС ЬЛТБОБ. оБРТЙНЕТ, ЕУМЙ (ЙУРПМШЪХС РПДРТПЗТБННЩ РБЛЕФБ curses) чЩ ТБЪТБВПФБМЙ ФЕЛУФПЧЩК ТЕДБЛФПТ Й ТЕДБЛФЙТХЕФЕ ЖТБЪХ

ФБЛ, ЮФПВЩ ПОБ ЮЙФБМБУШ:

ФП РТПЗТБННБ ЧЩЧЕДЕФ ФПМШЛП ‘ МХЮЫЙК ‘ ЧНЕУФП ‘ ПФМЙЮОЩК ‘, ПУФБМШОЩЕ УЙНЧПМЩ ПУФБОХФУС ВЕЪ ЙЪНЕОЕОЙК. пРФЙНЙЪБГЙС ХРТБЧМЕОЙС ЛХТУПТПН ОБЪЩЧБЕФУС ЕЭЕ ПРФЙНЙЪБГЙЕК ЧЩЧПДБ, РПУЛПМШЛХ НЙОЙНЙЪЙТХЕФУС ПВЯЕН РЕТЕДБЧБЕНЩИ ДБООЩИ, ФП ЕУФШ ЧЩЧПД.

рТЙ ПРФЙНЙЪБГЙЙ ХРТБЧМЕОЙС ЛХТУПТПН ЪБРЙУШ ОБ ЬЛТБО РТПЙЪЧПДЙФУС ФБЛЙН УРПУПВПН, ЛПФПТЩК УППФЧЕФУФЧХЕФ ФЕТНЙОБМХ, У ЛПФПТЩН ТБВПФБЕФ РТПЗТБННБ, ЙУРПМШЪХАЭБС РБЛЕФ curses . фБЛЙН ПВТБЪПН, ВЙВМЙПФЕЛБ curses РПЪЧПМСЕФ ДЕМБФШ ЧУЕ ОЕПВИПДЙНПЕ ОБ ФЕТНЙОБМБИ ТБЪМЙЮОЩИ ФЙРПЧ. рПДРТПЗТБННЩ РБЛЕФБ РТПУНБФТЙЧБАФ ВБЪХ ДБООЩИ terminfo (РПДТПВОП ПРЙУЩЧБЕФУС ОЙЦЕ), ЮФПВЩ ОБКФЙ РПДИПДСЭЕЕ ПРЙУБОЙЕ ФЕТНЙОБМБ.

юЕН ВХДЕФ РПМЕЪОБ ПРФЙНЙЪБГЙС ХРТБЧМЕОЙС ЛХТУПТПН чБН Й ФЕН, ЛФП ВХДЕФ РПМШЪПЧБФШУС чБЫЙНЙ РТПЗТБННБНЙ? чП-РЕТЧЩИ, ПОБ УЬЛПОПНЙФ чБЫЕ ЧТЕНС, ЪБФТБЮЙЧБЕНПЕ ОБ ПРЙУБОЙЕ ФПЗП, ЛБЛ ЙНЕООП чЩ ИПФЙФЕ ЙЪНЕОСФШ УПДЕТЦЙНПЕ ЬЛТБОБ. чП-ЧФПТЩИ, ПОБ УПИТБОЙФ ЧТЕНС РПМШЪПЧБФЕМС ЪБ УЮЕФ ХНЕОШЫЕОЙС ЧТЕНЕОЙ, ОЕПВИПДЙНПЗП ДМС РЕТЕРЙУЩЧБОЙС ЬЛТБОБ. ч-ФТЕФШЙИ, ПОБ ХНЕОШЫЙФ ЪБЗТХЪЛХ МЙОЙК УЧСЪЙ УЙУФЕНЩ UNIX Ч РЕТЙПД ПВОПЧМЕОЙС ЬЛТБОБ. ч-ЮЕФЧЕТФЩИ, чБН ОЕ РТЙДЕФУС ЪБДХНЩЧБФШУС ПВ ПЗТПНОПН ЛПМЙЮЕУФЧЕ ФЕТНЙОБМПЧ, ОБ ЛПФПТЩИ чБЫБ РТПЗТБННБ, ВЩФШ НПЦЕФ, ВХДЕФ ТБВПФБФШ.

дБМЕЕ РТЙЧПДЙФУС ФЕЛУФ РТПУФПК РТПЗТБННЩ, ТБВПФБАЭЕК У curses . пОБ ПВТБЭБЕФУС Л ОЕУЛПМШЛЙН РПДРТПЗТБННБН curses ДМС ФПЗП, ЮФПВЩ РЕТЕДЧЙОХФШ ЛХТУПТ ОБ УЕТЕДЙОХ ЬЛТБОБ Й ЧЩЧЕУФЙ ГЕРПЮЛХ УЙНЧПМПЧ BullsEye . чУЕ ЬФЙ РПДРТПЗТБННЩ ПРЙУЩЧБАФУС Ч УМЕДХАЭЕН ТБЪДЕМЕ, ЛПФПТЩК ОБЪЩЧБЕФУС йУРПМШЪПЧБОЙЕ РПДРТПЗТБНН РБЛЕФБ curses . юФПВЩ РПОСФШ, ЮФП ДЕМБАФ ЬФЙ РПДРТПЗТБННЩ, чБН ДПУФБФПЮОП ЧЪЗМСОХФШ ОБ ЙИ ЙНЕОБ.

1.2. юФП ФБЛПЕ terminfo?

дБМЕЕ РТЙЧПДЙФУС РТПУФБС ЛПНБОДОБС РТПГЕДХТБ, ЙУРПМШЪХАЭБС ВБЪХ ДБООЩИ terminfo .

1.3. чЪБЙНПДЕКУФЧЙЕ curses Й terminfo

рПДРТПЗТБННЩ РБЛЕФБ curses ЙЪЧМЕЛБАФ ЙЪ ВБЪЩ ДБООЩИ terminfo ЙОЖПТНБГЙА П ФПН ФЙРЕ ФЕТНЙОБМБ, ОБ ЛПФПТПН РТПЗТБННБ ЧЩРПМОСЕФУС. ч ДБМШОЕКЫЕН ЬФПФ ФЕТНЙОБМ НЩ ВХДЕН ОБЪЩЧБФШ ФЕЛХЭЙН ФЕТНЙОБМПН.

рТЕДРПМПЦЙН, ЮФП РТПЗТБННБ, ФЕЛУФ ЛПФПТПК РТЙЧЕДЕО Ч ЛПОГЕ ТБЪДЕМБ юФП ФБЛПЕ curses ?, ЧЩРПМОСЕФУС ОБ ФЕТНЙОБМЕ AT&T Teletype 5425. юФПВЩ ПФТБВПФБФШ ДПМЦОЩН ПВТБЪПН, ФП ЕУФШ ЧЩЧЕУФЙ BullsEye Ч ГЕОФТ ЬЛТБОБ, РТПЗТБННБ ДПМЦОБ ЙНЕФШ ЙОЖПТНБГЙА П ЛПМЙЮЕУФЧЕ УФТПЛ Й УФПМВГПЧ ОБ ЬЛТБОЕ. ьФЙ ДБООЩЕ ИТБОСФУС Ч ПРЙУБОЙЙ ФЕТНЙОБМБ AT&T Teletype 5425 Ч ВБЪЕ ДБООЩИ terminfo . юФПВЩ РПМХЮЙФШ ЙИ, РТПЗТБННЕ, ТБВПФБАЭЕК У curses , ДПУФБФПЮОП ЪОБФШ ФПМШЛП ОБЪЧБОЙЕ ФЕТНЙОБМБ, ОБ ЛПФПТПН ПОБ ЧЩРПМОСЕФУС. нПЦОП РЕТЕДБФШ ЕК ЬФП ОБЪЧБОЙЕ, РПНЕУФЙЧ ЕЗП Ч РЕТЕНЕООХА ПЛТХЦЕОЙС $TERM РТЙ РПДЛМАЮЕОЙЙ Л УЙУФЕНЕ UNIX, ЙМЙ РХФЕН РТЙУЧПЕОЙС ЪОБЮЕОЙС Й РПНЕЭЕОЙС Ч ПЛТХЦЕОЙЕ РЕТЕНЕООПК $TERM Ч чБЫЕН ЖБКМЕ .profile [УН. profile (4)]. тБУРПМБЗБС ЪОБЮЕОЙЕН $TERM , РТПЗТБННБ, ЙУРПМШЪХАЭБС curses , НПЦЕФ ЙЪЧМЕЮШ ПРЙУБОЙЕ ФЕЛХЭЕЗП ФЕТНЙОБМБ ЙЪ ВБЪЩ ДБООЩИ terminfo .

рХУФШ, ОБРТЙНЕТ, Ч .profile ЧЛМАЮЕОЩ УМЕДХАЭЙЕ УФТПЛЙ:

ч РЕТЧПК УФТПЛЕ ХУФБОБЧМЙЧБЕФУС ОБЪЧБОЙЕ ФЕТНЙОБМБ, Б ЧП ЧФПТПК ПОП РПНЕЭБЕФУС Ч ПЛТХЦЕОЙЕ. фТЕФШС УФТПЛБ РТЙНЕТБ ФТЕВХЕФ ПФ УЙУФЕНЩ UNIX РТПЙОЙГЙБМЙЪЙТПЧБФШ ФЕЛХЭЙК ФЕТНЙОБМ, ФП ЕУФШ ПВЕУРЕЮЙФШ УППФЧЕФУФЧЙЕ УПУФПСОЙС ФЕТНЙОБМБ ЕЗП ПРЙУБОЙА Ч ВБЪЕ ДБООЩИ terminfo . (рПТСДПЛ ЬФЙИ УФТПЛ ЧБЦЕО. юФПВЩ РТЙ ЧЩЪПЧЕ tput РТПЙЪПЫМБ РТБЧЙМШОБС ЙОЙГЙБМЙЪБГЙС ФЕЛХЭЕЗП ФЕТНЙОБМБ, $TERM ДПМЦОБ ВЩФШ ХЦЕ ХУФБОПЧМЕОБ Й РПНЕЭЕОБ Ч ПЛТХЦЕОЙЕ). еУМЙ, ЙНЕС ФБЛЙЕ УФТПЛЙ Ч ЖБКМЕ .profile , чЩ ЪБРХУФЙФЕ РТПЗТБННХ, ТБВПФБАЭХА У curses , ПОБ РПМХЮЙФ ОХЦОХА ЕК ЙОЖПТНБГЙА П ФЕТНЙОБМЕ ЙЪ ЖБКМБ, УППФЧЕФУФЧХАЭЕЗП ЪОБЮЕОЙА $TERM , ФП ЕУФШ ЙЪ ЖБКМБ /usr/lib/terminfo/a/att5425 .

1.4. дТХЗЙЕ ЛПНРПОЕОФЩ РБЛЕФБ ХРТБЧМЕОЙС ФЕТНЙОБМПН

лБЛ ВЩМП УЛБЪБОП ЧЩЫЕ, РБЛЕФ ХРТБЧМЕОЙС ФЕТНЙОБМПН ПВЩЮОП ОБЪЩЧБАФ curses / terminfo . пДОБЛП, Ч ОЕН ЕУФШ Й ДТХЗЙЕ ЛПНРПОЕОФЩ, ЙЪ ЛПФПТЩИ НЩ ХЦЕ ХРПНСОХМЙ, Ч ЮБУФОПУФЙ, tic (1M). дБМЕЕ РТЙЧПДЙФУС РПМОЩК УРЙУПЛ ЛПНРПОЕОФ, ТБУУНБФТЙЧБЕНЩИ Ч ЬФПН ТХЛПЧПДУФЧЕ:

captoinfo(1M) уТЕДУФЧП ДМС РЕТЕЧПДБ ПРЙУБОЙК ФЕТНЙОБМПЧ, УПЪДБООЩИ РПД ТБООЙНЙ ЧЕТУЙСНЙ УЙУФЕНЩ UNIX, Ч ЖПТНБФ terminfo .
curses(3X)
infocmp(1M)
уТЕДУФЧП ДМС РЕЮБФЙ Й УТБЧОЕОЙС УЛПНРЙМЙТПЧБООЩИ ПРЙУБОЙК ФЕТНЙОБМПЧ.
tabs(1) уТЕДУФЧП ДМС ХУФБОПЧЛЙ ОЕУФБОДБТФОЩИ РПЪЙГЙК ФБВХМСГЙЙ.
terminfo(4)
tic(1M)
лПНРЙМСФПТ ПРЙУБОЙК ФЕТНЙОБМПЧ ДМС ВБЪЩ ДБООЩИ terminfo .
tput(1) уТЕДУФЧП ДМС ХУФБОПЧЛЙ РПЪЙГЙК ФБВХМСГЙЙ ОБ ФЕТНЙОБМЕ Й РПМХЮЕОЙС ЪОБЮЕОЙК ЕЗП ИБТБЛФЕТЙУФЙЛ.

уН. ФБЛЦЕ profile (4), scr_dump (4), term (4) Й term (5). вПМЕЕ РПДТПВОХА ЙОЖПТНБГЙА ПВ ЬФЙИ ЛПНРПОЕОФБИ УН. Ч уРТБЧПЮОЙЛЕ РТПЗТБННЙУФБ Й уРТБЧПЮОЙЛЕ РПМШЪПЧБФЕМС.

2. йурпмшъпчбойе рпдртпзтбнн рблефб CURSES

ч ЬФПН ТБЪДЕМЕ ТБУУНБФТЙЧБАФУС ПУОПЧОЩЕ РПДРТПЗТБННЩ РБЛЕФБ curses , ЛПФПТЩЕ ЙУРПМШЪХАФУС РТЙ УПЪДБОЙЙ ЙОФЕТБЛФЙЧОЩИ ФЕТНЙОБМШОЩИ РТПЗТБНН. ч ОБЮБМЕ ТБЪДЕМБ ПРЙУБОЩ РПДРТПЗТБННЩ (Й ДТХЗЙЕ ЛПНРПОЕОФЩ), ЛПФПТЩЕ ОХЦОЩ ДМС ОПТНБМШОПК ТБВПФЩ МАВПК РТПЗТБННЕ, ТБВПФБАЭЕК У РБЛЕФПН (Ч ДБМШОЕКЫЕН НЩ ДМС ЛТБФЛПУФЙ ВХДЕН ЙОПЗДБ ОБЪЩЧБФШ ФБЛЙЕ РТПЗТБННЩ curses -РТПЗТБННБНЙ). ч ПУФБЧЫЕКУС ЮБУФЙ ТБЪДЕМБ ТБУУЛБЪЩЧБЕФУС П ФПН, ЛБЛ ЛПНРЙМЙТПЧБФШ Й ЧЩРПМОСФШ ФБЛХА РТПЗТБННХ. оБЛПОЕГ, ПРЙУЩЧБАФУС ОБЙВПМЕЕ ЮБУФП РТЙНЕОСЕНЩЕ РПДРТПЗТБННЩ, ЛПФПТЩЕ ДЕМБАФ УМЕДХАЭЕЕ:

  • пУХЭЕУФЧМСАФ ЧЧПД Й ЧЩЧПД ДБООЩИ ОБ ЬЛТБО ФЕТНЙОБМБ.
  • хРТБЧМСАФ ЧЧПДПН Й ЧЩЧПДПН ДБООЩИ — ОБРТЙНЕТ, РПДУЧЕЮЙЧБАФ ЧЩЧПДЙНЩЕ ДБООЩЕ ЙМЙ РПДБЧМСАФ ПФПВТБЦЕОЙЕ ЧЧПДЙНЩИ УЙНЧПМПЧ ОБ ЬЛТБОЕ («ЬИП»).
  • тБВПФБАФ У ОЕУЛПМШЛЙНЙ ПВТБЪБНЙ ЬЛТБОБ (ПЛОБНЙ).
  • чЩРПМОСАФ РТПУФЩЕ ЗТБЖЙЮЕУЛЙЕ ЖХОЛГЙЙ.
  • хРТБЧМСАФ РТПЗТБННЙТХЕНЩНЙ НЕФЛБНЙ ОБ ЬЛТБОЕ ФЕТНЙОБМБ.
  • пУХЭЕУФЧМСАФ ЧЧПД/ЧЩЧПД, ТБВПФБС ПДОПЧТЕНЕООП У ОЕУЛПМШЛЙНЙ ФЕТНЙОБМБНЙ.

рП НЕТЕ ПРЙУБОЙС РПДРТПЗТБНН НЩ РТЙЧПДЙН РТПУФЩЕ РТПЗТБННЩ, ЙММАУФТЙТХАЭЙЕ ЙИ РТЙНЕОЕОЙЕ. лТПНЕ ФПЗП, НЩ УУЩМБЕНУС ОБ ЗТХРРХ ВПМЕЕ ЪОБЮЙФЕМШОЩИ РТЙНЕТПЧ, ОБИПДСЭЙИУС Ч ТБЪДЕМЕ рТЙНЕТЩ РТПЗТБНН, ТБВПФБАЭЙИ У curses . ьФЙ РПУМЕДОЙЕ РТПЗТБННЩ ВПМЕЕ ЗМХВПЛЙ Й ЪБЮБУФХА ЙУРПМШЪХАФ РПДРТПЗТБННЩ, ЛПФПТЩЕ ЪДЕУШ ОЕ ПВУХЦДБАФУС, РПЬФПНХ ДЕТЦЙФЕ РПД ТХЛПК УРТБЧПЮОЙЛ curses (3X).

2.1. юФП ОХЦОП РТПЗТБННЕ ДМС ТБВПФЩ У curses

еУМЙ РТПЗТБННБ ЙУРПМШЪХЕФ РБЛЕФ curses , ПОБ ДПМЦОБ ЧЛМАЮБФШ ЖБКМ Й ЧЩЪЩЧБФШ РПДРТПЗТБННЩ initscr() , refresh() , ЙМЙ ЙН РПДПВОЩЕ, Б ФБЛЦЕ endwin() .

2.1.1. жБКМ

ч ЖБКМЕ ПРТЕДЕМСАФУС ОЕУЛПМШЛП ЗМПВБМШОЩИ РЕТЕНЕООЩИ Й УФТХЛФХТ ДБООЩИ, Б ФБЛЦЕ ФЕ ЙЪ РПДРТПЗТБНН РБЛЕФБ, ЛПФПТЩЕ Ч ДЕКУФЧЙФЕМШОПУФЙ СЧМСАФУС НБЛТПУБНЙ.

оБЮОЕН У ТБУУНПФТЕОЙС ПРТЕДЕМСЕНЩИ Ч ЖБКМЕ РЕТЕНЕООЩИ Й УФТХЛФХТ ДБООЩИ. ч ЖБКМЕ ПРТЕДЕМЕОЩ РБТБНЕФТЩ ЧУЕИ РПДРТПЗТБНН, ЧИПДСЭЙИ Ч РБЛЕФ curses . лТПНЕ ФПЗП, ПРТЕДЕМСАФУС ГЕМПЮЙУМЕООЩЕ РЕТЕНЕООЩЕ LINES Й COLS , ЛПФПТЩН РТЙ ЧЩРПМОЕОЙЙ РТПЗТБННЩ ОБЪОБЮБАФУС ЪОБЮЕОЙС УППФЧЕФУФЧЕООП ЧЕТФЙЛБМШОПЗП Й ЗПТЙЪПОФБМШОПЗП ТБЪНЕТБ ЬЛТБОБ. ьФП ДЕМБЕФУС РТЙ ЧЩЪПЧЕ ПРЙУЩЧБЕНПК ОЙЦЕ РПДРТПЗТБННЩ initscr() . ч ЖБКМЕ ПРТЕДЕМСАФУС ФБЛЦЕ ЛПОУФБОФЩ OK Й ERR . вПМШЫЙОУФЧП РПДРТПЗТБНН curses ЧПЪЧТБЭБАФ OK РТЙ ОПТНБМШОПН ЪБЧЕТЫЕОЙЙ Й ERR РТЙ ЧПЪОЙЛОПЧЕОЙЙ ПЫЙВЛЙ.

рТЙНЕЮБОЙЕ LINES Й COLS СЧМСАФУС ЧОЕЫОЙНЙ (ЗМПВБМШОЩНЙ) РЕТЕНЕООЩНЙ, РТЕДУФБЧМСАЭЙНЙ ТБЪНЕТЩ ЬЛТБОБ. ч РПМШЪПЧБФЕМШУЛПН ПЛТХЦЕОЙЙ НПЦОП ХУФБОПЧЙФШ ЪОБЮЕОЙС ДЧХИ РПДПВОЩИ ЙН РЕТЕНЕООЩИ, $LINES Й $COLUMNS . рТПЗТБННЩ curses ЙУРПМШЪХАФ ЪОБЮЕОЙС ЬФЙИ РЕТЕНЕООЩИ ПЛТХЦЕОЙС ДМС ПРТЕДЕМЕОЙС ТБЪНЕТБ ЬЛТБОБ. ч ЬФПК ЗМБЧЕ РТЙ УУЩМЛБИ ОБ РЕТЕНЕООЩЕ ПЛТХЦЕОЙС ЙУРПМШЪХЕФУС ЪОБЛ $, ЮФПВЩ ПФМЙЮЙФШ ЙИ ПФ РЕТЕНЕООЩИ, ПВЯСЧМСЕНЩИ Ч ЖБКМЕ . дПРПМОЙФЕМШОХА ЙОЖПТНБГЙА ПВ ЬФЙИ РЕТЕНЕООЩИ УН. ОЙЦЕ Ч ТБЪДЕМБИ рПДРТПЗТБННЩ initscr() , refresh() Й endwin() Й еЭЕ П УФТПЛБИ, УФПМВГБИ Й РПДРТПЗТБННЕ initscr() .

тБУУНПФТЙН ФЕРЕТШ НБЛТППРТЕДЕМЕОЙС. нОПЗЙЕ РПДРТПЗТБННЩ curses ПРТЕДЕМЕОЩ Ч ЛБЛ НБЛТПУЩ, ЛПФПТЩЕ ПВТБЭБАФУС Л ДТХЗЙН РПДРТПЗТБННБН Й НБЛТПУБН ЙЪ curses . оБРТЙНЕТ, refresh() СЧМСЕФУС НБЛТПУПН. пРТЕДЕМЕОЙЕ

РПЛБЪЩЧБЕФ, ЮФП ЧЩЪПЧ refresh ТБУЫЙТСЕФУС Ч ПВТБЭЕОЙЕ Л ФБЛЦЕ ЧИПДСЭЕК Ч curses РПДРТПЗТБННЕ wrefresh() . ьФБ РПУМЕДОСС, Ч УЧПА ПЮЕТЕДШ, ЧЩЪЩЧБЕФ ДЧЕ ДТХЗЙЕ РПДРТПЗТБННЩ curses : wnoutrefresh() Й doupdate() . нОПЗЙЕ РПДРТПЗТБННЩ ПВЕУРЕЮЙЧБАФ ОХЦОЩК ТЕЪХМШФБФ, ЗТХРРЙТХС ДЧБ-ФТЙ ПВТБЭЕОЙС Л ДТХЗЙН.

рТЕДПУФЕТЕЦЕОЙЕ нБЛТПТБУЫЙТЕОЙС curses НПЗХФ УПЪДБФШ РТПВМЕНЩ РТЙ ЙУРПМШЪПЧБОЙЙ ОЕЛПФПТЩИ ЛПОУФТХЛГЙК СЪЩЛБ C, ОБРТЙНЕТ, ++ ЙМЙ — .

пДОП РПУМЕДОЕЕ ЪБНЕЮБОЙЕ П : ПО БЧФПНБФЙЮЕУЛЙ ЧЛМАЮБЕФ , ЖБКМ ЙОФЕТЖЕКУБ У ДТБКЧЕТПН tty , . рПЧФПТОПЕ ЧЛМАЮЕОЙЕ Ч РТПЗТБННХ ЬФЙИ ЖБКМПЧ ВЕЪЧТЕДОП, ОП Й ВЕУУНЩУМЕООП.

2.1.2. рПДРТПЗТБННЩ initscr( ), refresh( ) Й endwin( )

рПДРТПЗТБННЩ initscr() , refresh() Й endwin() РТЙЧПДСФ ФЕТНЙОБМ Ч УПУФПСОЙЕ «ТБВПФБ У curses «, ПВОПЧМСАФ УПДЕТЦЙНПЕ ЬЛТБОБ Й ЧПУУФБОБЧМЙЧБАФ ФЕТНЙОБМ Ч УПУФПСОЙЙ «ЧОЕ curses » УППФЧЕФУФЧЕООП. дМС ХСУОЕОЙС ДЕКУФЧЙС ЛБЦДПК ЙЪ ЬФЙИ РПДРТПЗТБНН ЧПУРПМШЪХЕНУС ЕЭЕ ТБЪ ОБЫЙН РТПУФЩН РТЙНЕТПН.

Curses -РТПЗТБННБ ОБЮЙОБЕФУС ПВЩЮОП У ЧЩЪПЧБ initscr() ; ЬФП ДПУФБФПЮОП УДЕМБФШ ПДЙО ТБЪ. рПДРТПЗТБННБ initscr() ПРТЕДЕМСЕФ ФЙР ФЕТНЙОБМБ, ОБ ЛПФПТПН ЧЩРПМОСЕФУС РТПЗТБННБ, РП ЪОБЮЕОЙА РЕТЕНЕООПК ПЛТХЦЕОЙС $TERM , ЛБЛ ЬФП ПРЙУБОП Ч ТБЪДЕМЕ чЪБЙНПДЕКУФЧЙЕ curses Й terminfo . ъБФЕН РПДРТПЗТБННБ ЙОЙГЙБМЙЪЙТХЕФ ЧУЕ РЕТЕНЕООЩЕ Й УФТХЛФХТЩ ДБООЩИ, ПРЙУБООЩЕ Ч ЖБКМЕ . initscr() РТЙУЧБЙЧБЕФ РЕТЕНЕООЩН LINES Й COLS ЪОБЮЕОЙС, УППФЧЕФУФЧХАЭЙЕ ФЕТНЙОБМХ, ОБ ЛПФПТПН ЧЩРПМОСЕФУС РТПЗТБННБ. оБРТЙНЕТ, ЕУМЙ ЙУРПМШЪХЕФУС Teletype 5425, ПОБ РТЙУЧПЙФ ЪОБЮЕОЙЕ 24 РЕТЕНЕООПК LINES , Б ЪОБЮЕОЙЕ COLS УФБОЕФ ТБЧОЩН 80. еУМЙ ЧПЪОЙЛБЕФ ПЫЙВЛБ, РПДРТПЗТБННБ ЪБРЙУЩЧБЕФ УППВЭЕОЙЕ ПВ ЬФПН Ч stderr Й ЪБЧЕТЫБЕФ ТБВПФХ.

чЧПД/ЧЩЧПД РТЙ ЧЩРПМОЕОЙЙ РТПЗТБННЩ РТПЙЪЧПДЙФУС РПДРТПЗТБННБНЙ, РПДПВОЩНЙ ЙУРПМШЪХАЭЙНУС Ч РТЙНЕТЕ move() Й addstr() . оБРТЙНЕТ,

ФТЕВХЕФ РЕТЕНЕЭЕОЙС ЛХТУПТБ Ч ФПЮЛХ, ОБИПДСЭХАУС ОЕУЛПМШЛП МЕЧЕЕ ГЕОФТБ ЬЛТБОБ. ъБФЕН ФТЕВХЕФ ЧЩЧЕУФЙ ГЕРПЮЛХ УЙНЧПМПЧ Bulls . еУМЙ РТПЗТБННБ ЧЩРПМОСЕФУС ОБ ФЕТНЙОБМЕ Teletype 5425, ЬФБ ГЕРПЮЛБ ВХДЕФ ЧЩЧЕДЕОБ, ОБЮЙОБС У РПЪЙГЙЙ (11, 36).

чОЙНБОЙЕ! чУЕ РПДРТПЗТБННЩ curses , РЕТЕНЕЭБАЭЙЕ ЛХТУПТ, ПФУЮЙФЩЧБАФ ЕЗП ЛППТДЙОБФЩ ПФОПУЙФЕМШОП МЕЧПЗП ЧЕТИОЕЗП ХЗМБ ЬЛТБОБ. лППТДЙОБФЩ ( LINES , COLS ) ЬФПЗП ХЗМБ РТЙОЙНБАФУС ЪБ (0, 0), Б ОЕ ЪБ (1, 1). ъБНЕФШФЕ, ЮФП РЕТЧПК ЙДЕФ ЧЕТФЙЛБМШОБС ЛППТДЙОБФБ, Б ЪБФЕН ЗПТЙЪПОФБМШОБС, Ч ПФМЙЮЙЕ ПФ ПВЩЮОПК ЪБРЙУЙ ‘ x, y ‘ ДМС ЬЛТБООЩИ (ЙМЙ ЗТБЖЙЮЕУЛЙИ) ЛППТДЙОБФ. дМС РЕТЕНЕЭЕОЙС ЛХТУПТБ Ч УТЕДОАА УФТПЛХ ЬЛТБОБ Ч РТЙНЕТЕ РПСЧМСЕФУС -1, ЮФПВЩ ХЮЕУФШ ЛППТДЙОБФЩ (0, 0) ДМС ХЗМПЧПК РПЪЙГЙЙ.

рТЙ ЧЩЪПЧЕ РПДРТПЗТБНН ФЙРБ move() Й addstr() УПДЕТЦЙНПЕ ЖЙЪЙЮЕУЛПЗП ЬЛТБОБ ФЕТНЙОБМБ ОЕ НЕОСЕФУС. ьЛТБО ПВОПЧМСЕФУС ФПМШЛП РТЙ ЧЩЪПЧЕ refresh() . дП ФБЛПЗП ЧЩЪПЧБ ЙЪНЕОСЕФУС ФПМШЛП ЧОХФТЕООЕЕ РТЕДУФБЧМЕОЙЕ ЬЛТБОБ, ЛПФПТПЕ ОБЪЩЧБЕФУС ПЛОПН. ьФХ ЧЕУШНБ ЧБЦОХА ЛПОГЕРГЙА НЩ ПВУХДЙН ДБМЕЕ Ч ТБЪДЕМЕ еЭЕ ПВ ПЛОБИ Й РПДРТПЗТБННЕ refresh() .

ч ЪБЛМАЮЕОЙЕ ПФНЕФЙН, ЮФП РТПЗТБННБ, ТБВПФБАЭБС У curses , ЪБЛБОЮЙЧБЕФУС ЧЩЪПЧПН endwin() . ьФБ РПДРТПЗТБННБ ЧПУУФБОБЧМЙЧБЕФ РТЕЦОЕЕ УПУФПСОЙЕ ФЕТНЙОБМБ Й РПНЕЭБЕФ ЛХТУПТ Ч МЕЧЩК ОЙЦОЙК ХЗПМ ЬЛТБОБ.

2.2. лПНРЙМСГЙС РТПЗТБННЩ, ЛПФПТБС ЙУРПМШЪХЕФ curses

лПНРЙМЙТХКФЕ ФБЛХА РТПЗТБННХ, ЛБЛ ПВЩЮОХА РТПЗТБННХ ОБ СЪЩЛЕ C, ЛПНБОДПК cc (1) (УН. уРТБЧПЮОЙЛ РТПЗТБННЙУФБ), ЛПФПТБС ЧЩЪЩЧБЕФ ЛПНРЙМСФПТ СЪЩЛБ C.

рПДРТПЗТБННЩ ПВЩЮОП ИТБОСФУС Ч ВЙВМЙПФЕЛЕ /usr/lib/libcurses.a . юФПВЩ ТЕДБЛФПТ ЧОЕЫОЙИ УЧСЪЕК РТПУНБФТЙЧБМ ЬФХ ВЙВМЙПФЕЛХ, Ч ЛПНБОДЕ cc ОЕПВИПДЙНП ХЛБЪБФШ ПРГЙА -l .

пВЭЙК ЖПТНБФ ЛПНБОДОПК УФТПЛЙ ДМС ЛПНРЙМСГЙЙ РТПЗТБННЩ, ТБВПФБАЭЕК У curses , ФБЛПЧ:

жБКМ.c — ЬФП ЙНС ЖБКМБ У ЙУИПДОЩН ФЕЛУФПН РТПЗТБННЩ; ЖБКМ — ЙНС ЧЩРПМОЙНПЗП ПВЯЕЛФОПЗП ЖБКМБ.

2.3. чЩРПМОЕОЙЕ РТПЗТБННЩ, ЛПФПТБС ЙУРПМШЪХЕФ curses

ч РТПГЕУУЕ УЧПЕК ТБВПФЩ РПДРТПЗТБННЩ curses ПРЙТБАФУС ОБ ЙОЖПТНБГЙА ЙЪ ПЛТХЦЕОЙС РПМШЪПЧБФЕМС. ч ЮБУФОПУФЙ, РПМШЪПЧБФЕМА ФБЛПК РТПЗТБННЩ ПВЩЮОП ОХЦОП ЧЛМАЮЙФШ Ч УЧПК ЖБКМ .profile УМЕДХАЭЙЕ ФТЙ УФТПЛЙ:

уНЩУМ ЬФЙИ УФТПЛ ПВЯСУОСЕФУС Ч ТБЪДЕМЕ чЪБЙНПДЕКУФЧЙЕ curses Й terminfo . рПМШЪПЧБФЕМЙ curses -РТПЗТБННЩ НПЗХФ, ЛТПНЕ ФПЗП, ХУФБОПЧЙФШ Ч ЖБКМЕ .profile ЪОБЮЕОЙС РЕТЕНЕООЩИ ПЛТХЦЕОЙС $LINES , $COLUMNS Й $TERMINFO , ПДОБЛП, Ч ПФМЙЮЙЕ ПФ УМХЮБС У $TERM , ДЕМБФШ ЬФП ОЕ ПВСЪБФЕМШОП.

еУМЙ чБЫБ curses -РТПЗТБННБ ОЕ ТБВПФБЕФ ДПМЦОЩН ПВТБЪПН, чЩ, ЧПЪНПЦОП, РПРЩФБЕФЕУШ ЕЕ ПФМБДЙФШ У РПНПЭША sdb (1), ЛБЛ ЬФП ПРЙУЩЧБЕФУС Ч уРТБЧПЮОЙЛЕ РТПЗТБННЙУФБ. рПМШЪХСУШ sdb , ОХЦОП ХЮЙФЩЧБФШ ТСД ПВУФПСФЕМШУФЧ. чП-РЕТЧЩИ, curses -РТПЗТБННБ ЙОФЕТБЛФЙЧОБ Й ЛПОФТПМЙТХЕФ РПМПЦЕОЙЕ ЛХТУПТБ. пДОБЛП, ЙОФЕТБЛФЙЧОЩК ПФМБДЮЙЛ, РПДПВОЩК sdb , НПЦЕФ РТПЙЪЧЕУФЙ ОБ ЬЛТБОЕ ЙЪНЕОЕОЙС, П ЛПФПТЩИ ОЕ ВХДЕФ ЪОБФШ ПФМБЦЙЧБЕНБС РТПЗТБННБ.

чП-ЧФПТЩИ, РТПЗТБННБ, ТБВПФБАЭБС У curses , ЧЩЧПДЙФ Ч ПЛОП ДП ФЕИ РПТ, РПЛБ ОЕ ВХДЕФ ЧЩЪЧБОБ refresh() ЙМЙ РПДПВОБС ЕК РПДРТПЗТБННБ. ч УЧСЪЙ У ФБЛПК ЪБДЕТЦЛПК ЧЩЧПДБ ОБ ЬЛТБО, ПФМБДЛБ ЕЗП РТБЧЙМШОПУФЙ НПЦЕФ ВЩФШ ЪБФТХДОЕОБ.

ч-ФТЕФШЙИ, ЧП ЧИПДСЭЙИ Ч curses НБЛТПУБИ ОЕМШЪС ХУФБОПЧЙФШ ФПЮЛЙ РТЕТЩЧБОЙС. чНЕУФП НБЛТПУПЧ ОХЦОП ЙУРПМШЪПЧБФШ РПДРТПЗТБННЩ, Л ЛПФПТЩН ЬФЙ НБЛТПУЩ ПВТБЭБАФУС — ОБРТЙНЕТ, Л wrefresh() ЧНЕУФП refresh (), вПМЕЕ РПДТПВОХА ЙОЖПТНБГЙА П НБЛТПУБИ УН. ЧЩЫЕ Ч ТБЪДЕМЕ жБКМ .

2.4. еЭЕ П УФТПЛБИ, УФПМВГБИ Й РПДРТПЗТБННЕ initscr( )

2.5. еЭЕ ПВ ПЛОБИ Й РПДРТПЗТБННЕ refresh( )

лБЛ ХЛБЪЩЧБМПУШ ТБОЕЕ, РПДРТПЗТБННЩ curses ОЕ ПВОПЧМСАФ ЬЛТБО, РПЛБ ОЕ ВХДЕФ ЧЩЪЧБОБ refresh() . лПЗДБ refresh() ЧЩЪЩЧБЕФУС, ЧУЕ ДБООЩЕ, ОБЛПРМЕООЩЕ ДМС ЧЩЧПДБ, РЕТЕУЩМБАФУС ОБ ЬЛТБО ФЕЛХЭЕЗП ФЕТНЙОБМБ.

ьЖЖЕЛФ ЙУРПМШЪПЧБОЙС ПЛОБ ЧП НОПЗПН РПДПВЕО ЬЖЖЕЛФХ ЙУРПМШЪПЧБОЙС ВХЖЕТБ РТЙ ТБВПФЕ У ТЕДБЛФПТПН УЙУФЕНЩ UNIX. оБРТЙНЕТ, ЛПЗДБ чЩ ТЕДБЛФЙТХЕФЕ ЖБКМ РТЙ РПНПЭЙ vi (1), ЧУЕ ЙЪНЕОЕОЙС УПДЕТЦЙНПЗП ЖБКМБ ПФТБЦБАФУС Ч ВХЖЕТЕ, Б УБН ЖБКМ ЙЪНЕОСЕФУС ФПМШЛП РПУМЕ ЧЩДБЮЙ ЛПНБОД w ЙМЙ zz . бОБМПЗЙЮОП, ЛПЗДБ чЩ ЧЩЪЩЧБЕФЕ РТПЗТБННХ, ТБВПФБАЭХА У ЬЛТБОПН ЮЕТЕЪ РБЛЕФ curses , ЙЪНЕОСЕФУС УПДЕТЦЙНПЕ ПЛОБ, Б УБН ЬЛТБО ФЕТНЙОБМБ РЕТЕТЙУПЧЩЧБЕФУС ФПМШЛП РТЙ ЧЩЪПЧЕ refresh() . ч УПДЕТЦЙФУС ПРЙУБОЙЕ РТЙОСФПЗП РП ХНПМЮБОЙА ПЛОБ stdscr (УФБОДБТФОПЕ ПЛОП), ТБЪНЕТЩ ЛПФПТПЗП УПЧРБДБАФ У ТБЪНЕТБНЙ ЬЛТБОБ ФЕТНЙОБМБ. ч stdscr ЙНЕЕФ ФЙР WINDOW* , ХЛБЪБФЕМШ ОБ УФТХЛФХТХ СЪЩЛБ C, ЛПФПТХА РПМШЪПЧБФЕМШ НПЦЕФ РТЕДУФБЧМСФШ УЕВЕ Ч ЧЙДЕ ДЧХНЕТОПЗП НБУУЙЧБ УЙНЧПМПЧ, УППФЧЕФУФЧХАЭЕЗП ЬЛТБОХ ФЕТНЙОБМБ. рТПЗТБННБ ЧУЕЗДБ ПФУМЕЦЙЧБЕФ ЛБЛ УПУФПСОЙЕ stdscr , ФБЛ Й УПУФПСОЙЕ ЖЙЪЙЮЕУЛПЗП ЬЛТБОБ. refresh() , ЛПЗДБ ЧЩЪЩЧБЕФУС, УТБЧОЙЧБЕФ ЙИ Й РПУЩМБЕФ ОБ ФЕТНЙОБМ РПУМЕДПЧБФЕМШОПУФШ УЙНЧПМПЧ, РТЙЧПДСЭЙК ЕЗП ЬЛТБО Ч УППФЧЕФУФЧХАЭЙК УПДЕТЦЙНПНХ stdscr ЧЙД. рТЙ ЬФПН ЧЩВЙТБЕФУС ПДЙО ЙЪ НОПЗЙИ УРПУПВПЧ УДЕМБФШ ЬФП, У ХЮЕФПН ИБТБЛФЕТЙУФЙЛ ФЕТНЙОБМБ Й ЧПЪНПЦОПЗП УИПДУФЧБ ФПЗП, ЮФП ЕУФШ ОБ ЬЛТБОЕ Й ФПЗП, ЮФП УПДЕТЦЙФУС Ч ПЛОЕ. чЩИПДОПК РПФПЛ ПРФЙНЙЪЙТХЕФУС ФБЛЙН ПВТБЪПН, ЮФПВЩ ПО УПДЕТЦБМ ЛБЛ НПЦОП НЕОШЫЕ УЙНЧПМПЧ. оБ ТЙУХОЛЕ ОЙЦЕ РПЛБЪБОП, ЮФП РТПЙУИПДЙФ РТЙ ТБВПФЕ РТПЗТБННЩ, ЧЩЧПДСЭЕК BullsEye Ч ГЕОФТЕ ЬЛТБОБ (УН. ТБЪДЕМ юФП ФБЛПЕ curses ?). пВТБФЙФЕ ЧОЙНБОЙЕ, ЮФП, ЛБЛПК ВЩ НХУПТ ОЙ ВЩМ ОБ ЬЛТБОЕ, ПО ФБН Й ПУФБОЕФУС, РПЛБ ОЕ ВХДЕФ ЧЩЪЧБОБ refresh() . рТЙ ЬФПН ЧЩЪПЧЕ ЬЛТБО ПЮЙЭБЕФУС Й ЪБРПМОСЕФУС ФЕЛХЭЙН УПДЕТЦЙНЩН stdscr .

чНЕУФП stdscr чЩ НПЦЕФЕ УПЪДБЧБФШ Й ЙУРПМШЪПЧБФШ ДТХЗЙЕ ПЛОБ. пЛОБ РПМЕЪОЩ ДМС ПДОПЧТЕНЕООПЗП ЧЕДЕОЙС ОЕУЛПМШЛЙИ ПВТБЪПЧ ЬЛТБОБ. оБРТЙНЕТ, ЧП НОПЗЙИ РТЙМПЦЕОЙСИ ДМС ЧЧПДБ Й ЧЩЧПДБ ДБООЩИ ЙУРПМШЪХАФУС ДЧБ ПЛОБ: ПДОП ДМС ЧЧПДБ/ЧЩЧПДБ УПВУФЧЕООП ДБООЩИ, Б ДТХЗПЕ — ДМС ЧЩЧПДБ УППВЭЕОЙК ПВ ПЫЙВЛБИ, ЮФПВЩ ЬФЙ УППВЭЕОЙС ОЕ РПТФЙМЙ УПДЕТЦЙНПЕ ПУОПЧОПЗП ПЛОБ.

нПЦОП ТБЪДЕМЙФШ ЬЛТБО ОБ ВПМШЫПЕ ЛПМЙЮЕУФЧП ПЛПО, ПВОПЧМСС РП ЦЕМБОЙА ФП ЙМЙ ЙОПЕ ЙЪ ОЙИ. еУМЙ ПЛОБ РЕТЕЛТЩЧБАФУС, ОБ ЬЛТБО ЧЩЧПДЙФУС УПДЕТЦЙНПЕ ФПЗП ПЛОБ, ЛПФПТПЕ ПВОПЧМСМПУШ РПЪЦЕ. нПЦОП ФБЛЦЕ УПЪДБФШ ПДОП ПЛОП ЧОХФТЙ ДТХЗПЗП (РЕТЧПЕ НЩ ВХДЕН ЙОПЗДБ ОБЪЩЧБФШ РПДПЛОПН). дПРХУФЙН, ТБЪТБВБФЩЧБЕНПЕ чБНЙ РТЙМПЦЕОЙЕ ЙУРПМШЪХЕФ Ч ЛБЮЕУФЧЕ ЙОФЕТЖЕКУБ У РПМШЪПЧБФЕМЕН ЬЛТБООЩЕ ЖПТНЩ, ОБРТЙНЕТ, ДМС ЙЪПВТБЦЕОЙС ОБ ЬЛТБОЕ ТБУРЙУЛЙ. фПЗДБ НПЦОП ЙУРПМШЪПЧБФШ НЕОШЫЙЕ, ОБИПДСЭЙЕУС ЧОХФТЙ ПУОПЧОПЗП, ПЛОБ ДМС ХРТБЧМЕОЙС ДПУФХРПН Л ПФДЕМШОЩН РПМСН ФБЛПК ЖПТНЩ.

оЕЛПФПТЩЕ РПДРТПЗТБННЩ РБЛЕФБ curses РТЕДОБЪОБЮЕОЩ ДМС ТБВПФЩ У ПЛОБНЙ ПУПВПЗП ФЙРБ, ЛПФПТЩЕ НЩ ВХДЕН ОБЪЩЧБФШ УРЕГПЛОБНЙ. уРЕГПЛОП — ЬФП ФБЛПЕ ПЛОП, ТБЪНЕТ ЛПФПТПЗП ОЕ ПЗТБОЙЮЙЧБЕФУС ТБЪНЕТПН ЬЛТБОБ Й ЛПФПТПЕ ОЕ УЧСЪБОП У ЛБЛЙН-МЙВП ПРТЕДЕМЕООЩН НЕУФПН ОБ ЬЛТБОЕ. йИ НПЦОП РТЙНЕОСФШ, ЕУМЙ чБН ОХЦОЩ ПЮЕОШ ВПМШЫЙЕ ПЛОБ, ЙМЙ ЦЕ ФБЛЙЕ, ЛПФПТЩЕ ОХЦОП ПФПВТБЦБФШ ОБ ЬЛТБО ЮБУФСНЙ. уРЕГПЛОБ НПЗХФ, ОБРТЙНЕТ, РПОБДПВЙФШУС РТЙ ТБВПФЕ У ЬМЕЛФТПООЩНЙ ФБВМЙГБНЙ.

оЙЦЕ РПЛБЪБОЩ ЧЪБЙНПУЧСЪЙ НЕЦДХ ОЕУЛПМШЛЙНЙ ПЛОБНЙ, РПДПЛОБНЙ Й УРЕГПЛОБНЙ Й ЬЛТБОПН ФЕТНЙОБМБ.

ч ТБЪДЕМЕ тБВПФБ У ПЛОБНЙ ПРЙУЩЧБАФУС РПДРТПЗТБННЩ, ОЕПВИПДЙНЩЕ ДМС УПЪДБОЙС Й ЙУРПМШЪПЧБОЙС ПЛПО. еУМЙ чЩ ИПФЙФЕ УЕКЮБУ ХЧЙДЕФШ РТПЗТБННХ, ТБВПФБАЭХА У ПЛОБНЙ УТЕДУФЧБНЙ curses , УН. РТПЗТБННХ window Ч ТБЪДЕМЕ рТЙНЕТЩ РТПЗТБНН, ТБВПФБАЭЙИ У curses .

2.6. оЕУМПЦОЩК ЧЧПД/ЧЩЧПД

2.6.1. чЩЧПД

curses УПДЕТЦЙФ РПДРТПЗТБННЩ ДМС ЪБРЙУЙ Ч stdscr , РПИПЦЙЕ ОБ РПДРТПЗТБННЩ ЙЪ stdio (3S) ДМС ЪБРЙУЙ Ч ЖБКМ. пОЙ РПЪЧПМСАФ:

  • чЩЧПДЙФШ ПДЙОПЮОЩК УЙНЧПМ — addch() .
  • чЩЧПДЙФШ ГЕРПЮЛХ УЙНЧПМПЧ — addstr() .
  • жПТНБФЙТПЧБФШ УФТПЛХ ЙЪ ОЕУЛПМШЛЙИ ЧИПДОЩИ БТЗХНЕОФПЧ — printw() .
  • рЕТЕНЕЭБФШ ЛХТУПТ, ЧПЪНПЦОП, У ПДОПЧТЕНЕООЩН ЧЩЧПДПН УЙНЧПМБ (УЙНЧПМПЧ) — move() , mvaddch() , mvaddstr() , mvprintw() .
  • пЮЙУФЙФШ ЧЕУШ ЬЛТБО ЙМЙ ЕЗП ЮБУФШ — clear() , erase() , crltoeol() , clrtobot() .

дБМЕЕ УМЕДХАФ ПРЙУБОЙС Й РТЙНЕТЩ РТЙНЕОЕОЙС ЬФЙИ РПДРТПЗТБНН.

рТЕДПУФЕТЕЦЕОЙЕ вЙВМЙПФЕЛБ curses ТБУРПМБЗБЕФ УЧПЙН УПВУФЧЕООЩН ОБВПТПН РПДРТПЗТБНН ЧЧПДБ/ЧЩЧПДБ. еУМЙ чЩ ТБВПФБЕФЕ У curses , чБН ОЕ УМЕДХЕФ ЙУРПМШЪПЧБФШ ДМС ЧЧПДБ/ЧЩЧПДБ ДТХЗЙИ РПДРТПЗТБНН ЙМЙ ПВТБЭЕОЙК Л УЙУФЕНЕ, ОБРТЙНЕТ, read (2) ЙМЙ write (2); Ч РТПФЙЧОПН УМХЮБЕ РТЙ ЧЩРПМОЕОЙЙ РПДРТПЗТБННЩ НПЗХФ ЧПЪОЙЛОХФШ ОЕЦЕМБФЕМШОЩЕ ЬЖЖЕЛФЩ.

addch( )

уйофблуйу
прйубойе
addch() ЪБРЙУЩЧБЕФ ПДЙО УЙНЧПМ Ч stdscr .

ьФПФ УЙНЧПМ ЙНЕЕФ ФЙР chtype , ЛПФПТЩК ПРТЕДЕМСЕФУС Ч . chtype УПДЕТЦЙФ ДБООЩЕ Й БФТЙВХФЩ (ПВ БФТЙВХФБИ УН. ОЙЦЕ Ч ТБЪДЕМЕ бФТЙВХФЩ ЧЩЧПДБ).

тБВПФБС У РЕТЕНЕООЩНЙ ЬФПЗП ФЙРБ, ПВЯСЧМСКФЕ ЙИ РТЙОБДМЕЦБЭЙНЙ ЙНЕООП Л ФЙРХ chtype , Б ОЕ Л ФПНХ ПУОПЧОПНХ ФЙРХ (УЛБЦЕН, short ), ЮЕТЕЪ ЛПФПТЩК ПВЯСЧМСЕФУС chtype Ч . ьФП ПВЕУРЕЮЙФ УПЧНЕУФЙНПУФШ У ВХДХЭЙНЙ ЧЕТУЙСНЙ.

addch() РТПЙЪЧПДЙФ ОЕЛПФПТХА РЕТЕЛПДЙТПЧЛХ. фБЛ, ПОБ РТЕПВТБЪХЕФ:

  • УЙНЧПМ РЕТЕЧПДБ УФТПЛЙ Ч РПУМЕДПЧБФЕМШОПУФШ, ПВЕУРЕЮЙЧБАЭХА ПЮЙУФЛХ ДП ЛПОГБ УФТПЛЙ Й РЕТЕИПД Л ОПЧПК УФТПЛЕ; УЙНЧПМ ФБВХМСГЙЙ Ч УППФЧЕФУФЧХАЭЕЕ ЛПМЙЮЕУФЧП РТПВЕМПЧ;
  • ДТХЗЙЕ ХРТБЧМСАЭЙЕ УЙНЧПМЩ Ч ЙИ ЪБРЙУШ Ч ОПФБГЙЙ ^X .

addch() ПВЩЮОП ЧПЪЧТБЭБЕФ OK, ЪБ ЙУЛМАЮЕОЙЕН УМХЮБС ЧЩЧПДБ УЙНЧПМБ Ч РТБЧПН ОЙЦОЕН ХЗМХ ОЕТПММЙТХЕНПЗП ПЛОБ, ЛПЗДБ ЧПЪЧТБЭБЕФУС ERR .

addch() СЧМСЕФУС НБЛТПУПН.

ьФБ РТПЗТБННБ ЧЩЧПДЙФ УМЕДХАЭЕЕ:

уН. ФБЛЦЕ РТПЗТБННХ show Ч ТБЪДЕМЕ рТЙНЕТЩ РТПЗТБНН, ТБВПФБАЭЙИ У curses .

ртйнет

addstr( )

уйофблуйу
прйубойе
addstr() ЧЩЧПДЙФ ГЕРПЮЛХ УЙНЧПМПЧ Ч stdscr .

addstr() ЧЩЪЩЧБЕФ addch() ДМС ЧЩЧПДБ ЛБЦДПЗП УЙНЧПМБ.

addstr() РТПЙЪЧПДЙФ ФХ ЦЕ РЕТЕЛПДЙТПЧЛХ, ЮФП Й addch() .

addstr() ЧПЪЧТБЭБЕФ OK РТЙ ХУРЕЫОПН ЪБЧЕТЫЕОЙЙ Й ERR РТЙ ПЫЙВЛЕ.

addstr() СЧМСЕФУС НБЛТПУПН.

ртйнет
уН. РТЙНЕТЩ РТПЗТБНН ЧП чЧЕДЕОЙЙ.

printw( )

уйофблуйу
прйубойе
printw() ПУХЭЕУФЧМСЕФ ЖПТНБФЙТПЧБООЩК ЧЩЧПД Ч stdscr.

рПДПВОП printf (3S), printw() РПМХЮБЕФ ЖПТНБФ Й РЕТЕНЕООПЕ ЛПМЙЮЕУФЧП БТЗХНЕОФПЧ.

рПДПВОП addstr() , printw() ПВТБЭБЕФУС Л addch() ДМС ЧЩЧПДБ ЛБЦДПЗП УЙНЧПМБ.

printw() ЧПЪЧТБЭБЕФ OK РТЙ ХУРЕЫОПН ЪБЧЕТЫЕОЙЙ Й ERR РТЙ ПЫЙВЛЕ.

ьФБ РТПЗТБННБ ЧЩЧПДЙФ УМЕДХАЭЕЕ:

move( )

ртйнет
уйофблуйу
прйубойе
move() ХУФБОБЧМЙЧБЕФ ЛХТУПТ Ч РПЪЙГЙА «УФТПЛБ y , ЛПМПОЛБ x » ПЛОБ stdscr .

пВТБФЙФЕ ЧОЙНБОЙЕ, ЮФП РЕТЧЩН БТЗХНЕОФПН move() СЧМСЕФУС ЛППТДЙОБФБ y , Б ЧФПТЩН — x . лППТДЙОБФЩ МЕЧПЗП ЧЕТИОЕЗП ХЗМБ stdscr ТБЧОЩ (0, 0), Б РТБЧПЗП ОЙЦОЕЗП — ( LINES -1, COLS -1). рПДТПВОЕЕ УН. Ч ТБЪДЕМЕ рПДРТПЗТБННЩ initscr() , refresh() Й endwin() .

рЕТЕНЕЭЕОЙЕ ЛХТУПТБ НПЦОП РТПЙЪЧПДЙФШ ПДОПЧТЕНЕООП У ЧЩЧПДПН ДБООЩИ, Б ЙНЕООП:

  • mvaddch (y, x, ch) РЕТЕНЕЭБЕФ ЛХТУПТ Й ЧЩЧПДЙФ УЙНЧПМ;
  • mvaddstr (y, x, str) РЕТЕНЕЭБЕФ ЛХТУПТ Й ЧЩЧПДЙФ ГЕРПЮЛХ УЙНЧПМПЧ;
  • mvprintw (y, x, fmt[,arg. ]) РЕТЕНЕЭБЕФ ЛХТУПТ Й ЧЩЧПДЙФ ЖПТНБФЙТПЧБООХА УФТПЛХ.

move() ЧПЪЧТБЭБЕФ OK РТЙ ОПТНБМШОПН ЪБЧЕТЫЕОЙЙ Й ERR РТЙ ПЫЙВЛЕ. л ПЫЙВЛЕ РТЙЧПДЙФ РПРЩФЛБ УДЧЙОХФШ ЛХТУПТ Ч РПЪЙГЙА, ОЕ ОБИПДСЭХАУС НЕЦДХ (0, 0) Й ( LINES -1, COLS -1).

move() СЧМСЕФУС НБЛТПУПН.

ьФБ РТПЗТБННБ ЧЩЧПДЙФ УМЕДХАЭЕЕ:

рПУМЕ ОБЦБФЙС ЧПЪЧТБФБ ЛБТЕФЛЙ ЬЛТБО ВХДЕФ ЧЩЗМСДЕФШ ФБЛ:

дТХЗПК РТЙНЕТ ЙУРПМШЪПЧБОЙС move() НПЦОП ОБКФЙ Ч РТПЗТБННЕ scatter Ч ТБЪДЕМЕ рТЙНЕТЩ РТПЗТБНН, ТБВПФБАЭЙИ У curses .

ртйнет

clear( ), erase( )

уйофблуйу
прйубойе
пВЕ РПДРТПЗТБННЩ ЪБРПМОСАФ ЧУЕ ПЛОП stdscr РТПВЕМБНЙ.

clear() ДПРХУЛБЕФ ОБМЙЮЙЕ ОБ ЬЛТБОЕ НХУПТБ, П ЛПФПТПН ПОБ ОЕ ЪОБЕФ; ЬФБ РПДРТПЗТБННБ ЧЩЪЩЧБЕФ УОБЮБМБ erase() , Б ЪБФЕН clearok() , ЮФП РТЙЧПДЙФ Л РПМОПК ПЮЙУФЛЕ ЖЙЪЙЮЕУЛПЗП ЬЛТБОБ РТЙ УМЕДХАЭЕН ЧЩЪПЧЕ refresh() ДМС stdscr . рПДТПВОЕЕ П clearok() УН. curses (3X).

initscr() БЧФПНБФЙЮЕУЛЙ ЧЩЪЩЧБЕФ clear() .

clear() ЧУЕЗДБ ЧПЪЧТБЭБЕФ OK , erase() ОЕ ЧПЪЧТБЭБЕФ ОЙЮЕЗП РПМЕЪОПЗП.

й clear() , Й erase() СЧМСАФУС НБЛТПУБНЙ.

clrtoeol( ), clrtobot( )

уйофблуйу
прйубойе
clrtoeol() ЪБНЕОСЕФ ПУФБФПЛ УФТПЛЙ РТПВЕМБНЙ.

clrtobot() ЪБНЕОСЕФ ПУФБФПЛ ЬЛТБОБ РТПВЕМБНЙ.

пВЕ РПДРТПЗТБННЩ ЧЩРПМОСАФ УЧПЙ ДЕКУФЧЙС У РПЪЙГЙЙ, Ч ЛПФПТПК ОБИПДЙФУС ЛХТУПТ (ЧЛМАЮЙФЕМШОП).

оЙ ПДОБ ЙЪ РПДРТПЗТБНН ОЕ ЧПЪЧТБЭБЕФ ОЙЮЕЗП РПМЕЪОПЗП.

ртйнет
рТЙЧЕДЕН ФЕЛУФ РТПЗТБННЩ, ЙУРПМШЪХАЭЕК clrtobot() .


ьФБ РТПЗТБННБ ЧЩЧПДЙФ УМЕДХАЭЕЕ:

пВТБФЙФЕ ЧОЙНБОЙЕ ОБ ДЧБ ЧЩЪПЧБ refresh() — РЕТЧЩК ЧЩЧПДЙФ ЬФПФ ФЕЛУФ ОБ ЬЛТБО, ЧФПТПК ПЮЙЭБЕФ ЬЛТБО У ПФНЕЮЕООПЗП ЛХТУПТПН НЕУФБ ДП ЛПОГБ.

рПУМЕ ОБЦБФЙС ЧПЪЧТБФБ ЛБТЕФЛЙ ЬЛТБО ВХДЕФ ЧЩЗМСДЕФШ ФБЛ:

рТЙНЕТЩ ЙУРПМШЪПЧБОЙС clrtoeol() УН. Ч РТПЗТБННБИ show Й two Ч ТБЪДЕМЕ рТЙНЕТЩ РТПЗТБНН, ТБВПФБАЭЙИ У curses .

2.6.2. чЧПД

рПДРТПЗТБННЩ curses , РТЕДОБЪОБЮЕООЩЕ ДМС ЮФЕОЙС У ФЕЛХЭЕЗП ФЕТНЙОБМБ, РПДПВОЩ ФЕН, ЛПФПТЩЕ УПДЕТЦБФУС Ч stdio (3S) Й ЮЙФБАФ ЙЪ ЖБКМБ. пОЙ РПЪЧПМСАФ:

  • юЙФБФШ УЙНЧПМЩ РП ПДОПНХ: getch() .
  • юЙФБФШ УФТПЛХ, ЪБЛБОЮЙЧБАЭХАУС УЙНЧПМПН РЕТЕЧПДБ УФТПЛЙ: getstr() .
  • уЛБОЙТПЧБФШ ЧЧПДЙНЩЕ УЙНЧПМЩ, ЙЪЧМЕЛБС ЪОБЮЕОЙС Й РТЙУЧБЙЧБС ЙИ РЕТЕНЕООЩН ЙЪ УРЙУЛБ БТЗХНЕОФПЧ: scanw() .

рЕТЧЙЮОПК РПДРТПЗТБННПК СЧМСЕФУС getch() , ЛПФПТБС ПВТБВБФЩЧБЕФ Й ЧПЪЧТБЭБЕФ ЪОБЮЕОЙЕ ПДОПЗП ЧЧЕДЕООПЗП УЙНЧПМБ. пОБ РПДПВОБ РПДРТПЗТБННЕ getchar (3S) ЙЪ ВЙВМЙПФЕЛЙ СЪЩЛБ C, ЪБ ЙУЛМАЮЕОЙЕН ФПЗП, ЮФП ПОБ НПЦЕФ РТПЙЪЧПДЙФШ ОЕЛПФПТЩЕ ЪБЧЙУСЭЙЕ ПФ УЙУФЕНЩ ЙМЙ ФЕТНЙОБМБ ДЕКУФЧЙС, ЛПФПТЩЕ ОЕ ЧЩРПМОСЕФ getchar() . оБРТЙНЕТ, getch() НПЦОП ЙУРПМШЪПЧБФШ УПЧНЕУФОП У РПДРТПЗТБННПК keypad() ЙЪ ВЙВМЙПФЕЛЙ curses . ьФП РПЪЧПМСЕФ РТПЗТБННЕ ТБУРПЪОБЧБФШ Й ПВТБВБФЩЧБФШ, ЛБЛ ПДЙО УЙНЧПМ, РПУМЕДПЧБФЕМШОПУФЙ, ОБЮЙОБАЭЙЕУС У ESC, ЛПФПТЩЕ РЕТЕДБАФУС, ОБРТЙНЕТ, РТЙ ОБЦБФЙЙ ЛМБЧЙЫ ХРТБЧМЕОЙС ЛХТУПТПН ЙМЙ ЖХОЛГЙПОБМШОЩИ ЛМБЧЙЫ. дПРПМОЙФЕМШОХА ЙОЖПТНБГЙА П keypad() УН. Ч ПРЙУБОЙСИ getch() Й keypad() Ч curses (3X).

оЙЦЕ ПРЙУЩЧБАФУС ПУОПЧОЩЕ РПДРТПЗТБННЩ ДМС ЧЧПДБ У ФЕТНЙОБМБ Й ДБАФУС РТЙНЕТЩ ЙИ ЙУРПМШЪПЧБОЙС.

getch( )

уйофблуйу
прйубойе
getch() ЮЙФБЕФ ПДЙО УЙНЧПМ У ФЕЛХЭЕЗП ФЕТНЙОБМБ.

getch() ЧПЪЧТБЭБЕФ ЪОБЮЕОЙЕ ЬФПЗП УЙНЧПМБ ЙМЙ ERR РТЙ ЧПЪОЙЛОПЧЕОЙЙ УЙФХБГЙЙ «ЛПОЕГ ЖБКМБ», РПМХЮЕОЙЙ УЙЗОБМБ, ЙМЙ РТЙ ЮФЕОЙЙ ВЕЪ ПЦЙДБОЙС, ЕУМЙ УЙНЧПМ ЕЭЕ ОЕ ЧЧЕДЕО.

getch() СЧМСЕФУС НБЛТПУПН.

уН. ДБМЕЕ, Б ФБЛЦЕ Ч curses (3X) ПРЙУБОЙС echo() , noecho() , cbreak() , nocbreak() , raw() , noraw() , halfdelay() , nodelay() Й keypad() .

рПУНПФТЙН, ЮФП ЧЩЧПДЙФ ЬФБ РТПЗТБННБ. рЕТЧЩК refresh() ЧЩЧПДЙФ ГЕРПЮЛХ УЙНЧПМПЧ, ХЛБЪБООХА Ч addstr() , ЙЪ stdscr ОБ ЬЛТБО ФЕТНЙОБМБ:

рХУФШ ОБ ЛМБЧЙБФХТЕ ОБЦБМЙ w . getch() РТЙОЙНБЕФ УЙНЧПМ Й ЕЗП ЪОБЮЕОЙЕ РТЙУЧБЙЧБЕФУС ch . оБЛПОЕГ, ЧФПТПК ТБЪ ЧЩЪЩЧБЕФУС refresh() Й ЬЛТБО УФБОПЧЙФУС ФБЛЙН:

дТХЗПК РТЙНЕТ ЙУРПМШЪПЧБОЙС getch() УН. Ч РТПЗТБННЕ show Ч ТБЪДЕМЕ рТЙНЕТЩ РТПЗТБНН, ТБВПФБАЭЙИ У curses .

ртйнет

getstr( )

уйофблуйу
прйубойе
getstr() ЮЙФБЕФ УЙНЧПМЩ Й УПИТБОСЕФ ЙИ Ч ВХЖЕТЕ ДП ФЕИ РПТ, РПЛБ ОЕ ВХДЕФ ОБЦБФ ЧПЪЧТБФ ЛБТЕФЛЙ, РЕТЕЧПД УФТПЛЙ ЙМЙ ЛМБЧЙЫБ ЧЧПДБ.

getstr() ОЕ РТПЧЕТСЕФ ВХЖЕТ ОБ РЕТЕРПМОЕОЙЕ.

рТПЮЙФБООЩЕ УЙНЧПМЩ РЕТЕУЩМБАФУС Ч ГЕРПЮЛХ str .

getstr() СЧМСЕФУС НБЛТПУПН Й ЧЩЪЩЧБЕФ getch() ДМС ЮФЕОЙС ЛБЦДПЗП УЙНЧПМБ.

getstr() ЧПЪЧТБЭБЕФ ERR ФПМШЛП ФПЗДБ, ЛПЗДБ getch() ЧПЪЧТБЭБЕФ ERR . ч ПУФБМШОЩИ УМХЮБСИ ЧПЪЧТБЭБЕФУС OK .

уН. ДБМЕЕ, Б ФБЛЦЕ Ч curses (3X) ПРЙУБОЙС echo() , noecho() , cbreak() , nocbreak() , raw() , noraw() , halfdelay() , nodelay() Й keypad() .

дПРХУФЙН, чЩ ЧЧЕМЙ УФТПЛХ » нОЕ ОТБЧЙФУС ЙЪХЮБФШ УЙУФЕНХ UNIX «. рПУМЕ ОБЦБФЙС ЧПЪЧТБФБ ЛБТЕФЛЙ ЬЛТБО ВХДЕФ ЧЩЗМСДЕФШ ФБЛ:

scanw( )

ртйнет
уйофблуйу
прйубойе
scanw() ЧЩЪЩЧБЕФ getstr() Й УЛБОЙТХЕФ ЧЧЕДЕООХА УФТПЛХ.

рПДПВОП scanf (3S), scanw() ЙУРПМШЪХЕФ ЖПТНБФ ДМС РТЕПВТБЪПЧБОЙС ЧЧЕДЕООПК УФТПЛЙ Й РТЙУЧБЙЧБЕФ ЪОБЮЕОЙС РЕТЕНЕООПНХ ЛПМЙЮЕУФЧХ БТЗХНЕОФПЧ.

scanw() ЧПЪЧТБЭБЕФ ФЕ ЦЕ ЪОБЮЕОЙС, ЮФП Й scanf() .

дПРПМОЙФЕМШОХА ЙОЖПТНБГЙА УН. Ч ПРЙУБОЙЙ scanf (3S).

пВТБФЙФЕ ЧОЙНБОЙЕ ОБ ДЧБ ЧЩЪПЧБ refresh() . рПУМЕ РЕТЧПЗП ЧЩЪПЧБ ОБ ЬЛТБОЕ РПСЧМСЕФУС УФТПЛБ, РЕТЕДБООБС addstr() , РПУМЕ ЧФПТПЗП — УФТПЛБ, ЛПФПТХА ЧПЪЧТБЭБЕФ scanw() . лТПНЕ ФПЗП, ПВТБФЙФЕ ЧОЙНБОЙЕ ОБ ЧЩЪПЧ clear() . дПРХУФЙН, чЩ ЧЧЕМЙ УФТПЛХ 2,twin . рПУМЕ ЧЩРПМОЕОЙС РТПЗТБННЩ ЬЛТБО ФЕТНЙОБМБ ВХДЕФ ЧЩЗМСДЕФШ ФБЛ:

2.7. хРТБЧМЕОЙЕ ЧЧПДПН/ЧЩЧПДПН

2.7.1. бФТЙВХФЩ ЧЩЧПДБ

тБУУЛБЪЩЧБС ПВ addch() , НЩ ХРПНСОХМЙ, ЮФП ЬФБ РПДРТПЗТБННБ ЧЩЧПДЙФ Ч stdscr ПДЙО ЪОБЛ ФЙРБ chtype . chtype УПУФПЙФ ЙЪ ДЧХИ ЮБУФЕК: ЙОЖПТНБГЙЙ П УБНПН УЙНЧПМЕ Й ЙОЖПТНБГЙЙ П ОБВПТЕ БФТЙВХФПЧ, УЧСЪБООЩИ У ЬФЙН УЙНЧПМПН. ьФЙ БФТЙВХФЩ РПЪЧПМСАФ ПФПВТБЦБФШ УЙНЧПМ У РПЧЩЫЕООПК СТЛПУФША, РПДЮЕТЛОХФЩН, ЙОЧЕТФЙТПЧБООЩН Й Ф.Д.

у stdscr ЧУЕЗДБ УЧСЪБО ОБВПТ БФТЙВХФПЧ, ЛПФПТЩЕ БЧФПНБФЙЮЕУЛЙ РТЙУЧБЙЧБАФУС ЛБЦДПНХ ЧЩЧПДЙНПНХ УЙНЧПМХ. чЩ НПЦЕФЕ ЙЪНЕОЙФШ ФЕЛХЭЙЕ ЪОБЮЕОЙС БФТЙВХФПЧ, ЙУРПМШЪХС attrset() ЙМЙ ДТХЗЙЕ РПДРТПЗТБННЩ РБЛЕФБ curses , ЛПФПТЩЕ ПРЙУБОЩ ОЙЦЕ. рТЙЧЕДЕН ЪДЕУШ УРЙУПЛ БФТЙВХФПЧ Й ЙИ ПРЙУБОЙС:

  • A_BLINK — НЕТГБОЙЕ.
  • A_BOLD — РПЧЩЫЕООБС СТЛПУФШ ЙМЙ ЦЙТОЩК ЫТЙЖФ.
  • A_DIM — РПОЙЦЕООБС СТЛПУФШ.
  • A_REVERSE — ЙОЧЕТФЙТПЧБООПЕ ПФПВТБЦЕОЙЕ.
  • A_STANDOUT — ЛБЛ НПЦОП ЪБНЕФОЕЕ, ОБУЛПМШЛП ЬФП ЧПЪНПЦОП ОБ ДБООПН ФЕТНЙОБМЕ.
  • A_UNDERLINE — РПДЮЕТЛЙЧБОЙЕ.
  • A_ALTCHARSET — БМШФЕТОБФЙЧОБС ЛПДЙТПЧЛБ (УН. ТБЪДЕМ мЙОЙЙ ОБ ЬЛТБОЕ Й РТПЮБС ЗТБЖЙЛБ).

ьФЙ БФТЙВХФЩ НПЦОП РЕТЕДБЧБФШ Ч ЛБЮЕУФЧЕ БТЗХНЕОФБ РПДРТПЗТБННЕ attrset() ЙМЙ ЕК РПДПВОЩН. йН НПЦОП РЕТЕДБЧБФШ ЛПНВЙОБГЙЙ БФТЙВХФПЧ, ПВЯЕДЙОЕООЩЕ ПРЕТБГЙЕК ДЙЪЯАОЛГЙЙ ( | ).

рТЙНЕЮБОЙЕ оЕ ЛБЦДЩК ФЕТНЙОБМ НПЦЕФ ПФПВТБЦБФШ МАВПК ЙЪ РЕТЕЮЙУМЕООЩИ БФТЙВХФПЧ. еУМЙ ФЕТНЙОБМ ОЕ НПЦЕФ ТЕБМЙЪПЧБФШ ЪБРТПЫЕООЩК БФТЙВХФ, curses РЩФБЕФУС ЪБНЕОЙФШ ЕЗП РПИПЦЙН, Б ЕУМЙ Й ЬФП ОЕЧПЪНПЦОП, ФП БФТЙВХФ ЙЗОПТЙТХЕФУС.

тБУУНПФТЙН ЙУРПМШЪПЧБОЙЕ ПДОПЗП ЙЪ ЬФЙИ БФТЙВХФПЧ. уМЕДХАЭЙК ЖТБЗНЕОФ РТПЗТБННЩ ПВЕУРЕЮЙЧБЕФ ПФПВТБЦЕОЙЕ УМПЧБ У РПЧЩЫЕООПК СТЛПУФША:

бФТЙВХФЩ НПЦОП ЧЛМАЮБФШ РП ПДОПНХ, ЛБЛ Ч РТЙНЕТЕ: attrset (A_BOLD) , ЙМЙ Ч ЛПНВЙОБГЙЙ. оБРТЙНЕТ, ЮФПВЩ ЧЩЧЕУФЙ СТЛЙК НЕТГБАЭЙК ФЕЛУФ, чЩ НПЦЕФЕ ЙУРПМШЪПЧБФШ attrset (A_BOLD | A_BLINK) . фЕ ЙМЙ ЙОЩЕ БФТЙВХФЩ ЧЛМАЮБАФУС Й ЧЩЛМАЮБАФУС РПДРТПЗТБННБНЙ attron() Й attroff() ВЕЪ ЛБЛПЗП-МЙВП ЧМЙСОЙС ОБ ПУФБМШОЩЕ БФТЙВХФЩ ПФПВТБЦЕОЙС. attrset (0) ПФЛМАЮБЕФ ЧУЕ БФТЙВХФЩ.

ъБНЕФШФЕ, ЮФП Ч ОБВПТ БФТЙВХФПЧ ЧИПДЙФ A_STANDOUT , ЛПФПТЩК НПЦОП РТЙНЕОСФШ ДМС РТЙЧМЕЮЕОЙС ЧОЙНБОЙС РПМШЪПЧБФЕМС. дМС ЖЙЪЙЮЕУЛПК ТЕБМЙЪБГЙЙ ЬФПЗП БФТЙВХФБ ЙУРПМШЪХЕФУС ОБЙВПМЕЕ ЧЙЪХБМШОП ЧЩТБЪЙФЕМШОЩК УРПУПВ ПФПВТБЦЕОЙС, ЧПЪНПЦОЩК ОБ ДБООПН ФЕТНЙОБМЕ. пВЩЮОП ЬФП РПЧЩЫЕООБС СТЛПУФШ ЙМЙ ЙОЧЕТУЙС. еУМЙ ОХЦОП РТПУФП ЧЩДЕМЙФШ ЮБУФШ ФЕЛУФБ, ЧУЕ ТБЧОП, РПДУЧЕФЛПК, ЙОЧЕТУЙЕК ЙМЙ ЛБЛ-МЙВП ЕЭЕ, МХЮЫЕ ЙУРПМШЪПЧБФШ A_STANDOUT . дМС ЕЗП ЧЛМАЮЕОЙС Й ЧЩЛМАЮЕОЙС ХДПВОЩ ЖХОЛГЙЙ standout() Й standend() УППФЧЕФУФЧЕООП. жБЛФЙЮЕУЛЙ, standend() ПФЛМАЮБЕФ ЧУЕ БФТЙВХФЩ. лТПНЕ РЕТЕЮЙУМЕООЩИ БФТЙВХФПЧ, ЙНЕЕФУС ЕЭЕ ДЧЕ ВЙФПЧЩЕ НБУЛЙ, Б ЙНЕООП A_CHARTEXT Й A_ATTRIBUTES . йИ НПЦОП ЙУРПМШЪПЧБФШ ДМС ЙЪЧМЕЮЕОЙС ФПМШЛП УЙНЧПМБ ЙМЙ ФПМШЛП БФТЙВХФПЧ ЙЪ ЪОБЮЕОЙС, ЧПЪЧТБЭБЕНПЗП ЧИПДСЭЕК Ч curses ЖХОЛГЙЕК inch() , РХФЕН ЙИ ЛПОЯАОЛГЙЙ (ПРЕТБГЙС & СЪЩЛБ C) У ЬФЙН ЪОБЮЕОЙЕН. уН. ПРЙУБОЙЕ inch() Ч curses (3X).

рТЙЧЕДЕН ПРЙУБОЙЕ attrset() Й ДТХЗЙИ РПДРТПЗТБНН curses , ЛПФПТЩЕ ЙУРПМШЪХАФУС ДМС ХРТБЧМЕОЙС БФТЙВХФБНЙ ЧЩЧПДБ.

attron( ), attroff( ), attrset( )

ртйнет
уйофблуйу
прйубойе
attron() ЧЛМАЮБЕФ ЪБРТПЫЕООЩЕ БФТЙВХФЩ attrs , УПИТБОСС ФЕ, ЛПФПТЩЕ ХЦЕ ЧЛМАЮЕОЩ. attrs РТЙОБДМЕЦЙФ Л ФЙРХ chtype , ПРТЕДЕМСЕНПНХ ЧП ЧЛМАЮБЕНПН ЖБКМЕ .

attrset() ЧЛМАЮБЕФ ЪБРТПЫЕООЩЕ БФТЙВХФЩ attrs ЧНЕУФП ФЕИ, ЛПФПТЩЕ ЧЛМАЮЕОЩ Ч НПНЕОФ ПВТБЭЕОЙС Л ОЕК.

attroff() ЧЩЛМАЮБЕФ ЪБРТПЫЕООЩЕ БФТЙВХФЩ attrs , ЕУМЙ ПОЙ ЧЛМАЮЕОЩ.

бФТЙВХФЩ НПЗХФ ПВЯЕДЙОСФУС РТЙ РПНПЭЙ РПВЙФОПК ПРЕТБГЙЙ ймй ( | ).

чУЕ РПДРТПЗТБННЩ ЧПЪЧТБЭБАФ OK .

ртйнет
уН. РТПЗТБННХ highlight Ч ТБЪДЕМЕ рТЙНЕТЩ РТПЗТБНН, ТБВПФБАЭЙИ У curses .

standout( ), standend( )

уйофблуйу
прйубойе
standout() ЧЛМАЮБЕФ БФТЙВХФ A_STANDOUT Й ЬЛЧЙЧБМЕОФЕО ЧЩЪПЧХ attron (A_STANDOUT) .

standend() ЧЩЛМАЮБЕФ ЧУЕ БФТЙВХФЩ Й ЬЛЧЙЧБМЕОФЕО ЧЩЪПЧХ attrset (0) .

пВЕ РПДРТПЗТБННЩ ЧУЕЗДБ ЧПЪЧТБЭБАФ OK .

ртйнет
уН. РТПЗТБННХ highlight Ч ТБЪДЕМЕ рТЙНЕТЩ РТПЗТБНН, ТБВПФБАЭЙИ У curses .

2.7.2. ъЧПОЛЙ, УЧЙУФ, ЧУРЩЫЛЙ

йОПЗДБ ВЩЧБЕФ ОХЦОП РТЙЧМЕЮШ ЧОЙНБОЙЕ РПМШЪПЧБФЕМС. дМС ЬФПЗП Ч РБЛЕФ curses ЧЛМАЮЕОЩ ДЧЕ РПДРТПЗТБННЩ, ЛПФПТЩЕ НПЗХФ ЪБУФБЧЙФШ ФЕТНЙОБМ ЪЧЕОЕФШ, Б ЕЗП ЬЛТБО — ЧУРЩИЙЧБФШ.

flash() ЪБУФБЧМСЕФ ЬЛТБО ФЕТНЙОБМБ ЧУРЩИОХФШ, ЕУМЙ ЬФП ЧПЪНПЦОП, ЕУМЙ ЦЕ ОЕФ — ЧЛМАЮБЕФ ЪЧХЛПЧПК УЙЗОБМ. чУРЩЫЛБ СЧМСЕФУС БМШФЕТОБФЙЧПК ЪЧХЛПЧПНХ УЙЗОБМХ Й ПУПВЕООП РПМЕЪОБ, ЛПЗДБ ЪЧХЛ НЕЫБЕФ ЛПНХ-МЙВП, УЙДСЭЕНХ ОЕРПДБМЕЛХ ПФ ФЕТНЙОБМБ. рПДРТПЗТБННБ beep() ЧЩЪЩЧБЕФУС, ЛПЗДБ ОХЦОП РПДБФШ ЪЧХЛПЧПК УЙЗОБМ (ЕУМЙ ЬФП РПЮЕНХ-МЙВП ОЕЧПЪНПЦОП ОБ ДБООПН ФЕТНЙОБМЕ, beep() РЩФБЕФУС РТПЙЪЧЕУФЙ ЧУРЩЫЛХ).

beep( ), flash( )

уйофблуйу
прйубойе
flash() РЩФБЕФУС ЪБУФБЧЙФШ ЧУРЩИОХФШ ЬЛТБО ФЕТНЙОБМБ. еУМЙ ЬФП ОЕЧПЪНПЦОП, flash() РЩФБЕФУС ЧЛМАЮЙФШ ОБ ФЕТНЙОБМЕ ЪЧХЛПЧПК УЙЗОБМ.

beep() РЩФБЕФУС ЧЛМАЮЙФШ ОБ ФЕТНЙОБМЕ ЪЧХЛПЧПК УЙЗОБМ. еУМЙ ЬФП ОЕЧПЪНПЦОП, beep() РЩФБЕФУС ЪБУФБЧЙФШ ЧУРЩИОХФШ ЬЛТБО ФЕТНЙОБМБ.

оЙ ПДОБ ЙЪ РПДРТПЗТБНН ОЕ ЧПЪЧТБЭБЕФ ЛБЛПЗП-МЙВП ПУНЩУМЕООПЗП ЪОБЮЕОЙС.

2.7.3. пРГЙЙ ЧЧПДБ

уЙУФЕНБ UNIX РТПЙЪЧПДЙФ НОПЦЕУФЧП ДЕКУФЧЙК У УЙНЧПМБНЙ, ЧЧПДЙНЩНЙ РПМШЪПЧБФЕМЕН. уТЕДЙ РТПЮЕЗП, УЙУФЕНБ ЧЩРПМОСЕФ УМЕДХАЭЕЕ:

  • пФПВТБЦБЕФ ЧЧПДЙНЩЕ УЙНЧПМЩ ОБ ЬЛТБОЕ ФЕТНЙОБМБ (ФБЛПЕ ПФПВТБЦЕОЙЕ НЩ ВХДЕН ОБЪЩЧБФШ ЬИПН).
  • пВТБВБФЩЧБЕФ УЙНЧПМЩ ЪБВПС ( ERASE , ПВЩЮОП # ) Й ХОЙЮФПЦЕОЙС ( KILL , ПВЩЮОП @ ).
  • йОФЕТРТЕФЙТХЕФ CTRL+D ЛБЛ ЛПОЕГ ЖБКМБ ( EOF ).
  • пВТБВБФЩЧБЕФ УЙНЧПМЩ РТЕТЩЧБОЙС ( INTR ) Й ЧЩИПДБ ( QUIT ).
  • уВТБУЩЧБЕФ ВЙФ ЮЕФОПУФЙ УЙНЧПМБ.
  • рТЕПВТБЪХЕФ ЧПЪЧТБФ ЛБТЕФЛЙ Ч РЕТЕЧПД УФТПЛЙ.

Curses РПМОПУФША ВЕТЕФ ОБ УЕВС ХРТБЧМЕОЙЕ ЬЛТБОПН ФЕТНЙОБМБ, РПЬФПНХ ЕЗП РПДРТПЗТБННЩ ПФЛМАЮБАФ ЬИП, РТПЙЪЧПДЙНПЕ УЙУФЕНПК UNIX, Й ДЕМБАФ ЕЗП УБНПУФПСФЕМШОП. чТЕНЕОБНЙ ВЩЧБЕФ ОЕПВИПДЙНП РТПЗТБННОП ПФЛМАЮБФШ УФБОДБТФОХА ДМС УЙУФЕНЩ UNIX ПВТБВПФЛХ УЙНЧПМПЧ. дМС ЬФПЗП РТЕДОБЪОБЮЕОЩ ОЕЛПФПТЩЕ РПДРТПЗТБННЩ curses , ОБРТЙНЕТ, noecho() Й cbreak() . йУРПМШЪХС ФБЛЙЕ РПДРТПЗТБННЩ, НПЦОП ХРТБЧМСФШ ЙОФЕТРТЕФБГЙЕК ЧЧПДЙНЩИ УЙНЧПМПЧ. ч РТЙЧЕДЕООПК ОЙЦЕ ФБВМЙГЕ РЕТЕЮЙУМЕОЩ ПУОПЧОЩЕ РПДРТПЗТБННЩ, РТЕДОБЪОБЮЕООЩЕ ДМС ХРТБЧМЕОЙС ТЕЦЙНПН ЧЧПДБ.

еУМЙ РТПЗТБННБ ЙУРПМШЪХЕФ curses Й ЧЧПДЙФ У ФЕТНЙОБМБ, ПОБ ДПМЦОБ ХУФБОПЧЙФШ ОЕЛПФПТЩЕ ПРГЙЙ ЧЧПДБ. ьФП УЧСЪБОП У ФЕН, ЮФП РТЙ УФБТФЕ РТПЗТБННЩ ФЕТНЙОБМ НПЦЕФ ПЛБЪБФШУС Ч МАВПН ЙЪ ТЕЦЙНПЧ cbreak() , raw() , nocbreak() , ЙМЙ noraw() . лБЛ РПЛБЪБОП Ч ФБВМЙГЕ, РТЙ ЪБРХУЛЕ РТПЗТБННЩ ЗБТБОФЙТХЕФУС ФПМШЛП ОБМЙЮЙЕ ТЕЦЙНБ echo() .

лБЛ РТБЧЙМП, Ч ЙОФЕТБЛФЙЧОПК ФЕТНЙОБМШОПК РТПЗТБННЕ ЙУРПМШЪХАФУС ЛПНВЙОБГЙС ТЕЦЙНПЧ noecho() Й cbreak() . рХУФШ, ОБРТЙНЕТ, ОХЦОП ПФПВТБЦБФШ ЧЧПДЙНЩЕ УЙНЧПМЩ ОЕ ФБН, ЗДЕ ОБИПДЙФУС ЛХТУПТ, Б Ч ОЙЦОЕК УФТПЛЕ ЬЛТБОБ. дМС ЬФПЗП РТЕДОБЪОБЮЕОБ РПДРТПЗТБННБ noecho() . пДОБЛП, ИПФС noecho() Й РПДБЧМСЕФ ПФПВТБЦЕОЙЕ ЧЧПДЙНЩИ УЙНЧПМПЧ, УЙНЧПМЩ ЪБВПС Й ХОЙЮФПЦЕОЙС ПВТБВБФЩЧБАФУС ПВЩЮОЩН ПВТБЪПН. дМС ПФЛМАЮЕОЙС ЬФПЗП ТЕЦЙНБ ЙУРПМШЪХЕФУС РПДРТПЗТБННБ cbreak() .

пРГЙЙ ЧЧПДБ уЙНЧПМЩ
йОФЕТРТЕФЙТХАФУС оЕ ЙОФЕТРТЕФЙТХАФУС
оПТНБМШОПЕ УПУФПСОЙЕ «ЧОЕ curses « РТЕТЩЧБОЙЕ, ЧЩИПД, УВТПУ ВЙФБ ЮЕФОПУФЙ, Ч , ЪБВПК, ХОЙЮФПЦЕОЙЕ, ЛПОЕГ ЖБКМБ
оПТНБМШОПЕ УПУФПСОЙЕ «УФБТФ curses -РТПЗТБННЩ» ЬИП (ЪБНЕОСЕФ ЬИП УЙУФЕНЩ UNIX) ЧУЕ ПУФБМШОПЕ ОЕ ПРТЕДЕМЕОП
cbreak () Й echo () РТЕТЩЧБОЙЕ, ЧЩИПД, УВТПУ ВЙФБ ЮЕФОПУФЙ ЬИП ЪБВПК, ХОЙЮФПЦЕОЙЕ, ЛПОЕГ ЖБКМБ
cbreak () Й noecho () РТЕТЩЧБОЙЕ, ЧЩИПД, УВТПУ ВЙФБ ЮЕФОПУФЙ ЪБВПК, ХОЙЮФПЦЕОЙЕ, ЛПОЕГ ЖБКМБ, ЬИП
nocbreak () Й noecho () ТБЪТЩЧ, ЧЩИПД, УВТПУ ВЙФБ ЮЕФОПУФЙ, ЪБВПК, ХОЙЮФПЦЕОЙЕ, ЛПОЕГ ЖБКМБ ЬИП
nocbreak () Й echo () уН. РТЕДПУФЕТЕЦЕОЙЕ ОЙЦЕ
nl () Ч
nonl () Ч
raw () [ЧНЕУФП cbreak () ] ТБЪТЩЧ, ЧЩИПД, УВТПУ ВЙФБ ЮЕФОПУФЙ

рТЕДПУФЕТЕЦЕОЙЕ оЕ РТЙНЕОСКФЕ ПДОПЧТЕНЕООП nocbreak() Й noecho() . еУМЙ ХУФБОПЧМЕОЩ ПВБ ТЕЦЙНБ Й чЩ ЧЩЪЩЧБЕФЕ getch() , РТПЗТБННБ РТЙ ЮФЕОЙЙ ЛБЦДПЗП УЙНЧПМБ ЧЛМАЮБЕФ, Б ЪБФЕН ПФЛМАЮБЕФ cbreak() . ч ЪБЧЙУЙНПУФЙ ПФ УПУФПСОЙС ДТБКЧЕТБ ФЕТНЙОБМБ РТЙ ЧЧПДЕ УЙНЧПМБ, ЬФП НПЦЕФ РТЙЧЕУФЙ Л ЧЩЧПДХ ОЕЦЕМБФЕМШОЩИ ДБООЩИ ОБ ЬЛТБО.

рПНЙНП РПДРТПЗТБНН, РЕТЕЮЙУМЕООЩИ Ч ФБВМЙГЕ, ДМС ХРТБЧМЕОЙС ЧЧПДПН ЙУРПМШЪХАФУС УМЕДХАЭЙЕ РПДРТПЗТБННЩ curses : noraw() , halfdelay() , nodelay() . пОЙ ПВУХЦДБАФУС Ч curses (3X).

дБМЕЕ РПДТПВОЕЕ ПРЙУЩЧБАФУС РПДРТПЗТБННЩ noecho() , cbreak() Й УЧСЪБООЩЕ У ОЙНЙ echo() Й nocbreak() .

echo( ), noecho( )

уйофблуйу
прйубойе
echo() ХУФБОБЧМЙЧБЕФ ТЕЦЙН «ЬИП» — ПФПВТБЦЕОЙЕ УЙНЧПМПЧ ОБ ЬЛТБОЕ РП НЕТЕ ЙИ ЧЧПДБ. рТЙ УФБТФЕ РТПЗТБННЩ ЬФПФ ТЕЦЙН ХУФБОПЧМЕО.

noecho() ПФЛМАЮБЕФ ТЕЦЙН «ЬИП».

оЙ ФБ, ОЙ ДТХЗБС РПДРТПЗТБННБ ОЕ ЧПЪЧТБЭБАФ РПМЕЪОЩИ ЪОБЮЕОЙК.

curses -РТПЗТБННЩ НПЗХФ ТБВПФБФШ ОЕРТБЧЙМШОП, ЕУМЙ ЬИП ХУФБОПЧМЕОП ПДОПЧТЕНЕООП У nocbreak() . уН. ФБВМЙГХ ЧЩЫЕ Й РПУМЕДХАЭЕЕ РТЕДПУФЕТЕЦЕОЙЕ. рПУМЕ ПФЛМАЮЕОЙС ЬИБ ЧЧПДЙНЩЕ УЙНЧПМЩ НПЦОП ПФПВТБЦБФШ РПУТЕДУФЧПН addch() .

ртйнет
уН. РТПЗТБННЩ editor Й show Ч ТБЪДЕМЕ рТЙНЕТЩ РТПЗТБНН, ТБВПФБАЭЙИ У curses .

cbreak( ), nocbreak( )

уйофблуйу
прйубойе
cbreak() ЧЛМАЮБЕФ ТЕЦЙН «РТЕТЩЧБОЙЕ РТЙ ЧЧПДЕ ЛБЦДПЗП УЙНЧПМБ». рТПЗТБННБ РПМХЮБЕФ ЛБЦДЩК УЙНЧПМ УТБЪХ РПУМЕ ЕЗП ЧЧПДБ, ОП УЙНЧПМЩ ЪБВПС, ХОЙЮФПЦЕОЙС Й ЛПОГБ ЖБКМБ ОЕ ПВТБВБФЩЧБАФУС.

nocbreak() ЧПЪЧТБЭБЕФ Л ПВЩЮОПНХ ТЕЦЙНХ «РПУФТПЮОЩК ЧЧПД». пВЩЮОП ЬФПФ ТЕЦЙН ХУФБОПЧМЕО РТЙ ЪБРХУЛЕ РТПЗ- ТБННЩ.

оЙ ПДОБ ЙЪ РПДРТПЗТБНН ОЕ ЧПЪЧТБЭБЕФ РПМЕЪОЩИ ЪОБЮЕОЙК.

curses -РТПЗТБННЩ НПЗХФ ТБВПФБФШ ОЕРТБЧЙМШОП, ЕУМЙ cbreak() ЧЛМАЮБЕФУС Й ПФЛМАЮБЕФУС Ч РТЕДЕМБИ ПДОПК РТПЗТБННЩ, МЙВП ЕУМЙ ЙУРПМШЪХЕФУС ЛПНВЙОБГЙС nocbreak() Й echo() .

уН. ФБВМЙГХ ЧЩЫЕ Й РПУМЕДХАЭЕЕ РТЕДПУФЕТЕЦЕОЙЕ.

ртйнет
уН. РТПЗТБННЩ editor Й show Ч ТБЪДЕМЕ рТЙНЕТЩ РТПЗТБНН, ТБВПФБАЭЙИ У curses .

2.8. тБВПФБ У ПЛОБНЙ

тБОЕЕ, Ч ТБЪДЕМЕ еЭЕ ПВ ПЛОБИ Й РПДРТПЗТБННЕ refresh() , ПВЯСУОСМПУШ, ЮФП ФБЛПЕ ПЛОБ Й УРЕГПЛОБ Й ДМС ЮЕЗП ПОЙ НПЗХФ чБН РПОБДПВЙФШУС. ч ЬФПН ТБЪДЕМЕ ПРЙУЩЧБАФУС РПДРТПЗТБННЩ curses , РТЕДОБЪОБЮЕООЩЕ ДМС УПЪДБОЙС ПЛПО Й УРЕГПЛПО Й ХРТБЧМЕОЙС ЙНЙ.

2.8.1. чЧПД/ЧЩЧПД

дМС ЧЧПДБ Й ЧЩЧПДБ ДБООЩИ Ч ПЛОБ Й УРЕГПЛОБ ЙУРПМШЪХАФУС РПДРТПЗТБННЩ, РПИПЦЙЕ ОБ ФЕ, ЛПФПТЩЕ ТБВПФБАФ У stdscr . еДЙОУФЧЕООБС ТБЪОЙГБ УПУФПЙФ Ч ФПН, ЮФП ОЕПВИПДЙНП ХЛБЪБФШ ПЛОП, Л ЛПФПТПНХ ПФОПУЙФУС ПРЕТБГЙС. лБЛ РТБЧЙМП, ЙНЕОБ ЬФЙИ РПДРТПЗТБНН РПМХЮБАФУС РХФЕН ДПВБЧМЕОЙС ВХЛЧЩ w Ч ОБЮБМП ОБЪЧБОЙС УППФЧЕФУФЧХАЭЕК РПДРТПЗТБННЩ ДМС stdscr , Б ФБЛЦЕ ЙНЕОЙ ПЛОБ Ч ЛБЮЕУФЧЕ РЕТЧПЗП РБТБНЕФТБ. оБРТЙНЕТ, ЕУМЙ ОХЦОП ЧЩЧЕУФЙ УЙНЧПМ c Ч ПЛОП mywin , addch (‘c’) РТЕЧТБЭБЕФУС Ч waddch (mywin,’c’) . дБМЕЕ РТЙЧПДЙФУС УРЙУПЛ ТБВПФБАЭЙИ У ПЛОБНЙ РПДРТПЗТБНН, УППФЧЕФУФЧХАЭЙИ ФЕН, ЛПФПТЩЕ ВЩМЙ ПРЙУБОЩ Ч ТБЪДЕМЕ оЕУМПЦОЩК ЧЧПД/ЧЩЧПД.

лБЛ ЧЙДОП ЙЪ ПРЙУБОЙК, ЬФЙ РПДРТПЗТБННЩ ПФМЙЮБАФУС ПФ ФЕИ, ЛПФПТЩЕ ТБВПФБАФ У stdscr , ФПМШЛП УЧПЙНЙ ЙНЕОБНЙ Й ДПВБЧМЕОЙЕН БТЗХНЕОФБ win . ъБНЕФШФЕ, ЮФП Х РПДРТПЗТБНН, ЮШЙ ЙНЕОБ ОБЮЙОБАФУС ОБ mvw , БТЗХНЕОФ win РТЕДЫЕУФЧХЕФ ЛППТДЙОБФБН y , x , ИПФС, УХДС РП ЙИ ЙНЕОБН, УМЕДПЧБМП ВЩ ПЦЙДБФШ ПВТБФОПЗП. уН. Ч curses (3X) ДПРПМОЙФЕМШОЩЕ ДБООЩЕ ПВ ЬФЙИ РПДРТПЗТБННБИ, ЧБТЙБОФБИ РПДРТПЗТБНН getch() , getstr() Й ДТХЗХА ЙОЖПТНБГЙА, ЛБУБАЭХАУС ТБВПФЩ У ПЛОБНЙ.

чУЕ РПДРТПЗТБННЩ У ВХЛЧПК w Ч ЙНЕОЙ НПЗХФ ЙУРПМШЪПЧБФШУС Й УП УРЕГПЛОБНЙ, ЪБ ЙУЛМАЮЕОЙЕН wrefresh() Й wnoutrefresh() (УН. ОЙЦЕ). чНЕУФП ОЙИ УП УРЕГПЛОБНЙ ОХЦОП ЙУРПМШЪПЧБФШ УППФЧЕФУФЧЕООП prefresh() Й pnoutrefresh() .

2.8.2. рПДРТПЗТБННЩ wnoutrefresh( ) Й doupdate( )

лБЛ ВЩМП УЛБЪБОП ТБОЕЕ, РПДРТПЗТБННБ refresh() РЕТЕУЩМБЕФ ДБООЩЕ У stdscr ОБ ЬЛТБО ФЕТНЙОБМБ. refresh() СЧМСЕФУС НБЛТПУПН, ЛПФПТЩК ТБУЫЙТСЕФУС Ч wrefresh (stdscr) , П ЮЕН ФБЛЦЕ ХРПНЙОБМПУШ Ч ТБЪДЕМБИ юФП ОХЦОП РТПЗТБННЕ ДМС ТБВПФЩ У curses Й еЭЕ ПВ ПЛОБИ Й РПДРТПЗТБННЕ refresh() .

рПДРТПЗТБННБ wrefresh() РТЕДОБЪОБЮЕОБ ДМС РЕТЕУЩМЛЙ ДБООЩИ ЙЪ ПЛОБ (ВХДШ ФП stdscr ЙМЙ УПЪДБООПЕ РПМШЪПЧБФЕМЕН) ОБ ЬЛТБО ФЕТНЙОБМБ; ПОБ ЧЩЪЩЧБЕФ РПДРТПЗТБННЩ wnoutrefresh() Й doupdate() . бОБМПЗЙЮОЩН ПВТБЪПН, prefresh() РЕТЕУЩМБЕФ ДБООЩЕ ЙЪ УРЕГПЛОБ ОБ ЬЛТБО, ПВТБЭБСУШ Л pnoutrefresh() Й doupdate() .

рПМШЪХСУШ wnoutrefresh() ЙМЙ pnoutrefresh() (ЪДЕУШ НЩ ДМС РТПУФПФЩ ТБУУНПФТЙН ФПМШЛП РЕТЧХА ЙЪ ОЙИ) Й doupdate() , чЩ НПЦЕФЕ ПВОПЧМСФШ ЬЛТБО У ВПМШЫЕК ЬЖЖЕЛФЙЧОПУФША, ЮЕН ПВТБЭБСУШ Л wrefresh() . wrefresh() УОБЮБМБ ЧЩЪЩЧБЕФ wnoutrefresh() , ЛПФПТБС ЛПРЙТХЕФ ХЛБЪБООПЕ ПЛОП Ч УФТХЛФХТХ ДБООЩИ, ОБЪЩЧБЕНХА ЧЙТФХБМШОЩН ЬЛТБОПН. чЙТФХБМШОЩК ЬЛТБО УПДЕТЦЙФ ФП, ЮФП РТПЗТБННБ УПВЙТБЕФУС ЧЩЧЕУФЙ ОБ ФЕТНЙОБМ. чЩЪЧБЧ wnoutrefresh() , wrefresh() ЪБФЕН ПВТБЭБЕФУС Л doupdate() , ЛПФПТБС УТБЧОЙЧБЕФ ЧЙТФХБМШОЩК ЬЛТБО У ЖЙЪЙЮЕУЛЙН Й РТПЙЪЧПДЙФ ПВОПЧМЕОЙЕ РПУМЕДОЕЗП. еУМЙ чЩ ИПФЙФЕ ПФПВТБЪЙФШ УПДЕТЦЙНПЕ УТБЪХ ОЕУЛПМШЛЙИ ПЛПО, ЧЩЪПЧЩ wrefresh() РТЙЧЕДХФ Л ОЕУЛПМШЛЙН ПВТБЭЕОЙСН Л wnoutrefresh() Й doupdate() , ФП ЕУФШ Л ОЕУЛПМШЛЙН БЛФБН ЧЩЧПДБ ДБООЩИ ОБ ЬЛТБО. пДОБЛП, ЧЩЪЧБЧ wnoutrefresh() ДМС ЛБЦДПЗП ПЛОБ, Б ЪБФЕН ПДЙО ТБЪ doupdate() , НПЦОП ХНЕОШЫЙФШ ПВЭЕЕ ЛПМЙЮЕУФЧП РЕТЕДБЧБЕНЩИ УЙНЧПМПЧ Й ОЕПВИПДЙНПЗП ДМС РЕТЕДБЮЙ ЧТЕНЕОЙ РТПГЕУУПТБ. оЙЦЕУМЕДХАЭБС РТПЗТБННБ ЙУРПМШЪХЕФ doupdate() МЙЫШ ПДОБЦДЩ. ч ОБЮБМЕ ЬФПК РТПЗТБННЩ ПВЯСЧМСАФУС ОПЧЩЕ ПЛОБ. пРЕТБФПТЩ

ПВЯСЧМСАФ ДЧБ ПЛОБ, ЛПФПТЩЕ ОБЪЩЧБАФУС w1 Й w2 , РЕТЕДБЧБС ОЕЛПФПТЩЕ ПРЙУБОЙС РПДРТПЗТБННЕ newwin() , ЛПФПТБС РПДТПВОЕЕ ПРЙУБОБ ОЙЦЕ. оЙЦЕ РПЛБЪБОП ДЕКУФЧЙЕ wnoutrefresh() Й doupdate() ОБ ЬФЙ ДЧБ ПЛОБ Й ОБ ЧЙТФХБМШОЩК Й ЖЙЪЙЮЕУЛЙК ЬЛТБОЩ.

2.8.3. оПЧЩЕ ПЛОБ

newwin( )

уйофблуйу
прйубойе
newwin() ЧПЪЧТБЭБЕФ ХЛБЪБФЕМШ ОБ ОПЧПЕ ПЛОП У ОПЧПК ПВМБУФША ДБООЩИ.

бТЗХНЕОФЩ nlines Й ncols ЪБДБАФ ТБЪНЕТ ОПЧПЗП ПЛОБ.

бТЗХНЕОФЩ begin_y Й begin_x ЪБДБАФ ЛППТДЙОБФЩ ФПЮЛЙ ОБ ЬЛТБОЕ [ПФОПУЙФЕМШОП (0, 0)], ОБ ЛПФПТХА ПФПВТБЦБЕФУС МЕЧЩК ЧЕТИОЙК ХЗПМ ПЛОБ.

ртйнет
уН. РТЙНЕТ РТПЗТБННЩ, ТБВПФБАЭЕК У ДЧХНС ПЛОБНЙ Й ТЙУХОПЛ ЧЩЫЕ. уН. ФБЛЦЕ РТПЗТБННХ window Ч ТБЪДЕМЕ рТЙНЕТЩ РТПЗТБНН, ТБВПФБАЭЙИ У curses .

subwin( )

уйофблуйу
прйубойе
subwin() ЧПЪЧТБЭБЕФ ХЛБЪБФЕМШ ОБ ОПЧПЕ ПЛОП, ЛПФПТПЕ СЧМСЕФУС ЮБУФША ТБОЕЕ ПРТЕДЕМЕООПЗП ПЛОБ, orig .

бТЗХНЕОФЩ nlines Й ncols ЪБДБАФ ТБЪНЕТ ОПЧПЗП ПЛОБ.

бТЗХНЕОФЩ begin_y Й begin_x ЪБДБАФ ЛППТДЙОБФЩ МЕЧПЗП ЧЕТИОЕЗП ХЗМБ ПЛОБ ОБ ЬЛТБОЕ ФЕТНЙОБМБ.

лБЛ РПДПЛОБ, ФБЛ Й УБНЙ ПЛОБ НПЗХФ РЕТЕЛТЩЧБФШУС.

рТЕДПУФЕТЕЦЕОЙЕ оБ НПНЕОФ ЧЩРХУЛБ ДБООПЗП ТХЛПЧПДУФЧБ ОЕ ТБВПФБМП ПРТЕДЕМЕОЙЕ РПДПЛПО Х РПДПЛПО.

ьФБ РТПЗТБННБ ЪБРПМОСЕФ ЗТБОЙГХ stdscr (ФП ЕУФШ ЛТБС ЬЛТБОБ ФЕТНЙОБМБ) УЙНЧПМБНЙ w , Б ЗТБОЙГХ РПДПЛОБ sub — УЙНЧПМБНЙ s . дТХЗПК РТЙНЕТ УН. Ч РТПЗТБННЕ window ТБЪДЕМБ рТЙНЕТЩ РТПЗТБНН, ТБВПФБАЭЙИ У curses .

ртйнет

2.9. рТПЮЙЕ ЧПЪНПЦОПУФЙ РБЛЕФБ curses

хНЕС РПМШЪПЧБФШУС ПУОПЧОЩНЙ РПДРТПЗТБННБНЙ curses ДМС ЧЧПДБ/ЧЩЧПДБ ОБ ЬЛТБО Й ХРТБЧМЕОЙС ПЛОБНЙ, НПЦОП УПЪДБЧБФШ ФЕТНЙОБМШОЩЕ РТПЗТБННЩ, ХДПЧМЕФЧПТСАЭЙЕ РПФТЕВОПУФЙ ВПМШЫЙОУФЧБ РПМШЪПЧБФЕМЕК. чНЕУФЕ У ФЕН, Ч curses ЙНЕАФУС РПДРТПЗТБННЩ, ЛПФПТЩЕ РПЪЧПМСАФ ДЕМБФШ ВПМШЫЕ, ЮЕН РТПУФП ЧЧПДЙФШ Й ЧЩЧПДЙФШ УЙНЧПМЩ Й ТБВПФБФШ У ПЛОБНЙ. оБ УМЕДХАЭЙИ ОЕУЛПМШЛЙИ УФТБОЙГБИ ЛТБФЛП ПРЙУЩЧБАФУС ОЕЛПФПТЩЕ ЙЪ ЬФЙИ РПДРТПЗТБНН, ЛПФПТЩЕ РПНПЗХФ чБН ЧЩЧПДЙФШ РТПУФЩЕ ЗТБЖЙЮЕУЛЙЕ ЙЪПВТБЦЕОЙС, ЙУРПМШЪПЧБФШ РТПЗТБННЙТХЕНЩЕ НЕФЛЙ ФЕТНЙОБМБ Й ПВТБЭБФШУС ЙЪ ПДОПК РТПЗТБННЩ Л ОЕУЛПМШЛЙН ФЕТНЙОБМБН.

рТЕЦДЕ, ЮЕН ЙУРПМШЪПЧБФШ ЬФЙ ЧПЪНПЦОПУФЙ, УМЕДХЕФ ПУЧПЙФШ РПДРТПЗТБННЩ ЧЧПДБ/ЧЩЧПДБ Й ХРТБЧМЕОЙС ПЛОБНЙ, ЛПФПТЩЕ ВЩМЙ ТБУУНПФТЕОЩ ЧЩЫЕ Ч ЬФПК ЗМБЧЕ, Б ФБЛЦЕ Ч ТХЛПЧПДУФЧЕ curses (3X).

рТЕДПУФЕТЕЦЕОЙЕ рПДРТПЗТБННЩ, ПРЙУЩЧБЕНЩЕ ДБМЕЕ Ч ТБЪДЕМБИ мЙОЙЙ ОБ ЬЛТБОЕ Й РТПЮБС ЗТБЖЙЛБ Й йУРПМШЪПЧБОЙЕ РТПЗТБННЙТХЕНЩИ НЕФПЛ, ЙНЕАФУС ФПМШЛП Ч УЙУФЕНЕ UNIX V ЧЕТУЙС 3.1. рТПЗТБННБ, ТБВПФБАЭБС У ОЙНЙ, ЧПЪНПЦОП, ОЕ УНПЦЕФ ЧЩРПМОСФШУС ОБ ВПМЕЕ ТБООЙИ ЧЕТУЙСИ УЙУФЕНЩ UNIX. дМС ТБВПФЩ У ЬФЙНЙ РПДРТПЗТБННБНЙ ОЕПВИПДЙНП ЙНЕФШ УЙУФЕНХ UNIX V ЧЕТУЙС 3.1 Й УППФЧЕФУФЧХАЭХА ЧЕТУЙА ВЙВМЙПФЕЛЙ curses .

2.9.1. мЙОЙЙ ОБ ЬЛТБОЕ Й РТПЮБС ЗТБЖЙЛБ

нОПЗЙЕ ФЕТНЙОБМЩ РПДДЕТЦЙЧБАФ БМШФЕТОБФЙЧОХА ЛПДЙТПЧЛХ ДМС РТПУФЩИ ЗТБЖЙЮЕУЛЙИ ЙЪПВТБЦЕОЙК (ЗТБЖЙЮЕУЛЙЕ УЙНЧПМЩ, ЙМЙ ЗМЙЖЩ). ьФЙН ОБВПТПН УЙНЧПМПЧ НПЦОП РПМШЪПЧБФШУС Й Ч РТПЗТБННБИ, ТБВПФБАЭЙИ У curses . ч curses ЙУРПМШЪХАФУС ФЕ ЦЕ ОБЪЧБОЙС ЗМЙЖПЧ, ЮФП Й Ч ЗТБЖЙЮЕУЛПН ОБВПТЕ УЙНЧПМПЧ VT100.

дМС ТБВПФЩ У БМШФЕТОБФЙЧОПК ЛПДЙТПЧЛПК Ч curses -РТПЗТБННЕ, ОЕПВИПДЙНП РЕТЕДБФШ РПДРТПЗТБННЕ waddch() (ЙМЙ РПДПВОПК) РПУМЕДПЧБФЕМШОПУФШ УЙНЧПМПЧ, ЮШЙ ЙНЕОБ ОБЮЙОБАФУС У ACS_ . оБРТЙНЕТ, ACS_ULCORNER — ЬФП РЕТЕНЕООБС ДМС УЙНЧПМБ, ЙЪПВТБЦБАЭЕЗП МЕЧЩК ЧЕТИОЙК ХЗПМ. еУМЙ ФЕТНЙОБМ РПДДЕТЦЙЧБЕФ ЬФПФ УЙНЧПМ, ФП Ч ACS_ULCORNER ВХДЕФ ТЕЪХМШФБФ ПРЕТБГЙЙ ймй ( | ) УППФЧЕФУФЧХАЭЕЗП ЪОБЮЕОЙС Й ВЙФОПК НБУЛЙ A_ALTCHARSET . еУМЙ ФБЛПЗП ЗТБЖЙЮЕУЛПЗП УЙНЧПМБ ОЕФ, ЙУРПМШЪХЕФУС УЙНЧПМ ЙЪ УФБОДБТФОПЗП ОБВПТБ ASCII, БРРТПЛУЙНЙТХАЭЙК ФТЕВХЕНПЕ ЙЪПВТБЦЕОЙЕ. оБРТЙНЕТ, ДМС БРРТПЛУЙНБГЙЙ ACS_HLINE , ЗПТЙЪПОФБМШОПК ЮЕТФЩ, ЙУРПМШЪХЕФУС — (ЪОБЛ НЙОХУ). еУМЙ ВМЙЪЛБС БРРТПЛУЙНБГЙС ОЕЧПЪНПЦОБ, ЙУРПМШЪХЕФУС + , ЪОБЛ РМАУ. чУЕ УФБОДБТФОЩЕ ЙНЕОБ ACS_ Й БРРТПЛУЙНЙТХАЭЙЕ ЙИ УЙНЧПМЩ РЕТЕЮЙУМЕОЩ Ч curses (3X).

нЩ РТЙЧЕДЕН ЮБУФШ ФЕЛУФБ РТПЗТБННЩ, ЛПФПТБС ЙУРПМШЪХЕФ ЗТБЖЙЮЕУЛЙЕ УЙНЧПМЩ. ч РТЙНЕТЕ ЧЩЪЩЧБЕФУС РПДРТПЗТБННБ box() , ЧИПДСЭБС Ч РБЛЕФ curses , ДМС ФПЗП, ЮФПВЩ ПЛТХЦЙФШ НЕОА ОБ ЬЛТБОЕ ТБНЛПК. рП ХНПМЮБОЙА box() ЙУРПМШЪХЕФ ЗТБЖЙЮЕУЛЙЕ УЙНЧПМЩ, ОП РП ЧЩВПТХ РПМШЪПЧБФЕМС НПЦЕФ ТЙУПЧБФШ ЪОБЛБНЙ Й — [УН. curses (3X)]. еУМЙ НЕОА, ЙЪПВТБЦЕООПЕ Ч ТБНЛЕ, ЙНЕЕФ РТПДПМЦЕОЙЕ ЧЧЕТИ ЙМЙ ЧОЙЪ ЪБ РТЕДЕМЩ ТБНЛЙ, ФП ДМС ХЛБЪБОЙС ЬФПЗП ЧЩЧПДСФУС УФТЕМЛЙ УППФЧЕФУФЧЕООП ЧЧЕТИ ЙМЙ ЧОЙЪ ( ACS_UARROW Й ACS_DARROW) .

рТЙЧЕДЕН ЕЭЕ ПДЙО РТЙНЕТ. рПУЛПМШЛХ УЙНЧПМ ДМС УФТЕМЛЙ ЧОЙЪ (ОБРТЙНЕТ, УФТПЮОБС v ) ОЕ ПЮЕОШ ЧЩДЕМСЕФУС ОБ ЬЛТБОЕ, ЕУМЙ ОБ ОЕН НОПЗП УФТПЮОЩИ ВХЛЧ, ЬФПФ УЙНЧПМ НПЦОП ЪБНЕОЙФШ ОБ РТПРЙУОХА V .

вПМЕЕ РПДТПВОХА ЙОЖПТНБГЙА УН. Ч уРТБЧПЮОЙЛЕ РТПЗТБННЙУФБ, curses (3X).

2.9.2. йУРПМШЪПЧБОЙЕ РТПЗТБННЙТХЕНЩИ НЕФПЛ

вПМШЫЙОУФЧП ФЕТНЙОБМПЧ РПДДЕТЦЙЧБЕФ РТПЗТБННЙТХЕНЩЕ НЕФЛЙ Ч ОЙЦОЕК ЮБУФЙ УЧПЕЗП ЬЛТБОБ. оБ ЛМБЧЙБФХТЕ ЬФЙН НЕФЛБН ПВЩЮОП УППФЧЕФУФЧХЕФ ЖХОЛГЙПОБМШОЩЕ ЛМБЧЙЫЙ. нЕФПЛ ПВЩЮОП ЧПУЕНШ, ЛБЦДБС ДМЙОПК Ч ЧПУЕНШ ЪОБЛПЧ Й ЧЩУПФПК Ч ПДОХ-ДЧЕ УФТПЛЙ.

вЙВМЙПФЕЛБ curses УПДЕТЦЙФ РПДРТПЗТБННЩ, РПДДЕТЦЙЧБАЭЙЕ ЕДЙОХА НПДЕМШ ЙЪ ЧПУШНЙ РТПЗТБННЙТХЕНЩИ НЕФПЛ. еУМЙ ФЕТНЙОБМ ЙИ ОЕ ЙНЕЕФ, ОЙЦОСС УФТПЛБ ЕЗП ЬЛТБОБ РТЕЧТБЭБЕФУС Ч ПВМБУФШ РТПЗТБННЙТХЕНЩИ НЕФПЛ. дМС ЙУРПМШЪПЧБОЙС Ч curses -РТПЗТБННБИ ФБЛЙИ НЕФПЛ, ОЕФ ОЕПВИПДЙНПУФЙ ЙНЕФШ ОБ ЛМБЧЙБФХТЕ УППФЧЕФУФЧХАЭЙЕ ЙН ЖХОЛГЙПОБМШОЩЕ ЛМБЧЙЫЙ.

дБМЕЕ ЛТБФЛП ПРЙУЩЧБАФУС ВПМШЫЙОУФЧП РПДРТПЗТБНН curses , РТЙНЕОСАЭЙИУС РТЙ ТБВПФЕ У РТПЗТБННЙТХЕНЩНЙ НЕФЛБНЙ: slk_init() , slk_set() , slk_refresh() , slk_noutrefresh() , slk_clear() Й slk_restore() .

еУМЙ чЩ РПМШЪХЕФЕУШ РТПЗТБННЙТХЕНЩНЙ НЕФЛБНЙ Ч curses -РТПЗТБННЕ, чБН ОЕПВИПДЙНП РЕТЕД initscr() ЧЩЪЧБФШ РПДРТПЗТБННХ slk_init() . рТЙ ЬФПН ХУФБОБЧМЙЧБЕФУС ЧОХФТЕООЙК ЖМБЗ, ХЛБЪЩЧБАЭЙК initscr() , ЮФП РТПЗТБННЙТХЕНЩЕ НЕФЛЙ ЙУРПМШЪХАФУС. еУМЙ initscr() ПВОБТХЦЙФ, ЮФП РТПЗТБННЙТХЕНЩЕ НЕФЛЙ ПФУХФУФЧХАФ ОБ ФЕТНЙОБМЕ, МЙВП ЙИ НЕОШЫЕ ЧПУШНЙ, МЙВП ЙИ ДМЙОБ НЕОЕЕ ЧПУШНЙ УЙНЧПМПЧ, ПОБ ХДБМСЕФ ОЙЦОАА УФТПЛХ stdscr , ЮФПВЩ ЙУРПМШЪПЧБФШ ЕЕ ДМС ТБЪНЕЭЕОЙС РТПЗТБННЙТХЕНЩИ НЕФПЛ. рТЙ ЬФПН ТБЪНЕТ stdscr Й ЪОБЮЕОЙЕ РЕТЕНЕООПК LINES ХНЕОШЫБЕФУС ОБ ЕДЙОЙГХ. тБЪХНОП ОБРЙУБООБС РТПЗТБННБ, ЙУРПМШЪХАЭБС РЕТЕНЕООЩЕ LINES Й COLS , ВХДЕФ ЧЩРПМОСФШУС РТБЧЙМШОП, ЛБЛ ЕУМЙ ВЩ ЬФПК УФТПЛЙ ЧППВЭЕ ОЕ ВЩМП ВЩ ОБ ЬЛТБОЕ.

slk_init() ЙНЕЕФ ПДЙО БТЗХНЕОФ, ПРТЕДЕМСАЭЙК УРПУПВ ТБЪНЕЭЕОЙС НЕФПЛ ОБ ЬЛТБОЕ Ч УМХЮБЕ ЙУРПМШЪПЧБОЙС ДМС ЬФПЗП УФТПЛЙ ЙЪ stdscr . чЩВПТ ЧПЪНПЦЕО НЕЦДХ ТБЪНЕЭЕОЙЕН ЗТХРРБНЙ 3-2-3, ЛБЛ ЬФП РТЙОСФП ОБ ФЕТНЙОБМБИ AT&T, МЙВП 4-4, ЛБЛ ОБ ФЕТНЙОБМБИ иШАМЕФФ-рБЛЛБТД. рПДРТПЗТБННЩ curses ПРТЕДЕМСАФ РПМПЦЕОЙЕ Й ТБЪНЕТ НЕФПЛ Ч УППФЧЕФУФЧЙЙ У ХЛБЪБООЩН УРПУПВПН, РТЙЮЕН НБЛУЙНБМШОП ЧПЪНПЦОБС ДМЙОБ НЕФЛЙ — ЧПУЕНШ УЙНЧПМПЧ.

рПДРТПЗТБННБ slk_set() ЙНЕЕФ ФТЙ БТЗХНЕОФБ: ОПНЕТ НЕФЛЙ (1-8), ФЕЛУФ, РПНЕЭБЕНЩК Ч НЕФЛХ (ОЕ ВПМЕЕ ЧПУШНЙ УЙНЧПМПЧ), ЧЩТБЧОЙЧБОЙЕ ЬФПЗП ФЕЛУФБ Ч РПМЕ НЕФЛЙ (0 — ЧЩТБЧОЙЧБОЙЕ ЧМЕЧП, 1 — ГЕОФТЙТПЧБОЙЕ, 2 — ЧЩТБЧОЙЧБОЙЕ ЧРТБЧП).

рПДРТПЗТБННБ slk_noutrefresh() РПДПВОБ wnoutrefresh() ФЕН, ЮФП ПОБ ПВОПЧМСЕФ УПДЕТЦЙНПЕ ЧОХФТЕООЕЗП ПВТБЪБ ЬЛТБОБ, ОП ОЕ ЧЩЧПДЙФ ДБООЩЕ ОБ ТЕБМШОЩК ЬЛТБО. рПУЛПМШЛХ РПУМЕ ЕЕ ЧЩЪПЧБ ПВЩЮОП ЧЩЪЩЧБАФ wrefresh() , ЙНЕООП slk_noutrefresh() , ЛБЛ РТБЧЙМП, ЙУРПМШЪХЕФУС ДМС ЧЩЧПДБ НЕФПЛ ОБ ЬЛТБО ФЕТНЙОБМБ.

рПДПВОП ФПНХ, ЛБЛ wrefresh() ЬЛЧЙЧБМЕОФОБ РПУМЕДПЧБФЕМШОЩН ЧЩЪПЧБН wnoutrefresh() Й doupdate() , РПДРТПЗТБННБ slk_refresh() ЬЛЧЙЧБМЕОФОБ РПУМЕДПЧБФЕМШОЩН ЧЩЪПЧБН slk_noutrefresh() Й doupdate() .

юФПВЩ РТПЗТБННЙТХЕНЩЕ НЕФЛЙ ОЕ НЕЫБМЙ ТБВПФЕ Ч УТЕДЕ shell, РЕТЕД ПВТБЭЕОЙЕН Л endwin() НПЦОП ЧЩЪЧБФШ slk_clear() , ЛПФПТБС ХДБМСЕФ РТПЗТБННЙТХЕНЩЕ НЕФЛЙ У ЬЛТБОБ Й ЧЩЪЩЧБЕФ doupdate() . рТПЗТБННЙТХЕНЩЕ НЕФЛЙ НПЦОП ЧПУУФБОПЧЙФШ ОБ ЬЛТБОЕ ЖХОЛГЙЕК slk_restore() . рПДТПВОЕЕ П РПДРТПЗТБННБИ ДМС ТБВПФЩ У РТПЗТБННЙТХЕНЩНЙ НЕФЛБНЙ УН. curses (3X).

2.9.3. тБВПФБ У ОЕУЛПМШЛЙНЙ ФЕТНЙОБМБНЙ УТБЪХ

Curses -РТПЗТБННБ НПЦЕФ ЧЩЧПДЙФШ ДБООЩЕ УТБЪХ ОБ ОЕУЛПМШЛП ФЕТНЙОБМПЧ. ьФП НПЦЕФ ПЛБЪБФШУС РПМЕЪОЩН РТЙ ТБЪТБВПФЛЕ РТПЗТБНН, ЛПФПТЩЕ РТЕДУФБЧМСАФ УПВПК ПДЙО РТПГЕУУ Й ПВТБЭБАФУС Л ПДОПК ВБЪЕ ДБООЩИ, ОБРТЙНЕТ, ЙЗТ ДМС ОЕУЛПМШЛЙИ ХЮБУФОЙЛПЧ.

рЙУБФШ РТПЗТБННЩ, ТБВПФБАЭЙЕ У ОЕУЛПМШЛЙНЙ ФЕТНЙОБМБНЙ, — ДЕМП ОЕМЕЗЛПЕ, Й РПДРТПЗТБННЩ curses ОЕ ТЕЫБАФ ЧУЕИ ЧПЪОЙЛБАЭЙИ РТЙ ЬФПН РТПВМЕН. оБРТЙНЕТ, УБНЙ РТПЗТБННЩ, Б ОЕ РПДРТПЗТБННЩ ВЙВМЙПФЕЛЙ, ДПМЦОЩ ПРТЕДЕМСФШ ЙНЕОБ ЖБКМПЧ ДМС ФЕТНЙОБМПЧ Й ФЙРЩ ЬФЙИ ФЕТНЙОБМПЧ. уФБОДБТФОЩК УРПУПВ У ЙУРПМШЪПЧБОЙЕН РЕТЕНЕООПК ПЛТХЦЕОЙС $TERM ОЕ УТБВБФЩЧБЕФ, РПУЛПМШЛХ ЛБЦДЩК РТПГЕУУ НПЦЕФ ЪОБФШ ФПМШЛП П УЧПЕН УПВУФЧЕООПН ПЛТХЦЕОЙЙ.

дТХЗБС РТПВМЕНБ ЧПЪОЙЛБЕФ, ЛПЗДБ ОЕУЛПМШЛП РТПЗТБНН РЩФБАФУС ЮЙФБФШ ДБООЩЕ У ПДОПЗП Й ФПЗП ЦЕ ФЕТНЙОБМБ. уМЕДХЕФ ЙЪВЕЗБФШ УЙФХБГЙЙ, ЛПЗДБ РТПЗТБННЩ РЕТЕИЧБФЩЧБАФ ДБООЩЕ ДТХЗ Х ДТХЗБ. ч ФП ЦЕ ЧТЕНС, РТПЗТБННБ, ЛПФПТБС РЩФБЕФУС ЪБОСФШ ДПРПМОЙФЕМШОЩК ФЕТНЙОБМ, ОЕ ДПМЦОБ РТПУФП РТЕТЩЧБФШ РТПЗТБННХ, ЛПФПТБС ХЦЕ ТБВПФБЕФ ОБ ОЕН. (пВЩЮОП ЬФП ФБЛЦЕ ОЕРТЙЕНМЕНП ЙЪ УППВТБЦЕОЙК ВЕЪПРБУОПУФЙ, ОП ВЩЧБАФ УМХЮБЙ, ЛПЗДБ ЬФП НПЦЕФ ПЛБЪБФШУС РПМЕЪОЩН, ОБРТЙНЕТ, ЕУМЙ ФЕТНЙОБМ ОЕ ЙУРПМШЪХЕФУС, МЙВП ДМС ТБЪТБВПФЛЙ РТПЗТБНН УЧСЪЙ НЕЦДХ ФЕТНЙОБМБНЙ). фЙРЙЮОЩН ТЕЫЕОЙЕН РТПВМЕНЩ СЧМСЕФУС ЪБРХУЛ ЛБЦДЩН РПМШЪПЧБФЕМЕН РТПЗТБННЩ, ХЧЕДПНМСАЭЕК ЗМБЧОХА РТПЗТБННХ П ЦЕМБОЙЙ У ОЕК ТБВПФБФШ Й РЕТЕДБАЭЕК ЗМБЧОПК РТПЗТБННЕ ЙДЕОФЙЖЙЛБФПТ РТПГЕУУБ ХЧЕДПНМСАЭЕК РТПЗТБННЩ, ЙНС МЙОЙЙ Й ФЙР ЙУРПМШЪХЕНПЗП ФЕТНЙОБМБ. ъБФЕН ХЧЕДПНМСАЭБС РТПЗТБННБ РЕТЕИПДЙФ Ч ОЕБЛФЙЧОПЕ УПУФПСОЙЕ ДП ПЛПОЮБОЙС ТБВПФЩ ЗМБЧОПК. рЕТЕД УЧПЙН ЪБЧЕТЫЕОЙЕН, ЗМБЧОБС РТПЗТБННБ БЛФЙЧЙЪЙТХЕФ ЧУЕ ХЧЕДПНМСАЭЙЕ РТПЗТБННЩ, РПУМЕ ЮЕЗП ЧУЕ ПОЙ ЪБЧЕТЫБАФУС.

лПОГЕРГЙС ТБВПФЩ curses УП НОПЗЙНЙ ФЕТНЙОБМБНЙ ЪБЛМАЮБЕФУС Ч РПДДЕТЦБОЙЙ ФЕЛХЭЕЗП ФЕТНЙОБМБ. чУЕ ПВТБЭЕОЙС Л РПДРТПЗТБННБН ПФОПУСФУС Л ЬФПНХ ФЕЛХЭЕНХ ФЕТНЙОБМХ. зМБЧОБС РТПЗТБННБ ДПМЦОБ ПРЙУБФШ ЛБЦДЩК ФЕТНЙОБМ Й УПИТБОЙФШ УУЩМЛХ ОБ ОЕЗП Ч УЧПЙИ РЕТЕНЕООЩИ. лПЗДБ РТПЗТБННЕ ОХЦОП ТБВПФБФШ У ОЕЛПФПТЩН ФЕТНЙОБМПН, ЕК УМЕДХЕФ ХУФБОПЧЙФШ ЕЗП Ч ЛБЮЕУФЧЕ ФЕЛХЭЕЗП Й ЧЩЪЩЧБФШ ПВЩЮОЩЕ РПДРТПЗТБННЩ curses .

уУЩМЛЙ ОБ ФЕТНЙОБМ Ч curses -РТПЗТБННЕ ЙНЕАФ ФЙР *SCREEN . оПЧЩК ФЕТНЙОБМ ЙОЙГЙБМЙЪЙТХЕФУС РХФЕН ПВТБЭЕОЙС Л newterm (type, outfd, infd) . newterm ЧПЪЧТБЭБЕФ ХЛБЪБФЕМШ ОБ ОПЧЩК ФЕТНЙОБМ, type — ЬФП ГЕРПЮЛБ УЙНЧПМПЧ, УПДЕТЦБЭБС ФЙР ЙУРПМШЪХЕНПЗП ФЕТНЙОБМБ. outfd СЧМСЕФУС ХЛБЪБФЕМЕН ОБ ЖБКМ [ *FILE , stdio (3S)], ЛПФПТЩК ЙУРПМШЪХЕФУС ДМС ЧЩЧПДБ ОБ ФЕТНЙОБМ, Б infd ХЛБЪЩЧБЕФ ОБ ЖБКМ ДМС ЧЧПДБ У ФЕТНЙОБМБ. чЩЪПЧ newterm() ЪБНЕОСЕФ ПВЩЮОПЕ ПВТБЭЕОЙЕ Л initscr() , ЛПФПТПЕ ТБУЫЙТСЕФУС Ч newterm (getenv («TERM»), stdout, stdin) .

дМС ЙЪНЕОЕОЙС ФЕЛХЭЕЗП ФЕТНЙОБМБ ОЕПВИПДЙНП ЧЩЪЧБФШ set_term (sp) , ЗДЕ sp ХЛБЪЩЧБЕФ ОБ ФЕТНЙОБМ, ЛПФПТЩК ДПМЦЕО УФБФШ ФЕЛХЭЙН. set_term() ЧПЪЧТБЭБЕФ ХЛБЪБФЕМШ ОБ ФЕТНЙОБМ, ЛПФПТЩК ВЩМ ФЕЛХЭЙН ОБ НПНЕОФ ЕЕ ЧЩЪПЧБ.

чБЦОП РПОСФШ, ЮФП ЛБЦДЩК ФЕТНЙОБМ ВХДЕФ ЙНЕФШ УЧПЙ УПВУФЧЕООЩЕ ТЕЦЙНЩ ТБВПФЩ Й ПЛОБ. лБЦДЩК ФЕТНЙОБМ ДПМЦЕО ВЩФШ РТПЙОЙГЙБМЙЪЙТПЧБО УППФЧЕФУФЧХАЭЙН ЧЩЪПЧПН newterm() . дМС ЛБЦДПЗП ФЕТНЙОБМБ ПФДЕМШОП ДПМЦОЩ ВЩФШ ХУФБОПЧМЕОЩ ТЕЦЙНЩ ТБВПФЩ, ОБРТЙНЕТ, cbreak() ЙМЙ noecho() . тБЧОЩН ПВТБЪПН ДМС ЛБЦДПЗП ФЕТНЙОБМБ ПФДЕМШОП ДПМЦОЩ ЧЩЪЩЧБФШУС endwin() Й refresh() . оЙЦЕ ЙЪПВТБЦЕО ФЙРЙЮОЩК УГЕОБТЙК ТБУУЩМЛЙ УППВЭЕОЙС ОБ ОЕУЛПМШЛП ФЕТНЙОБМПЧ.

вПМЕЕ РПДТПВОЩК РТЙНЕТ УН. Ч РТПЗТБННЕ two ТБЪДЕМБ рТЙНЕТЩ РТПЗТБНН, ТБВПФБАЭЙИ У curses .

3. йурпмшъпчбойе рпдртпзтбнн рблефб TERMINFO

йОПЗДБ НПЗХФ РПОБДПВЙФШУС РПДРТПЗТБННЩ ВПМЕЕ ОЙЪЛПЗП ХТПЧОС, ЮЕН ФЕ, ЛПФПТЩЕ РТЕДМБЗБЕФ РБЛЕФ curses . фБЛЙЕ РПДРТПЗТБННЩ УПДЕТЦБФУС Ч РБЛЕФЕ terminfo . пОЙ ОЕ ТБВПФБАФ ОЕРПУТЕДУФЧЕООП У ЬЛТБОПН ФЕТНЙОБМБ, Б ДБАФ РПМШЪПЧБФЕМА ЧПЪНПЦОПУФШ ХЪОБФШ ЪОБЮЕОЙС ИБТБЛФЕТЙУФЙЛ ФЕТНЙОБМБ Й РПУМЕДПЧБФЕМШОПУФЙ УЙНЧПМПЧ, ЛПФПТЩЕ ФЕТНЙОБМПН ХРТБЧМСАФ.

рПДРТПЗТБННЩ terminfo РПМЕЪОП ЙУРПМШЪПЧБФШ Ч ФТЕИ УМХЮБСИ. чПРЕТЧЩИ, ЕУМЙ чБН ОХЦОЩ ФПМШЛП ОЕЛПФПТЩЕ ЧПЪНПЦОПУФЙ ФЕТНЙОБМБ, ОБРТЙНЕТ, ЧЩДЕМЕОЙЕ ФЕЛУФБ ОБ ЬЛТБОЕ. чП-ЧФПТЩИ, ЕУМЙ ОХЦОП ОБРЙУБФШ ЖЙМШФТ. фЙРЙЮОЩК ЖЙМШФТ ФПМШЛП РТЕПВТБЪХЕФ ЧИПДОПК РПФПЛ, ВЕЪ ПЮЙУФЛЙ ЬЛТБОБ ЙМЙ РЕТЕНЕЭЕОЙС ЛХТУПТБ. еУМЙ ЧЙД РТЕПВТБЪПЧБОЙС ЪБЧЙУЙФ ПФ ФЕТНЙОБМБ, Й ЬЛТБО ОЕ ДПМЦЕО ПЮЙЭБФШУС, ФП УФПЙФ ЧПУРПМШЪПЧБФШУС РПДРТПЗТБННБНЙ terminfo . ч-ФТЕФШЙИ, ЕУМЙ чЩ РЙЫЕФЕ УРЕГЙБМШОХА РТПЗТБННХ ДМС РПУЩМЛЙ УРЕГЙБМШОПК УФТПЛЙ ОБ ФЕТНЙОБМ, ОБРТЙНЕТ, ДМС РТПЗТБННЙТПЧБОЙС ЖХОЛГЙПОБМШОПК ЛМБЧЙБФХТЩ, ХУФБОПЧЛЙ РПЪЙГЙК ФБВХМСГЙЙ, РЕТЕДБЮЙ ДБООЩИ ОБ РТЙОФЕТ, ЙМЙ ДМС ТБВПФЩ УП УФТПЛПК УПУФПСОЙС. ъБ ЙУЛМАЮЕОЙЕН ЬФЙИ ФТЕИ УМХЮБЕЧ, чБН МХЮЫЕ ОЕ РПМШЪПЧБФШУС РПДРТПЗТБННБНЙ terminfo : curses УПДЕТЦЙФ РПДРТПЗТБННЩ ВПМЕЕ ЧЩУПЛПЗП ХТПЧОС, ЙУРПМШЪПЧБОЙЕ ЛПФПТЩИ РПЧЩУЙФ УФЕРЕОШ РЕТЕОПУЙНПУФЙ чБЫЙИ РТПЗТБНН ОБ ДТХЗЙЕ УЙУФЕНЩ UNIX Й ДТХЗЙЕ ФЕТНЙОБМЩ.

рТЙНЕЮБОЙЕ чБН ОЕ УМЕДХЕФ ЙУРПМШЪПЧБФШ РПДРТПЗТБННЩ terminfo , ЛТПНЕ ФТЕИ РЕТЕЮЙУМЕООЩИ УМХЮБЕЧ, РПУЛПМШЛХ РПДРТПЗТБННЩ curses ПВЕУРЕЮЙЧБАФ ТЕБЛГЙА ОБ ЙЪЯСОЩ Й УВПЙ ЖЙЪЙЮЕУЛЙИ ФЕТНЙОБМПЧ. рТЙ ТБВПФЕ У РПДРТПЗТБННБНЙ terminfo чБН РТЙДЕФУС УБНПУФПСФЕМШОП ТЕБЗЙТПЧБФШ ОБ ЧПЪОЙЛБАЭЙЕ УЙФХБГЙЙ. лТПНЕ ФПЗП, ЬФЙ РПДРТПЗТБННЩ НЕОСАФУС Й НПЗХФ УФБФШ ОЕУПЧНЕУФЙНЩНЙ У РТЕЦОЙНЙ.

3.1. юФП ОХЦОП РТПЗТБННЕ ДМС ТБВПФЩ У terminfo

лБЛ РТБЧЙМП, РТПЗТБННБ, ТБВПФБАЭБС У terminfo , ЧЛМАЮБЕФ ЖБКМЩ Й РПДРТПЗТБННЩ, ЛПФПТЩЕ РЕТЕЮЙУМЕОЩ ОЙЦЕ:

жБКМЩ Й ОХЦОЩ, РПУЛПМШЛХ ПОЙ УПДЕТЦБФ ПРТЕДЕМЕОЙС ФЕЛУФПЧЩИ ПВЯЕЛФПЧ, ЮЙУЕМ Й ЖМБЗПЧ, ЛПФПТЩЕ ЙУРПМШЪХАФУС РПДРТПЗТБННБНЙ terminfo . setupterm() ЪБОЙНБЕФУС ЙОЙГЙБМЙЪБГЙЕК. рЕТЕДБЮБ ЕК ЪОБЮЕОЙК (char*) 0, 1 Й (int*) 0 ПВЕУРЕЮЙЧБЕФ ХУФБОПЧЛХ ТБЪХНОЩИ ТЕЦЙНПЧ. еУМЙ setupterm() ОЕ НПЦЕФ ТБУРПЪОБФШ ФЙР ЙУРПМШЪХЕНПЗП ФЕТНЙОБМБ, ПОБ ЧЩЧПДЙФ УППВЭЕОЙЕ ПВ ПЫЙВЛЕ Й ЪБЧЕТЫБЕФУС. reset_shell_mode() ДЕМБЕФ РТЙНЕТОП ФП ЦЕ, ЮФП Й endwin() , Й ДПМЦОБ ЧЩЪЩЧБФШУС РЕТЕД ЪБЧЕТЫЕОЙЕН terminfo -РТПЗТБННЩ. рТЙ ЧЩЪПЧЕ setupterm() ПРТЕДЕМСАФУС ЪОБЮЕОЙС ЗМПВБМШОЩИ РЕТЕНЕООЩИ, ОБРТЙНЕТ clear_screen . йИ ЪОБЮЕОЙС НПЗХФ ВЩФШ ЧЩЧЕДЕОЩ ОБ ЬЛТБО ЧИПДСЭЙНЙ Ч terminfo РПДРТПЗТБННБНЙ putp() ЙМЙ tputs() , ЮФП ПВЕУРЕЮЙЧБЕФ РПМШЪПЧБФЕМА ДПРПМОЙФЕМШОЩЕ ЧПЪНПЦОПУФЙ РП ЛПОФТПМА ФЕТНЙОБМБ. фБЛХА УФТПЛХ ОЕ УМЕДХЕФ ЧЩЧПДЙФШ РПДРТПЗТБННПК printf (3S) ЙЪ ВЙВМЙПФЕЛЙ СЪЩЛБ C, РПУЛПМШЛХ Ч ОЕК УПДЕТЦЙФУС ЙОЖПТНБГЙС ПВ ЙУРПМШЪПЧБОЙЙ УЙНЧПМПЧ-ЪБРПМОЙФЕМЕК. рТПЗТБННБ, РЩФБАЭБСУС ЧЩЧЕУФЙ ЕЕ ФБЛЙН ПВТБЪПН, НПЦЕФ ЪБЧЕТЫЙФШУС БЧБТЙКОП, ЕУМЙ ФЕТНЙОБМ ФТЕВХЕФ ЙУРПМШЪПЧБОЙС ЪБРПМОЙФЕМЕК, ЙМЙ ЕУМЙ ПО ЙУРПМШЪХЕФ РТПФПЛПМ xon/xoff.

оБ ХТПЧОЕ terminfo РПДРТПЗТБННЩ ВПМЕЕ ЧЩУПЛПЗП ХТПЧОС, ОБРТЙНЕТ, addch () Й getch() , ОЕДПУФХРОЩ. чБН РТЙДЕФУС УБНПУФПСФЕМШОП ТЕЫБФШ РТПВМЕНХ ЧЩЧПДБ ОБ ЬЛТБО. уРЙУПЛ ИБТБЛФЕТЙУФЙЛ Й ЙИ ПРЙУБОЙК УН. Ч terminfo (4), УРЙУПЛ РПДРТПЗТБНН terminfo УН. Ч curses (3X).

3.2. лПНРЙМСГЙС Й ЧЩРПМОЕОЙЕ РТПЗТБНН, ЛПФПТЩЕ ЙУРПМШЪХАФ terminfo

пВЭЙК ЖПТНБФ ЛПНБОДОПК УФТПЛЙ ДМС ЛПНРЙМСГЙЙ, ЛБЛ Й ПУПВЕООПУФЙ ЪБРХУЛБ РТПЗТБНН, ЙУРПМШЪХАЭЙИ terminfo , ФЕ ЦЕ, ЮФП Й ДМС МАВПК ДТХЗПК curses -РТПЗТБННЩ. рПДТПВОПУФЙ УН. Ч ТБЪДЕМБИ лПНРЙМСГЙС РТПЗТБННЩ, ЛПФПТБС ЙУРПМШЪХЕФ curses Й чЩРПМОЕОЙЕ РТПЗТБННЩ, ЛПФПТБС ЙУРПМШЪХЕФ curses .

3.3. рТЙНЕТ РТПЗТБННЩ, ТБВПФБАЭЕК У terminfo

рПЪОБЛПНЙНУС РПВМЙЦЕ У РПДРТПЗТБННБНЙ terminfo ОБ РТЙНЕТЕ ЙУРПМШЪПЧБОЙС ЖХОЛГЙЙ tputs (cap, affcnt, outc) Ч ЬФПК РТПЗТБННЕ. tputs() ДПВБЧМСЕФ УЙНЧПМЩ-ЪБРПМОЙФЕМЙ. оЕЛПФПТЩЕ ФЕТНЙОБМЩ ЙНЕАФ ЧПЪНПЦОПУФШ ЪБДЕТЦЙЧБФШ ЧЩЧПД. йИ ПРЙУБОЙС Ч ВБЪЕ ДБООЩИ terminfo , ВЩФШ НПЦЕФ, УПДЕТЦБФ ГЕРПЮЛЙ, РПДПВОЩЕ $ , ЮФП ПЪОБЮБЕФ ЪБДЕТЦЛХ ОБ 20 НЙММЙУЕЛХОД (УН. ОЙЦЕ ТБЪДЕМ хЛБЪБОЙЕ ИБТБЛФЕТЙУФЙЛ ФЕТНЙОБМБ). tputs ЗЕОЕТЙТХЕФ ДПУФБФПЮОПЕ ДМС ЪБДЕТЦЛЙ ОБ ЬФП ЧТЕНС ЛПМЙЮЕУФЧП УЙНЧПМПЧ-ЪБРПМОЙФЕМЕК.

tputs() ЙНЕЕФ ФТЙ РБТБНЕФТБ. рЕТЧЩК СЧМСЕФУС ГЕРПЮЛПК УЙНЧПМПЧ, ПРТЕДЕМСАЭЕК ИБТБЛФЕТЙУФЙЛХ (БФТЙВХФ ЧЩЧПДБ), ЛПФПТХА ОЕПВИПДЙНП ТЕБМЙЪПЧБФШ. чФПТПК — ЛПМЙЮЕУФЧП ЪБФТБЗЙЧБЕНЩИ ЬФЙН УФТПЛ. (оЕЛПФПТЩЕ ЪБРТПУЩ ФТЕВХАФ ДПВБЧМЕОЙС УЙНЧПМПЧ-ЪБРПМОЙФЕМЕК Ч ЛПМЙЮЕУФЧЕ, ЪБЧЙУСЭЕН ПФ ЬФПЗП РБТБНЕФТБ. оБРТЙНЕТ, ЪБРТПУ ОБ ЧУФБЧЛХ УФТПЛЙ, insert_line , НПЦЕФ РТЙЧЕУФЙ Л ЛПРЙТПЧБОЙА ЧУЕИ УФТПЛ ОЙЦЕ ФЕЛХЭЕК, ДМС ЮЕЗП ОХЦОП ЧТЕНС, РТПРПТГЙПОБМШОПЕ ЛПМЙЮЕУФЧХ ЛПРЙТХЕНЩИ УФТПЛ. еУМЙ ОЙ ПДОБ УФТПЛБ ОЕ ЪБФТБЗЙЧБЕФУС, Ч ЛБЮЕУФЧЕ affcnt ЙУРПМШЪХЕФУС 1. еДЙОЙГБ ЧНЕУФП ОХМС ВЕТЕФУС ДМС ОБДЕЦОПУФЙ, ФБЛ ЛБЛ affcnt ХНОПЦБЕФУС ОБ ОЕЛПФПТЩК ЙОФЕТЧБМ ЧТЕНЕОЙ, Б ХНОПЦЕОЙЕ ЮЕЗП-МЙВП ОБ 0 ДБЕФ 0). фТЕФЙК РБТБНЕФТ — ЬФП РПДРТПЗТБННБ, ЧЩЪЩЧБЕНБС ДМС ЧЩЧПДБ ЛБЦДПЗП УЙНЧПМБ.

дМС РПОЙНБОЙС ЦЕМБФЕМШОПУФЙ ЙУРПМШЪПЧБОЙС РПДРТПЗТБНН ХТПЧОС curses ЧНЕУФП РПДРТПЗТБНН ХТПЧОС terminfo (ФБН, ЗДЕ ЬФП ЧПЪНПЦОП), РПМЕЪОП ПВТБФЙФШ ЧОЙНБОЙЕ ОБ РТПЧЕТЛХ ЪОБЮЕОЙС underline_char Ч РТЙНЕТЕ. оЕЛПФПТЩЕ ФЕТНЙОБМЩ ЙНЕАФ ХРТБЧМСАЭЙК УЙНЧПМ, ХЛБЪЩЧБАЭЙК ОБЮБМП РПДЮЕТЛЙЧБОЙС, Й ЕЭЕ ПДЙО УЙНЧПМ, ХЛБЪЩЧБАЭЙК ЛПОЕГ РПДЮЕТЛЙЧБОЙС. дТХЗЙН ОЕПВИПДЙНП ХЛБЪБОЙЕ ЛПДБ РПДЮЕТЛЙЧБОЙС РТЙ ЧЩЧПДЕ ЛБЦДПЗП УЙНЧПМБ. рТПЗТБННБ termhl ИТБОЙФ ЪОБЮЕОЙЕ ЬФПЗП ТЕЦЙНБ, Й, ЕУМЙ ОЕПВИПДЙНП, ЧЩЧПДЙФ underline_char ДМС РПДЮЕТЛЙЧБОЙС ПЮЕТЕДОПЗП УЙНЧПМБ. йЪ-ЪБ ОБМЙЮЙС ФБЛПЗП ТПДБ НЕМЛЙИ ДЕФБМЕК, У ЛПФПТЩНЙ РТПЗТБННЩ ХТПЧОС terminfo ДПМЦОЩ ТБЪВЙТБФШУС УБНПУФПСФЕМШОП, Й РТЕДРПЮФЙФЕМШОЕЕ ТБВПФБФШ ОБ ХТПЧОЕ curses .

рТПЗТБННБ termhl ВЩМБ ОБРЙУБОБ ДМС ЙММАУФТБГЙЙ РТЙНЕОЕОЙС РПДРТПЗТБНН terminfo , РПЬФПНХ ПОБ РПМХЮЙМБУШ УМПЦОЕЕ, ЮЕН НПЗМБ ВЩ ВЩФШ. чНЕУФП ОЕРПУТЕДУФЧЕООПЗП ЧЩЧПДБ enter_bold_mode , enter_underline_mode Й exit_attribute_mode НПЦОП ВЩМП ВЩ ЙУРПМШЪПЧБФШ РПДРТПЗТБННХ vidattr [УН. curses (3X)]. жБЛФЙЮЕУЛЙ, Ч РПУМЕДОЕН УМХЮБЕ РТПЗТБННБ ВЩМБ ВЩ ВПМЕЕ ОБДЕЦОБ, РПУЛПМШЛХ УХЭЕУФЧХЕФ ОЕУЛПМШЛП УРПУПВПЧ ЙЪНЕОЕОЙС БФТЙВХФПЧ ЧЩЧПДБ.

4. йурпмшъпчбойе вбъщ дбоощи TERMINFO

вБЪБ ДБООЩИ terminfo УПДЕТЦЙФ ПРЙУБОЙС НОПЗЙИ ФЕТНЙОБМПЧ, У ЛПФПТЩНЙ НПЗХФ ТБВПФБФШ ЛБЛ РПДРТПЗТБННЩ curses , ФБЛ Й ОЕЛПФПТЩЕ УТЕДУФЧБ УЙУФЕНЩ UNIX, ОБРТЙНЕТ vi (1). лБЦДПЕ ПРЙУБОЙЕ ФЕТНЙОБМБ РТЕДУФБЧМСЕФ УПВПК УЛПНРЙМЙТПЧБООЩК ЖБКМ, УПДЕТЦБЭЙК ЙНЕОБ, РПД ЛПФПТЩНЙ ЬФПФ ФЕТНЙОБМ ЙЪЧЕУФЕО, Й ЗТХРРХ ТБЪДЕМЕООЩИ ЪБРСФЩНЙ РПМЕК, ПРЙУЩЧБАЭЙИ ЧПЪНПЦОЩЕ ДЕКУФЧЙС Й ИБТБЛФЕТЙУФЙЛЙ ФЕТНЙОБМБ. ч ЬФПН ТБЪДЕМЕ ПРЙУЩЧБАФУС ВБЪБ ДБООЩИ terminfo , УТЕДУФЧБ ДМС ТБВПФЩ У ОЕК Й ЕЕ УЧСЪШ У ВЙВМЙПФЕЛПК curses .

4.1. уПЪДБОЙЕ ПРЙУБОЙС ФЕТНЙОБМБ

вБЪБ ДБООЩИ terminfo УПДЕТЦЙФ ПРЙУБОЙС НОПЗЙИ ОБЙВПМЕЕ ЮБУФП РТЙНЕОСАЭЙИУС ФЕТНЙОБМПЧ. нПЦЕФ, ПДОБЛП, ПЛБЪБФШУС, ЮФП чЩ РПЦЕМБЕФЕ ОБРЙУБФШ curses -РТПЗТБННХ, РТЕДОБЪОБЮЕООХА ДМС ЧЩРПМОЕОЙС ОБ ФЕТНЙОБМЕ, ЛПФПТЩК ЕЭЕ ОЕ ПРЙУБО. ч ЬФПН УМХЮБЕ чБН РТЙДЕФУС УПЪДБФШ ЕЗП ПРЙУБОЙЕ.

ч ПВЭЕН УМХЮБЕ ДМС ЗЕОЕТБГЙЙ ПРЙУБОЙС ФЕТНЙОБМБ ОЕПВИПДЙНП:

  • хЛБЪБФШ ЙЪЧЕУФОЩЕ чБН ОБЪЧБОЙС ФЕТНЙОБМБ.
  • чЩСУОЙФШ Й РЕТЕЮЙУМЙФШ ИБТБЛФЕТЙУФЙЛЙ ФЕТНЙОБМБ.
  • лПНРЙМЙТПЧБФШ ПРЙУБОЙЕ ФЕТНЙОБМБ.
  • фЕУФЙТПЧБФШ ЬФП ПРЙУБОЙЕ.
  • рТЙ ОЕПВИПДЙНПУФЙ ЧЕТОХФШУС ЛП ЧФПТПНХ ЫБЗХ, ХФПЮОЙФШ ИБТБЛФЕТЙУФЙЛЙ Й РПЧФПТЙФШ РПУМЕДХАЭЙЕ ЫБЗЙ.
  • йОПЗДБ ЗЕОЕТЙТПЧБФШ Й ФЕУФЙТПЧБФШ ПРЙУБОЙЕ ФЕТНЙОБМБ МЕЗЮЕ РП ЮБУФСН. фБЛЙЕ РПУМЕДПЧБФЕМШОЩЕ ФЕУФЩ РПНПЗХФ ЧЩСЧЙФШ чБЫЙ УМБВЩЕ УФПТПОЩ Ч ТБВПФЕ РП ПРЙУБОЙА ФЕТНЙОБМПЧ. лТПНЕ ФПЗП, НПЦОП ПВМЕЗЮЙФШ ЗЕОЕТБГЙА, ЛПТТЕЛФЙТХС ХЦЕ УХЭЕУФЧХАЭЕЕ ПРЙУБОЙЕ РПИПЦЕЗП ФЕТНЙОБМБ (ОЕ УМЕДХЕФ ЪБВЩЧБФШ ДЕЧЙЪ УЙУФЕНЩ UNIX: ПРЙТБФШУС ОБ ТБВПФХ ДТХЗЙИ).

    дБМЕЕ НЩ ПРЙЫЕН ЛБЦДЩК ЫБЗ РПУФТПЕОЙС ПРЙУБОЙС ОЕЛПФПТПЗП ХУМПЧОПЗП ФЕТНЙОБМБ myterm.

    4.1.1. оБЪЧБОЙЕ ФЕТНЙОБМБ

    оБЪЧБОЙЕ ФЕТНЙОБМБ — ЬФП ЙОЖПТНБГЙС, У ЛПФПТПК ОБЮЙОБЕФУС ЕЗП ПРЙУБОЙЕ Ч terminfo . ч ДЕКУФЧЙФЕМШОПУФЙ, ОБЪЧБОЙЕ НПЦЕФ ЧЛМАЮБФШ ОЕУЛПМШЛП ЙНЕО, ТБЪДЕМЕООЩИ ЧЕТФЙЛБМШОПК ЮЕТФПК ( | ). рЕТЧПЕ ЙНС ДПМЦОП РТЕДУФБЧМСФШ УПВПК ОБЙВПМЕЕ ЮБУФП ЙУРПМШЪХЕНПЕ УПЛТБЭЕОЙЕ. рПУМЕДОЙН ДПМЦОП ХЛБЪЩЧБФШУС ЙНС, РПМОПУФША ЙДЕОФЙЖЙГЙТХАЭЕЕ ФЕТНЙОБМ. пВЩЮОП, ЬФП ОБЪЧБОЙЕ, ЛПФПТЩН РПМШЪХЕФУС ЖЙТНБ-РТПЙЪЧПДЙФЕМШ. чУЕ ЙНЕОБ НЕЦДХ РЕТЧЩН Й РПУМЕДОЙН ДПМЦОЩ ВЩФШ ЙЪЧЕУФОЩНЙ УЙОПОЙНБНЙ ЙНЕОЙ ФЕТНЙОБМБ. чУЕ ЙНЕОБ, ЛТПНЕ РПУМЕДОЕЗП, ЪБРЙУЩЧБАФУС УФТПЮОЩНЙ ВХЛЧБНЙ Й ОЕ ДПМЦОЩ УПДЕТЦБФШ РТПВЕМПЧ. еУФЕУФЧЕООП, РПУМЕДОЕЕ ЙНС ЛБЛ НПЦОП ВПМЕЕ ФПЮОП ЧПУРТПЙЪЧПДЙФ ОБЪЧБОЙЕ ЖЙТНЩ-РТПЙЪЧПДЙФЕМС.

    рТЙЧЕДЕН ОБЪЧБОЙЕ ЙЪ ПРЙУБОЙС ФЕТНЙОБМБ AT&T Teletype 5420:

    пВТБФЙФЕ ЧОЙНБОЙЕ, ЮФП Ч ОБЮБМЕ ЙДЕФ ОБЙВПМЕЕ ЮБУФП ЙУРПМШЪХЕНПЕ УПЛТБЭЕОЙЕ, Б Ч ЛПОГЕ — ПЖЙГЙБМШОПЕ ОБЪЧБОЙЕ ФЕТНЙОБМБ. ъБНЕФШФЕ ФБЛЦЕ, ЮФП ОБЪЧБОЙЕ ПЛБОЮЙЧБЕФУС ЪБРСФПК.

    рТЙЧЕДЕН ОБЪЧБОЙЕ ДМС ОБЫЕЗП ХУМПЧОПЗП ФЕТНЙОБМБ myterm:

    йНЕОБ ФЕТНЙОБМПЧ ДПМЦОЩ ХДПЧМЕФЧПТСФШ ПВЩЮОЩН УПЗМБЫЕОЙСН ПВ ЙНЕОБИ. ьФЙ УПЗМБЫЕОЙС ЛБУБАФУС, Ч ЮБУФОПУФЙ, ОБЮБМШОПЗП ЙНЕОЙ, ОБРТЙНЕТ, 5425 ЙМЙ myterm. ьФП ЙНС ОЕ ДПМЦОП УПДЕТЦБФШ УФТБООЩИ УЙНЧПМПЧ (ОБРТЙНЕТ, НЙОХУПЧ), ЛПФПТЩЕ НПЗХФ ОЕ ВЩФШ ТБУРПЪОБОЩ ЛБЛ ЮБУФШ УЙОПОЙНБ ЙНЕОЙ ФЕТНЙОБМБ. чПЪНПЦОЩЕ ТЕЦЙНЩ ПВПТХДПЧБОЙС Й РТЕДРПЮФЕОЙС РПМШЪПЧБФЕМС ХЛБЪЩЧБАФУС РХФЕН ДПВБЧМЕОЙС ЙНЕОЙ Й «ЙОДЙЛБФПТБ ТЕЦЙНБ» Ч ЛПОГЕ ЙНЕОЙ. оБРТЙНЕТ, ДМС ОБЫЕЗП ЖЙЛФЙЧОПЗП ФЕТНЙОБМБ ТЕЦЙН У ВПМШЫЙН ЮЙУМПН УЙНЧПМПЧ Ч УФТПЛЕ (ЮФП ПВПЪОБЮБЕФУС ЮЕТЕЪ -w ) ВХДЕФ ЪБРЙУБО Ч ЧЙДЕ myterm-w. дТХЗЙЕ ЙОДЙЛБФПТЩ РПДТПВОП ПВУХЦДБАФУС Ч term (5).

    4.1.2. чЩСУОЕОЙЕ ИБТБЛФЕТЙУФЙЛ ФЕТНЙОБМБ

    рПУМЕ УПЪДБОЙС ГЕРПЮЛЙ ЙНЕО, ДМС РТБЧЙМШОПЗП ПРЙУБОЙС ОПЧПЗП ФЕТНЙОБМБ УМЕДХЕФ ЧЩСУОЙФШ ЪОБЮЕОЙС ЕЗП ИБТБЛФЕТЙУФЙЛ. дМС ЬФПЗП чБН ОБДМЕЦЙФ УДЕМБФШ УМЕДХАЭЕЕ:

    • йЪХЮЙФШ ТХЛПЧПДУФЧП РП ТБВПФЕ У чБЫЙН ФЕТНЙОБМПН. ч ОЕН ДПМЦОБ УПДЕТЦБФШУС ЙОЖПТНБГЙС П ЧПЪНПЦОПУФСИ ФЕТНЙОБМБ Й УППФЧЕФУФЧХАЭЙИ ЙН РПУМЕДПЧБФЕМШОПУФСИ ХРТБЧМСАЭЙИ УЙНЧПМПЧ.
    • рТПЧЕТЙФШ, ЮФП РЕТЕДБЕФУС РТЙ ОБЦБФЙЙ ЛМБЧЙЫ чБЫЕЗП ФЕТНЙОБМБ, ЕУМЙ ЬФПК ЙОЖПТНБГЙЙ ОЕФ Ч ТХЛПЧПДУФЧЕ. ьФП НПЦОП УДЕМБФШ ПДОЙН ЙЪ УМЕДХАЭЙИ УРПУПВПЧ. чЧЕДЙФЕ ЙМЙ
    • рЕТЧБС УФТПЛБ ДМС ЛБЦДПЗП ЙЪ УРПУПВПЧ ФЕУФЙТПЧБОЙС ЗПФПЧЙФ ФЕТНЙОБМ Л ЧЩРПМОЕОЙА ФЕУФБ. CTRL+D РПНПЗБЕФ ЧЕТОХФШ ФЕТНЙОБМ Ч ОПТНБМШОЩК ТЕЦЙН.
    • уН. terminfo (4), ЗДЕ РЕТЕЮЙУМЕОЩ ЧУЕ ОБЪЧБОЙС ИБТБЛФЕТЙУФЙЛ ФЕТНЙОБМПЧ, ЛПФПТЩЕ ЙУРПМШЪХАФУС ДМС ЕЗП ПРЙУБОЙС. рПДТПВОПУФЙ ЙЪМБЗБАФУС Ч УМЕДХАЭЕН ТБЪДЕМЕ, хЛБЪБОЙЕ ИБТБЛФЕТЙУФЙЛ ФЕТНЙОБМБ.

    4.1.3. хЛБЪБОЙЕ ИБТБЛФЕТЙУФЙЛ ФЕТНЙОБМБ

    рПУМЕ ФПЗП, ЛБЛ чЩ ХСУОЙМЙ ИБТБЛФЕТЙУФЙЛЙ ФЕТНЙОБМБ, ЙИ ОЕПВИПДЙНП ХЛБЪБФШ Ч ЕЗП ПРЙУБОЙЙ. пРЙУБОЙЕ ЙНЕЕФ ЧЙД РПУМЕДПЧБФЕМШОПУФЙ ТБЪДЕМЕООЩИ ЪБРСФЩНЙ РПМЕК, ЛБЦДПЕ ЙЪ ЛПФПТЩИ УПДЕТЦЙФ РТЙОСФПЕ Ч terminfo УПЛТБЭЕОЙЕ ОБЪЧБОЙС ИБТБЛФЕТЙУФЙЛЙ Й, Ч ОЕЛПФПТЩИ УМХЮБСИ, ЕЕ ЪОБЮЕОЙЕ ДМС ДБООПЗП ФЕТНЙОБМБ. оБРТЙНЕТ, ДМС ХЛБЪБОЙС УРПУПВОПУФЙ ФЕТНЙОБМБ РПДБЧБФШ ЪЧХЛПЧПК УЙЗОБМ ЙУРПМШЪХЕФУС УПЛТБЭЕОЙЕ bel . оБ ВПМШЫЙОУФЧЕ ФЕТНЙОБМПЧ ЙОУФТХЛГЙЕК, РЕТЕДБЧБЕНПК ДМС РПДБЮЙ ЪЧХЛПЧПЗП УЙЗОБМБ, СЧМСЕФУС CTRL+G . фБЛЙН ПВТБЪПН, ИБТБЛФЕТЙУФЙЛБ ЧПЪНПЦОПУФЙ РПДБЮЙ ЪЧХЛПЧПЗП УЙЗОБМБ ЙЪПВТБЦБЕФУС Ч ПРЙУБОЙЙ ФЕТНЙОБМБ Ч ЧЙДЕ bel=^G, .

    пРЙУБОЙЕ ИБТБЛФЕТЙУФЙЛЙ НПЦЕФ ЪБОЙНБФШ ОЕУЛПМШЛП УФТПЛ. ч ПФМЙЮЙЕ ПФ РЕТЧПК УФТПЛЙ, УФТПЛЙ РТПДПМЦЕОЙС ДПМЦОЩ ОБЮЙОБФШУС У УЙНЧПМБ ФБВХМСГЙЙ ЙМЙ РТПВЕМБ. ч ПРЙУБОЙЕ НПЦОП ЧЛМАЮБФШ ЛПННЕОФБТЙЙ, ЛПФПТЩЕ ЧЩДЕМСАФУС УЙНЧПМПН # Ч ОБЮБМЕ УФТПЛЙ.

    рПМОЩК УРЙУПЛ ИБТБЛФЕТЙУФЙЛ, ЛПФПТЩЕ НПЦОП ХЛБЪЩЧБФШ Ч ПРЙУБОЙЙ ФЕТНЙОБМБ УН. Ч terminfo (4). ч ЬФПН УРЙУЛЕ РТЙЧПДСФУС ОБЪЧБОЙЕ ИБТБЛФЕТЙУФЙЛЙ, УПЛТБЭЕООПЕ ОБЪЧБОЙЕ, ЛПФПТПЕ ЙУРПМШЪХЕФУС Ч ВБЪЕ ДБООЩИ, ДЧХИВХЛЧЕООЩК ЛПД, УППФЧЕФУФЧХАЭЙК ЬФПК ИБТБЛФЕТЙУФЙЛЕ Ч ХУФБТЕЧЫЕК ВБЪЕ ДБООЩИ termcap, Б ФБЛЦЕ ЛТБФЛПЕ ПРЙУБОЙЕ ИБТБЛФЕТЙУФЙЛЙ. уПЛТБЭЕОЙЕ, ЛПФПТПЕ ОЕПВИПДЙНП ХЛБЪБФШ Ч ПРЙУБОЙЙ ФЕТНЙОБМБ УН. Ч ЛПМПОЛЕ «уПЛТБЭЕОЙЕ».

    рТЙНЕЮБОЙЕ юФПВЩ curses -РТПЗТБННБ НПЗМБ ТБВПФБФШ У ФЕТНЙОБМПН, ЕЗП ПРЙУБОЙЕ Ч ВБЪЕ ДБООЩИ terminfo ДПМЦОП ЧЛМАЮБФШ, ЛБЛ НЙОЙНХН, ИБТБЛФЕТЙУФЙЛЙ, ЛБУБАЭЙЕУС РЕТЕНЕЭЕОЙС ЛХТУПТБ ЧП ЧУЕИ ЮЕФЩТЕИ ОБРТБЧМЕОЙСИ Й ПЮЙУФЛЙ ЬЛТБОБ.

    ъОБЮЕОЙЕ ИБТБЛФЕТЙУФЙЛЙ НПЦЕФ ЪБДБЧБФШУС ЛМБЧЙЫЕК (ОБРТЙНЕТ, CTRL+G ), ЮЙУМПН, ЙМЙ ГЕРПЮЛПК УЙНЧПМПЧ, ПРТЕДЕМСАЭЕК РПУМЕДПЧБФЕМШОПУФШ ПРЕТБГЙК, ЛПФПТЩЕ ОХЦОП ЧЩРПМОЙФШ, ЮФПВЩ ДПВЙФШУС ОЕПВИПДЙНПЗП ЬЖЖЕЛФБ. дМС ХЛБЪБОЙС ФЙРБ ЪОБЮЕОЙС РПУМЕ ОБЪЧБОЙС ИБТБЛФЕТЙУФЙЛЙ Ч ПРЙУБОЙЙ ФЕТНЙОБМБ НПЗХФ ЙУРПМШЪПЧБФШУС ОЕЛПФПТЩЕ УРЕГЙБМШОЩЕ УЙНЧПМЩ, Б ЙНЕООП:

    # хЛБЪЩЧБЕФ, ЮФП ДБМЕЕ УМЕДХЕФ ЮЙУМПЧПЕ ЪОБЮЕОЙЕ ИБТБЛФЕТЙУФЙЛЙ. оБРТЙНЕТ, ЛПМЙЮЕУФЧП УФПМВГПЧ НПЦЕФ ПРТЕДЕМСФШУС Ч ЧЙДЕ cols#80 .
    = хЛБЪЩЧБЕФ, ЮФП ЪОБЮЕОЙЕ ИБТБЛФЕТЙУФЙЛЙ СЧМСЕФУС ГЕРПЮЛПК УЙНЧПМПЧ. ьФБ ГЕРПЮЛБ Ч ДЕКУФЧЙФЕМШОПУФЙ НПЦЕФ ВЩФШ РПУМЕДПЧБФЕМШОПУФША ЛПНБОД, ФТЕВХАЭЙИ ПФ ФЕТНЙОБМБ ЧЩРПМОЕОЙС ПРТЕДЕМЕООЩИ ДЕКУФЧЙК. ч ФБЛЙИ ГЕРПЮЛБИ НПЗХФ ЙУРПМШЪПЧБФШУС ОЕЛПФПТЩЕ УРЕГЙБМШОЩЕ УЙНЧПМЩ, Б ЙНЕООП:
    ^ пВПЪОБЮБЕФ ХРТБЧМСАЭЙК УЙНЧПМ. оБРТЙНЕТ, ЪЧХЛПЧПК УЙЗОБМ РПДБЕФУС РЕТЕДБЮЕК CTRL+G , ЮФП ЪБРЙУЩЧБЕФУС Ч ЧЙДЕ ^G .
    \e ЙМЙ \E ч УПРТПЧПЦДЕОЙЙ ЕЭЕ ЛБЛЙИ-МЙВП УЙНЧПМПЧ ПВПЪОБЮБАФ escape-РПУМЕДПЧБФЕМШОПУФЙ. оБРТЙНЕТ, \EC РЕТЕДБЕФУС ОБ ФЕТНЙОБМ Ч ЧЙДЕ ESC C .
    \n пВПЪОБЮБЕФ РЕТЕЧПД УФТПЛЙ.
    \l пВПЪОБЮБЕФ РЕТЕИПД Л ОПЧПК УФТПЛЕ.
    \r пВПЪОБЮБЕФ ЧПЪЧТБФ ЛБТЕФЛЙ.
    \t пВПЪОБЮБЕФ ЗПТЙЪПОФБМШОХА ФБВХМСГЙА.
    \b пВПЪОБЮБЕФ ЧПЪЧТБФ ОБ УЙНЧПМ ОБЪБД.
    \f пВПЪОБЮБЕФ РЕТЕИПД Л ОПЧПК УФТБОЙГЕ.
    \s пВПЪОБЮБЕФ РТПВЕМ.
    \nnn пВПЪОБЮБЕФ УЙНЧПМ У ЧПУШНЕТЙЮОЩН ЛПДПН nnn , ЗДЕ nnn НПЦЕФ ЙНЕФШ ПФ ПДОПК ДП ФТЕИ ГЙЖТ.
    $ ьФЙ УЙНЧПМЩ ЙУРПМШЪХАФУС ДМС ПВПЪОБЮЕОЙС ЪБДЕТЦЛЙ Ч НЙММЙУЕЛХОДБИ. дМЙФЕМШОПУФШ ЪБДЕТЦЛЙ ЪБЛМАЮБЕФУС Ч ХЗМПЧЩЕ УЛПВЛЙ ( <> ). пОБ НПЦЕФ ВЩФШ ГЕМЩН ЙМЙ ДЕУСФЙЮОЩН ЮЙУМПН У ПДОПК ГЙЖТПК РПУМЕ ФПЮЛЙ. рПУМЕ ЮЙУМБ НПЦЕФ УМЕДПЧБФШ ЪЧЕЪДПЮЛБ ( * ). ъЧЕЪДПЮЛБ ХЛБЪЩЧБЕФ, ЮФП ДМЙФЕМШОПУФШ ЪБДЕТЦЛЙ РТПРПТГЙПОБМШОБ ЛПМЙЮЕУФЧХ ЧПЧМЕЮЕООЩИ Ч ПРЕТБГЙА УФТПЛ. оБРТЙНЕТ, ЪБДЕТЦЛБ Ч 20 НЙММЙУЕЛХОД ОБ УФТПЛХ ХЛБЪЩЧБЕФУС Ч ЧЙДЕ $ . вПМЕЕ РПДТПВОХА ЙОЖПТНБГЙА П ЪБДЕТЦЛЕ Й УЙНЧПМБИ-ЪБРПМОЙФЕМСИ УН. Ч terminfo (4).

    йОПЗДБ ВЩЧБЕФ ОЕПВИПДЙНП ПФЛМАЮЙФШ ОЕЛПФПТХА ИБТБЛФЕТЙУФЙЛХ Ч ПРЙУБОЙЙ ФЕТНЙОБМБ. ьФП НПЦОП УДЕМБФШ, РПНЕУФЙЧ ФПЮЛХ ( . ) РЕТЕД УПЛТБЭЕООЩН ОБЪЧБОЙЕН ИБТБЛФЕТЙУФЙЛЙ, ФПЗДБ ПОБ ЧПУРТЙОЙНБЕФУС ЛБЛ ЛПННЕОФБТЙК. оБРТЙНЕТ, ЮФПВЩ ЪБЛПННЕОФЙТПЧБФШ ИБТБЛФЕТЙУФЙЛХ ЪЧХЛПЧПЗП УЙЗОБМБ, ОЕПВИПДЙНП ЪБРЙУБФШ ЕЕ ФБЛ: фЕРЕТШ, ЛПЗДБ НЩ ХЪОБМЙ, ЛБЛ ПРЙУЩЧБАФУС ИБТБЛФЕТЙУФЙЛЙ ФЕТНЙОБМБ, ПРЙЫЕН ЙИ ДМС myterm. нЩ ТБУУНПФТЙН ИБТБЛФЕТЙУФЙЛЙ ЬЛТБОБ, ЛМБЧЙБФХТЩ, ПУОПЧОЩЕ Й РБТБНЕФТЙЮЕУЛЙЕ ИБТБЛФЕТЙУФЙЛЙ.

    4.1.3.1. пУОПЧОЩЕ ИБТБЛФЕТЙУФЙЛЙ

    уМЕДХАЭЙЕ ИБТБЛФЕТЙУФЙЛЙ СЧМСАФУС ПВЭЙНЙ ДМС ВПМШЫЙОУФЧБ ФЕТНЙОБМПЧ: ЪЧХЛПЧПК УЙЗОБМ, ЛПМПОЛЙ Й УФТПЛЙ ОБ ЬЛТБОЕ, ЧПЪНПЦОПУФШ ОБДРЕЮБФЩЧБОЙС УЙНЧПМПЧ. рХУФШ ОБЫ ЗЙРПФЕФЙЮЕУЛЙК ФЕТНЙОБМ ЙНЕЕФ ЬФЙ Й ОЕЛПФПТЩЕ ДТХЗЙЕ РЕТЕЮЙУМЕООЩЕ ОЙЦЕ ЧПЪНПЦОПУФЙ. ъБНЕФШФЕ, ЮФП Ч УЛПВЛБИ РПУМЕ ЛБЦДПК ИБТБЛФЕТЙУФЙЛЙ УМЕДХЕФ ЕЕ УПЛТБЭЕОЙЕ ДМС terminfo :

    • бЧФПНБФЙЮЕУЛЙК РЕТЕИПД Ч ОБЮБМП УМЕДХАЭЕК УФТПЛЙ, ЛПЗДБ ЛХТУПТ ДПУФЙЗБЕФ РТБЧПК ЗТБОЙГЩ (am).
    • уРПУПВОПУФШ РПДБЧБФШ ЪЧХЛПЧПК УЙЗОБМ. лПНБОДПК РПДБЮЙ УЙЗОБМБ СЧМСЕФУС CTRL+G (bel).
    • ыЙТЙОБ ЬЛТБОБ — 80 ЛПМПОПЛ. (cols).
    • чЩУПФБ ЬЛТБОБ — 30 УФТПЛ. (lines).
    • йУРПМШЪХЕФУС РТПФПЛПМ xon/xoff (xon).

    пВЯЕДЙОЙЧ РПУМЕДПЧБФЕМШОПУФШ ЙНЕО (УН. ТБЪДЕМ оБЪЧБОЙЕ ФЕТНЙОБМБ) Й ПРЙУБОЙЕ ХРПНСОХФЩИ ИБТБЛФЕТЙУФЙЛ, НЩ РПМХЮЙН УМЕДХАЭЕЕ ПРЙУБОЙЕ ДМС ВБЪЩ ДБООЩИ terminfo :

    4.1.3.2. иБТБЛФЕТЙУФЙЛЙ ЬЛТБОБ

    ьФЙ ИБТБЛФЕТЙУФЙЛЙ ХРТБЧМСАФ УПДЕТЦЙНЩН ЬЛТБОБ. рХУФШ ФЕТНЙОБМ myterm ЙНЕЕФ РЕТЕЮЙУМЕООЩЕ ОЙЦЕ ИБТБЛФЕТЙУФЙЛЙ. пРСФШ-ФБЛЙ, Ч УЛПВЛБИ РПУМЕ ПРЙУБОЙС ИБТБЛФЕТЙУФЙЛЙ ДБЕФУС ЕЕ УПЛТБЭЕОЙЕ.

    • чПЪЧТБФХ ЛБТЕФЛЙ УППФЧЕФУФЧХЕФ CTRL+M (cr).
    • рЕТЕНЕЭЕОЙА ЛХТУПТБ ОБ ПДОХ УФТПЛХ ЧЧЕТИ УППФЧЕФУФЧХЕФ CTRL+K (cuu1).
    • рЕТЕНЕЭЕОЙА ЛХТУПТБ ОБ ПДОХ УФТПЛХ ЧОЙЪ УППФЧЕФУФЧХЕФ CTRL+J (cud1).
    • рЕТЕНЕЭЕОЙА ЛХТУПТБ ОБ ПДОХ УФТПЛХ ЧМЕЧП УППФЧЕФУФЧХЕФ CTRL+H (cub1).
    • рЕТЕНЕЭЕОЙА ЛХТУПТБ ОБ ПДОХ УФТПЛХ ЧРТБЧП УППФЧЕФУФЧХЕФ CTRL+L (cuf1).
    • рЕТЕИПДХ Л ЙОЧЕТФЙТПЧБООПНХ ПФПВТБЦЕОЙА УППФЧЕФУФЧХЕФ ESC D (smso).
    • пФНЕОЕ ЙОЧЕТФЙТПЧБООПЗП ПФПВТБЦЕОЙС УППФЧЕФУФЧХЕФ ESC Z (rmso).
    • рПУМЕДПЧБФЕМШОПУФША, ПЮЙЭБАЭЕК ДП ЛПОГБ УФТПЛЙ, СЧМСЕФУС ESC K , Й ЬФПФ РТПГЕУУ ДПМЦЕО УПРТПЧПЦДБФШУС ЪБДЕТЦЛПК Ч 3 НУ. (el).
    • рТПЙЪЧПДЙФУС ТПММЙТПЧБОЙЕ ЬЛТБОБ ФЕТНЙОБМБ РТЙ РПМХЮЕ- ОЙЙ РЕТЕЧПДБ УФТПЛЙ Ч ЛПОГЕ ЬЛТБОБ (ind).

    пРЙУБОЙЕ ФЕТНЙОБМБ myterm, ЧЛМАЮБАЭЕЕ ЬФЙ ИБТБЛФЕТЙУФЙЛЙ, ВХДЕФ ЧЩЗМСДЕФШ ФБЛ:

    4.1.3.3. иБТБЛФЕТЙУФЙЛЙ ЛМБЧЙБФХТЩ

    ьФЙ ИБТБЛФЕТЙУФЙЛЙ РТЕДУФБЧМСАФ УПВПК РПУМЕДПЧБФЕМШОПУФЙ УЙНЧП- МПЧ, ЗЕОЕТЙТХЕНЩЕ РТЙ ОБЦБФЙЙ ЛМБЧЙЫ ОБ ЛМБЧЙБФХТЕ ФЕТНЙОБМБ. вПМШЫЙОУФЧП ФЕТНЙОБМПЧ ЙНЕЕФ ТСД УРЕГЙБМШОЩИ ЛМБЧЙЫ, РП НЕОШЫЕК НЕТЕ, УФТЕМЛЙ Й ЛМБЧЙЫЙ ЪБВПС. рХУФШ ОБЫ ЗЙРПФЕФЙЮЕУЛЙК ФЕТНЙ- ОБМ ЙНЕЕФ ОЕУЛПМШЛП ФБЛЙИ ЛМБЧЙЫ, ЛПФПТЩЕ ЗЕОЕТЙТХАФ УМЕДХАЭЙЕ РПУМЕДПЧБФЕМШОПУФЙ:

    • ъБВПК — CTRL+H (kbs).
    • уФТЕМЛБ ЧЧЕТИ — ESC [A (kcuu1).
    • уФТЕМЛБ ЧОЙЪ — ESC [B (kcud1).
    • уФТЕМЛБ ЧРТБЧП — ESC [C (kcuf1).
    • уФТЕМЛБ ЧМЕЧП — ESC [D (kcub1).
    • лМБЧЙЫБ HOME — ESC [H (khome).

    дПВБЧЙН ЬФХ ЙОЖПТНБГЙА Л ОБЫЕНХ ПРЙУБОЙА:

    4.1.3.4. рБТБНЕФТЙЪПЧБООЩЕ ГЕРПЮЛЙ

    иБТБЛФЕТЙУФЙЛЙ, ЪОБЮЕОЙС ЛПФПТЩИ ЪБДБАФУС РБТБНЕФТЙЪПЧБООЩНЙ ГЕРПЮЛБНЙ, НПЗХФ ЙНЕФШ РБТБНЕФТЩ. оБРТЙНЕТ, ФБЛПЧЩ ИБТБЛФЕТЙУФЙЛЙ, ПРЙУЩЧБАЭЙЕ РПЪЙГЙПОЙТПЧБОЙЕ ЛХТУПТБ ОБ ЬЛТБОЕ, ЙМЙ ЧЛМАЮЕОЙЕ ЛПНВЙОБГЙЙ ТЕЦЙНПЧ ПФПВТБЦЕОЙС. дМС РПЪЙГЙПОЙТПЧБОЙС ЛХТУПТБ ЙУРПМШЪХЕФУС ИБТБЛФЕТЙУФЙЛБ cup, РТЙ ЬФПН РЕТЕДБАФУС ДЧБ РБТБНЕФТБ: ОПНЕТ УФТПЛЙ Й ОПНЕТ УФПМВГБ. ч УМХЮБЕ ФБЛЙИ ИБТБЛФЕТЙУФЙЛ, ЛБЛ cup ЙМЙ sgr (ХУФБОПЧЛБ БФТЙВХФПЧ), РБТБНЕФТЩ РЕТЕДБАФУС ЮЕТЕЪ ЧИПДСЭХА Ч terminfo РПДРТПЗТБННХ tparm() .

    бТЗХНЕОФЩ РБТБНЕФТЙЮЕУЛЙИ ИБТБЛФЕТЙУФЙЛ ПВТБВБФЩЧБАФУС УПЗМБУОП ЧЛМАЮЕООЩН Ч ПРЙУБОЙС ЬФЙИ ИБТБЛФЕТЙУФЙЛ УРЕГЙБМШОЩН РПУМЕДПЧБ- ФЕМШОПУФСН УЙНЧПМПЧ, ЛПФПТЩЕ ОБЮЙОБАФУС У % . ьФЙ РПУМЕДПЧБФЕМШОПУФЙ РПИПЦЙ ОБ ФЕ, ЛПФПТЩЕ ЙУРПМШЪХАФУС Ч printf (3S). лТПНЕ ФПЗП, ДБООЩЕ НПЦОП ЪБРЙУБФШ Ч УФЕЛ Й РТПЙЪЧПДЙФШ ОБД ОЙНЙ ПРЕТБГЙЙ, ЛПФПТЩЕ ЪБРЙУЩЧБАФУС Ч ЧЙДЕ, ВМЙЪЛПН Л ПВТБФОПК РПМШУЛПК ЪБРЙУЙ. лБЛ НЩ ХРПНСОХМЙ, cup ЙНЕЕФ ДЧБ БТЗХНЕОФБ: ОПНЕТ УФТПЛЙ Й ОПНЕТ УФПМВГБ. sgr ЙНЕЕФ ДЕЧСФШ БТЗХНЕОФПЧ, РП ПДОПНХ ОБ ЛБЦДЩК ЙЪ БФТЙВХФПЧ ПФПВТБЦЕОЙС. уРЙУПЛ БТЗХНЕОФПЧ sgr Й РПТСДПЛ ЙИ УМЕДПЧБОЙС, Б ФБЛЦЕ РТЙНЕТЩ УН. Ч terminfo (4).

    рХУФШ ОБ ОБЫЕН ФЕТНЙОБМЕ ЛХТУПТ РПЪЙГЙПОЙТХЕФУС РПУМЕДПЧБФЕМШОПУФША, УПУФПСЭЕК ЙЪ УЙНЧПМПЧ ESC [ , ЪБ ЛПФПТЩНЙ УМЕДХАФ ОПНЕТБ УФТПЛЙ Й УФПМВГБ, ТБЪДЕМЕООЩЕ ФПЮЛПК У ЪБРСФПК, Б Ч ЛПОГЕ ЙДЕФ H . лППТДЙОБФЩ ЪБДБАФУС ПФОПУЙФЕМШОП 1, Б ОЕ ОХМС. фБЛ, ЮФПВЩ РЕТЕДЧЙОХФШ ЛХТУПТ Ч РПЪЙГЙА (5, 18) ПФОПУЙФЕМШОП (0, 0), ОЕПВ- ИПДЙНП РЕТЕДБФШ РПУМЕДПЧБФЕМШОПУФШ \E[6;19H .

    гЕМПЮЙУМЕООЩЕ БТЗХНЕОФЩ ЪБРЙУЩЧБАФУС Ч УФЕЛ РПУМЕДПЧБФЕМШОПУФША %p , ЪБ ЛПФПТПК УМЕДХЕФ ОПНЕТ БТЗХНЕОФБ, ОБРТЙНЕТ, %p2 ДМС ЪБРЙУЙ Ч УФЕЛ ЧФПТПЗП БТЗХНЕОФБ. %i — ЬФП ЛТБФЛБС ЪБРЙУШ ДМС ХЧЕМЙЮЕОЙС РЕТЧЩИ ДЧХИ БТЗХНЕОФПЧ. дМС ЧЩЧПДБ ЮЙУМБ ЙЪ ЧЕТЫЙОЩ УФЕЛБ Ч ДЕУСФЙЮОПН ЧЙДЕ ЙУРПМШЪХЕФУС %d , ЛБЛ Й Ч printf . рПУМЕДПЧБФЕМШОПУФШ cup ОБЫЕЗП ФЕТНЙОБМБ УФТПЙФУС УМЕДХАЭЙН ПВТБЪПН:

    cup= рПСУОЕОЙС
    \E[ ЧЩЧЕУФЙ ESC [
    %i ХЧЕМЙЮЙФШ ПВБ БТЗХНЕОФБ
    %p1 ЪБРЙУБФШ РЕТЧЩК БТЗХНЕОФ (ОПНЕТ УФТПЛЙ) Ч УФЕЛ
    %d ЧЩЧЕУФЙ ОПНЕТ УФТПЛЙ Ч ДЕУСФЙЮОПН ЧЙДЕ
    ; ЧЩЧЕУФЙ ФПЮЛХ У ЪБРСФПК
    %p2 ЪБРЙУБФШ ЧФПТПК БТЗХНЕОФ (ОПНЕТ УФПМВГБ Ч УФЕЛ)
    %d ЧЩЧЕУФЙ ОПНЕТ УФПМВГБ Ч ДЕУСФЙЮОПН ЧЙДЕ
    H ЧЩЧЕУФЙ ЪБЧЕТЫБАЭЙК ГЕРПЮЛХ УЙНЧПМ H

    дПВБЧЙЧ ЬФП Л ОБЫЕНХ ПРЙУБОЙА, РПМХЮЙН:

    рПДТПВОЕЕ П РБТБНЕФТЙЪПЧБООЩИ ГЕРПЮЛБИ УН. terminfo (4).

    4.1.4. лПНРЙМСГЙС ПРЙУБОЙС

    пРЙУБОЙС ФЕТНЙОБМПЧ Ч ВБЪЕ ДБООЩИ terminfo РЕТЕЧПДСФУС ЙЪ ЙУИПДОПЗП Ч ЛПНРЙМЙТПЧБООЩК ЖПТНБФ ЛПНРЙМСФПТПН tic (1M).

    йУИПДОЩК ЖБКМ У ПРЙУБОЙЕН ПВЩЮОП ЙНЕЕФ ТБУЫЙТЕОЙЕ .ti . оБРТЙНЕТ, ПРЙУБОЙЕ myterm ВХДЕФ ОБЪЩЧБФШУС myterm.ti . уЛПНРЙМЙТПЧБООПЕ ПРЙУБОЙЕ myterm ПВЩЮОП РПНЕЭБЕФУС Ч /usr/lib/terminfo/m/ myterm, ФБЛ ЛБЛ ОБЪЧБОЙЕ ФЕТНЙОБМБ ОБЮЙОБЕФУС ОБ m . myterm ВХДЕФ ФБЛЦЕ ЙНЕФШ УЙОПОЙНЩ, ОБРТЙНЕТ, /f/fancy . еУМЙ РЕТЕД ЛПНРЙМСГЙЕК ХУФБОПЧМЕОП Й РПНЕЭЕОП Ч ПЛТХЦЕОЙЕ ЪОБЮЕОЙЕ РЕТЕНЕООПК $TERMINFO , УЛПНРЙМЙТПЧБООПЕ ПРЙУБОЙЕ ВХДЕФ РПНЕЭЕОП Ч ЛБФБМПЗ $TERMINFO . ч ЬФПН УМХЮБЕ ЧУЕ РТПЗТБННЩ ВХДХФ ЙУЛБФШ ПРЙУБОЙЕ ФЕТНЙОБМБ УОБЮБМБ Ч ЛБФБМПЗЕ $TERMINFO , Б ЪБФЕН ХЦЕ Ч РПДТБЪХНЕЧБЕНПН ЛБФБМПЗЕ /usr/lib/terminfo . пВЭЙК ЖПТНБФ ЛПНБОДОПК УФТПЛЙ ДМС ЪБРХУЛБ ЛПНРЙМСФПТБ tic ФБЛПЧ:

    пРГЙС -v ФТЕВХЕФ ЧЩЧПДЙ ФТБУУЙТПЧПЮОПК ЙОЖПТНБГЙЙ П ИПДЕ ЛПНРЙМСГЙЙ ЖБКМБ. пРГЙС -c ЪБДБЕФ РПЙУЛ ПЫЙВПЛ Ч ПРЙУБОЙЙ, ПОБ НПЦЕФ ЙУРПМШЪПЧБФШУС ПДОПЧТЕНЕООП У -v . еУМЙ ОХЦОП УЛПНРЙМЙТПЧБФШ УТБЪХ ОЕУЛПМШЛП ЖБКМПЧ, УМЕДХЕФ РТЕЦДЕ ЧПУРПМШЪПЧБФШУС ЛПНБОДПК cat (1) ДМС ЙИ ПВЯЕДЙОЕОЙС. рТЙЧЕДЕООБС ОЙЦЕ ЛПНБОДОБС УФТПЛБ ЪБДБЕФ ЛПНРЙМСГЙА ПРЙУБОЙС terminfo ДМС ОБЫЕЗП ЗЙРПФЕФЙЮЕУЛПЗП ФЕТНЙОБМБ:

    рПДТПВОХА ЙОЖПТНБГЙА П ЛПНРЙМСФПТЕ УН. Ч уРТБЧПЮОЙЛЕ БДНЙОЙУФТБФПТБ, tic (1M).

    4.1.5. фЕУФЙТПЧБОЙЕ ПРЙУБОЙС

    тБУУНПФТЙН ФТЙ УРПУПВБ ФЕУФЙТПЧБОЙС ПРЙУБОЙС ФЕТНЙОБМБ. чП-РЕТЧЩИ, НПЦОП ХУФБОПЧЙФШ ЪОБЮЕОЙЕ РЕТЕНЕООПК ПЛТХЦЕОЙС $TERMINFO ТБЧОЩН ЙНЕОЙ ЛБФБМПЗБ, УПДЕТЦБЭЕЗП ЬФП ПРЙУБОЙЕ. еУМЙ РТПЗТБННЩ ЧЩРПМОСАФУС ОБ ОПЧПН ФЕТНЙОБМЕ ФБЛ ЦЕ, ЛБЛ ПОЙ ДЕМБМЙ ЬФП ОБ ДТХЗЙИ ФЕТНЙОБМБИ, ОПЧПЕ ПРЙУБОЙЕ РТЙЗПДОП ДМС ЙУРПМШЪПЧБОЙС.

    чП-ЧФПТЩИ, НПЦОП РТПЧЕТЙФШ РТБЧЙМШОПУФШ ЪБРПМОЕОЙС ЬЛТБОБ РТЙ ЧУФБЧЛЕ УФТПЛ, ДМС ЮЕЗП ЪБЛПННЕОФЙТПЧБФШ ИБТБЛФЕТЙУФЙЛХ xon Ч ПРЙУБОЙЙ ФЕТНЙОБМБ Й ТЕДБЛФЙТПЧБФШ РТЙ РПНПЭЙ vi (1) ВПМШЫПК ЖБКМ (ОЕ НЕОЕЕ УФБ УФТПЛ) РТЙ УЛПТПУФЙ РЕТЕДБЮЙ 9600 ВПД, ЕУМЙ ЬФП ЧПЪНПЦОП. хДБМЙФЕ ПЛПМП 15 УФТПЛ Ч УЕТЕДЙОЕ ЬЛТБОБ Й ВЩУФТП ОБЦНЙФЕ ОЕУЛПМШЛП ТБЪ u (ПФНЕОЙФШ ПРЕТБГЙА). еУМЙ УПДЕТЦЙНПЕ ЬЛТБОБ РПТФЙФУС, ФП, ЧЕТПСФОП, ОХЦОП ХЧЕМЙЮЙФШ ЧТЕНС ЪБДЕТЦЛЙ. рТЙНЕТОП ФБЛПК ЦЕ ФЕУФ НПЦОП ЙУРПМШЪПЧБФШ ДМС РТПЧЕТЛЙ ЧУФБЧЛЙ УЙНЧПМБ.

    ч-ФТЕФШЙИ, НПЦОП ЧПУРПМШЪПЧБФШУС ЛПНБОДПК tput (1). ьФБ ЛПНБОДБ ЧЩЧПДЙФ ЪОБЮЕОЙЕ ИБТБЛФЕТЙУФЙЛЙ — ЮЙУМПЧПЕ ЙМЙ ФЕЛУФПЧПЕ, Ч ЪБЧЙУЙНПУФЙ ПФ ЕЕ ФЙРБ. еУМЙ ИБТБЛФЕТЙУФЙЛБ ВХМЕЧБ, tput ОЙЮЕЗП ОЕ ЧЩЧПДЙФ, ОП ЧПЪЧТБЭБЕФ ЛПД ЪБЧЕТЫЕОЙС (0, ЕУМЙ ЙУФЙОБ, 1, ЕУМЙ МПЦШ). пВЭЙК ЖПТНБФ ЛПНБОДЩ tput ФБЛПЧ: пРГЙС -TФЙР ЪБДБЕФ ФЙР ФЕТНЙОБМБ, П ЛПФПТПН ЧЩ ЪБРТБЫЙЧБЕФЕ ЙОЖПТНБГЙА. пВЩЮОП ЬФХ ПРГЙА ХЛБЪЩЧБФШ ОЕ ФТЕВХЕФУС, ФБЛ ЛБЛ РП ХНПМЮБОЙА Ч ЛБЮЕУФЧЕ ЙНЕОЙ ФЕТНЙОБМБ ВЕТЕФУС ЪОБЮЕОЙЕ РЕТЕНЕООПК ПЛТХЦЕОЙС $TERM . рПМЕ ИБТБЛФЕТЙУФЙЛБ ХЛБЪЩЧБЕФ, ЪОБЮЕОЙЕ ЛБЛПК ИБТБЛФЕТЙУФЙЛЙ ОБДП ЙЪЧМЕЮШ ЙЪ ВБЪЩ ДБООЩИ terminfo .

    уМЕДХАЭБС ЛПНБОДОБС УФТПЛБ РПЛБЪЩЧБЕФ, ЛБЛ ЧЩЧПДЙФУС ОБ ЬЛТБО РПУМЕДПЧБФЕМШОПУФШ ДМС ПЮЙУФЛЙ ЬЛТБОБ:

    уМЕДХАЭБС ЛПНБОДОБС УФТПЛБ РПЛБЪЩЧБЕФ, ЛБЛ ПФПВТБЪЙФШ ОБ ФЕТНЙОБМЕ ЛПМЙЮЕУФЧП ЛПМПОПЛ, ЙНЕАЭЙИУС ОБ ЕЗП ЬЛТБОЕ:

    вПМЕЕ РПДТПВОХА ЙОЖПТНБГЙА П ЛПНБОДЕ tput Й ЧЩЧПДЙНЩИ ЕК УППВЭЕОЙСИ УН. Ч уРТБЧПЮОЙЛЕ РПМШЪПЧБФЕМС, tput (1).

    4.2. рЕЮБФШ Й УТБЧОЕОЙЕ ПРЙУБОЙК Ч ВБЪЕ ДБООЩИ terminfo

    йОПЗДБ ВЩЧБЕФ ОЕПВИПДЙНП УТБЧОЙФШ ПРЙУБОЙС ДЧХИ ФЕТНЙОБМПЧ ЙМЙ РТПУНПФТЕФШ ПРЙУБОЙЕ, ОЕ ПВТБЭБСУШ Л ЛБФБМПЗХ, УПДЕТЦБЭЕНХ ЙУИПДОЩЕ ФЕЛУФЩ ПРЙУБОЙК terminfo . ч ПВПЙИ УМХЮБСИ НПЦОП ЧПУРПМШЪПЧБФШУС ЛПНБОДПК infocmp(1M). уТБЧОЙФШ ДЧБ ПРЙУБОЙС ПДОПЗП Й ФПЗП ЦЕ ФЕТНЙОБМБ НПЦОП, ОБРТЙНЕТ, ФБЛ:

    ьФБ РПУМЕДПЧБФЕМШОПУФШ ЛПНБОД УТБЧОЙЧБЕФ УФБТПЕ Й ОПЧПЕ ПРЙУБОЙС ФЕТНЙОБМБ 5420.

    юФПВЩ РПМХЮЙФШ ЙУИПДОЩК ФЕЛУФ ПРЙУБОЙС terminfo ДМС 5420, ЧЧЕДЙФЕ

    4.3. рТЕПВТБЪПЧБОЙЕ termcap-ПРЙУБОЙС Ч terminfo-ПРЙУБОЙЕ

    рТЕДПУФЕТЕЦЕОЙЕ вБЪБ ДБООЩИ terminfo ТБЪТБВПФБОБ Ч ЛБЮЕУФЧЕ ЪБНЕОЩ ВБЪЩ ДБООЩИ termcap . фБЛПК РЕТЕИПД ОЕМШЪС ЧЩРПМОЙФШ НЗОПЧЕООП, РПУЛПМШЛХ У ЙУРПМШЪПЧБОЙЕН termcap (Й ДМС ТБВПФЩ У ОЕК) ОБРЙУБОП НОПЦЕУФЧП РТПЗТБНН Й РТПГЕУУПЧ. мАВПК РЕТЕИПД ПФ termcap Л terminfo ФТЕВХЕФ ОЕЛПФПТПЗП ПРЩФБ ТБВПФЩ У ПВЕЙНЙ ВБЪБНЙ ДБООЩИ. у ПРЙУБОЙСНЙ Ч ЬФЙИ ВБЪБИ ДБООЩИ ОЕПВИПДЙНП ПВТБЭБФШУС ЧЕУШНБ ПУФПТПЦОП, РПУЛПМШЛХ ПФ ОЙИ ЪБЧЙУЙФ РТБЧЙМШОПЕ ЖХОЛГЙПОЙТПЧБОЙЕ чБЫЕЗП ФЕТНЙОБМБ. лПНБОДБ captoinfo (1M) РТЕПВТБЪХЕФ ПРЙУБОЙЕ Ч ЖПТНБФЕ termcap(4) Ч ПРЙУБОЙЕ Ч ЖПТНБФЕ terminfo (4). captoinfo РПМХЮБЕФ ЖБКМ Ч ЖПТНБФЕ termcap Й ЧЩЧПДЙФ ЬЛЧЙЧБМЕОФОПЕ ПРЙУБОЙЕ Ч ЖПТНБФЕ terminfo ОБ УФБОДБТФОЩК ЧЩЧПД. оБРТЙНЕТ, ЛПНБОДОБС УФТПЛБ

    РТЕПВТБЪХЕФ ЖБКМ /etc/termcap Ч ЙУИПДОЩК ФЕЛУФ Ч ЖПТНБФЕ terminfo , У УПИТБОЕОЙЕН ЛПННЕОФБТЙЕЧ Й ДТХЗПК ЙОЖПТНБГЙЙ, ОЕ ПФОПУСЭЕКУС УПВУФЧЕООП Л ПРЙУБОЙА, ЕУМЙ ПОБ РТЙУХФУФЧХЕФ. лПНБОДОБС УФТПЛБ

    ЙЭЕФ ПРЙУБОЙЕ ФЕЛХЭЕЗП ФЕТНЙОБМБ Ч ВБЪЕ ДБООЩИ termcap (ПОЙ ЪБДБАФУС ЪОБЮЕОЙСНЙ РЕТЕНЕООЩИ ПЛТХЦЕОЙС $TERM Й $TERMCAP УППФЧЕФУФЧЕООП) Й РТЕПВТБЪХЕФ ЕЗП Ч ЖПТНБФ terminfo .

    еУМЙ ОХЦОЩ ПРЙУБОЙС ФЕТНЙОБМБ ЛБЛ Ч ЖПТНБФЕ termcap , ФБЛ Й Ч ЖПТНБФЕ terminfo , НПЦОП ИТБОЙФШ ФПМШЛП ПРЙУБОЙЕ terminfo Й ЙУРПМШЪПЧБФШ infocmp -C ДМС РПМХЮЕОЙС ПРЙУБОЙС Ч ЖПТНБФЕ termcap .

    еУМЙ чЩ ЛПНРЙМЙТПЧБМЙ РТПЗТБННЩ ЛПНБОДПК cc (1) У ПРГЙСНЙ -ltermcap ЙМЙ -ltermlib , ПОЙ ВХДХФ ТБВПФПУРПУПВОЩ Й Ч ДБМШОЕКЫЕН. пДОБЛП, ЧНЕУФП ЬФЙИ ПРГЙК УМЕДХЕФ ЙУРПМШЪПЧБФШ -lcurses .

    5. ртйнетщ ртпзтбнн, тбвпфбаэйи у CURSES

    дБМЕЕ РТЙЧПДСФУС РТЙНЕТЩ, ДЕНПОУФТЙТХАЭЙЕ ЙУРПМШЪПЧБОЙЕ РПДРТПЗТБНН curses .

    5.1. рТПЗТБННБ editor

    ъДЕУШ РПДРТПЗТБННЩ curses ЙУРПМШЪХАФУС ДМС УПЪДБОЙС ТЕДБЛФПТБ ФЕЛУФПЧ. дМС РТПУФПФЩ РТПЗТБННБ editor ИТБОЙФ ВХЖЕТ Ч stdscr ; СУОП, ЮФП Ч ОБУФПСЭЕН ТЕДБЛФПТЕ УМЕДПЧБМП ВЩ ЙНЕФШ ПФДЕМШОХА УФТХЛФХТХ ДМС ВХЖЕТБ. ч ЬФПК РТПЗТБННЕ ЕУФШ Й ДТХЗЙЕ ХРТПЭЕОЙС: ОЕ РТЕДХУНБФТЙЧБЕФУС ТЕДБЛФЙТПЧБОЙЕ ЖБКМПЧ, УПДЕТЦБЭЙИ ВПМШЫЕ УФТПЛ, ЮЕН РПНЕЭБЕФУС ОБ ЬЛТБОЕ, МЙВП УП УФТПЛБНЙ, ДМЙОБ ЛПФПТЩИ ВПМШЫЕ ДМЙОЩ УФТПЛЙ ОБ ЬЛТБОЕ; УЮЙФБЕФУС, ЮФП ЖБКМ ОЕ УПДЕТЦЙФ ХРТБЧМСАЭЙИ УЙНЧПМПЧ.

    пВ ЬФПК РТПЗТБННЕ УФПЙФ УЛБЪБФШ УМЕДХАЭЕЕ. чП-РЕТЧЩИ, ПОБ ЙУРПМШЪХЕФ РПДРТПЗТБННЩ move() , mvaddstr() , flash() , wnoutrefresh() , clrtoeol() . ьФЙ РПДРТПЗТБННЩ ТБУУНБФТЙЧБМЙУШ Ч ТБЪДЕМЕ йУРПМШЪПЧБОЙЕ РПДРТПЗТБНН РБЛЕФБ curses .

    чП-ЧФПТЩИ, Ч ОЕК РТЙНЕОСАФУС ОЕЛПФПТЩЕ РПДРТПЗТБННЩ curses , П ЛПФПТЩИ НЩ ТБОЕЕ ОЕ ХРПНЙОБМЙ. оБРТЙНЕТ, ЖХОЛГЙС, ПУХЭЕУФЧМСАЭБС ЪБРЙУШ ЖБКМБ, ПВТБЭБЕФУС Л РПДРТПЗТБННЕ mvinch() , ЛПФПТБС ЧПЪЧТБЭБЕФ УЙНЧПМ, ОБИПДСЭЙКУС Ч ХЛБЪБООПК РПЪЙГЙЙ ПЛОБ. уФТХЛФХТБ ДБООЩИ, ЙУРПМШЪХЕНБС ДМС ЪБРЙУЙ ЖБКМБ, ОЕ УПДЕТЦЙФ ЙОЖПТНБГЙЙ П ДМЙОЕ УФТПЛ Й ЙИ ЛПМЙЮЕУФЧЕ Ч ЖБКМЕ, РПЬФПНХ РТЙ ЪБРЙУЙ ХОЙЮФПЦБАФУС ИЧПУФПЧЩЕ РТПВЕМЩ. рТПЗТБННБ ЙУРПМШЪХЕФ ФБЛЦЕ РПДРТПЗТБННЩ insch() , delch() , insertln() , deleteln() , ЛПФПТЩЕ ЧУФБЧМСАФ ЙМЙ ХДБМСАФ УЙНЧПМ ЙМЙ УФТПЛХ. йОЖПТНБГЙА ПВ ЬФЙИ РПДРТПЗТБННБИ УН. Ч curses (3X).

    ч-ФТЕФШЙИ, ЬФПФ ТЕДБЛФПТ ЧПУРТЙОЙНБЕФ Ч ЛБЮЕУФЧЕ ЛПНБОД ЛБЛ УРЕГЙБМШОЩЕ ЛМБЧЙЫЙ, ФБЛ Й УЙНЧПМЩ ASCII. у ПДОПК УФПТПОЩ, ДМС ОПЧЙЮЛПЧ ВПМЕЕ ХДПВЕО Ч ПУЧПЕОЙЙ ТЕДБЛФПТ, ЙУРПМШЪХАЭЙК УРЕГЙБМШОЩЕ ЛМБЧЙЫЙ. йН МЕЗЮЕ ЙУРПМШЪПЧБФШ УФТЕМЛЙ ДМС РЕТЕНЕЭЕОЙС ЛХТУПТБ, ЮЕН ЪБРПНОЙФШ, ЮФП ВХЛЧЕ h УППФЧЕФУФЧХЕФ ДЧЙЦЕОЙЕ ЧМЕЧП, j — ЧОЙЪ, k — ЧЧЕТИ, Б l — ЧРТБЧП. у ДТХЗПК УФПТПОЩ, ПРЩФОЩЕ РПМШЪПЧБФЕМЙ ПВЩЮОП РТЕДРПЮЙФБАФ ЙУРПМШЪПЧБФШ УЙНЧПМЩ ASCII, ФБЛ ЛБЛ Ч ЬФПН УМХЮБЕ ОЕ ОХЦОП РЕТЕОПУЙФШ РБМШГЩ Ч ФХ ЮБУФШ ЛМБЧЙБФХТЩ, ЗДЕ ОБИПДСФУС УРЕГЙБМШОЩЕ ЛМБЧЙЫЙ.

    рТЙНЕЮБОЙЕ чБЫБ curses -РТПЗТБННБ УНПЦЕФ ТБВПФБФШ У ВПМЕЕ ЫЙТПЛЙН ОБВПТПН ФЕТНЙОБМПЧ, ЕУМЙ Ч ОЕК У ЛБЦДПК УРЕГЙБМШОПК ЛМБЧЙЫЕК ВХДЕФ УЧСЪБО УЙНЧПМ ASCII, РПУЛПМШЛХ ОЕ ОБ ЛБЦДПН ФЕТНЙОБМЕ ЛМБЧЙБФХТБ ЧЛМАЮБЕФ, ОБРТЙНЕТ, УФТЕМЛЙ.

    ч-ЮЕФЧЕТФЩИ, ЛПНБОДБ CTRL+L ЧЩРПМОСЕФ ЖХОЛГЙА, ЛПФПТХА ДПМЦОЩ ЙНЕФШ ВПМШЫЙОУФЧП curses -РТПЗТБНН. уМХЮБЕФУС ФБЛ, ЮФП ДТХЗЙЕ РТПЗТБННЩ ЧЩЧПДСФ ЮФП-МЙВП ОБ ЬЛТБО (ОБРТЙНЕТ, РТЙ РЕТЕДБЮЕ УППВЭЕОЙК), МЙВП ЬЛТБО РПТФЙФУС Ч ТЕЪХМШФБФЕ УВПЕЧ ПВПТХДПЧБОЙС. ч ЬФПН УМХЮБЕ РПМШЪПЧБФЕМШ НПЦЕФ ЧЧЕУФЙ CTRL+L , Ч ТЕЪХМШФБФЕ ЮЕЗП ЬЛТБО ПЮЙЭБЕФУС Й ЪБРПМОСЕФУС ЧОПЧШ РПУТЕДУФЧПН

    оБЛПОЕГ, ЕЭЕ ПДОПК ЧБЦОПК ПУПВЕООПУФША СЧМСЕФУС ФП, ЮФП ЧЧПДЙНЩЕ ЛПНБОДЩ ЪБЛБОЮЙЧБАФУС ОБЦБФЙЕН CTRL+D , Б ОЕ ESC . вЩМП ВЩ УПВМБЪОЙФЕМШОП ЙУРПМШЪПЧБФШ ESC , ФБЛ ЛБЛ ЬФБ ЛМБЧЙЫБ СЧМСЕФУС ПДОПК ЙЪ ОЕНОПЗЙИ, РТЙУХФУФЧХАЭЙИ ОБ МАВПК ЛМБЧЙБФХТЕ (ОБТСДХ У RETURN Й BREAK ). пДОБЛП, ЬФП НПЦЕФ РТЙЧЕУФЙ Л ЧПЪОЙЛОПЧЕОЙА ДЧХУНЩУМЕООПУФЙ. вПМШЫЙОУФЧП ФЕТНЙОБМПЧ ЙУРПМШЪХЕФ РПУМЕДПЧБФЕМШОПУФЙ УЙНЧПМПЧ, ОБЮЙОБАЭЙЕУС У ESC ДМС ХРТБЧМЕОЙС ФЕТНЙОБМПН Й ЙНЕАФ ЛМБЧЙЫЙ, РТЙ ОБЦБФЙЙ ОБ ЛПФПТЩЕ РЕТЕДБАФУС ФБЛЙЕ РПУМЕДПЧБФЕМШОПУФЙ. еУМЙ РТПЗТБННБ РПМХЮБЕФ У ЛМБЧЙБФХТЩ ESC , ПОБ ОЕ НПЦЕФ ТБЪМЙЮЙФШ, ОБЦБМ МЙ РПМШЪПЧБФЕМШ ESC ЙМЙ ДТХЗХА ЖХОЛГЙПОБМШОХА ЛМБЧЙЫХ.

    Editor Й ДТХЗЙЕ ЙУРПМШЪХАЭЙЕ curses РТПЗТБННЩ ТЕЫБАФ ЬФХ РТПВМЕНХ, ХУФБОБЧМЙЧБС ФБКНЕТ. еУМЙ ЪБ ОЕЛПФПТЩК ЙОФЕТЧБМ ЧТЕНЕОЙ РТЙИПДЙФ ЕЭЕ УЙНЧПМ Й ПО НПЦЕФ ВЩФШ ОБЮБМПН РПУМЕДПЧБФЕМШОПУФЙ, ЛПФПТХА ЗЕОЕТЙТХЕФ ЖХОЛГЙПОБМШОБС ЛМБЧЙЫБ, РТПЗТБННБ РЩФБЕФУС ЮЙФБФШ РПУМЕДХАЭЙЕ УЙНЧПМЩ ДП ФЕИ РПТ, РПЛБ ОЕ ВХДЕФ УЮЙФБОБ ЧУС РПУМЕДПЧБФЕМШОПУФШ ДМС ЖХОЛГЙПОБМШОПК ЛМБЧЙЫЙ, МЙВП УЙНЧПМ, ЛПФПТЩК ОЕ НПЦЕФ ВЩФШ ЮБУФША ФБЛПК РПУМЕДПЧБФЕМШОПУФЙ, МЙВП РПЛБ ОЕ ЙУФЕЮЕФ ПРТЕДЕМЕООПЕ ЧТЕНС. ьФБ УФТБФЕЗЙС ИПТПЫБ, ОП ОЕ БВУПМАФОП ОБДЕЦОБ. рПМШЪПЧБФЕМШ НПЦЕФ ОБЦБФШ ESC Й УТБЪХ ЪБ ОЕК ЕЭЕ ЛМБЧЙЫХ, Й ФПЗДБ curses -РТПЗТБННБ ТЕЫЙФ, ЮФП ВЩМБ ОБЦБФБ ЖХОЛГЙПОБМШОБС ЛМБЧЙЫБ. лТПНЕ ФПЗП, ESC ОЕ УТБЪХ РЕТЕДБЕФУС ПВТБВБФЩЧБАЭЕК РТПЗТБННЕ, Ч ТЕЪХМШФБФЕ ЮЕЗП РПУМЕДОСС НЕДМЕООЕЕ ТЕБЗЙТХЕФ ОБ ОБЦБФЙЕ ЬФПК ЛМБЧЙЫЙ.

    нОПЗЙЕ УХЭЕУФЧХАЭЙЕ ОЩОЕ РТПЗТБННЩ ЙУРПМШЪХАФ ESC Ч ЛБЮЕУФЧЕ ПДОПК ЙЪ ПУОПЧОЩИ УЧПЙИ ЛПНБОД, Й ЬФП РПМПЦЕОЙЕ ОЕМШЪС ЙЪНЕОЙФШ, ОЕ ЧЩЪЧБЧ ОЕДПЧПМШУФЧБ ВПМШЫПЗП ЛПМЙЮЕУФЧБ РПМШЪПЧБФЕМЕК. юФПВЩ ЙУРПМШЪПЧБФШ ЖХОЛГЙПОБМШОХА ЛМБЧЙБФХТХ, ЬФЙ РТПЗТБННЩ ДПМЦОЩ ТЕЫБФШ ПРЙУБООХА ЧЩЫЕ РТПВМЕНХ ДЧХУНЩУМЕООПУФЙ — Ч МХЮЫЕН УМХЮБЕ РХФЕН ЙУРПМШЪПЧБОЙС ФБКНЕТБ. нПТБМШ ЧУЕЗП ЬФПЗП СУОБ: ЙЪВЕЗБКФЕ ЙУРПМШЪПЧБОЙС ЛМБЧЙЫЙ ESC Ч чБЫЙИ РТПЗТБННБИ.

    5.2. рТПЗТБННБ highlight

    ьФБ РТПЗТБННБ ЙММАУФТЙТХЕФ ЙУРПМШЪПЧБОЙЕ РПДРТПЗТБННЩ attrset() . рТПЗТБННБ highlight ЮЙФБЕФ ФЕЛУФПЧЩК ЖБКМ Й ЙУРПМШЪХЕФ ОБИПДСЭЙЕУС Ч ОЕН ХРТБЧМСАЭЙЕ ГЕРПЮЛЙ ДМС РЕТЕЛМАЮЕОЙС БФТЙВХФПЧ ПФПВТБЦЕОЙС. \U ПЪОБЮБЕФ РПДЮЕТЛЙЧБОЙЕ, \B — РПЧЩЫЕООХА СТЛПУФШ, \N ЧПУУФБОБЧМЙЧБЕФ РПДТБЪХНЕЧБЕНЩЕ ЪОБЮЕОЙС БФТЙВХФПЧ.

    пВТБФЙФЕ ЧОЙНБОЙЕ ОБ РЕТЧЩК ЧЩЪПЧ РПДРТПЗТБННЩ scrollok() , П ЛПФПТПК НЩ ЕЭЕ ОЕ ХРПНЙОБМЙ [УН. curses (3X)]. ьФБ РПДРТПЗТБННБ РПЪЧПМСЕФ ТПММЙТПЧБФШ ЬЛТБО ФЕТНЙОБМБ, ЕУМЙ ЕЗП ТБЪНЕТ НЕОШЫЕ ТБЪНЕТБ ЖБКМБ. лПЗДБ РТПЗТБННБ РЩФБЕФУС ЧЩЧЕУФЙ ЮФП-МЙВП ОЙЦЕ ОЙЦОЕЗП ЛТБС ЬЛТБОБ, scrollok( ) БЧФПНБФЙЮЕУЛЙ ТПММЙТХЕФ ОБ ПДОХ УФТПЛХ ЧЧЕТИ Й ЧЩЪЩЧБЕФ refresh() .

    5.3. рТПЗТБННБ scatter

    ьФБ РТПЗТБННБ ВЕТЕФ РЕТЧЩЕ ( LINES — 1) УФТПЛ УФБОДБТФОПЗП ЧЧПДБ Й ПФПВТБЦБЕФ УЙНЧПМЩ ОБ ЬЛТБОЕ ФЕТНЙОБМБ Ч УМХЮБКОПН РПТСДЛЕ. юФПВЩ ЬФБ РТПЗТБННБ ТБВПФБМБ РТБЧЙМШОП, ЧИПДОПК ЖБКМ ОЕ ДПМЦЕО УПДЕТЦБФШ УЙНЧПМПЧ ФБВХМСГЙЙ Й ОЕПФПВТБЦБЕНЩИ УЙНЧПМПЧ.

    5.4. рТПЗТБННБ show

    рТПЗТБННБ show РТПУНБФТЙЧБЕФ ЖБКМ, РПЛБЪЩЧБС ЕЗП УПДЕТЦЙНПЕ ЬЛТБО ЪБ ЬЛТБОПН Ч ПФЧЕФ ОБ ОБЦБФЙС РТПВЕМБ. рТПЗТБННБ ЧЩЪЩЧБЕФ cbreak() , ЮФПВЩ ОЕ ОХЦОП ВЩМП ОБЦЙНБФШ ЧПЪЧТБФ ЛБТЕФЛЙ РПУМЕ РТПВЕМБ, Й noecho() , ЮФПВЩ РТПВЕМ ОЕ ЧЩЧПДЙМУС ОБ ЬЛТБО. оЕ ПВУХЦДБЧЫБСУС ТБОЕЕ РПДРТПЗТБННБ nonl() ЧЩЪЩЧБЕФУС ДМС ДПРПМОЙФЕМШОПК ПРФЙНЙЪБГЙЙ. фБЛЦЕ ОЕ ПВУХЦДБЧЫБСУС ТБОЕЕ РПДРТПЗТБННБ idlok() ЧЩЪЩЧБЕФУС, ЮФПВЩ ДБФШ ЧПЪНПЦОПУФШ ЧУФБЧМСФШ Й ХДБМСФШ УФТПЛЙ [ДПРПМОЙФЕМШОХА ЙОЖПТНБГЙА УН. Ч curses (3X)]. ъБНЕФШФЕ, ЮФП ЧЩЪЩЧБАФУС ЕЭЕ РПДРТПЗТБННЩ clrtoeol() , clrtobot() .

    5.5. рТПЗТБННБ two

    ьФБ РТПЗТБННБ РТПУНБФТЙЧБЕФ ЧИПДОПК ЖБКМ, ЧЩЧПДС РЕТЧХА ЕЗП УФТБОЙГХ ОБ ЬЛТБО ФЕТНЙОБМБ, У ЛПФПТПЗП ПОБ ВЩМБ ЧЩЪЧБОБ, Б ЧФПТХА — ОБ ФЕТНЙОБМ, ЙНС ЛПФПТПЗП ХЛБЪЩЧБЕФУС Ч ЛПНБОДОПК УФТПЛЕ. ъБФЕН ПОБ ЦДЕФ ОБЦБФЙС РТПВЕМБ ОБ ПДОПН ЙЪ ФЕТНЙОБМПЧ, РПУМЕ ЮЕЗП ЧЩЧПДЙФ ОБ ОЕЗП УМЕДХАЭХА УФТБОЙГХ.

    рТПЗТБННБ two — ЬФП РТПУФЕКЫЙК РТЙНЕТ ДЧХИФЕТНЙОБМШОПК curses -РТПЗТБННЩ. пОБ ОЕ РПДДЕТЦЙЧБЕФ ХЧЕДПНМЕОЙС Й ФТЕВХЕФ ХЛБЪБОЙС ЙНЕОЙ Й ФЙРБ ЧФПТПЗП ФЕТНЙОБМБ Ч ЛПНБОДОПК УФТПЛЕ. рПУМЕ ЬФПЗП ОБ ЧФПТПН ФЕТНЙОБМЕ ОХЦОП ЧЧЕУФЙ ЛПНБОДХ sleep 100000 , ЮФПВЩ РЕТЕЧЕУФЙ ЕЗП Ч ОЕБЛФЙЧОПЕ УПУФПСОЙЕ ОБ ЧТЕНС ТБВПФЩ РТПЗТБННЩ. рПМШЪПЧБФЕМШ РЕТЧПЗП ФЕТНЙОБМБ ДПМЦЕО ЙНЕФШ РПМОПНПЮЙС ДМС ЧЧПДБ Й ЧЩЧПДБ ОБ ЧФПТПН ФЕТНЙОБМЕ.

    5.6. рТПЗТБННБ window

    ьФБ РТПЗТБННБ РТЕДУФБЧМСЕФ УПВПК РТЙНЕТ ТБВПФЩ УП НОПЗЙНЙ ПЛОБНЙ. пУОПЧОБС ЙОЖПТНБГЙС УПДЕТЦЙФУС Ч stdscr. еУМЙ ОБ ЖЙЪЙЮЕУЛЙК ЬЛТБО ОХЦОП ЧТЕНЕООП ЧЩЧЕУФЙ ЮФП-МЙВП ЕЭЕ, УПЪДБЕФУС ОПЧПЕ ПЛОП, РПЛТЩЧБАЭЕЕ ЮБУФШ ЬЛТБОБ. пВТБЭЕОЙЕ Л wrefresh() ДМС ЬФПЗП ПЛОБ РТЙЧПДЙФ Л ФПНХ, ЮФП ЕЗП УПДЕТЦЙНПЕ ЪБРЙУЩЧБЕФУС ОБ ЬЛТБО ФЕТНЙОБМБ РПЧЕТИ УПДЕТЦЙНПЗП stdscr . рПУМЕДХАЭЙК ЧЩЪПЧ refresh() ДМС stdscr РТЙЧПДЙФ Л ЧПУУФБОПЧМЕОЙА ЬЛТБОБ. пВТБФЙФЕ ЧОЙНБОЙЕ ОБ ЧЩЪПЧ РПДРТПЗТБННЩ touchwin() [НЩ ОЕ ХРПНЙОБМЙ П ОЕК ТБОЕЕ, УН. curses (3X)], ЛПФПТЩК РТПЙЪЧПДЙФУС РЕТЕД ЧЩЧПДПН УПДЕТЦЙНПЗП ПЛОБ РПЧЕТИ ФПЗП ПЛОБ, ЛПФПТПЕ ХЦЕ ОБИПДЙФУС ОБ ЬЛТБОЕ. ьФБ РПДРТПЗТБННБ РТЕРСФУФЧХЕФ ПРФЙНЙЪБГЙЙ ТБВПФЩ У ЬЛТБОПН. еУМЙ Х чБУ ЧПЪОЙЛБАФ РТПВМЕНЩ У ЧЩЧПДПН ПДОПЗП ПЛОБ РПЧЕТИ ДТХЗПЗП, ДМС ОПТНБМШОПК ТБВПФЩ УМЕДХЕФ РТЕДЧБТЙФЕМШОП ЧЩЪЩЧБФШ touchwin() ДМС ОПЧПЗП ПЛОБ.

    terminal size

    Как узнать размер терминала?
    Т.е. количество строчек и длину строки?
    Желательно стандартными средствами без использования библиотек ncurses и подобных.

    Re: тип bool в C

    #include
    не знаю, устроит или нет, но вроде это не либа, а набор определений.
    Вообщем дерзай.
    А еще поищи в инете список кодов для ANSI/VT100 терминалов.
    Или посмотри свой /etc/termcap (!)
    Или напиши мне на мыло oxid@nteam.ru, я тебе документик маленький вышлю.

    Re: terminal size

    Re: terminal size

    вообще поидее нужно что то типа
    struct winsize wins;

    err = ioctl(fd, TIOCGWINSZ, &wins);
    /* TODO: err check here */
    printf(«cols=%d rows=%d\n», wins.ws_col, wins.ws_row);

    Re: terminal size

    > err = ioctl(fd, TIOCGWINSZ, &wins);
    А если терминал — не локальный, а подключен через RS232C?

    Re: terminal size

    Re: terminal size

    > какая разница? :)
    Работать не будет.

    Причем необязательно через RS232C — вообще на любом терминале, кроме локальной консоли linux.

    Подумай: ioctl’ы обрабатываются ядром. Как о них узнает терминал (или его эмулятор — xterm, например). Никак. Поэтому и работать такой способ будет только на локальной linux-консоли. То есть на мониторе, подключенном к видеоадаптеру данной машины, и только в том случае, если выводом управляет ядро, а не X Windiw, или Midnight Commander, или какая другая прога, запустившая данную программу на псевдотерминале.

    Re: terminal size

    какой-то у тебя бессвязный поток сознания. :)
    1) ioctl передается драйверу терминала. Можешь сам поглядеть в linux/drivers/char/vt.c
    2) это как еще xterm в обход ядра ходит? Вы что-то путаете, батенька

    Re: terminal size

    > ioctl передается драйверу терминала.
    И что? Драйверу _какого_ терминала передается? Драйверу виртуальной консоли linux. Я и не спорю, что на локальной linux-консоли ioctl’ы будут работать. Ты, наверно, не в курсе, что, кроме виртуальных linux-консолей, существуют другие терминалы? Так вот, они существуют. И к linux’у не имеют никакого отношения. Если ты зашел по сети на linux-сервер, куда пойдет твой ioctl? Удаленному хосту? Даже и не надейся на это. Драйверу vt сервера? Ну подумай, как он тебе узнает размеры экрана удаленного хоста?

    > это как еще xterm в обход ядра ходит?
    В исходники его погляди — увидишь как. Для вывода xterm использует запрос ImageText8 X сервера (не напрямую, а черех Xlib, но это сути не меняет). X сервер делает видеовывод собственными средствами, не используя для этого графические возможности ядра (у которого их нет).

    Ну напиши ты простую программу, которая делает какой-нибудь ioctl на STDOUT_FILENO. Запусти ее на виртуальной консоли linux. Убедись, что она работает (под mc не пытайся — не заработает). Запусти X Window. Открой окно xterm. Запусти в нем эту же прогу. Убедись, что она _не_ работает (также как и под mc). Почему? Да потому что ее stdout’ом будет не /dev/ttyN, а /dev/pts/N (где N — какое-то число). Если уж ты способен читать исходники ядра, то погляди, какие ioctl’ы поддерживает псевдотерминал (/usr/src/linux/drivers/char/pty.c).

    ЗЫ: если еще раз заявишь про бессвязный поток сознания — ответа не получишь (мне не платят за ответы на твои вопросы, а хамства мне и в реале хватает).

    Re: terminal size

    уважаемый nobody давайте сделаем проще. размер терминала можно узнать командой stty -a запускаем в консоли и в xterm команду strace -olog stty -a внимательно смотрим в файл log и видим (о чудо!) что размер терминала в том и другом случае вернулся через ioctl TIOCGWINSZ, который отработал нормально. Я это проделал, а вы можете мне поверить на слово если такой занятой человек :)

    То, что там иксы повесили на master side pty, и какими средствами они организуют вывод в данном случае никакой роли не играет — все равно все пройдет через драйвер терминала в ядре.

    С Уважением SadStork

    Re: terminal size

    Ok, насчет программного терминала ты оказался прав (щелчок мне по носу). Одна программа вызывает ioctl для установки переменной «размеры_терминала», другая вызовом ioctl может считать эту переменную. В случае vt инициализирует эту переменную драйвер linux-консоли, в случае pts — программа на стороне master.

    А как насчет аппаратного терминала? Ведь он не сможет установить эту переменную. Чтобы этот способ работал, должна быть какая-то программа на данной машине, которая знает размеры экрана подключенного терминала и может установить переменную ядра соответствующим образом.

    Способ, основанный на кодах управления терминалом (приведенный мной выше) будет работать на любом терминале, потому что эти коды интерпретируются самим терминалом.

    Re: terminal size

    что-то я вас не понимаю — для того, чтобы слать по линии инициализационные данные о размерах терминала нужна программа, а чтобы ловить esc-последовательности которые интерпретируются «самим терминалом» никакой программы не требуюется? :) Там Святой Дух их перехватывает и интерпретирует, видимо.

    Извините за сарказм

    Re: terminal size

    Дело в том, что ни один терминал не умеет «слать по линии инициализационные данные о размерах терминала». Зато любой совместимый по кодам с vt100 умеет интерпретировать их.

    Простой пример. Захожу из дома по модему на рабочую машину. Делаю stty -a. Мне сообщается, что размер терминала = 0 строк и 0 столбцов.

    Что делать? Альтернатив тут всего 3:
    1) Юзать ncurses (эта либа использует базу данных terminfo для получения информации о терминале, в т.ч. о его размерах).
    2) Парсить terminfo вручную.
    3) Юзать коды управления терминалом.

    Способ #1 не подходит: anonymous, запостивший данный вопрос, явно указал, что ncurses ему не катит.
    Способ #2 лично мне кажется сложнее, чем #3, для которого функция состоит из 3 строк:

    int get_term_size(int *width, int *height)
    <
    setvbuf(stdout, NULL, _IONBF, 0);
    fputs(«\x1B[255;255H\x1B[6n», stdout);
    return scanf(«\x1B[%d;%dR», height, w >>

    Реально же будет всего 2 строки, потому что функция setvbuf будет вызвана еще раньше: если программеру нужны размеры экрана, значит он собирается работать в полноэкранном режиме, а значит построчная буферизация stdout должна быть отключена.

    Re: terminal size

    вообще говоря это недореализация в linux — по идеи все терминальные девайсы(такие как виртуальный, псевдо и сериальный терминалы) должны иметь одинаковый базовый ioctl(как во FreeBSD например) .. вообще говоря у тебя терминал может и не быть vt100 компатабельным и ты все равно не зная ньюансов сможешь узнать размер через TIOCGWINSZ .. так что все зависит от того что надо в конце концов получить ..

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

    >1) Юзать ncurses (эта либа использует базу данных
    >terminfo для получения информации о терминале, в т.ч. о
    >его размерах).
    >2) Парсить terminfo вручную.

    помоему для получения terminfo используется ioctl

    Re: terminal size

    > все терминальные девайсы(такие как виртуальный,
    > псевдо и сериальный терминалы) должны
    > иметь одинаковый базовый ioctl
    Непонятно, что ты имеешь в виду под словом `ioctl’ применительно к аппаратному терминалу? ioctl — это системный вызов. Прога из юзерспэйса делает на своей машине int 80h (для linux@PC). Ядро ОС этой же самой машины этот вызов обрабатывает. Дальше этой машины ioctl не уходит. Системные вызова не передаются по кабелям (будь то сетевой кабель или RS232C). Каким образом терминал, подключенный через кабель, узнает о каком-то там ioctl?

    Может быть, ты имеешь в виду следующее: ядро, обнаружив на линии терминал, посылает ему Esc-последовательность для получения его размеров и прочей инфы? А потом проги на этой машине могут обращаться по ioctl к ядру для получения этой инфы, так? Если я правильно угадал, то объясни, как ядро может обнаружить подключение терминала? Ведь по RS232C может подключаться все, что угодно. И посылаемые подключенному девайсу коды могут сделать с ним что-то, что юзеру не надо. И потом, зачем все это? Есть база данных terminfo, в которой все существующие терминалы описаны. А если прога не хочет (или не может) юзать terminfo, то пускай и посылает сама Esc-коды терминалу. Зачем ядру эти заморочки?

    > в твоем случае ты должен быть уверен
    > что терминал заинтерпретирует тебя корректно
    Ты обратил внимание на последнюю строку функции?
    return scanf(«\x1B[%d;%dR», height, w >Если терминал не поддерживает Esc-коды vt100 (а точнее, ECMA-48 CSI sequences), то функция возвратит 0. В этом случае размеры терминала останутся неизвестными. Ну и что? Если Esc-последовательности не поддерживаются, ты все равно не сможешь работать в полноэкранном режиме (как ты собираешься без них устанавливать курсор в произвольную позицию экрана?).

    > помоему для получения terminfo используется ioctl
    Неа, обычная юзерспэйсная база данных. В ядре она нафиг не нужна. Хранится на диске. У меня это каталог /usr/share/terminfo. Идет вместе с ncurses (в том же архиве). Устанавливается также вместе с ncurses (по make install).

    Кстати, у юзера вполне может оказаться /etc/termcap вместо terminfo. Если не ошибаюсь, на фряхе используется именно он. Его парсить еще веселее — это очень большой текстовый файл. БД terminfo была придумана для замены /etc/termcap (она бинарная, и каждый файл содержит описание только одного терминала, а значит с ней быстрее работать).

    Re: terminal size

    > Непонятно, что ты имеешь в виду под словом `ioctl’ применительно к
    > аппаратному терминалу?

    ну батенька .. апаратные терминалы к линуксу вообще отношения не имеют
    и я про них ни словом не обмолвился .. а под сериальным терминалом
    имелся ввиду псевдо девайс(чарактер девайс) который может слушаться и
    обрабатываться каким нибудь getty например при попадании данных в
    линию RS232 .. после этого getty устанавливает запрашиваемые размеры
    (например по получении соотв ESC-последовательноти) и ты можешь
    пользоваться ioctl(на стороне getty) для получения установленных
    размеров (то есть получился твой апаратный терминал — это коробка с
    линуском и с торчащим RS232 нульмодемом).

    > Ты обратил внимание на последнюю строку функции?
    > return scanf(«\x1B[%d;%dR», height, w >
    обратил .. именно из-за этой последней строчки и может возникнуть
    десинхронизация .. например имеем терминал не vt100 компатабельный —
    ты послал ему эту ESC-посл для получения размера и висишь в scanfе
    ждешь ответа, но он(терминал) не поддерживает эту посл и в этот момент
    решил послать тебе какие-то данные — соответсвенно если во время
    работы с терминалом ты проделаешь подобное то ты потеряешь эти данные
    в отсосанном(вернувшем 0) scanf вызове.

    > Неа, обычная юзерспэйсная база данных. В ядре она нафиг не
    > нужна. Хранится на диске. У меня это каталог
    > /usr/share/terminfo. Идет вместе с ncurses (в том же
    > архиве). Устанавли вается также вместе с ncurses (по make install).

    а — ну пожалуйста что там получается .. у любого терминала описаного в
    terminfo должен быть заранее оговоренный размер? — тухлость.

    вобщем не хочу тебя ни в чем убеждать — пользовать
    ESC-последовательности в соответствующих местах катируется.

    > ioctl — это системный вызов. Прога из
    > юзерспэйса делает на своей машине int 80h (для linux@PC). Ядро ОС
    > этой же самой машины этот вызов обрабатывает. Дальше этой машины
    > ioctl не уходит. Системные вызова не передаются по кабелям (будь то
    > сетевой кабель или RS232C). Каким образом терминал, подключенный
    > через кабель, узнает о каком-то там ioctl?

    :))) прикинь системные вызовы да даже аппаратные прерывания могу
    передаваться по кабелям. Кстати если системный вызовы не могут
    передаваться через кабеля — то как работает клиентская часть NFS, а
    точнее ее RPC часть?

    Re: terminal size

    > как работает клиентская часть NFS, а точнее ее RPC часть?
    А как работает запрос файла у FTP сервера? Сервер делает open, read и close. То есть как минимум 3 сискола. Ты готов считать запрос файла передачей сисколов по сети?

    Я вообще-то понимаю, о чем ты говоришь: с точки зрения клиента происходит следующее: приложение обратилось к ядру, а ядро полезло в сеть. По ведь ядро не передает в сеть именно _сискол_. Это просто невозможно — сеть же может быть гетерогенной. Представь: я в вызове open указываю права доступа 755, а сервер работает на Windows. Если считать это именно передачей сискола, то должно быть так: ядро Windows получает от ядра linux сискол open. Опаньки — нет такого сискола. Есть CreateFile — ладно, вызываем его. Но с какими аргументами?

    Понимаешь, это не есть передача сискола. Это просто запрос обслуживания по сети. А то что с точки зрения программы-клиента какой-то локальный сискол привел к сетевой активности — ну и что? Когда ты обращаешься к FTP серверу, ты делаешь сискол send, в результате которого на сервере происходит сискол read (или ReadFile, или что-то еще). Та же сетевая активность, только вид сбоку.

    > аппаратные прерывания могу передаваться по кабелям.
    Ты говоришь об экзотических архитектурах, где несколько машин, связанных сетью, образуют одну большую машину, или что-то типа того? Если да, то в этом случае сеть — уже не сеть, а разновидность системной шины. Я понимаю: шина — она, конечно, тоже провода (даже шина данных персоналки), но я все-таки не имел ее в виду. Когда я говорил про кабеля, то имел в виду связь отдельных устройств, не представляющих собой в связанном виде единое целое с общей шиной данных/адреса/управления/чего-то-еще.

    Re: terminal size

    функции можно вызывать по сети .. see RPC(Remote Procedure Call) .. во многих ядрах есть kern-rpc. Hа самом деле представь себе картину — все девайсы имеют Ethernet как системную шину .. в том числе и биос и память и винт и все что угодно :)) — или например с помощью FireWire ты _хардверно_ можешь замапить себе чужую память и работать с ней как со своей собственной .. а что если именно в этом куске памяти расположить новый сискол(например насильно запихнуть модуль(который содержит новый сискол) в этот участок памяти)?

    Основы программирования в Linux (72 стр.)

    Если в Linux запущена регистрация в графическом режиме, либо с помощью программы startx илн менеджера экранов xdm, на первой свободной консоли, обычно /dev/tty7, стартует графическая оболочка X Window System. Переключиться с нее на текстовую, консоль вы сможете с помощью комбинации клавиш ++ , а вернуться с помощью ++ .

    В ОС Linux можно запустить более одного сеанса X. Если вы сделаете это, скажем, с помощью следующей команды

    $ startx — :1

    Linux запустит сервер X на следующей свободной виртуальной консоли, в данном случае на /dev/tty8, и переключаться между ними вы сможете с помощью комбинаций клавиш ++ и ++ .

    Во всех остальных отношениях виртуальные консоли ведут себя как обычные терминалы, описанные в этой главе. Если процесс обладает достаточными правами, виртуальные консоли можно открывать, считывать с них данные, писать на них информацию точно так же, как в случае обычного терминала.

    Псевдотерминалы

    У многих UNIX-подобных систем, включая Linux, есть средство, именуемое псевдотерминалом. Это устройства, очень похожие на терминалы, которые мы использовали в данной главе, за исключением того, что у них нет связанного с ними оборудования. Они могут применяться для предоставления терминалоподобного интерфейса другим программам.

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

    Одно время реализация псевдотерминалов (если вообще существовала) сильно зависела от конкретной системы. Сейчас они включены в стандарт Single UNIX Specification (единый стандарт UNIX) как UNIX98 Pseudo-Terminals (псевдотерминалы стандарта UNIX98) или PTY.

    Резюме

    В этой главе вы узнали о трех аспектах управления терминалом. В начале главы рассказывалось об обнаружении перенаправления и способах прямого диалога с терминалом в случае перенаправления дескрипторов стандартных файлов. Вы посмотрели на аппаратную модель терминала и немного познакомились с его историей. Затем вы узнали об общем терминальном интерфейсе и структуре termios, предоставляющей в ОС Linux возможность тонкого управления и манипулирования терминалом. Вы также увидели, как применять базу данных terminfo и связанные с ней функции для управления в аппаратно-независимом стиле выводом на экран, и познакомились с приемами мгновенного обнаружения нажатий клавиш. В заключение вы узнали о виртуальных консолях и псевдотерминалах.

    Глава 6
    Управление текстовыми экранами с помощью библиотеки curses

    В главе 5 вы узнали, как улучшить управление вводом символов и как обеспечить вывод символов способом, не зависящим от особенностей конкретного терминала. Проблема использования общего терминального интерфейса (GTI или termios) и манипулирование escape-последовательностями с помощью tparm и родственных функций заключается в необходимости применения большого объема программного кода низкого уровня. Для многих программ предпочтительней интерфейс высокого уровня. Мы хотели бы иметь возможность просто рисовать на экране и применять библиотеку функций для автоматического отслеживания аппаратных характеристик терминала.

    В этой главе вы узнаете именно о такой библиотеке, называемой curses. Стандарт curses очень важен как компромисс между простыми «строковыми» программами и полностью графическими (которые обычно труднее программировать) программами в графической оболочке X Window System, такими как GTK+/GNOME и Qt/KDE, В ОС Linux есть библиотека svgatib (Super VGA Library, библиотека низкоуровневой графики), но она не является стандартной библиотекой UNIX, поэтому обычно не доступна в других UNIX-подобных операционных системах.

    Библиотека curses применяется во многих полноэкранных приложениях как довольно легкий и аппаратно-независимый способ разработки полноэкранных, хотя и символьных программ. Такие программы почти всегда легче писать с помощью библиотеки curses, чем непосредственно применять escape-последовательности. Эта библиотека также может управлять клавиатурой, обеспечивая легкий в использовании, не блокирующий режим ввода символов.

    Вы можете столкнуться с тем, что несколько примеров из этой главы не всегда будут отображаться на простой консоли Linux так, как вы ожидали. Бывают случаи, когда сочетание библиотеки curses и определения консоли терминала получается немного не согласованным и приводит в результате к несколько странным компоновкам при использовании curses. Но если для отображения вывода применить графическую оболочку X Window System и окно xterm, все встанет на свои места.

    В этой главе обсуждаются следующие темы:

    □ применение библиотеки curses:

    □ основные идеи curses;

    □ управление базовыми вводом и выводом;

    □ использование множественных окон;

    □ применение режима дополнительной клавиатуры (keypad mode);

    Мы закончим главу переработкой на языке С программы, управляющей коллекцией компакт-дисков, подытожив все, чему вы научились к этому моменту.

    Компиляция с библиотекой curses

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

    Поскольку curses — это библиотека, для ее применения необходимо включить в программу заголовочный файл, объявления функций и макросы из соответствующей системной библиотеки. Существует несколько разных реализаций библиотеки curses. Первоначальная версия появилась в системе BSD UNIX и затем была включена в разновидности UNIX стиля System V прежде, чем была стандартизована группой X/Open. Система Linux использует вариант ncurses («new curses») — свободно распространяемую версию System V Release 4.0 curses, разработанную для Linux. Эта реализация хорошо переносится на другие версии UNIX, хотя и содержит несколько непереносимых дополнительных функций. Есть даже версии библиотеки для MS-DOS и Windows. Если вы увидите, что библиотека curses, поставляемая с вашей версией системы UNIX, не поддерживает некоторые функции, попытайтесь получить копию альтернативной библиотеки ncurses. Обычно пользователи ОС Linux обнаруживают уже установленную библиотеку ncurses или, по крайней мере, ее компоненты, необходимые для выполнения программ на базе библиотеки curses. Если инструментальные библиотеки для нее заранее не установлены в вашем дистрибутиве (нет файла curses.h или файла библиотеки curses для редактирования связей), для большинства основных дистрибутивов их всегда можно найти в виде стандартного пакета с именем наподобие ibncurses5-dev.

    В стандарте X/Open определены два варианта curses: базовый и расширенный. Расширенный вариант библиотеки curses содержит разнородную кучу дополнительных функций, включая ряд функций для обработки многостолбцовых символов и подпрограммы управления цветом. Кроме приведенного далее в этой главе описания способов управления цветом, мы будем в основном привязаны к функциям базовой версии библиотеки.

    При компиляции программ, использующих curses, следует подключить заголовочный файл curses.h и на этапе редактирования связей саму библиотеку с помощью аргумента -lcurses. Во многих системах Linux вы можете применять просто библиотеку curses, а потом обнаружить, что на самом деле вы пользуетесь усовершенствованной, более новой реализацией ncurses.

    Для того чтобы проверить, как установлена библиотека curses в вашей системе, выполните команду

    ls -l /usr/include/*curses.h

    для просмотра заголовочных файлов и

    ls -l /usr/lib/lib*curses*

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

    $ gcc program. с -о program -lcurses

    Если установка curses в вашей системе не использует автоматически ncurses, вы сможете явно задать использование ncurses, включив файл ncurses.h вместо файла curses.h и выполнив следующую команду:

    $ gcc -I/usr/include/ncurses program.с -о program -lncurses

    в которой опция -I задает каталог для поиска заголовочного файла.

    В загружаемом коде сценария Makefile предполагается, что в установленной у вас системе по умолчанию применяется библиотека curses, поэтому вы должны заменить его или откомпилировать вручную, если в вашей системе это не так.

    Илон Маск рекомендует:  Как добавить вокруг текста рамку определенного цвета
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL