ubuntuusers.de

Programmierung eines Keyboards

Status: Ungelöst | Ubuntu-Version: Ubuntu 11.04 (Natty Narwhal)
Antworten |

MarcelB

Anmeldungsdatum:
17. August 2011

Beiträge: Zähle...

Hi,

ich würde mich gerne näher in die Linux und EmbeddedLinuxWelt einarbeiten. Linux nutze ich auf meinem Desktop seit einigen Jahren und kenne daher einige Grundlagen.

Prinzipiell wollte ich eine kleine KeyBoardAnwendung schreiben. Ansich ist das auch kein Problem. Tastenabfrage und das abspielen und Sounds ist ja schnell erledigt. Jetzt kommt allerdings die Integration ins System. Ich würde gerne das das Programm automatisch startet und auch anschließend auf meine Tastendrücke reagiert. Das ist allerdings nicht so einfach. Ein Programm im Autostart bekommt schließlich nie den Fokus. Hooks wie unter Windows gibt es afaik auch nicht. Ich könnte zwar einfach mir den Inhalt von /dev/tty1 abfragen und dort die Tasten auslesen, das ist allerdings relativ träge. Zudem wurde auch nicht jede Taste erkannt. Meine Alternativversuch war anschließend, ein Autologgin in tty01 zu machen und anschließend direkt das Programm starten. Nach Änderung der init-Dateien startete mein EmbeddedLinux aber nicht mehr.

Meine Suche nach "globaler Tastenabfrage" führte mich eigentlich nur zur Erkenntnis das es relativ leicht über den X-Server gehen soll, alternativen fand ich allerdings nicht. Hat da wer einen guten Tipp für mich, wie ich das machen kann oder es sinnvoll gemacht werden sollte?

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

das ist ja ein bunter Strauß

MarcelB schrieb:

... Tastenabfrage und das Abspielen und Sounds ist ja schnell erledigt... ... das Programm automatisch startet und auch anschließend auf meine Tastendrücke reagiert. ... im Autostart bekommt schließlich nie den Fokus.

Du gehst von einer Session mit grafischer Benutzeroberfläche aus. Du möchtest, dass nach dem Login deine Applikation gestartet wird und auch den Fokus erhält? D.h. du musst eine Anwendung schreiben, die ein Fenster öffnet und - im Falle des Fokus - die Tastendrücke anzeigt, bzw. auswertet und was damit macht. Das ist normales Geschäft. Allerdings arbeitet man bei Programmierung grafischer Oberflächen über den X-Server, der direkte (und auch Treiber-abhängige) Schnittstellen zur Hardware aus Sicht des Anwenderprogrammes vermeidet. Ich vermute du suchst da nach Möglichkeiten, das Keyboard anzuzapfen ? → und findest deshalb zu diesem Thema sozusagen nix (weil man es nämlich nicht so macht).

Da bei Linux und anderen UNIX-Derivaten das Betriebssystem und die Oberfläche getrennte paar Schuhe sind (im Gegensatz zu Windoof), ist die Regel, wie der Fokus vergeben wird, dem Window-Manager überlassen (KDE, Gnome .... bei manchen kann man die Regeln auch einstellen - z.B. fvwm)

MarcelB schrieb:

Ich könnte zwar einfach mir den Inhalt von /dev/tty1 abfragen und dort die Tasten auslesen, das ist allerdings relativ träge.

Wieso träge, was hast du gemacht?

MarcelB schrieb:

Zudem wurde auch nicht jede Taste erkannt.

/dev/tty ist eine Terminal-Schnittstelle, da gibt es einen Treiber dazwischen, der ist entsprechend ausgelegt und reagiert auf Steuerzeichen. Du müsstest die Schnittstelle im "Raw-Mode" auslesen. Aber mit der tty-Geschichte arbeitest du ja sozusgaen an der grafischen Oberfläche vorbei!

Wenn du eine bestimmte Programmiersprache und Entwicklungsumgebung verwendest, gibt es da div. Objekte zur Erstellung von grafischen Elementen, um eine Benutzeroberfläche zu bauen. Diese sind so, dass sie mit dem X-Server kommunizieren. Mit den Mitteln der Sprache bzw. zugehöriger Libraries können auch die Eingabeereignisse entgegengenommen werden (Events durch Maus oder Tastatur oder oder oder).

Hier ein simples Beispiel in der Sprache tcl/tk Damit kannst du dir die Tastendrücke anzeigen lassen:

#! /bin/bash
# nur ein Kommentar, zwingend mit Backslash am Ende  \
exec wish  "$0" "$@"

set keysym "Press any key"
pack [label .l -textvariable keysym  -padx 2m  -pady 1m]

bind  . <Key>  {
  set keysym "You pressed %K (number %N,  code %k)"
}

Hier wird einfach ein "Label" - eine Fläche, die Text anzeigt - eingeblendet. Angezeigt und automatisch aktualisiert wird der Inhalt der variablen namens 'keysym'.

Mit dem Bind wird eine Reaktion auch Tastendruck ( Event-Art '<Key>' ) definiert. Innerhalb des 'bind' wird %K durch den Namen des Keys und %k durch den Keycode ersetzt.

Antworten |