LINUX.ORG.RU

Как ожидать нажатия любой клавиши без curses


0

0

Искал я, искал, но везде только примеры с getch. А я не хочу использовать проклятую curses. Ведь getch как-то делает это, значит, можно сделать и другими средствами. Пробовал ioctl, fcntl, tcgetattr. Переводил ввод в небуферезированный вид, отключал каноническое что-то, включал N_DELAY и NONBLOCK. Ничего не работает. Всегда требуется нажатия Enter. А надо чтобы буква попадала в поток ввода сразу после нажатия клавиши. Сдается мне, что вместо терминала придется обращаться к клавиатуре.

Забыл, забыл

Я юзаю FreeBSD 5.2.1 и Knoppix Linux 5.0. Желательно переносимый POSIX-вариант.

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

getc аналогично getch(stdin) из библиотеки stdio.h. А эта ф-я читает 1 символ из потока и возвращает его в int-виде. Нет, не то... все равно надо будет нажать Enter после ввода символа.

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

getc

getc(stream) аналогична getchar из stdio.h. Все равно надо будет нажать Enter после ввода символа, чтобы он попал в поток ввода.

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

setvbuf

Да, это тоже уже пробовал. Делал ввод небуферизированным, но внешне ничего не изменяется. Все равно ему нужен Enter. И так я 50 раз находил "нужную" ф-ю и оказывалось, что ничего не меняется.
Скорее всего надо или к клавиатуре обращаться или менять локальные параметры терминала.

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

С tcsetattr должно работать.

struct termios t; tcgetattr(STDIN_FILENO, &t); t.c_lflag &= ~ICANON; tcsetattr(STDIN_FILENO, TCSANOW, &t);

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

t.c_lflag &= ~ICANON;

Ура, работает!!! Хотя я уже пробовал такой же вариант, но он почему-то не работал. Так и знал, что надо что-то менять в локальных параметрах терминала! Но проблема - вывод выходит на экран тоже только после вывода символа конца строки. Я думаю, надо точно также сделать чтобы вывод выводился на экран сразу после write или putchar.

AndreyMust19
() автор топика
Ответ на: t.c_lflag &= ~ICANON; от AndreyMust19

У меня сразу выводится (под линуксом). В посиксе сказано: "The implementation may provide a buffering mechanism." Попробуй tcflush.

grusha
()
Ответ на: курсор от AndreyMust19

Вывести escape-последовательность \e[?25l

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