Emalele1688
15-10-2012, 15:15
Salve a tutti :D
Avrei bisogno di leggere gli input da mouse e tastiera direttamente dal sottosistema di input (bypassando il server X), quindi usando la struttura input_event che riempio con una read sul descrittore aperto in /dev/input/eventX;
Ho perņ due problemi: Primo, come faccio a sapere direttamente nel programma qual'č il numero del device /dev/input/eventX da aprire?? Attualmenete sulla mia macchina apro /dev/input/event1 per il mouse e /dev/input/event2 per la tastiera. Ma dubito che sia una cosa standard su tutti i sistemi giusto?
Se non sbaglio infatti esiste un file "/proc/bus/input/devices" che permette di conoscere i dispositivi di input.
Secondo per poter aprire tali file devo acquisire i privileggi di root. Come bypasso ciņ??
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/input.h>
#include <string.h>
#include <linux/input.h>
#include <sys/ioctl.h>
#define KEY_RELEASE 0
#define KEY_PRESS 1
#define KEY_KEEPING_PRESSED 2
int main (int argc, char *argv[])
{
int i, fd;
struct input_event ev[64];
if (argc != 2)
{
fprintf(stderr, "usage: %s event-device (/dev/input/eventX)\n", argv[0]);
return 1;
}
if ((fd = open(argv[1], O_RDONLY)) < 0)
{
perror("Couldn't open input device");
return 1;
}
while (1)
{
size_t rb = read(fd, ev, sizeof(ev));
for (i = 0; i < (int) (rb / sizeof(struct input_event)); i++)
{
if(ev[i].type == EV_KEY)
{
if(ev[i].value == KEY_PRESS)
printf("Key press: %d code %d value %d\n", ev[i].type, ev[i].code, ev[i].value);
if(ev[i].value == KEY_RELEASE)
printf("Key release %d code %d value %d\n", ev[i].type, ev[i].code, ev[i].value);
if(ev[i].value == KEY_KEEPING_PRESSED)
printf("Key keeping pressed %d code %d value %d\n", ev[i].type, ev[i].code, ev[i].value);
}
}
}
return 0;
}
Quindi in poche parole, se volessi saperlo nel programma il numero di device senza che glielo passo io in input?
Come faccio ad eseguirlo senza privileggi di root?
Grazie anticipatamente.
Avrei bisogno di leggere gli input da mouse e tastiera direttamente dal sottosistema di input (bypassando il server X), quindi usando la struttura input_event che riempio con una read sul descrittore aperto in /dev/input/eventX;
Ho perņ due problemi: Primo, come faccio a sapere direttamente nel programma qual'č il numero del device /dev/input/eventX da aprire?? Attualmenete sulla mia macchina apro /dev/input/event1 per il mouse e /dev/input/event2 per la tastiera. Ma dubito che sia una cosa standard su tutti i sistemi giusto?
Se non sbaglio infatti esiste un file "/proc/bus/input/devices" che permette di conoscere i dispositivi di input.
Secondo per poter aprire tali file devo acquisire i privileggi di root. Come bypasso ciņ??
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/input.h>
#include <string.h>
#include <linux/input.h>
#include <sys/ioctl.h>
#define KEY_RELEASE 0
#define KEY_PRESS 1
#define KEY_KEEPING_PRESSED 2
int main (int argc, char *argv[])
{
int i, fd;
struct input_event ev[64];
if (argc != 2)
{
fprintf(stderr, "usage: %s event-device (/dev/input/eventX)\n", argv[0]);
return 1;
}
if ((fd = open(argv[1], O_RDONLY)) < 0)
{
perror("Couldn't open input device");
return 1;
}
while (1)
{
size_t rb = read(fd, ev, sizeof(ev));
for (i = 0; i < (int) (rb / sizeof(struct input_event)); i++)
{
if(ev[i].type == EV_KEY)
{
if(ev[i].value == KEY_PRESS)
printf("Key press: %d code %d value %d\n", ev[i].type, ev[i].code, ev[i].value);
if(ev[i].value == KEY_RELEASE)
printf("Key release %d code %d value %d\n", ev[i].type, ev[i].code, ev[i].value);
if(ev[i].value == KEY_KEEPING_PRESSED)
printf("Key keeping pressed %d code %d value %d\n", ev[i].type, ev[i].code, ev[i].value);
}
}
}
return 0;
}
Quindi in poche parole, se volessi saperlo nel programma il numero di device senza che glielo passo io in input?
Come faccio ad eseguirlo senza privileggi di root?
Grazie anticipatamente.