PDA

View Full Version : [C Unix/Linux]


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.