LINUX.ORG.RU

Обработка спец-клавиш в терминале


0

0

Добрый день ! Тут встала задача - обрабатывать нажатие клавиш 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"); }

anonymous

Я тихо фигею и извиняюсь за форматирование :

#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");
  }

anonymous
()

#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");
  }

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

> Как тут не подойдет ?

неа - этот код вообще не реагирует на шифт

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