@Friedhelm
.Net Enterprise developer

Как отключить буферизацию ввода и эхо-вывод (termios.h, stdin)?

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

Мне не помог вызов функций setbuf(stdin, NULL) и setvbuf(stdin, NULL, _IONBF, 0)

В книги Прата говорилось о функции ioctl для unix-подобных систем. помогите с ней разобраться?

Спасибо.
  • Вопрос задан
  • 657 просмотров
Решения вопроса 2
@res2001
Developer, ex-admin
На сколько я понял вам нужно перевести терминал в raw режим.
Для этого нужно выставить кучу флагов в struct termios и вызвать tcsetattr(().
Вот как это реализовано в libuv:
struct termios tmp;
      tmp.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
      tmp.c_oflag |= (ONLCR);
      tmp.c_cflag |= (CS8);
      tmp.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);
      tmp.c_cc[VMIN] = 1;
      tmp.c_cc[VTIME] = 0;
  tcsetattr(fd, TCSADRAIN, &tmp);

Код выдран из исходников libuv: src/unix/tty.c -> uv_tty_set_mode().
Ответ написан
@Friedhelm Автор вопроса
.Net Enterprise developer
#include <termios.h>

// хранилище дефолтного состояния
static struct termios stored_termios;

// Отключить эхо-вывод и буферизацию ввода
void set_keypress (void)
{
    tcgetattr(0, & stored_termios);

    struct termios new_termios = stored_termios;
        new_termios.c_lflag &= ~(ECHO | ICANON);
        new_termios.c_cc[VMIN] = 1;  
        new_termios.c_cc[VTIME] = 0; 
 
    tcsetattr(0, TCSANOW, & new_termios);
}
 
// Восстановление дефолтного состояния
void reset_keypress (void) 
{
    tcsetattr(0, TCSANOW, & stored_termios);
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы