Получение позиции курсора и размера терминала в терминале Linux - PullRequest
4 голосов
/ 21 марта 2012

В моем консольном приложении Linux C ++ я хочу получить размер терминала (строки + столбцы) и текущую позицию курсора.Что касается последнего, я думаю, что я мог бы использовать для этого коды ANSI, но я не уверен, как правильно его проанализировать.Также я не вижу, как получить размер окна?

По другим причинам переключение на ncurses в настоящее время не вариант.

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Старый метод получения размера - это termcap с помощью libtermcap. Новое - terminfo (+ lib). Я бы порекомендовал использовать библиотеку, которая абстрагирует эту (и все другие связанные с терминалами вещи), и использовать библиотеку вывода терминала, такую ​​как (n) curses.

Это также будет работать на других системах Unix.

1 голос
/ 22 марта 2012

Чтобы получить размер, правильный способ - вызвать TIOCGWINSZ ioctl().Пример из моего кода:

struct winsize ws = { 0, 0, 0, 0 };
if(ioctl(tt->outfd, TIOCGWINSZ, &ws) == -1)
  return;

/* ws.ws_row and ws.ws_col now give the size */

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

Какдля получения позиции курсора, это немного сложнее.Некоторые терминалы позволяют запрашивать его с помощью DSR 6 (Отчет о состоянии устройства)

$ echo -ne "\e[6n"; cat -v
^[[62;1R

Ответ от DSR приходит в CSI R, здесь говорится о 62-й строке (на основе 1), 1-й столбец.

Однако, поскольку не все терминалы поддерживают DSR 6, может быть проще всего не полагаться на возможность запрашивать позицию курсора, а вместо этого выполнять исходную адресацию терминала абсолютным образом, размещая курсор именно там, где вы хотите.

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