2010-11-29 8 views
1

Je suis en train d'écrire un programme qui doit interroger les touches du clavier à des moments précis, et plutôt que de passer par l'effort d'écrire mon propre cours de vote par clavier, je pensais utiliser Classe de clavier intégrée de JInput.Utilisation de claviers dans JInput sans privilèges root

Cela fonctionne parfaitement quand j'exécute mon programme en tant que root (je cours sous Ubuntu 10.10) mais il ne détecte même pas le fait que le clavier existe lorsqu'il est exécuté en tant qu'utilisateur normal. Je reçois la sortie d'erreur suivant:

Nov 29, 2010 2:08:50 PM net.java.games.input.DefaultControllerEnvironment getControllers 
INFO: Loading: net.java.games.input.LinuxEnvironmentPlugin 
Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event11): Failed to open device /dev/input/event11 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event10): Failed to open device /dev/input/event10 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event9): Failed to open device /dev/input/event9 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event8): Failed to open device /dev/input/event8 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event7): Failed to open device /dev/input/event7 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event6): Failed to open device /dev/input/event6 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event5): Failed to open device /dev/input/event5 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event4): Failed to open device /dev/input/event4 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event3): Failed to open device /dev/input/event3 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event2): Failed to open device /dev/input/event2 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event1): Failed to open device /dev/input/event1 (13) 


Nov 29, 2010 2:08:50 PM net.java.games.input.ControllerEnvironment log 
INFO: Failed to open device (/dev/input/event0): Failed to open device /dev/input/event0 (13) 

Quelqu'un at-il une expérience en utilisant des claviers à JInput ou des idées sur la façon de contourner ce donc je n'ai pas courir en tant que root? Merci!

Répondre

1

Au lieu d'exécuter le programme en tant que root, vous pouvez également faire

sudo chmod a+r /dev/input/event5 

(ou tout autre périphérique points à votre clavier) Il est à vous de décider ce qui est plus sûr pour vos besoins, cependant. Je pense, mais je ne suis pas sûr, que les autorisations reviendront après un redémarrage.

Je n'ai jamais réussi à faire fonctionner l'adaptateur de clavier de JInput dans Ubuntu sans exécuter l'application en tant que root ou en faisant ce qui précède. Probablement pas une réponse que vous vouliez, mais elle vous dira au moins que vous n'êtes pas seul. La raison évidente pour laquelle le périphérique ne peut pas être lu par n'importe qui est qu'un programme non privilégié (par exemple un enregistreur de frappe) ne peut pas écouter toutes les entrées provenant du clavier à un moment donné. Je pense que les différents systèmes de fenêtrage fonctionnent en mode privilégié, puis contrôlent l'accès aux données du clavier pour les programmes utilisateur. Si JInput passait par cette couche, vous n'auriez probablement pas besoin de privilèges spéciaux.

Modifier

Comme il semblait travailler pour l'OP, je vais inclure la note de barti_ddu ici. Comme alternative à la modification manuelle des autorisations sur le périphérique clavier comme je l'ai noté ci-dessus, vous pouvez également définir une règle udev de sorte que ces autorisations sont définies automatiquement. Notamment, vous pouvez l'utiliser pour définir le groupe pour l'appareil (par exemple "entrée"), puis exécutez le programme en conséquence.

Cela impliquerait d'ajouter quelque chose comme ceci à /etc/udev/rules.d/99-evdev.rules:

KERNEL=="event*", NAME="input/%k", MODE="640", GROUP="input" 

Attention: non testé.

+1

La règle udev simple persisterait/dev/input/event * permissions. Je préfère créer un groupe spécial (par exemple, "entrée") et ensuite mettre quelque chose comme 'KERNEL ==" événement * ", NAME =" entrée /% k ", MODE =" 640 ", GROUP =" entrée "'/etc/udev/rules.d/99-evdev.rules –

+0

@barti: Ahh, je voulais dire que les autorisations revenaient comme une bonne chose :-). Mais l'idée de mettre en sandbox les appareils dans un groupe est une bonne idée. Malheureusement, il semble que toutes ces solutions sont assez dégoûtantes pour quelqu'un qui veut juste jouer le jeu (je serais prudent d'installer quelque chose qui dit qu'il a besoin d'un accès sans entrave à mon clavier pendant que le programme fonctionne, qu'il soit ou non au premier plan ou non). –

+0

@Mark: Ok, je vois Votre point maintenant (et je suis heureux, j'ai provoqué Votre commentaire, de toute façon) :) Tout se résume à type d'application: Je ne vois pas pourquoi le jeu devrait avoir accès à événements de clavier à l'échelle du système. D'un autre côté, le réglage des privilèges d'accès aux entrées est moins dangereux que le réglage du bit setuid ou de l'exécution du programme en tant que super utilisateur. Mais encore une fois, je peux manquer quelque chose :) –