Добрый день ! Тут встала задача - обрабатывать нажатие клавиш shift , ctrl , alt в терминале . Я нашел код , в котором читается /dev/console , терминал устанавливается в т.н. raw-режим с помощью tcsetattr(fd, TCSANOW, &raw); и читаем консоль с помощью read() .
Но ! При этом клавиатура полностью блокируется для остальной системы . не понимаю , как снять это ограничение . Ниже - код :
#include <termios.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/kd.h> // see man console_ioctl(4)
main() { struct termios orig, raw; unsigned char c=0, pc=0; char *table[256]; int i, j=0, fd, oldkbmode;
for (i=0; i<256; i++) table[i] = NULL; // relevant codes for the AgVr3
if ((fd=open("/dev/console",O_RDONLY)) < 0) perror("Can't open console");
// Get the console (keyboard) parameters and make a copy we can modify tcgetattr(fd, &orig); tcgetattr(fd, &raw); if (ioctl(fd, KDGKBMODE, &oldkbmode)) perror("KDGKBMODE");
// Turn off echoing, linebuffering and special-character processing, raw.c_lflag &=~ (ICANON | ECHO);
// Set the raw control bits and ioctl KDSKBMODE K_RAW tcsetattr(fd, TCSANOW, &raw); if (ioctl(fd, KDSKBMODE, K_RAW)) perror("KDSKBMODE");
sleep(1); // time for the new console mode to "settle" (needed under X)
printf("Type keys to see their keycodes.\n" "Quits after 100 key events and/or by typing ^C\n\n"); for (j=0; j<10; j++) { pc = c; read(fd, &c, 1); printf("%2d: code= %3u - %s\n", j, c, (table[c]==NULL)? "":table[c]); if ((pc==29) && (c==46)) break; } if (j<100) read(fd, &c, 1); // get the last event from ^C printf("\n... Here we have finished, thanks!\n");
// Restore the original state tcsetattr(fd, TCSANOW, &orig); if (ioctl(fd, KDSKBMODE, oldkbmode)) perror("KDSKBMODE"); }