LINUX.ORG.RU

не работает tputs

 


1

2

Добрый день, пытаюсь написать реализацию терминала. Хочу чтобы при вызове от переводил терминал в неканонический режим и очищал экран. Но tputs почему то не срабатывает, помогите пожалуйста.

struct termios saved_attributes; /* переменная для сохранения исходных атрибутов терминала */
 
int ft_c(int c)
{
    write(2, &c, 1);
    return (1);
}
 
void    reset_input_mode(void)
{
    tcsetattr(0, TCSANOW, &saved_attributes);
}
 
void set_input_mode(void)
{
    struct termios tattr;
 
    if (!isatty(0)) /* проверяем, что вводим с терминала */
    {
        fprintf(stderr, "Not a terminal.\n");
        exit (1);
    }
    tcgetattr(0, &saved_attributes); /* считываем текущий режим работы терминала */
    memcpy(&tattr, &saved_attributes, sizeof(tattr));
    tattr.c_lflag &= ~(ICANON | ECHO | ECHOE); /* включаем неканонический режим без эха */
    tattr.c_cc[VMIN] = 1; /* считываем минимум по одному символу */
    tattr.c_cc[VTIME] = 0; /* без ограничения времени ожидания */
    tcsetattr(0, 0, &tattr); /* устанавливаем новый режим работы терминала */
    tputs(tgetstr("cl", NULL), 1, ft_c);
}


terminfo, вроде, нужно сначала инициализировать. Как-то так:

setupterm(getenv("TERM"), 1, (int *)0);

Ну и коды возврата не мешало бы проверять.

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

добавил такую строку и все заработало, но не очень понимаю почему

tgetent(NULL, getenv("TERM"))


Можешь объяснить пожалуйста?
diosio
() автор топика

Это тоже инициализация. Без этого библиотека не знает о каком терминале идёт речь (сама $TERM не читает).

Обычно перед использованием библиотек их надо инициализировать. Об этом написано в man. Просто я смотрел man tputs.

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