LINUX.ORG.RU

Как писать текст прямо в буфер терминала


0

0

Решил попробовать - как программы (текстовые редакторы) прокручивают текст. Как вы знаете, такие программы при перемещении курсора "вверх/вниз" и вводе текста не распечатывают весь обновленный экран заново, а изменяют его содержимое. То есть они каким-то образом пишут прямо в буфер терминала. Решил узнать как это делается. В гугле все тихо - может не так вопрос задаю? "Как писать прямо в буфер терминала?", "Прокрутка текста". Не нашел. Решил покопаться в исходниках. У меня были HTEditor и Biew. У первого исходники очень запутанны, поэтому сказу принялся за второго. Нашел файлы keyboard.c и vio.c. Первый устанавливает режимы терминала перед началом работы, а второй вроде бы выводит текст на экран. Как он это делает я не нашел. Но понял одно - у программы есть 2-мерный массив, она изменяет его содержимое и вместе с этим изменяется содержимое экрана. Вспомнил что ee тоже так должен делать. Посмотрел его исходники. Есть new_curse.c, к-й выполняет некоторые функции curses'а (очень полезно кстати посмотреть - на предмет как работают нек. из них). А при компиляции есть выбор - либо new_curses.h, либо curses. Его смотрел я Си-файл, но опять ничего не нашел. Уж больно большой. Из всех вызовов - только ioctl, устанавливающий / получающий флаги терминала и fcntl, к-й тоже самое делает с открытым файлом. Подскажет кто-нибудь, как это сделать? Или правильный вопрос, нужные curses-функции или системные вызовы.

Если я правильно понял, то ты хочешь записывать в любое место терминала. Для этого нужно установить курсор в нужное место и осуществить запись.
1. У ncurses есть окна, котырые можно позиционировать, есть move()
2. У ncurses есть scroll-функции.
3. Позицию курсора можно установить с пом. esc-последовательностей
echo -e "\033[H\033[J\033[30;60H*******НЕLLO*****"

Chumka ★★★
()
Ответ на: комментарий от Chumka

>Для этого нужно установить курсор в нужное место и осуществить запись.
Так пользователь увидит как по экрану бегает курсор.
>У ncurses есть scroll-функции

Вот мне интересно - как они работают. Неужто они курсор перемещают?

AndreyMust19
() автор топика
Ответ на: комментарий от AndreyMust19

Так пользователь увидит как по экрану бегает курсор.

Его можно убрать.

Неужто они курсор перемещают?

Да.

anonymous
()
Ответ на: комментарий от anonymous

>Его можно убрать.
Неужели придется перед обновлением экрана скрывать курсор, а после обновления - показывать его?

AndreyMust19
() автор топика
Ответ на: комментарий от AndreyMust19

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

anonymous
()
Ответ на: комментарий от AndreyMust19

У разных терминалов разные возможности, разные ESC-последовательности, может почитать man console_codes. ncurses была как раз для этого, чтобы для каждого типа терминал использовать свои ESC-последовательности, и в редакторах и просмоторщиках её и используют, а вы, что собрались писать без ncurses?

mky ★★★★★
()
Ответ на: комментарий от mky

У разных терминалов разные возможности, разные ESC-последовательности, может почитать man console_codes. ncurses была как раз для этого, чтобы для каждого типа терминал использовать свои ESC-последовательности, и в редакторах и просмоторщиках её и используют, а вы, что собрались писать без ncurses?

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

anonymous
()
Ответ на: комментарий от AndreyMust19

>>Его можно убрать.
> Неужели придется перед обновлением экрана скрывать курсор, а после обновления - показывать его?


УЖАС!!! НЕТ-НЕТ!!! Только не это!!!11

LamerOk ★★★★★
()
Ответ на: комментарий от anonymous

В Линуксе есть прямой доступ к содержимому текстового буфера через файлы /dev/vcsa (символ+атрибут) или /dev/vcs (только символ). Я так переносил в линукс библиотеку текстового интерфейса VitaminC из-под DOS. Через них же можно перемещать курсор.

sigurd ★★★★★
()
Ответ на: комментарий от sigurd

В Линуксе есть прямой доступ к содержимому текстового буфера через файлы /dev/vcsa (символ+атрибут) или /dev/vcs (только символ).

Это работает только со «стандартным» терминалом. С эмуляторами (xterm, gnom-terminal и т.д.), а так же через telnet/ssh/etc. такое естественно не проходит. И вообще, /dev/vcs* - это не совсем буфер терминала, оно более низкоуровневое, чем терминал.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.