A questão parece um pouco contraditória, já que você está citando ferramentas X, mas pede uma solução que "idealmente funcione sem X".
Sobre o seu achado em 4 th :
xinput
lhe dará a correspondência
$ xinput list-props 11
Device 'AT Translated Set 2 keyboard':
Device Enabled (145): 1
Coordinate Transformation Matrix (147): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
Device Product ID (266): 1, 1
Device Node (267): "/dev/input/event0"
pelo menos com a seguinte versão
$ xinput --version
xinput version 1.6.1
XI version on server: 2.3
Primeiro passo: detectando o dispositivo de evento do teclado em C
#include <stdio.h>
//#include <unistd.h>
#include <fcntl.h>
#include <linux/input.h>
// typical use : sudo ./a.out /dev/input/event*
int main (int argc, char *argv[])
{
struct input_event ev[64];
int fd[argc],rd,idev,value, size = sizeof (struct input_event);
char name[256] = "Unknown";
if(argc==1) return -1;
int ndev=1;
while(ndev<argc && (fd[ndev] = open (argv[ndev], O_RDONLY|O_NONBLOCK)) != -1){
ndev++;
}
fprintf (stderr,"Found %i devices.\n", ndev);
if(ndev==1) return -1;
while (1){
for(idev=1; idev<argc; idev++){
if( (rd=read (fd[idev], ev, size * 64)) >= size){
value = ev[0].value;
if (value != ' ' && ev[1].value == 1 && ev[1].type == 1){
ioctl (fd[idev], EVIOCGNAME (sizeof (name)), name);
printf ("%s\n", name);
return idev;
}
}
}
// sleep(1);
}
return -1;
}
Muito obrigado a esta página . Eu tirei a maioria das verificações de segurança do código que pedi emprestado, para maior clareza, no código real, você provavelmente as quer.
Note que os pressionamentos de tecla são ecoados, então você pode, de fato, pedir gentilmente ao usuário para apertar uma tecla modificadora (Shift, Control ...) ao invés de qualquer tecla .
Segundo passo: use xinput para obter o ID X do nome do dispositivo
Compile a fonte C acima e use desta maneira:
xinput list --id-only "keyboard:$(sudo ./a.out /dev/input/event*)"