2010-12-27 8 views
3

Ich schreibe ein Programm in C++, um die Hintergrundbeleuchtung der Tastatur von OS X auf dem MacBook Pro unter Linux zu implementieren. Bisher schaltet es die Hintergrundbeleuchtung ein, wenn das System 20 Sekunden lang keine Tastatur- und Mausereignisse registriert hat, schaltet es sich wieder aus und schaltet es natürlich wieder ein, wenn ein Ereignis registriert wird. Das nächste, was ich brauche, um das Programm zu machen, ist, Tastenanschläge auf der Tastatur-Hintergrundbeleuchtung-hoch/runter-Tasten zu erfassen, aber ich bin mir nicht sicher, wie ich das angehen soll.Ergreifen von Ereignissen auf bestimmten Schlüsseln mit X11 unter Linux

Ich verwende derzeit XScreenSaverQueryInfo, um die Leerlaufzeit von Tastatur- und Mausereignissen zu erhalten, also wäre eine Methode, die X11-API verwendet, in Ordnung. Ich habe viel gegoogelt, aber ich habe keinen Weg gefunden, mit dem ich sicher gehen könnte. Das Problem, das ich bei vielen der gefundenen Methoden sehe, ist, dass sie einen Schlüsselcode verwenden, um den Schlüssel zu identifizieren, aber ich denke nicht, dass dies eine praktikable Lösung wäre, da das Programm für jedes verfügbare Tastaturlayout funktionieren sollte.

Irgendeine Idee einer Methode und API sollte ich mit gehen? Was würde am besten funktionieren?

Grüße,

Antwort

2

Der normale Weg dazu ist mit XGrabKey(). Es verwendet Keycodes, aber Sie würden den Keycode nicht hart codieren, Sie würden es mit XKeysymToKeycode() bekommen. Um korrekter zu sein, sollten Sie den Grab-Vorgang auch wiederholen, wenn Sie ein MappingNotify (XMappingEvent) erhalten. (Hinweis, MappingNotify, nicht MapNotify.) Wenn es für diese Schlüssel kein Keysym gibt - wahrscheinlich gibt es nicht auf alten X-Versionen, aber hoffentlich neuere X.org-Versionen haben eine - dann müssen Sie nur den Schlüsselcode verdrahten . Das wird nicht sehr robust oder portabel sein, aber funktioniert wahrscheinlich für alle unter Linux mit dem gleichen Hardwaremodell.

Bereiten Sie sich darauf vor, dass Key Grabs global sind. Wenn Sie also versuchen, XGrabKey() und etwas anderes hat diesen Schlüssel bereits gegriffen, erhalten Sie einen X-Fehler - standardmäßig das Programm beendet. Eine andere Eigenart von XGrabKey() ist, dass es den Schlüssel mit einem präzisen Modifikatorsatz ergreift. Um beispielsweise mit und ohne NumLock zu arbeiten, müssen Sie zweimal greifen. Siehe Global Hotkey with X11/Xlib

In einem normalen Linux-Setup (wenn Sie eine Funktion wie diese in Upstream-Projekte erhalten möchten), wollen die Desktop-Umgebungen nicht viele separate Anwendungen kämpfen um die Schlüssel packt und Fehler zu bekommen. Es wird also einige zentrale Koordinationspunkte geben, wie zum Beispiel der Window Manager oder ein spezieller Daemon, der alle Tastaturbefehle ausführt und Befehle an andere Prozesse weiterleitet. Sie sollten also wahrscheinlich den gleichen Upstream-Code verwenden, der andere spezielle Schlüssel wie diesen behandelt, wenn Sie Ihre Funktion standardmäßig in Verteilungen integrieren wollten.

Eine andere Sache zu beachten ist die Xkb API, die viel komplizierter ist. Es gibt einige hirnbrechende Methoden, mit Xkb nach Schlüsseln zu greifen, aber ich habe keinen Vorteil, diese Route zu gehen.

+0

Die 'Xkb'-Route wird dann wichtig, wenn Sie mehr als eine Tastatur angeschlossen haben, da sich Tastencodes und Keysyms nicht so einfach zuordnen lassen. –

2

Wenn Sie das noch nicht getan haben, um sich mit xev vertraut machen. Starten Sie es, geben Sie ihm den Fokus und drücken Sie die Tasten, um zu sehen, was passiert.

Verwandte Themen