Чтобы получить размер, правильный способ - вызвать 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, может быть проще всего не полагаться на возможность запрашивать позицию курсора, а вместо этого выполнять исходную адресацию терминала абсолютным образом, размещая курсор именно там, где вы хотите.