Несмотря на то, что это старый вопрос, я подумал, что должен поделиться кратким примером того, как это сделать без использования ncurses, это не сложно, но я уверен, что он не будет таким переносимым.
Этот код устанавливает стандартный ввод в необработанном режиме, переключается на экран альтернативного буфера (который сохраняет состояние терминала перед его запуском), включает отслеживание мыши и печатает кнопку и координаты, когда пользователь щелкает где-то.После выхода с помощью Ctrl + C программа возвращает конфигурацию терминала.
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
int main (void)
{
unsigned char buff [6];
unsigned int x, y, btn;
struct termios original, raw;
// Save original serial communication configuration for stdin
tcgetattr( STDIN_FILENO, &original);
// Put stdin in raw mode so keys get through directly without
// requiring pressing enter.
cfmakeraw (&raw);
tcsetattr (STDIN_FILENO, TCSANOW, &raw);
// Switch to the alternate buffer screen
write (STDOUT_FILENO, "\e[?47h", 6);
// Enable mouse tracking
write (STDOUT_FILENO, "\e[?9h", 5);
while (1) {
read (STDIN_FILENO, &buff, 1);
if (buff[0] == 3) {
// User pressd Ctr+C
break;
} else if (buff[0] == '\x1B') {
// We assume all escape sequences received
// are mouse coordinates
read (STDIN_FILENO, &buff, 5);
btn = buff[2] - 32;
x = buff[3] - 32;
y = buff[4] - 32;
printf ("button:%u\n\rx:%u\n\ry:%u\n\n\r", btn, x, y);
}
}
// Revert the terminal back to its original state
write (STDOUT_FILENO, "\e[?9l", 5);
write (STDOUT_FILENO, "\e[?47l", 6);
tcsetattr (STDIN_FILENO, TCSANOW, &original);
return 0;
}
Примечание. Это не будет работать должным образом для терминалов с более чем 255 столбцами.
Лучшие ссылки на escape-последовательности, которые я нашел, это this и this one.