Что такое код ncurses_slk_clear

Содержание

ncurses_slk_clear

(PHP 4 >= 4.0.7, PHP 5 = 1.0.0)

ncurses_slk_clear — Clears soft labels from screen

Описание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, ее имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

The function ncurses_slk_clear() clears soft label keys from screen.

Возвращаемые значения

Returns TRUE on errors, FALSE otherwise.

ncurses_slk_color

(PHP 4 >= 4.0.7, PHP 5 = 1.0.0)

ncurses_slk_color — Sets color for soft label keys

Описание

Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, ее имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

К настоящему времени эта функция еще не была документирована; для ознакомления доступен только список аргументов.

Список параметров

НОВОСТИ ФОРУМА
Рыцари теории эфира
01.10.2020 — 05:20: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]69vJGqDENq4[/Youtube][/center]
[center]14:36[/center]
Osievskii Global News
29 сент. Отправлено 05:20, 01.10.2020 г.’ target=_top>Просвещение от Вячеслава Осиевского — Карим_Хайдаров.
30.09.2020 — 12:51: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Ok]376309070[/Ok][/center]
[center]11:03[/center] Отправлено 12:51, 30.09.2020 г.’ target=_top>Просвещение от Дэйвида Дюка — Карим_Хайдаров.
30.09.2020 — 11:53: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]VVQv1EzDTtY[/Youtube][/center]
[center]10:43[/center]

интервью Раввина Борода https://cursorinfo.co.il/all-news/rav.
мой телеграмм https://t.me/peshekhonovandrei
мой твиттер https://twitter.com/Andrey54708595
мой инстаграм https://www.instagram.com/andreipeshekhonow/

[b]Мой комментарий:
Андрей спрашивает: Краснодарская синагога — это что, военный объект?
— Да, военный, потому что имеет разрешение от Росатома на манипуляции с радиоактивными веществами, а также иными веществами, опасными в отношении массового поражения. Именно это было выявлено группой краснодарцев во главе с Мариной Мелиховой.

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

Что такое код ncurses_slk_clear

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_slk_clear

ncurses_slk_clear — очищает мягкие ярлыки/soft labels на экране.

Описание

bool ncurses_slk_clear (void)

Эта функция — ЭКСПЕРИМЕНТАЛЬНАЯ. Поведение, имя и всё остальное, что задокументировано для данной функции может быть изменено в будущих релизах РНР без предупреждения. Вы можете использовать эту функцию только на свой страх и риск.

Функция ncurses_slk_clear() очищает ключи мягких ярлыков на экране. Возвращает TRUE при ошибке, иначе FALSE .

Предупреждение!

Назад Оглавление Вперёд
ncurses_slk_attrset Вверх ncurses_slk_color

Материалы, которые находятся на этой страничке, любезно предоставлены Игорем Ивановым

Программирование с ncurses: первые шаги 0

Программирование

Статья была опубликована 1 марта 2013 года в 12:00, а последний раз правилась 9 апреля 2015 года в 11:49.

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

Примечание: эта статья была впервые опубликована в электронном издании «Open Source» от журнала «Системный администратор» и размещена на nixp.ru по согласованию с редакцией.

Иногда нужно написать какую-нибудь программу, не прибегая к тяжеловесным библиотекам графических тулкитов вроде Qt или GTK, а возможностей обычного консольного вывода (printf, cout) всё же маловато. Как быть? На помощь приходит ncurses.

В незапамятные времена, в Беркли, существовала библиотека под названием curses. Создал её известный UNIX-гуру Кен Арнолд. По своим функциям curses напоминала модуль CRT для Pascal, а основным её назначением было взаимодействие с экраном (на уровне терминала) и клавиатурой. Со временем у неё появилось развитие под названием pcurses, а потом (в 1993 году) — ncurses (new curses), которая надолго поселилась под сенью проекта GNU (http://www.gnu.org/software/ncurses/ncurses.html). Ncurses используется довольно большим количеством программ — среди них, например, файловый менеджер Midnight Commander и веб-браузер lynx. Писать программу под ncurses выгодно: эта библиотека найдется в любом дистрибутиве *nix, и будет входить в эти дистрибутивы по крайней мере еще долгое время. В общем, пишем под ncurses — пишем на века!

Подключить ncurses к своей программе на Си или С++ очень просто. Достаточно использовать в исходнике директиву #include , а для компиляции указать -lncurses для линковки:

Конечно, надо, чтобы были установлены заголовочные файлы ncurses. В Debian и Ubuntu пакет с ними называется ncurses-dev:

Для сборки программ, где более чем один файл, удобно использовать какую-нибудь систему сборки вроде autotools или Scons. В случае последней (я предпочитаю её), в каталоге с исходником программы нужно создать файл под названием SConstruct такого содержания:

Теперь при запуске в том же каталоге команды scons будут скомпилированы все .cpp-файлы и слинкованы с библиотеками ncurses и любыми другими (в примере — «other-libs»). Для сборки и установки программы надо выполнить с правами root:

Для инициализации ncurses чаще всего вызываются три функции:
1. initscr(); — инициализирует работу с консолью. Эта функция выполняет довольно много работы, поскольку существует множество различных терминалов, а ncurses перед началом работы с каким-либо из них надо определить тип терминала и «адаптироваться» под него. Вызов initscr возвращает указатель WINDOW *, который потом можно использовать в других функциях. К последним относятся getyx() для получения координат курсора, putwin() для сохранения окна в файл, getwin() для чтения окна из файла, copywin() для копирования содержимого одного окна в другое… Кроме того, initscr() очищает окно.
2. keypad (stdscr, TRUE); — если так вызвать keypad(), вы сможете «отлавливать» нажатия клавиш ряда F и курсорных. stdscr — стандартный, определенный в ncurses указатель на окно «по умолчанию». Если не вызвать keypad с параметром TRUE, то функции вроде getch() вместо кода нажатой клавиши будут возвращать escape-последовательности.
3. noecho(); — если вызвана, то последующие нажатия клавиш не будут отображаться на экране автоматически. Это нормальный режим, если вы хотите сами обрабатывать нажатия на клавиши (например, реализуете собственное меню и тому подобное).

Завершить работу с библиотекой ncurses следует вызовом функции endwin(), которая освободит все распределенные библиотекой ресурсы и вернет терминал к состоянию до инициализации библиотеки вашей программой.

Для считывания нажатий на клавиши в общих целях используется функция getch(), а для считывания из конкретного окна — wgetch(). Цикл выглядит примерно так:

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

Для вывода текста в консоль чаще всего используют функцию printw(), которая принимает те же аргументы, что и printf(), то есть вы можете форматировать текст как угодно. Для строк C++ (std:string) в качестве строковых параметров надо передавать их через функцию c_str(), то есть:

При выводе строки без завершающего символа «\n» курсор остается в текущей строке, на последнем выведенном символе, так что следующий вызов printw() в этом случае дополнит текущую строку. Функция addch() служит для вывода одного символа, переданного в параметре. Сразу можно задать ему атрибуты начертания (символ комбинируется с атрибутами с помощью логического OR):

Вывести символ по заданным координатам можно так:

Атрибуты текста — это цвет и начертание. Они актуальны и для printw(). Как можно изменить атрибуты?

Сначала нужно включить «цветовой движок» ncurses, вызывая (обычно после initscr()) функцию:

Внутри неё создается палитра из 8 основных цветов (COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW, COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE), а также инициализируются глобальные переменные COLORS и COLOR_PAIRS. Допустим, стоит задача вывода некоего меню, списка, где обычные элементы будут отрисованы обычным цветом и начертанием, а текущий элемент — жирным и другими цветами.

Для этого надо создать две так называемые «цветовые пары». Первой будет присвоен красный цвет букв и черный для фона, а второй — белый цвет букв и черный для фона:

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

Некоторые могут поинтересоваться, почему нажатие клавиши Enter отлавливается через ‘\n’, а не KEY_ENTER. Это очень тяжелый вопрос. Если при инициализации вызывать функцию nonl(), то можно отлавливать Enter вот так:

Если не вызывать nonl(), то вот так:

А константа KEY_ENTER действует и вовсе странным образом… В общем, проверка на соответствие ‘\n’ — самое верное средство для UNIX-систем.

Ввод и события мыши

Для ввода строковых значений в ncurses предусмотрены функции scanw(), getstr() и другие. Например, чтобы получить строку в массив str, можно поступить так:

Для обработки событий мыши сначала нужно провести инициализацию:

После этого в обработчике нажатий на клавиши можно поступить так:

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

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

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

  • printf, sprintf, fprintf, scanf, sscanf, fscanf
    С этими функциями libc вы можете выдавать форматированные строки в stdout (стандартный вывод), stderr (стандартная ошибка) или другие потоки, определенные как FILE *stream (например, файлы). sscanf обеспечивает подобные возможности для чтения форматированного ввода из stdin.
  • termcap
    База данных TERMinal CAPabilitie это таблица элементов описания работы с терминалом в ASCII-файле /etc/termcap. Здесь вы можете найти информацию о том, как выводить специальные символы, как осуществлять операции (удаления, вставки символов или строк и т.д.) и как инициализировать терминал. База данных используется, например, редактором vi. Имеются библиотечные функции для чтения и использования возможностей терминала (смотри termcap(3x)). С этой базой данных программы могут работать с различными терминалами одним и тем же кодом. База данных termcap и библиотечные функции предоставляют только низкоуровневый доступ к терминалу. Изменение атрибутов или цветов, параметризованный вывод и оптимизация остаются программисту.
  • terminfo database
    База данных TERMinal INFOrmation построена над базой данных termcap и описывает некоторые возможности терминалов на более высоком уровне. С terminfo программа может легко менять атрибуты экрана, используя специальные клавиши, такие как функциональные клавиши и др. Эта база данных может быть найдена в /usr/lib/terminfo/[A-z,0-9]*. Каждый файл описывает один терминал.
  • curses
    Terminfo хорошая база для работы с терминалом в программе. Библиотека (BSD-)curses дает вам высокоуровневый доступ к терминалу, базируясь на terminfo. curses позволяет открывать и манипулировать окнами на экране, предоставляет весь необходимый набор функций ввода/вывода и может изменять видеоатрибуты терминально-независимым образом на более чем 150 терминалах. Библиотека находится в /usr/lib/libcurses.a. Это BSD-версия curses.
  • ncurses
    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 содержит два типа объектов:

  1. обычные символы и
  2. информацию, как трансформировать или форматировать аргументы.

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

  • Параметры:

    • Форматированный аргумент будет при печати прижат влево на своем поле.
    • +
      Каждое число будет напечатано со знаком, например, +12 или -2.32 .
  • Пробел
    Если первый символ не знак, то будет вставлен пробел.
  • 0
    Для чисел ширина поля будет заполнена слева нулями .
  • #
    Изменяет вывод в зависимости от трансформации для аргумента:
    • Для o первое число будет .
    • Для x или X будет напечатано в конце 0x или 0X соответственно.
    • Для e, E, f, F вывод имеет десятичную точку.
    • Для g или G в конце аргумента будут напечатаны нули.
  • Число, указывающее минимальную ширину поля.
    Трансформированный аргумент печатается в поле, ширина которого не меньше, чем сам аргумент. С этим числом вы можете увеличить ширину поля. Если аргумент меньше, то оставшаяся часть поля заполняется пробелами или нулями.
  • Точка для отделения ширины поля и точности.
  • Число для точности.

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

  • int printf(const char *format, . )
    То же самое, что fprintf(stdout, . ).
  • int sprintf(char *s, const char *format, . )
    То же, что и printf(. ), но вывод будет записан в символьный указатель s (с последующим \ 0). Вы должны захватить достаточно памяти для s !
  • vprintf(const char *format, va_list arg)
    vfprintf(FILE *stream, const char *format, va_list arg)
    vsprintf(char *s, const char *format, va_list arg)
    То же, что и для вышеописанных функций, только список аргументов находится в arg .
  • Символ Форматируется в
    d,i int signed, десятиричный
    o int unsigned, восьмеричный, без предваряющего 0
    x,X int unsigned, шестнадцатиричный, без предваряющего 0x
    u int unsigned, десятиричный
    c int (unsigned) одиночный символ
    s char * до \0
    f double как [-]mmm.ddd
    e,E double как [-]m.dddddde+xx, [-]m.dddddde-xx
    g,G double использует %e или %f когда нужно
    p void *
    n int *
    % %

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

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

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

      int fscanf(FILE *stream, const char *format, . )
      fscanf(. ) читает из stream и преобразует ввод по правилам, определяемым в format . Результаты помещаются в аргументы, заданные в «. » (эти аргументы должны быть указателями!). Чтение заканчивается, когда в format исчерпаны правила форматирования. 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 .
    Символ Вход: тип аргумента
    d десятичный integer: int*
    i integer: int* (вход может быть восьми или шестнадцатиричным)
    o восьмеричный integer: int* (с или без предваряющего 0)
    u десятичный unsigned: unsigned int*
    x шестнадцатиричный integer: int* (с или без предваряющего 0x)
    c один или более символов: char* (без завершающего /0)
    e,f,gf float: float* (такой как [-]m.dddddde+xx, [-]m.dddddde-xx)
    p указатель: void*
    n число трансформированных аргументов: int*
    [. ] непустое множество символов на входе: char*
    [^. ] исключая такие символы: char*
    % %

    Таблица 8.2: Libc: правила scanf
    перед d,i,n,o,u,x может стоять h, если указатель short
    то же для l, если указатель long
    l также может быть перед e,f,g, если указатель double
    L может стоять перед e,f,g, если указатель long double

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

    8.2.1 Введение

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

    • получить описание текущего терминала: tgetent(. ).
    • найти описание для информации: tgetnum(. ), tgetflag(. ), tgetstr(. ).
    • Представить числовые параметры в форме, специфичной для терминала: tparam(. ), tgoto(. ).
    • вычислить и произвести поточечный вывод: tputs(. ).

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

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

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

    • int tgetent(void *buffer, const char *termtype)
      В операционной системе Linux текущее имя терминала содержится в переменой среды TERM. Поэтому termtype есть результат вызова getenv(3) .

    Что касается buffer , то в GNU-версии Linux termcap не нужно захватывать память. В других версиях вам придется выделить 2048 байт (прежде buffer требовал 1024 байта, но сейчас размер удвоился).

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

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

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

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

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

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

    Каждое свойство связано с единственным типом значений (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

    Boolean

    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 сбой телевизионного луча, неверная табуляция и странный режим выделения

    Numeric

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

    String

    !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 ( WINDOW *initscr()
    Обычно это первая функция, вызываемая из программы, использующей ncurses. В некоторых случаях полезно вызывать slk_init(int), filter(), ripoffline(. ) или use_env(bf) перед initscr(). Для работы с несколькими терминалами (или тестирования возможностей системы) Вы можете использовать newterm(. ) вместо initscr().

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

  • SCREEN *newterm(char *type, FILE *outfd, FILE *infd)
    Работая в ncurses с несколькими терминалами, вы должны вызвать для каждого из них newterm(. ) вместо initscr() . type это имя терминала как оно содержится в $TERM (ansi, xterm, vt100, например). outfd это указатель для вывода, infd указатель для ввода. Для каждого терминала, открытого newterm(. ), следует вызывать endwin().
  • SCREEN *set_term(SCREEN *new)
    При помощи set_term(SCREEN) Вы можете переключать текущий терминал. Все функции будут работать с текущим терминалом, установленным set_term(SCREEN).
  • int endwin()
    endwin() произведет очистку, восстановит режимы терминала, сохраненные перед вызовом initscr(), и поставит курсор в левый верхний угол экрана. Не забудьте закрыть все окна перед тем, как вызвать endwin(), перед выходом из вашей программы.

    Дополнительный вызов refresh() после endwin() восстановит содержимое терминала, отображавшееся до вызова initscr() (visual-mode), в противном случае экран будет очищен (non-visual-mode).

  • int isendwin()
    Возвращает TRUE, если после endwin() была вызвана refresh(), иначе FALSE.
  • void delscreen(SCREEN* sp)
    Вызывается после endwin() для высвобождения всех занятых ресурсов, когда SCREEN больше не нужен.
  • 8.5 Окна

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

      WINDOW *newwin(nlines, ncols, begy, begx)
      begy и begx координаты верхнего левого угла окна. nlines это число линий (integer); ncols число колонок (integer).

    Рисунок 8.1: Ncurses: схема для newwin

    Верхний левый угол нашего окна находится в строке 10 в колонке 10; окно имеет 10 строк и 60 колонок. Если nlines равна нулю, окно будет иметь (LINES-begy) строк. Точно так же, если ncols равна нулю, то окно будет иметь (COLS-begx) колонок.

    Когда мы вызываем newwin(. ) с нулевыми аргументами: открытое окно получает размеры экрана.

    При помощи LINES и COLS мы можем открыть окно на середине экрана, какую бы размерность оно ни имело:

    Откроется окно с 22 строками и 70 колонками в середине экрана. Проверьте размер экрана перед тем, как открывать окно. Консоль Linux имеет не менее 25 строк и 80 колонок, но на Х-терминалах это может не выполняться (их размеры изменяемы).

    С другой стороны, используйте LINES и COLS , чтобы поместить два окна в один экран:

    Подробнее смотрите screen.c в директории с примерами.

  • int delwin(win)
    Удаляет окно win . Подокна win удаляются перед win . Будут освобождены все ресурсы, занятые win . Удаляйте все открытые вами окна перед вызовом endwin().
  • int mvwin(win, by, bx)
    Перемещает окно на координаты by,bx . Если это означает выход за пределы экрана, то ничего не произойдет и будет возвращен ERR.
  • WINDOW *subwin(origwin, nlines, ncols, begy, begx)
    Возвращает подокно в середине origwin . Когда вы изменяете одно из двух окон ( origwin или новое), это изменение отразится на обоих окнах. Вызывайте touchwin(origwin) перед следующим refresh().

    begx и begy относятся не к origwin , а к экрану.

  • WINDOW *derwin(origwin, nlines, ncols, begy, begx)
    То же, что subwin(), begx и begy относятся не к экрану, а к origwin .
  • int mvderwin(win, y, x)
    Перенесет win за пределы родительского окна.
  • WINDOW *dupwin(win)
    Дублирует окно win .
  • int overlay(win1, win2)
    int overwrite(win1, win2)
    overlay(. ) скопирует весь текст из win1 в win2 , игнорируя пропуски. overwrite(. ) делает то же самое, но копирует вместе с пропусками.
  • int copywin(win1, win2, sminrow, smincol, dminrow, dmincol,
    dmaxrow, dmaxcol, overlay)
    То же, что overlay(. ) и overwrite(. ), но позволяет контролировать область окна для копирования.
  • 8.6 Вывод

    • int addch(ch)
      int waddch(win, ch)
      int mvaddch(y, x, ch)
      int mvwaddch(win, y, x, ch)
      Эти функции выводят символ в окно. Они работают с окном; Вам нужно вызвать refresh(), чтобы поместить окно на экран. Функции addch(. ) и waddch(. ) помещают символ ch в окно или win . mvaddch(. ) и mvwaddch(. ) предварительно ставят курсор на позицию y,x.
    • int addstr(str)
      int addnstr(str, n)
      int waddstr(win, str)
      int waddnstr(win, str, n)
      int mvaddstr(y, x, str)
      int mvaddnstr(y, x, str, n)
      int mvwaddstr(win, y, x, str)
      int mvwaddnstr(win, y, x, str, n)
      Эти функции заносят строку в окно и эквивалентны сериям вызовов addch(. ). str это строка, заканчивающаяся символом с кодом 0 («blafoo \ 0»). Функции, начинающиеся с w, заносят str в окно win , остальные в stdscr. Функции с n пишут n символов строки str . Если n равен -1, будет записана вся строка str .
    • int addchstr(chstr)
      int addchnstr(chstr, n)
      int waddchstr(win, chstr)
      int waddchnstr(win, chstr, n)
      int mvaddchstr(y, x, chstr)
      int mvaddchnstr(y, x, chstr, n)
      int mvwaddchstr(win, y, x, chstr)
      int mvwaddchnstr(win, y, x, chstr, n)
      Эти функции копируют chstr в окно stdscr или win . Начальной позицией является позиция курсора. Функции с n пишут n символов строки chstr . Если n равен -1, будет записана вся строка. Курсор не двигается и символы не контролируются. Эти функции быстрее, чем addstr(. ). chstr является указателем на массив элементов chtype .
    • int echochar(ch)
      int wechochar(win, ch)
      То же, что addch(. ), waddch(win), с последующим refresh(), wrefresh(win).

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

    • int printw(fmt, . )
      int wprintw(win, fmt, . )
      int mvprintw(y, x, fmt, . )
      int mvwprintw(win, y, x, fmt, . )
      int vwprintw(win, fmt, va_list)
      Эти функции соответствуют printf(. ) и подобным ей функциям libc.

    В libc printf() используется для форматированного вывода. Вы можете определять выводимую строку и включать в нее переменные различных типов. Подробнее смотрите раздел 8.1.1.

    vwprintw(. ) требует подключения varargs.h.

    8.6.2 Вставка символов и строк

    • int insch(c)
      int winsch(win, c)
      int mvinsch(y,x,c)
      int mvwinsch(win,y,x,c)
      Символ ch вставляется слева от курсора, и все символы сдвигаются на одну позицию вправо. Самый правый символ строки может быть потерян.
    • int insertln()
      int winsertln(win)
      Вставляет чистую строку над текущей. Нижняя строка будет потеряна.
    • int insdelln(n)
      int winsdelln(win, n)
      Для положительного n эти функции вставляют n строк в соответствующем окне ( n нижних строк будут потеряны). Для отрицательных n будут удалены n строк под курсором, оставшиеся сдвинутся вверх.
    • int insstr(str)
      int insnstr(str, n)
      int winsstr(win, str)
      int winsnstr(win, str, n)
      int mvinsstr(y, x, str)
      int mvinsnstr(y, x, str, n)
      int mvwinsstr(win, y, x, str)
      int mvwinsnstr(win, y, x, str, n)
      Эти функции вставят str в текущую строку слева от курсора (сколько возможно до конца строки). Символы справа от курсора сдвигаются вправо и удаляются достигнув конца строки. Курсор остается на месте.

    y и x координаты, на которые переместится курсор перед вставкой str ; n это число вставляемых символов ( n=0 вводит чистую строку).

    8.6.3 Удаление символов и строк

    • int delch()
      int wdelch(win)
      int mvdelch(y, x)
      int mvwdelch(win, y, x)
      Выполняется удаление символа под курсором и сдвиг оставшейся справа от курсора строки на одну позицию влево.

    y и x координаты, на которые курсор переместится перед удалением.

  • int deleteln()
    int wdeleteln(win)
    Удаление строки под курсором и перемещение нижележащих линий на одну позицию вверх. Последняя линия окна будет очищена.
  • 8.6.4 Боксы и линии

    • int border(ls, rs, ts, bs, tl, tr, bl, br)
      int wborder(win, ls, rs, ts, bs, tl, tr, bl, br)
      int box(win, vert, hor)
      Очерчивают соответствующее окно (stdscr или win ). В таблице 8.3 вы увидите символы и их значения по умолчанию для box(. ). На картинке вы увидите позиции символов для бокса.
  • int vline(ch, n)
    int wvline(win, ch, n)
    int hline(ch, n)
    int whline(win, ch, n)
    Эти функции вычерчивают вертикальную или горизонтальную прямую начиная с позиции курсора. ch это используемый символ, n задает число таких символов. Позиция курсора не изменяется.
  • 8.6.5 Фоновый (background) символ

    • void bkgdset(ch)
      void wbkgdset(win, ch)
      Устанавливает фоновый символ и атрибут для экрана или окна. Атрибут в ch будет OR-нут с каждым непробельным символом окна. Фон становится частью окна и не изменяется при прокрутке и вводе/выводе.
    • int bkgd(ch)
      int wbkgd(win, ch)
      Установит в ch фоновый символ и атрибут.
    Код символа Позиция По умолчанию
    tl левая верхняя ACS_ULCORNER
    ts верхняя сторона ACS_HLINE
    tr правая верхняя ACS_URCORNER
    ls левая сторона ACS_VLINE
    rs правая сторона ACS_VLINE
    bl левая нижняя ACS_LLCORNER
    bs нижняя сторона ACS_HLINE
    br правая нижняя ACS_LRCORNER
    rt правая средняя ACS_RTEE
    lt левая средняя ACS_LTEE
    tt верхняя средняя ACS_TTEE
    bt нижняя средняя ACS_BTEE

    Таблица 8.3: Ограничительные символы Ncurses

    Рисунок 8.2: Символы бокса в ncurses.

    8.7 Ввод

    • int getch()
      int wgetch(win)
      int mvgetch(y, x)
      int mvwgetch(win, y, x)
      getch() прочитает ввод с терминала. Если режим паузы установлен, getch() будет ждать нажатия клавиши. Если нет, вернет клавишу из буфера ввода или ERR, если буфер пуст. mvgetch(. ) и mvwgetch(. ) сначала установят курсор на позицию y,x . w-функции читают ввод с терминала, связанного с окном win , getch() и mvgetch(. ) с stdscr.

    С включенной keypad(. ) при нажатии функциональной клавиши getch() вернет код, определенный в ncurses.h как макрос KEY_*. При нажатии ESCAPE (который может быть началом функциональной клавиши) ncurses запустит односекундный таймер. Если остаток не получен в течение этой секунды, то возвращается ESCAPE, иначе значение функциональной клавиши. При необходимости секундный таймер можно отключить через notimeout().

  • int ungetch(ch)
    Вернет ch в буфер ввода.
  • int getstr(str)
    int wgetstr(win, str)
    int mvgetstr(y, x, str)
    int mvwgetstr(win, y, x, str)
    int wgetnstr(win, str, n)
    Эти функции проделают серию вызовов getch(), пока не будет получена новая строка. Символы помещаются в str , поэтому не забывайте захватывать память для вашего символьного указателя перед вызовом getstr(). Если включено эхо, то строка отображается (используйте noecho(), чтобы его отключить) и пользовательские символы удаления будут проинтерпретированы.
  • chtype inch()
    chtype winch(win)
    chtype mvinch(y, x)
    chtype mvwinch(win, y, x)
    Эти функции возвращают символ с экрана или окна. Поскольку возвращается тип chtype , возвращается и атрибут. Информация об атрибуте может быть получена с помощью констант A_* (см. таблицу 8.4).
  • int instr(str)
    int innstr(str, n)
    int winstr(win, str)
    int winnstr(win, str, n)
    int mvinstr(y, x, str)
    int mvinnstr(y, x, str, n)
    int mvwinstr(win, y, x, str)
    int mvwinnstr(win, y, x, str, n)
    Возвращает символьную строку из экрана или окна.
  • int inchstr(chstr)
    int inchnstr(chstr, n)
    int winchstr(win, chstr)
    int winchnstr(win, chstr, n)
    int mvinchstr(y, x, chstr)
    int mvinchnstr(y, x, chstr, n)
    int mvwinchstr(win, y, x, chstr)
    int mvwinchnstr(win, y, x, chstr, n)
    Возвращает строку типа chtype из экрана или окна вместе с атрибутом для каждого символа. Пока не реализована; lib_inchstr не включена в библиотеку ncurses.
  • 8.7.1 Форматированный ввод

    • int scanw(fmt, . )
      int wscanw(win, fmt, . )
      int mvscanw(y, x, fmt, . )
      int mvwscanw(win, y, x, fmt, . )
      int vwscanw(win, fmt, va_list)
      Функции эквивалентны scanf(. ) из libc (см. раздел 8.1.2). Входом для сканирования служит вызов wgetstr(. ).

    8.8 Опции

    Опции вывода

    • int idlok(win, bf)
      void idcok(win, bf)
      Включение и отключение возможностей вставки/удаления для окна терминала (idlok(. ) для строк, idcok(. ) для символов).
    • void immedok(win, bf)
      Если устанавливается TRUE, то каждое изменение в окне win вызывает физическое обновление экрана. Это может ухудшить характеристики программы, поэтому значение по умолчанию FALSE.
    • int clearok(win, bf)
      Если bf равен TRUE, то следующий вызов wrefresh(win) очистит экран и полностью его перерисует (Ctrl+L в редакторе vi).
    • int leaveok(win, bf)
      По умолчанию ncurses ставит курсор там, где он был при последнем обновлении окна. Программы, не использующие курсор, могут установить leaveok(. ) TRUE и сэкономить время, требующееся для движения курсора.
    • int nl()
      int nonl()
      Управление переходом на новую строку. После nl() произойдетт возврат каретки и дозаполнение; nonl() отключает контроль. В последнем случае ncurses может ускорить перемещение курсора.

    8.8.1 Опции ввода

    • int keypad(win, bf)
      TRUE активизирует keypad на клавиатуре во время ожидания ввода. Для функциональных клавиш и стрелок keypad ncurses вернет код клавиши, определенный как KEY_* в ncurses.h. Это очень удобно для клавиатуры ПК, потому что вы имеете возможность и пользоваться цифровым блоком, и перемещать курсор.
    • int meta(win, bf)
      Если TRUE, то коды клавиш, возвращаемые getch(), 7-битовые (верхний бит не учитывается).
    • int cbreak()
      int nocbreak()
      int crmode()
      int nocrmode()
      cbreak() и nocbreak() устанавливают или снимают режим терминала CBREAK. Когда CBREAK установлен, читаемый ввод немедленно доступен программе, когда нет будет буферизован до получения целой строки. Замечание:crmode() и nocrmode() существуют для повышения совместимости, их использовать не нужно.
    • int raw()
      int noraw()
      Устанавливает или снимает режим RAW. RAW это то же, что и CBREAK, только без обработки специальных символов.
    • int echo()
      int noecho()
      Вызывайте echo() для отображения ввода пользователя и noecho(), чтобы его скрыть.
    • int halfdelay(t)
      То же, что и cbreak(), но с паузой в t секунд.
    • int nodelay(win, bf)
      Терминал устанавливается в неблокируемый режим. getch() вернет ERR, если ввод не готов. Если bf есть FALSE, то getch() будет ждать нажатия клавиши.
    • int timeout(t)
      int wtimeout(win, t)
      Эти функции рекомендуется использовать вместо halfdelay(t) и nodelay(win, bf). Результат getch() зависит от значения t . При положительном t считывание блокируется на t милисекунд; при t , равном нулю, блокировки не происходит; при отрицательном t программа блокируется, пока ввод не станет возможен.
    • int notimeout(win, bf)
      Если bf равен TRUE, getch() будет использовать односекундный таймер для интерпретации вводимой последовательности, начинающейся с ESCAPE и т.п.
    • int typeahead(fd)
      При fd , равном -1, никакой проверки печати производиться не будет, при других значениях ncurses будет использовать для таких проверок файловый дескриптор fd вместо stdin .
    • int intrflush(win, bf)
      При активизации истинным bf нажатая клавиша прерывания (типа quit, break) очистит очередь драйвера tty.

    8.8.2 Атрибуты терминала

    • int baudrate()
      Возвращает скорость терминала в bps (бит в секунду).
    • char erasechar()
      Возвращает текущий символ erase.
    • char killchar()
      Возвращает текущий символ kill.
    • int has_ic()
      int has_il()
      has_ic() возвращает TRUE, если терминал может вставлять/удалять символ, has_il() возвращает TRUE, если терминал может вставлять/удалять строку. В противном случае возвращается ERR.
    • char *longname()
      Указатель предоставляет доступ к описанию текущего терминала.
    • char *termname()
      Возвращает содержимое TERM из пользовательской среды.

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

    Поговорим об использовании опций окна и режимов терминала.

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

    Теперь имеется 2 основных типа ввода:

    1. Программа ожидает нажатия клавиши, чтобы вызвать соответствующую функцию (например, что-нибудь вроде «press ‘q’ for quit» и ждет q);
    2. Ожидается, что пользователь введет строку символов в маску на экране (например, каталог или адрес в базе данных).

    Для первого случая мы установим следующие опции и режимы, и цикл while сработает корректно:

    Эта программа повиснет до нажатия клавиши. Если нажата q, мы вызываем your_quit_function(), иначе ждем другого ввода.

    Выражение switch может быть расширено по нашему желанию. Макросы KEY_* служат для учета специальных клавиш. Например, для клавиш перемещения курсора. Для просмотра файла цикл может выглядеть примерно так:

    Для второго случая, нам достаточно установить echo(), и символы, набираемые пользователем, будут напечатаны на экране. Место печати задается функциями move(. ) или wmove(. ).

    Или вы можете открыть окно с маской (выделяемой другими цветами) и попросить пользователя ввести строку:

    Более подробно см. input.c в каталоге примеров.

    8.9 Очистка окна и линий

    • int erase()
      int werase(win)
      werase(. ) и erase() скопируют пробелы на каждую позицию окна win или stdscr. Например, если вы установили атрибуты цвета в окне и вызвали werase(), окно должно быть окрашено. Однако автор имел некоторые проблемы с COLOR_PAIRS, если определял другие атрибуты, а затем черный по белому, так он писал его собственную стирающую функцию (это низкоуровневый доступ к структуре WINDOW):

    Проблема состоит в том, что ncurses иногда делает совершенно бесполезными атрибуты окна, когда заполняет экран пробелами. Если в lib_clrtoeol.c BLANK определен как то другие атрибуты окна теряются, пока идет стирание строки.

  • int clear()
    int wclear(win)
    То же, что erase(), но будет также установлен clearok() (экран будет очищен с последующим обновлением).
  • int clrtobot()
    int wclrtobot(win)
    Очистка текущей строки курсора (начинается с символа справа от курсора) и строки под курсором.
  • int clrtoeol()
    int wclrtoeol(win)
    Очистка текущей строки начиная справа от курсора и до конца строки.
  • 8.10 Обновление терминала

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

    • int refresh()
      int wrefresh(win)
      refresh() копирует stdscr на терминал, а wrefresh(win) копирует изображение окна в stdscr и затем делает curscr подобным stdscr.
    • int wnoutrefresh(win)
      int doupdate()
      wnoutrefresh(win) копирует окно win только в stdscr. Это означает, что вывода на терминал не производится, но виртуальный экран stdscr на самом деле выглядит именно так, как того хочет программист. doupdate() произведет вывод на терминал. Программа может менять различные окна, вызывая wnoutrefresh(win) для каждого окна, а затем достаточно один раз вызвать doupdate(), чтобы обновить физический экран.

    Допустим, мы имеем следующую программу с двумя окнами. Мы изменяем оба окна, меняя несколько линий текста. Напишем cgangewin(win) с wrefresh(win).

    Тогда ncurses обновит терминал дважды, а это замедлит исполнение нашей программы. Благодаря doupdate() мы изменим changewin(win) и нашу основную функцию, добившись этим лучшего исполнения.

  • int redrawwin(win)
    int wredrawln(win, bline, nlines)
    Используйте эти функции, когда перед записью чего-нибудь нового требуется выбросить несколько строк или целый экран (может быть строки запорчены или что-либо вроде этого).
  • int touchwin(win)
    int touchline(win, start, count)
    int wtouchln(win, y, n, changed)
    int untouchwin(win)
    Говорит ncurses, что были произведены манипуляции с целым окном или линиями от start до start+count . Например, когда есть несколько окон, перекрывающих друг друга (как в примере type.c), изменение одного из них никак не повлияет на изображение других.

    wtouchln() захватит n линий, начинающихся в y . Если change соответствует TRUE, то линии захватываются, в противном случае нет (изменяются или не изменяются).

    untouchwin(win) пометит окно win как неизмененное со времени последнего вызова refresh().

  • int is_linetouched(win, line)
    int is_wintouched(win)
    При помощи этих функций вы можете проверить, были ли линия line или окно win захвачены со времени последнего вызова refresh().
  • 8.11 Видеоатрибуты и цвет

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

    Определение Атрибут
    A_ATTRIBUTES маска для атрибутов (chtype)
    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

    Таблица 8.4: Ncurses-атрибуты

    Ncurses определяет 8 цветов, которыми вы можете пользоваться на терминале с цветовой поддержкой. Сначала проинициализируйте цветовые структуры данных посредством start_color(), затем проверьте возможности терминала при помощи has_colors(). start_color() будет инициализировать COLORS, наибольшее количество цветов, поддерживаемых терминалом, и COLOR_PAIR, максимальное число цветовых пар, которые вы можете определить.

    Определение Цвет
    COLOR_BLACK черный
    COLOR_RED красный
    COLOR_GREEN зеленый
    COLOR_YELLOW желтый
    COLOR_BLUE синий
    COLOR_MAGENTA пурпурный
    COLOR_CYAN голубой
    COLOR_WHITE белый

    Таблица 8.5: Цвета в Ncurses

    Атрибуты могут быть совмещены ‘|’ (OR), поэтому вы можете получить четкий мерцающий вывод при помощи A_BOLD|A_BLINK

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

    Будьте осторожны с цветами, если вы пишете программы для ncurses и BSD curses, так как BSD curses не имеет цветовой поддержки. (Точно так же не имеют цветовой поддержки старые версии SYS V). Поэтому, если вы компилируете для обеих библиотек, придется использовать операции #ifdef.

    • int attroff(attr)
      int wattroff(win, attr)
      int attron(attr)
      int wattron(win, attr)
      Включают или отключают указанный атрибут attr , не влияя на другие атрибуты в окне (stdscr или win ).
    • int attrset(attr)
      int wattrset(win, attr)
      Установка атрибута в attr в stdscr или win .
    • int standout()
      int standend()
      int wstandout(win)
      int wstandend(win)
      Включают атрибут наиболее яркого режима для окна (stdscr или win ).
    • chtype getattrs(win)
      Выдает текущие атрибуты для окна win .
    • bool has_colors()
      Возвращает TRUE, если терминал имеет цвета. Перед тем, как использовать цвета, проверьте терминал has_colors() , а перед этим проинициализируйте цвета start_color() .
    • bool can_change_color()
      TRUE, если терминал может переопределять цвета.
    • int start_color()
      Цветовая инициализация. Эта функция должна быть вызвана перед использованием цветов!
    • int init_pair(pair,fg,bg)
      Если вы используете цвета в атрибутах окна, то сначала вы должны определить цветовую пару через init_pair(. ). fg и bg это цвета переднего и заднего плана, спаренные в pair . pair принимает значения от 1 до COLORPAIRS -1. 0 не ошибка, но зарезервирован для черного и белого. Определенную однажды pair можно использовать как атрибут. К примеру, нужны красные символы на синем: Теперь вызовем wattr(. ) для установки новой пары цветов для win : Или соединим цветовые пары с другими атрибутами, например: Первый вызов установит цветовую пару и атрибут BOLD, второй подключит режим STANDOUT, и вы получите светлый красный на синем экране.
    • int pair_content(pair, f, b)
      Вернет цвета переднего и заднего плана из pair .
    • int init_color(color, r, g, b)
      Изменит цветовые компоненты r , g и b для color . r , g и b находятся в диапазоне от 1 до COLORS -1.
    • int color_content(color, r, g, b)
      Получение компонентов r , g и b для color .

    Как комбинировать атрибуты и цвета? Некоторые терминалы, как консоли в Linux, имеют цвета, а некоторые нет (xterm, vs100 и т.д.). Следующий код решит эту проблему:

    Прежде всего, функция CheckColor проинициализирует цвета при помощи start_color(). Затем has_colors() вернет TRUE, если текущий терминал имеет цвета. После этого вызывается ini_tpair(. ) для соединения цветов переднего и заднего плана, и wattrset(. ) для установки этих цветов в данном окне. Впрочем, чтобы установить атрибуты для черно-белого терминала, мы можем использовать только wattrset(. ).

    Чтобы получить цвета на xterm, лучший способ, найденный автором, это использовать ansi_xterm с надерганными элементами terminfo из Midnight Commander. Просто добудьте исходники ansi_xterm и Midnight Commander (mc-x.x.tar.gz). Потом скомпилируйте ansi_xterm и используйте tic с xterm.ti и vt100.ti из архива mc-x.x.tar.gz. Запустите ansi_xterm и протестируйте его.

    8.12 Координаты курсора и окна

    • int move(y, x)
      int wmove(win, y, x)
      Движение курсора stdscr или win. Для функций ввода/вывода определяются дополнительные макросы, передвигающие курсор перед вызовом данных функций.
        int curs_set(bf)
        Переключает видимость/невидимость курсора, если терминал имеет такую возможность.
      • void getyx(win, y, x)
        Возвращает координаты курсора. Замечание: это макрос.
      • void getparyx(win, y, x)
        Если win подокно, getparyx(. ) сохранит координаты окна относительно родительского окна. В противном случае y и x установятся в -1.
      • void getbegyx(win, y, x)
        void getmaxyx(win, y, x)
        int getmaxx(win)
        int getmaxy(win)
        Сохранит начальные и размерные координаты для win в y и x .
      • int getsyx(int y, int x)
        int setsyx(int y, int x)
        Сохранит виртуальный курсор экрана в y и x или установит этот курсор. При y и x , равных -1, getsyx(. ) установит leaveok.

    8.13 Прокрутка

    • int scrollok(win, bf)
      Если TRUE, текст в окне win будет прокручен вверх на одну строку, когда курсор находится в правом нижнем углу и напечатан символ. Если FALSE, то курсор остается на прежней позиции.

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

  • int scroll(win)
    Эта функция прокрутит окно (и строки в структуре данных) на одну строку вверх.
  • int scrl(n)
    int wscrl(win, n)
    Эти функции прокрутят окно stdscr или win вверх или вниз, в зависимости от целого n . Если n положительное, произойдет прокрутка окна на n линий вверх, если n отрицательное на n линий вниз.
  • int setscrreg(t, b)
    int wsetscrreg(win, t, b)
    Устанавливают программную область прокрутки.
  • Следующий код объяснит, как прокручивать текст на экране. Смотрите также type.c в директории примеров.

    Мы хотим прокрутить текст в окне, имеющем 18 линий и 66 колонок. S[] это массив символов с текстом. Max_s является номером последней строки в S[]. Clear_line напечатает пробелы с текущей позиции курсора до конца строки, используя текущие атрибуты окна (не A_NORMAL, как это делает clrtoeol). Beg это последняя строка из s[], изображенная на данный момент на экране. Scroll перечень того, что должна сделать функция, показать NEXT или PREVious (следующую или предыдущую) строку текста.

    8.14 Заполнители

    • WINDOW *newpad(nlines, ncols)
    • WINDOW *subpad(orig, nlines, ncols, begy, begx)
    • int prefresh(pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)
    • int pnoutrefresh(pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)
    • int pechochar(pad, ch)

    8.15 Мягкие метки

    • int slk_init(int fmt)
    • int slk_set(int labnum, char *label, int fmt)
    • int slk_refresh()
    • int slk_noutrefresh()
    • char *slk_label(int labnum)
    • int slk_clear()
    • int slk_restore()
    • int slk_touch()
    • int slk_attron(chtype attr)
      int slk_attrset(chtype attr)
      int slk_attroff(chtype attr)
      Эти функции соответствуют функциям attron(attr), attrset(attr) and attroff(attr).

    8.16 Разное

    • int beep()
    • int flash()
    • char *unctrl(chtype c)
    • char *keyname(int c)
    • int filter()
    • void use_env(bf)
    • int putwin(WINDOW *win, FILE *filep)
    • WINDOW *getwin(FILE *filep)
    • int delay_output(int ms)
    • int flushinp()

    8.17 Низкоуровневый доступ

    • int def_prog_mode()
    • int def_shell_mode()
    • int reset_prog_mode()
    • int reset_shell_mode()
    • int resetty()
    • int savetty()
    • int ripoffline(int line, int (*init))
    • int napms(int ms)

    8.18 Дамп экрана

    • int scr_dump(char *filename)
    • int scr_restore(char *filename)
    • int scr_init(char *filename)
    • int scr_set(char *filename)

    8.19 Эмуляция termcap

    • int tgetent(char *bp, char *name)
    • int tgetflag(char id[2])
    • int tgetnum(char id[2])
    • char *tgetstr(char id[2], char **area)
    • char *tgoto(char *cap, int col, int row)
    • int tputs(char *str, int affcnt, int (*putc)())

    8.20 Функции terminfo

    • int setupterm(char *term, int fildes, int *errret)
    • int setterm(char *term)
    • int set_curterm(TERMINAL *nterm)
    • int del_curterm(TERMINAL *oterm)
    • int restartterm(char *term, int fildes, int *errret)
    • char *tparm(char *str, p1, p2, p3, p4, p5, p6, p7, p8, p9)
      p1 — p9 long int.
    • int tputs(char *str, int affcnt, int (*putc)(char))
    • int putp(char *str)
    • int vidputs(chtype attr, int (*putc)(char))
    • int vidattr(chtype attr)
    • int mvcur(int oldrow, int oldcol, int newrow, int newcol)
    • int tigetnum(char *capname)
    • int tigetstr(char *capname)

    8.21 Функции отладки

    • void _init_trace()
    • void _tracef(char *, . )
    • char *_traceattr(mode)
    • void traceon()
    • void traceoff()

    8.22 Свойства terminfo

    8.22.1 Boolean

    Переменная Имя свойства Внутренний код Описание
    auto_left_margin bw bw Cub1 переносит с колонки 0 в последнюю колонку
    auto_right_margin am am Границы терминала устанавливаются автоматически
    back_color_erase bce ut Экран очищается с цветом фона
    can_change ccc cc Терминал может переопределять существующие цвета
    ceol_standout_glitch xhp xs выделение не удаляется перезаписью (hp)
    col_addr_glith xhpa YA Только положительное движение для свойств hpa/mhpa
    cpi_changes_res cpix YF Изменение размеров символа изменяет разрешение
    cr_cancels_micro_mode crxm YB Использование cr отключает режим micro
    eat_newline_glitch xenl xn Новая строка игнорируется после 80 столбцов (Concept)
    erase_overstrike eo eo Можно забить пробелом
    generic_type gn gn Общий тип линии (такой как выделенная или коммутируемая)
    hard_copy hc hc Терминал твердой копии
    hard_cursor chts HC Курсор аппаратный
    has_meta_key km km Имеет метаклавишу ($shift, sets parity bit$)
    has_print_wheel daisy YC требуется вмешательство оператора, чтобы изменить символьную таблицу притера
    has_status_line hs hs Имеет дополнительную строку статуса
    hue_lightness_saturation hls hl Терминал использует только цветовую нотацию HLS (Tektronix)
    insert_null_glitch in in Режим вставки распознает нули
    lpi_changes_res lpix YG Изменение толщины линии изменяет разрешение
    memory_above da da Сохранение содержимого дисплея над экраном
    memory_below db db Сохранение содержимого дисплея под экраном
    move_insert_mode mir mi Безопасность передвижения в режиме вставки
    move_standout_mode msgr ms Безопасность передвижения в режиме выделения
    needs_xon_xoff nxon nx Дозаполнение не будет работать, требуется xon/xoff
    no_esc_ctl_c xsb xb $Beehive$ (f1=escape, f2=Ctrl-C)
    non_rev_rmcup nrrmc NR smcup не оборачивает rmcup
    no_pad_char npc NP Символ заполнения не существует
    non_dest_scroll_region ndscr ND Область прокрутки ненарушаема
    over_strike os os Терминал забивает символы
    prtr_silent mc5i 5i Принтер не создает эха на экране
    row_addr_glitch xvpa YD Только положительное движение для свойств vhp\mvpa
    semi_auto_right_margin sam YE Печать в последнем столбце вызывает cr
    status_line_esc_ok eslok es Escape может быть использован в строке статуса
    dest_tabs_magic_smso xt xt Нарушена табуляция, magic so char (Teleray 1061)
    tilde_glitch hz hz Невозможно напечатать тильды
    transparent_underline ul ul Забой подчеркивания
    xon_xoff xon xo Терминал использует команды xon/xoff

    8.22.2 Numbers

    Переменная Имя свойства Внутренний код Описание
    bit_image_entwining bitwin Yo Не документировано в SYSV
    buffer_capacity bufsz Ya Буфер печати
    columns cols co Число колонок в линии
    dot_vert_spacing spinv Yb Высота позиции, в pin на дюйм
    dot_horz_spacing spinh Yc Ширина позиции, в точках на дюйм
    init_tabs it it Табуляторы изначально каждые # позиций
    label_height lh lh Линий в каждой метке
    label_width lw lw Колонок в каждой метке
    lines lines li Число линий на экране или странице
    lines_of_memory lm/TD> lm Число линий в памяти, 0 означает переменное
    magic_cookie_glitch xmc/TD> sg/TD> Число пробелов слева от smso или rmso
    max_colors colors/TD> Co Максимальное количество цветов на экране
    max_micro_address maddr Yd Максимальное значение в micro_. _adress
    max_micro_jump mjump Ye Максимальное значение в parm_. _micro
    max_pairs pairs pa Максимальное число цветовых пар на экране
    micro_col_size mcs Yf Размер шага символа в режиме micro
    micro_line_size mls Yg Размер шага линии в режиме micro
    no_color_video ncv NC Видеоатрибуты, которые нельзя использовать с цветами
    number_of_pins npins Yh Число pin на головке принтера
    num_labels nlab Nl Число меток на экране
    output_res_char orc Yi Горизонтальное разрешение, в единицах на линию
    output_res_line orl Yj Вертикальное разрешение, в единицах на линию
    output_res_horz_inch orhi Yk Горизонтальное разрешение, в единицах на дюйм
    output_res_vert_inch orvi Yl Вертикальное разрешение, в единицах на дюйм
    padding_baud_rate pb pb Нижняя граница, когда требуется cr/nl заполнение
    virtual_terminal vt vt Номер виртуального терминала (UNIX)
    width_status_line wsl ms Число колонок в строке статуса
    bit_image_type bitype Yp Тип устройства двоичного образа
    buttons tns BT Количество кнопок мыши
    max_attributes ma ma Максимальное число атрибутов, которое можно установить для терминала одновременно
    maximum_windows wnum MW Максимальное число возможных окон
    print_rate cps Ym Скорость печати, в символах в секунду
    wide_char_size widcs Yn Размер шага символа в режиме двойной ширины

    Последние шесть числовых свойств присутствуют в структуре term SYSV, но не задокументированы в man page. Комментарии взяты из заголовка этой структуры.

    8.22.3 Strings

    acs_chars acsc ac $Graphics charset pairs$ def=vt100
    alt_scancode_esc scesa S8 Альтернативный esc для эмуляции $scancode$ (по умолчанию vt100)
    back_tab cbt bt Возврат табулятора (P)
    bell bel bl Слышимый сигнал (звонок) (P)
    bit_image_repeat birep Xy Повторение двоичного образа ячейки #1 #2 раз (использует tparm)
    bit_image_newline binel Zz Передвижение на следующую линию двоичного образа (использует tparm)
    bit_image_carriage_return bicr Yv Передвижение на начало линии двоичного образа (использует tparm)
    carriage_return cr cr Возврат каретки
    change_char_pitch cpi ZA Изменение # символов на дюйм
    change_line_pitch lpi ZB Изменение # линий на дюйм
    change_res_horz chr ZC Изменение горизонтального разрешения
    change_res_vert cvr ZD Изменение вертикального разрешения
    change_scroll_region csr cs Изменение до #1 линий через #2 (vt100) (PG)
    char_padding rmp rP Как ip, только когда в режиме вставки
    char_set_names csnm Zy Список наименований символьной таблицы
    clear_all_tabs tbc ct Очистка всех позиций табуляции (P)
    clear_margins mgc MC Очистка всех границ (верхней, нижней и сторон)
    clear_screen clear cl Очистка экрана и курсор home (P*)
    clr_bol el1 cb Очистка до начала строки
    clr_eol el ce Очистка до конца строки (P)
    clr_eos ed cd Очистка до конца дисплея (P*)
    code_set_init csin ci Инициализация последовательности для сложных таблиц кодов
    color_names colornm Yw Дать наименование для цвета #1
    column_address hpa ch Установка колонки курсора (PG)
    command_character cmdch CC cmd символ терминально устанавливаем в прототипе
    cursor_address cup cm Показ движения курсора строка #1 колонка #2 (PG)
    cursor_down cud1 do Вниз на одну линию
    cursor_home home ho Курсор в начало (если не указана позиция курсора)
    cursor_invisible civis vi Сделать курсор невидимым
    cursor_left cub1 le Передвижение курсора на одну позицию влево
    cursor_mem_address mrcup CM Запоминание соответствующей адресации курсора
    cursor_normal cnorm ve Придать курсору нормальную видимость (undo vs/vi)
    cursor_right cuf1 nd Ненарушаемое пространство (курсор вправо)
    cursor_to_ll ll ll Последняя строка, первая колонка (если не указана позиция курсора)
    cursor_up cuu1 up Пересылка на верхний уровень (курсор вверх)
    cursor_visible cvvis vs Сделать курсор сильновидимым
    define_bit_image_region defbi Yx Определение прямоугольной области двоичного образа (использует tparm)
    define_char defc ZE Определение символов в символьной таблице
    delete_character dch1 dc Удаление символа (P*)
    delete_line dl1 dl Удаление линии (P*)
    device_type devt dv Индикация поддержки языка/таблицы кодов
    dis_status_line dsl ds Невозможна строка статуса
    display_pc_char dispc S1 Отображение символа ПК
    down_half_line hd hd Пол-линии вниз (вперед 1/2 перевода строки)
    ena_acs enacs eA Включена альтернативная символьная таблица
    end_bit_image_region endbi Yy Конец области двоичного образа (использует tparm)
    enter_alt_charset_mode smacs as Начало альтернативная символьной таблицы (P)
    enter_am_mode smam SA Включение автоматических границ
    enter_blink_mode blink mb Включение мигания
    enter_bold_mode bold md Включения суперяркого режима
    enter_ca_mode smcup ti Строка начала программ, использующих позицию курсора
    enter_delete_mode smdc dm Режим удаления (enter)
    enter_dim_mode dim mh Включение полуяркого режима
    enter_doublewide_mode swidm ZF Возможен режим двойной ширины
    enter_draft_quality sdrfq ZG Установка качества печати
    enter_insert_mode smir im Режим вставки (enter)
    enter_italics_mode sitm ZH Возможен режим курсива
    enter_leftward_mode slm ZI Возможно движение каретки влево
    enter_micro_mode smicm ZJ Разблокирование возможностей микропередвижения
    enter_near_letter_quality snlq ZK Установка печати NLQ
    enter_normal_quality snrmq ZL Установка нормального качества печати
    enter_pc_charset_mode smpch S2 Ввод режима показа символов ПК
    enter_protected_mode prot mp Включение защищенного режима
    enter_reverse_mode rev mr Включение обратного видеорежима
    enter_scancode_mode smsc S4 Ввод режима scancode ПК
    enter_secure_mode invis mk Включение пробельного режима (символы невидимы)
    enter_shadow_mode sshm ZM Возможен режим оттененной печати
    enter_standout_mode smso so Начало режима выделения
    enter_subscript_mode ssubm ZN Возможна печать индекса
    enter_superscript_mode ssupm ZO Возможна печать верхнего индекса
    enter_underline_mode smul us Начало режима подчеркивания
    enter_upward_mode sum ZP Возможно движение каретки вверх
    enter_xon_mode smxon SX Включение подтверждения связи xon/xoff
    erase_chars ech ec Очистка #1 символов (PG)
    exit_alt_charset_mode rmacs ae Конец альтернативной символьной таблицы (P)
    exit_am_mode rmam RA Отключение автоматических границ
    exit_attribute_mode sgr0 me Отключение всех атрибутов
    exit_ca_mode rmcup te Строка конца программ, использующих позицию курсора
    exit_delete_mode rmdc ed Конец режима удаления
    exit_doublewide_mode rwidm ZQ Невозможна печать с двойной шириной
    exit_insert_mode rmir ei Конец режима вставки
    exit_italics_mode ritm ZR Невозможна печать курсивом
    exit_leftward_mode rlm ZS Возможно движение каретки вправо (нормального режима)
    exit_micro_mode rmicm ZT Заблокированы возможности микропередвижения
    exit_pc_charset_mode rmpch S3 Невозможен показ символов ПК
    exit_scancode_mode rmsc S5 Невозможен режим просмотра ПК
    exit_shadow_mode rshm ZU Невозможна оттененная печать
    exit_standout_mode rmso se Конец режима выделения
    exit_subscript_mode rsubm ZV Невозможна подстрочная печать
    exit_superscript_mode rsupm ZW Невозможна надстрочная печать
    exit_underline_mode rmul ue Конец режима подчеркивания
    exit_upward_mode rum ZX Возможно движение каретки вниз
    exit_xon_mode rmxon RX Отключение подтверждения связи xon/xoff
    flash_screen flash vb Видимый звонок (невозможно передвижение курсора)
    form_feed ff ff Терминал твердой копии извергает страницы (P*)
    form_status_line fsl fs Возврат со строки статуса
    init_1string is1 i1 Строка инициализации терминала
    init_2string is2 i2 Строка инициализации терминала
    init_3string is3 i3 Строка инициализации терминала
    init_file if if Название содержащего файла
    init_prog iprog iP Путь программы для инициализации
    initialize_color initc Ic Инициализация определения цвета
    initialize_pair initp Ip Инициализация цветовой пары
    insert_character ich1 ic Символ вставки (P)
    insert_line il1 al Добавление новой чистой строки (P*)
    insert_padding ip ip Забивка после вставленного символа (p*)
    key_a1 ka1 K1 Верхний левый keypad
    key_a3 ka3 K3 Верхний правый keypad
    key_b2 ka2 K2 Центр keypad
    key_backspace kbs kb Послан клавишей backspace
    key_beg kbeg 1 Клавиша начала
    key_btab kcbt kB Клавиша назад табуляции
    key_c1 kc1 K4 Нижний левый keypad
    key_c3 kc3 K5 Нижний левый keypad
    key_cancel kcan 2 Клавиша cancel
    key_catab ktbc ka Послан клавишей очистки всей табулиции
    key_clear kclr kC Послан клавишей очистки экрана или клавишей очистки (стирания)
    key_close kclo 3 Клавиша close
    key_command kcmd 4 Командная клавиша
    key_copy kcpy 5 Клавиша копирования
    key_create kcrt 6 Клавиша создания
    key_ctab kctab kt Послан клавишей очистки табулиции
    key_dc kdch1 kD Послан клавишей удаления символа
    key_dl kdl1 kL Послан клавишей удаления строки
    key_down kcud1 kd Послан клавишей нижнего терминального массива
    key_eic krmir kM Послан клавишей rmir или smir в режиме вставки
    key_end kend 7 Клавиша end
    key_enter kent 8 Клавиша ввода/посылки
    key_eol kel kE Послан клавишей очистки до конца строки
    key_eos ked kS Послан клавишей очистки до конца экрана
    key_exit kext 9 Клавиша выхода
    key_f0 kf0 k0 Функциональная клавиша F00
    key_f1 kf1 k1 Функциональная клавиша F01
    key_f2 kf2 k2 Функциональная клавиша F02
    key_f3 kf3 k3 Функциональная клавиша F03
    key_f4 kf4 k4 Функциональная клавиша F04
    key_f5 kf5 k5 Функциональная клавиша F05
    key_f6 kf6 k6 Функциональная клавиша F06
    key_f7 kf7 k7 Функциональная клавиша F07
    key_f8 kf8 k8 Функциональная клавиша F08
    key_f9 kf9 k9 Функциональная клавиша F09
    key_f10 kf10 k; Функциональная клавиша F10
    key_f11 kf11 F1 Функциональная клавиша F11
    key_f12 kf12 F2 Функциональная клавиша F12
    key_f13 kf13 F3 Функциональная клавиша F13
    key_f14 kf14 F4 Функциональная клавиша F14
    key_f15 kf15 F5 Функциональная клавиша F15
    key_f16 kf16 F6 Функциональная клавиша F16
    key_f17 kf17 F7 Функциональная клавиша F17
    key_f18 kf18 F8 Функциональная клавиша F18
    key_f19 kf19 F9 Функциональная клавиша F19
    key_f20 kf20 FA функциональная клавиша F00
    key_f21 kf21 FB функциональная клавиша F01
    key_f22 kf22 FC функциональная клавиша F02
    key_f23 kf23 FD функциональная клавиша F03
    key_f24 kf24 FE функциональная клавиша F04
    key_f25 kf25 FF функциональная клавиша F05
    key_f26 kf26 FG функциональная клавиша F06
    key_f27 kf27 FH функциональная клавиша F07
    key_f28 kf28 FI функциональная клавиша F08
    key_f29 kf29 FJ функциональная клавиша F09
    key_f30 kf30 FK функциональная клавиша F10
    key_f31 kf31 FL функциональная клавиша F11
    key_f32 kf32 FM функциональная клавиша F12
    key_f33 kf33 FN функциональная клавиша F13
    key_f34 kf34 FO функциональная клавиша F14
    key_f35 kf35 FP функциональная клавиша F15
    key_f36 kf36 FQ функциональная клавиша F16
    key_f37 kf37 FR функциональная клавиша F17
    key_f38 kf38 FS функциональная клавиша F18
    key_f39 kf39 FT функциональная клавиша F19
    key_f40 kf40 FU функциональная клавиша F00
    key_f41 kf41 FV функциональная клавиша F01
    key_f42 kf42 FW функциональная клавиша F02
    key_f43 kf43 FX функциональная клавиша F03
    key_f44 kf44 FY функциональная клавиша F04
    key_f45 kf45 FZ функциональная клавиша F05
    key_f46 kf46 Fa функциональная клавиша F06
    key_f47 kf47 Fb функциональная клавиша F07
    key_f48 kf48 Fc функциональная клавиша F08
    key_f49 kf49 Fd функциональная клавиша F09
    key_f50 kf50 Fe функциональная клавиша F10
    key_f51 kf51 Ff функциональная клавиша F11
    key_f52 kf52 Fg функциональная клавиша F12
    key_f53 kf53 Fh функциональная клавиша F13
    key_f54 kf54 Fi функциональная клавиша F14
    key_f55 kf55 Fj функциональная клавиша F15
    key_f56 kf56 Fk функциональная клавиша F16
    key_f57 kf57 Fl функциональная клавиша F17
    key_f58 kf58 Fm функциональная клавиша F18
    key_f59 kf59 Fn функциональная клавиша F19
    key_f60 kf60 Fo функциональная клавиша F10
    key_f61 kf61 Fp функциональная клавиша F11
    key_f62 kf62 Fq функциональная клавиша F12
    key_f63 kf63 Fr функциональная клавиша F13
    key_find kfnd клавиша поиска
    key_help khlp %1 клавиша помощи
    key_home khome kh послан клавишей home
    key_ic kich1 kI послан клавишей символ вставки/ ввод режима вставки
    key_il kil1 kA послан клавишей вставки строки
    key_left kcub1 kl послан клавишей левого терминального массива
    key_ll kll kH послан клавишей home-down
    key_mark kmrk %2 клавиша пометки
    key_message kmsg %3 клавиша сообщения
    key_move kmov %4 клавиша перемещения
    key_next knxt %5 клавиша следующего
    key_npage knp kN послан клавишей следующей страницы
    key_open kopn %6 клавиша открывания
    key_options kopt %7 клавиша опций
    key_ppage kpp kP послан клавишей предыдущей страницы
    key_previous kprv %8 клавиша предыдущего
    key_print kprt %9 клавиша печати
    key_redo krdo %0 клавиша redo
    key_reference kref &1 клавиша ссылки
    key_refresh krfr &2 клавиша обновления
    key_replace krpl &3 клавиша перестановки
    key_restart krst &4 клавиша перезапуска
    key_resume kres &5 клавиша возобновления работы
    key_right kcuf1 kr послан клавишей стрелки враво
    key_save ksav &6 клавиша сохранения
    key_sbeg kBEG &9 клавиша начала в верхнем регистре
    key_scancel kCAN &0 клавиша cancel в верхнем регистре
    key_scommand kCMD *1 командная клавиша в верхнем регистре
    key_scopy kCPY *2 клавиша копирования в верхнем регистре
    key_screate kCRT *3 клавиша создания в верхнем регистре
    key_sdc kDC *4 клавиша удаления символа в верхнем регистре
    key_sdl kDL *5 клавиша удаления строки в верхнем регистре
    key_select kslt *6 клавиша выделения
    key_send kEND *7 клавиша конца в верхнем регистре
    key_seol kEOL *8 клавиша конца строки в верхнем регистре
    key_sexit kEXT *9 клавиша выхода в верхнем регистре
    key_sf kind kF послан клавишей прокрутки прямо/вниз
    key_sfind kFND *0 клавиша поиска в верхнем регистре
    key_shelp kHLP #1 клавиша помощи в верхнем регистре
    key_shome kHOM #2 клавиша начала в верхнем регистре
    key_sic kIC #3 клавиша вставки символа в верхнем регистре
    key_sleft kLFT #4 клавиша влево в верхнем регистре
    key_smessage kMSG %a клавиша сообщения в верхнем регистре
    key_smove kMOV %b клавиша перемещения в верхнем регистре
    key_snext kNXT %c клавиша следующего в верхнем регистре
    key_soptions kOPT %d клавиша опций в верхнем регистре
    key_sprevious kPRV %e клавиша предыдущего в верхнем регистре
    key_sprint kPRT %f клавиша печати в верхнем регистре
    key_sr kri kR послан клавишей прокрутки назад/вверх
    key_sredo kRDO %g клавиша redo в верхнем регистре
    key_sreplace kRPL %h клавиша перестановки в верхнем регистре
    key_sright kRIT %i клавиша вправо в верхнем регистре
    key_sresume kRES %j клавиша возобновления работы в верхнем регистре
    key_ssave kSAV !1 клавиша сохранения в верхнем регистре
    key_ssuspend kSPD !2 клавиша приостановки в верхнем регистре
    key_stab khts kT послан клавишей установки табуляции
    key_sundo kUND !3 клавиша undo в верхнем регистре
    key_suspend kspd &7 клавиша приостановки
    key_undo kund &8 клавиша undo
    key_up kcuu1 ku послан клавишей вверх терминала
    keypad_local rmkx ke выход из режима $»keypad transmit»$
    keypad_xmit smkx ks установка режима $»keypad transmit»$ терминала
    lab_f0 lf0 l0 метки на функциональную клавишу f0, если не f0
    lab_f1 lf1 l1 метки на функциональную клавишу f1, если не f1
    lab_f2 lf2 l2 метки на функциональную клавишу f2, если не f2
    lab_f3 lf3 l3 метки на функциональную клавишу f3, если не f3
    lab_f4 lf4 l4 метки на функциональную клавишу f4, если не f4
    lab_f5 lf5 l5 метки на функциональную клавишу f5, если не f5
    lab_f6 lf6 l6 метки на функциональную клавишу f6, если не f6
    lab_f7 lf7 l7 метки на функциональную клавишу f7, если не f7
    lab_f8 lf8 l8 метки на функциональную клавишу f8, если не f8
    lab_f9 lf9 l9 метки на функциональную клавишу f9, если не f9
    lab_f10 lf10 la метки на функциональную клавишу f10, если не f10
    label_on smln LO подключение мягких меток
    label_off rmln LF отключение мягких меток
    meta_off rmm mo отключение метарежима
    meta_on smm mm включение метарежима (8-ой бит)
    micro_column_address mhpa ZY как column_address для микрорегулировки
    micro_down mcud1 ZZ как cursor_down для микрорегулировки
    micro_left mcub1 Za как cursor_left для микрорегулировки
    micro_right mcuf1 Zb как cursor_right для микрорегулировки
    micro_row_address mvpa Zc как row_address для микрорегулировки
    micro_up mcuu1 Zd как cursor_up для микрорегулировки
    newline nel nw новая линия (действует, как lf после cr)
    order_of_pins porder Ze Соединяет программные $buts$ с pin головки принтера
    orig_colors oc oc Сброс всех цветовых пар
    orig_pair op op Установка цветовой пары по умолчанию, как в первоначальном варианте
    pad_char pad pc Символ-заполнитель (скорее всего null)
    parm_dch dch DC Удаление #1 символов (PG*)
    parm_delete_line dl DL Удаление #1 строк (PG*)
    parm_down_cursor cud DO Движение курсора вниз на #1 строк (PG*)
    parm_down_micro mcud Zf Как cud для микрорегулирования
    parm_ich ich IC Вставка #1 пробельных символов (PG*)
    parm_index indn SF Прокрутка вперед #1 строк (PG)
    parm_insert_line il AL Добавление #1 новых чистых строк (PG*)
    parm_left_cursor cub LE Перемещение курсора влево на #1 позиций (PG)
    parm_left_micro mcub Zg Как cul для микрорегулирования
    parm_right_cursor cuf RI Перемещение курсора вправо на #1 позиций (PG*)
    parm_right_micro mcuf Zh Как cur для микрорегулирования
    parm_rindex rin SR Прокрутка назад на #1 строк (PG*)
    parm_upcursor cuu UP Перемещение курсора вверх на #1 строк (PG*)
    parm_upmicro mcuu Zi Как cuu для микрорегулирования
    pkey_key pfkey pk Программная функциональная клавиша #1 для печати строки #2
    pkey_local pfloc pl Программная функциональная клавиша #1 для выполнения строки #2
    pkey_xmit pfx px Программная функциональная клавиша #1 для xmit строки #2
    pkey_plab pfxl xl Программная клавиша #1 для xmit #2 и показа #3
    plab_norm pln pn Программная метка #1 для показа строки #2
    print_screen mc0 ps Печать содержимого экрана
    prtr_non mc5p pO Включение принтера для #1 байт
    prtr_off mc4 pf Выключение принтера
    prtr_on mc5 po Включение принтера
    repeat_char rep rp Повторение символа #1 #2 раз (PG*)
    req_for_input rfi RF Запрос на ввод
    reset_1string rs1 r1 Перезапуск терминала в нормальный режим
    reset_2string rs2 r2 Перезапуск терминала в нормальный режим
    reset_3string rs3 r3 Перезапуск терминала в нормальный режим
    reset_file rf rf Имя файла, содержащего строку перезапуска
    restore_cursor rc rc Установка курсора на позицию последнего sc
    row_address vpa cv Абсолютная вертикальная позиция (установка линии) (PG)
    save_cursor sc sc Сохранение позиции курсора (P)
    scancode_escape scesc S7 Escape для эмуляции scancode
    scroll_forward ind sf Прокрутка текста вверх (P)
    scroll_reverse ri sr Прокрутка текста вниз (P)
    select_char_set scs Zj Выбор символьной таблицы
    set0_des_seq s0ds s0 $Shift to codeset 0 (EUC set 0, ASCII)$
    set1_des_seq s1ds s1 $Shift to codeset 1$
    set2_des_seq s2ds s2 $Shift to codeset 2$
    set3_des_seq s3ds s3 $Shift to codeset 3$
    set_a_background setab AB Установка цвета заднего плана, используя ANSI escape
    set_a_foreground setaf AF Установка цвета переднего плана, используя ANSI escape
    set_attributes sgr sa Установка видеоатрибутов (PG9)
    set_background setb Sb Установка текущего цвета заднего плана
    set_bottom_margin smgb Zk Объявление текущей строки нижней границей
    set_bottom_margin_parm smgbp Zl Строки на расстоянии #1 или #2 от нижней границы объявляются нижней границей
    set_color_band setcolor Yz Установить текущим цвет #1
    set_color_pair scp sp Установка текущей цветовой пары
    set_foreground setf Sf Установка текущего цвета переднего плана
    set_left_margin smgl ML Установка текущей колонки как левой границы
    set_left_margin_parm smglp Zm Установка левой (правой) границы на #1 (#2)
    set_lr_margin smglr ML Установка левой и правой границ
    set_page_lingth slines YZ Установка длины страницы в #1 линий (используйте tparm)
    set_right_margin smgr MR Установка текущей колонки как правой границы
    set_right_margin_parm smgrp Zn Установка колонки #1 как правой границы
    set_tab hts st Установка табуляций на всех линиях в текущей колонке
    set_tb_margin smgtb MT Установка верхней и нижней границ
    set_top_margin smgt Zo Установка текущей строки как верхней границы
    set_top_margin_parm smgtp Zp Установка строки #1 как верхней границы
    set_window wind wi Текущее окно: строки #1-#2, колонки #3-#4
    start_bit_image sbim Zq Начало печати bit image
    start_char_set_def scsd Zr Начало определения символьной таблицы
    stop_bit_image rbim Zs Конец печати bit image
    stop_char_set_def rcsd Zt Конец определения символьной таблицы
    subscript_characters subcs Zu Список подстрочных символов
    superscript_characters supcs Zv Список надстрочных символов
    tab ht ta Табуляция на 8 следующих позиций
    these_cause_cr docr Zw Данные символы вызывают CR
    to_status_line tsl ts Переход на строку статуса, первую колонку
    underline_char uc uc Подчеркнуть символ и встать после него
    up_half_line hu hu Передвижение на 1/2 содержимого строки
    xoff_character xoffc XF символ XOFF
    xon_character xonc XN символ XON

    Следующие числовые свойства присутствуют в структуре term SYSV, но не задокументированы в man page. Комментарии взяты из заголовка этой структуры.

    Что такое код ncurses_slk_clear

    (PHP 4 >= 4.1.0, PHP 5)

    ncurses_slk_clear — Clears soft labels from screen

    Description bool ncurses_slk_clear ( void )

    This function is EXPERIMENTAL . The behaviour of this function, the name of this function, and anything else documented about this function may change without notice in a future release of PHP. Use this function at your own risk.

    The function ncurses_slk_clear() clears soft label keys from screen.

    Что такое код ncurses_slk_clear

    Скидка 25% на все тарифы хостинга по промокоду STDCITF

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

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

    8.8.1. Опции ввода

    * int keypad(win, bf)

    TRUE активизирует keypad на клавиатуре во время ожидания ввода. Для функциональных клавиш и стрелок keypad ncurses вернет код клавиши, определенный как KEY_* в ncurses.h. Это очень удобно для клавиатуры ПК, потому что вы имеете возможность и пользоваться цифровым блоком, и перемещать курсор.

    Если TRUE, то коды клавиш, возвращаемые getch(), 8-битовочистые (верхний бит не учитывается).

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

    Устанавливает или снимает режим RAW. RAW — это то же, что и CBREAK, только без обработки специальных символов.

    Вызывайте echo() для отображения ввода пользователя и noecho(), чтобы его скрыть. * int halfdelay(t)

    То же, что cbreak() с паузой в t секунд.

    * int nodelay(win, bf)

    Терминал устанавливается в неблокируемый режим. getch() вернет ERR, если ввод не готов. Если bf есть FALSE, то getch() будет ждать нажатия клавиши.

    Эти функции рекомендуется использовать вместо halfdelay(t) и nodelay(win, bf). Результат getch() зависит от значения t. При положительном t считывание блокируется на t милисекунд; при t, равном нулю, блокировки не происходит; при отрицательном t программа блокируется, пока ввод не станет возможен.

    * int notimeout(win, bf)

    Если bf равен TRUE, getch() будет использовать односекундный таймер для интерпретации вводимой последовательности, начинающейся с ESCAPE и т.п.

    При fd, равном -1, никакой проверки печати производиться не будет, при других значениях ncurses будет использовать для таких проверок файловый дескриптор fd вместо stdin.

    * int intrflush(win, bf)

    При активизации истинным bf нажатая клавиша прерывания (типа quit, break) очистит очередь драйвера tty. (Пока не реализованы.)

    8.8.2. Атрибуты терминала

    Возвращает скорость терминала в bps (бит в секунду).

    Возвращает текущий символ erase.

    Возвращает текущий символ kill.

    * int has_ic()
    int has_il()
    has_ic()

    возвращает TRUE, если терминал может вставлять/удалять символ, has_il() возвращает TRUE, если терминал может ставлять/удалять линию. В противном случае возвращается ERR. (Пока не реализованы.)

    Указатель предоставляет доступ к описанию текущего терминала.

    (Пока не реализована.)

    Возвращает содержимое TERM из пользовательской среды. (Пока не реализована.)

    8.8.3. Использование опций

    Поговорим об использовании опций окна и режимов терминала.

    Прежде всего, под Linux-ом вам следует подключить keypad. Это позволит пользоваться цифровым блоком и клавишами перемещения курсора на клавиатуре ПК.

    Теперь имеется 2 основных типа ввода:

    1. программа ожидает нажатия клавиши, чтобы вызвать соответствующую функцию (например, что-нибудь вроде «press ‘q’ for quit» и ждет q);
    2. ожидается, что пользователь напечатает строку символов в маску на экране (например, каталог или адрес в базе данных).

    Для первого случая мы установим следующие опции и режимы, и цикл while сработает корректно:

    Эта программа повиснет до нажатия клавиши. Если нажата q, мы вызываем your_quit_function(), иначе — ждем другого ввода.

    Выражение switch может быть расширено по нашему желанию. Макросы KEY_* служат для учета специальных клавиш. Например,

    для клавиш перемещения курсора.

    Для просмотра файла цикл может выглядеть примерно так:

    Для второго случая, нам достаточно установить echo(), и символы, набираемые пользователем, будут напечатаны на экране. Место печати задается функциями move(. ) или wmove(. ).

    Или вы можете открыть окно с маской (выделяемой другими цветами) и попросить пользователя ввести строку:

    Более подробно см. input.c в директории примеров.

    8.9. Очистка окна и линий

    werase(. ) и erase() скопируют пробелы на каждую позицию окна win или stdscr. Например, если вы установили атрибуты цвета в окне и вызвали werase(), окно должно быть окрашено. Однако автор имел некоторые проблемы с COLOR_PAIRS, если определял другие атрибуты, а затем черный по белому, так он писал его собственную стирающую функцию (это низкоуровневый доступ к структуре WINDOW):

    Проблема состоит в том, что ncurses иногда делает совершенно бесполезными атрибуты окна, когда заполняет экран пробелами. Если в lib_clrtoeol.c BLANK определен как

    то другие атрибуты окна теряются, пока идет стирание строки.

    То же, что erase(), но будет также установлен clearok() (экран будет очищен с последующим обновлением).

    Очистка текущей линии курсора (начинается с символа справа от курсора) и строки под курсором.

    Очистка текущей строки начиная справа от курсора и до конца строки.

    8.10. Обновление терминала

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

    refresh() копирует stdscr на терминал, а wrefresh(win) копирует изображение окна в stdscr и затем делает curscr подобным stdscr.

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

    Допустим, мы имеем следующую программу с двумя окнами. Мы изменяем оба окна, меняя несколько линий текста. Напишем cgangewin(win) с wrefresh(win).

    Тогда ncurses обновит терминал дважды, а это замедлит исполнение нашей программы. Благодаря doupdate() мы изменим changewin(win) и нашу основную функцию, добившись этим лучшего исполнения.

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

    Говорит ncurses-у, что были произведены манипуляции с целым окном или линиями от start до start+count. Например, когда у вас есть несколько окон, перекрывающих друг друга (как в примере type.c), изменение одного из них никак не повлияет на изображение других.

    wtouchln(. ) захватит n линий, начинающихся в y. Если change соответствует TRUE, то линии захватываются, в противном случае — нет (изменяются или не изменяются).

    untouchwin(win) пометит окно win как неизмененное со времени последнего вызова refresh().

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

    Таблица 8.4: Ncurses — атрибуты

    8.11. Видеоатрибуты и цвет

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

    Ncurses определяет 8 цветов, которыми вы можете пользоваться на терминале с цветовой поддержкой. Сначала проинициализируйте цветовые структуры данных посредством start_color(), затем проверьте возможности терминала при помощи has_colors(). start_color() будет инициализировать COLORS, наибольшее количество цветов, поддерживаемых терминалом, и COLOR_PAIR, максимальное число цветовых пар, которые вы можете определить.

    Атрибуты могут быть совмещены ‘|’ (OR), поэтому вы можете получить четкий мерцающий вывод при помощи A_BOLD|A_BLINK

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

    Будьте осторожны с цветами, если вы пишете программы для ncurses и BSD curses, так как BSD curses не имеет цветовой поддержки. (Точно так же не имеют цветовой поддержки старые версии SYS V). Поэтому, если вы компилируете для обеих библиотек, вам придется использовать операции #ifdef.

    Включают или отключают указанный атрибут attr, не влияя на другие атрибуты в окне (stdscr или win).

    Установка атрибута в attr в stdscr или win.

    Включают атрибут наиболее яркого режима для окна (stdscr или win).

    Выдает текущие атрибуты для окна win.

    Возвращает TRUE, если терминал имеет цвета. Перед тем, как использовать цвета, проверьте терминал has_colors()-ом, а перед этим проинициализируйте цвета start_color()-ом.

    TRUE, если терминал может переопределять цвета.

    Цветовая инициализация. Эта функция должна быть вызвана перед использованием цветов!

    Если вы используете цвета в атрибутах окна, то сначала вы должны определить цветовую пару через init_pair(. ). fg и bg — это цвета переднего и заднего плана, спаренные в pair. pair принимает значения от 1 до COLORPAIRS -1. (0 — не ошибка, но зарезервирован для черного и белого.) Определенную однажды pair можно использовать как атрибут. К примеру, вам нужны красные символы на синем экране:

    Теперь вызовем wattr(. ) для установки новой пары цветов для win:

    Или соединим цветовые пары с другими атрибутами, например:

    Первый вызов установит цветовую пару и атрибут BOLD, второй — подключит режим STANDOUT, и вы получите светлый красный на синем экране.

    Вернет цвета переднего и заднего плана из pair.

    Изменит цветовые компоненты r, g и b для color. r, g и b находятся в диапазоне от 1 до COLORS -1.

    Получение компонентов r, g и b для color.

    Как комбинировать атрибуты и цвета? Некоторые терминалы, как консоли в Linux-е, имеют цвета, а некоторые — нет (xterm, vs100 и т.д.). Следующий код решит эту проблему: vo > Прежде всего, функция CheckColor проинициализирует цвета при помощи start_color(). Затем has_colors() вернет TRUE, если текущий терминал имеет цвета. После этого вызывается ini_tpair(. ) для соединения цветов переднего и заднего плана, и wattrset(. ) для установки этих цветов в данном окне. Впрочем, чтобы установить атрибуты для черно-белого терминала, мы можем использовать только wattrset(. ).

    Чтобы получить цвета на xterm, лучший способ, найденный автором, — это использовать ansi_xterm с надерганными элементами terminfo из M >Движение курсора stdscr или win. Для функций ввода/вывода определяются дополнительные макросы, передвигающие курсор перед вызовом данных функций.

    Переключает видимость/невидимость курсора, если терминал имеет такую возможность.

    Возвращает координаты курсора. Замечание: это макрос.

    Если win — подокно, getparyx(. ) сохранит координаты окна относительно родительского окна. В противном случае y и x установятся в -1. (Пока не реализована.)

    Сохранит начальные и размерные координаты для win в y и x.

    Сохранит виртуальный курсор экрана в y и x или установит этот курсор. При y и x, равных -1, getsyx(. ) установит leaveok.

    8.13. Прокрутка

    Если TRUE, текст в окне win будет прокручен вверх на одну линию, когда курсор находится в правом нижнем углу и напечатан символ.Если FALSE, то курсор остается на прежней позиции.

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

    Эта функция прокрутит окно (и строки в структуре данных) на одну линию вверх.

    Эти функции прокрутят окно stdscr или win вверх или вниз, в зависимости от целого n. Если n положительное, произойдет прокрутка окна на n линий вверх, если n отрицательное — на n линий вниз.

    Устанавливают программную область прокрутки.

    Следующий код объяснит, как прокручивать текст на экране. Смотри также type.c в директории примеров.

    Мы хотим прокрутить текст в окне, имеющем 18 линий и 66 колонок. S[] — это массив символов с текстом. Max_s является номером последней линии в S[]. Clear_line напечатает пробелы с текущей позиции курсора до конца линии, используя текущие атрибуты окна (не A_NORMAL, как это делает clrtoeol). Beg — это последняя линия из s[], изображенная на данный момент на экране. Scroll — это перечень того, что должна сделать функция, показать NEXT или PREVious (следующую или предыдущую) линию текста.

    8.14. Заполнители

    • WINDOW *newpad(nlines, ncols)
    • WINDOW *subpad(orig, nlines, ncols, begy, begx)
    • int prefresh(pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)
    • int pnoutrefresh(pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)
    • int pechochar(pad, ch)

    8.15. Мягкие метки (Soft-labels)

    • int slk_init(int fmt)
    • int slk_set(int labnum, char *label, int fmt)
    • int slk_refresh()
    • int slk_noutrefresh()
    • char *slk_label(int labnum)
    • int slk_clear()
    • int slk_restore()
    • int slk_touch()
    • int slk_attron(chtype attr)
    • int slk_attrset(chtype attr)
    • int slk_attroff(chtype attr)

    Эти функции соответствуют функциям attron(attr), attrset(attr) и attroff(attr). Пока не реализованы.

    8.16. Разное

    • int beep()
    • int flash()
    • char *unctrl(chtype c)
    • char *keyname(int c)
    • int filter() (Пока не реализована.)
    • vo >В следующем тексте вы найдете обзор различных пакетов (n)curses.

    Первая колонка содержит bsd-curses (в версии 2.1.0 и в SunOS 4.x),

    во второй колонке — sysv-curses (в SunOS 5.4 / Solaris 2), наконец,

    ncurses_slk_clear

    (PHP 4 >= 4.0.7, PHP 5 = 1.0.0)

    ncurses_slk_clear — Clears soft labels from screen

    Описание

    Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, ее имя и относящаяся к ней документация могут измениться в последующих версиях PHP без уведомления. Используйте эту функцию на свой страх и риск.

    The function ncurses_slk_clear() clears soft label keys from screen.

    Возвращаемые значения

    Returns TRUE on errors, FALSE otherwise.

    ncurses_slk_clear

    ncurses_slk_clear — очищает мягкие ярлыки/soft labels на экране.

    Описание

    bool ncurses_slk_clear (void)

    Warning

    Эта функция — ЭКСПЕРИМЕНТАЛЬНАЯ. Поведение, имя и всё остальное, что задокументировано для данной функции может быть изменено в будущих релизах РНР без предупреждения. Вы можете использовать эту функцию только на свой страх и риск.

    Функция ncurses_slk_clear() очищает ключи мягких ярлыков на экране. Возвращает TRUE при ошибке, иначе FALSE .

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