Wie läuft das?

User avatar
Eszett

13 Apr 2014, 06:12

Ich habe mittlerweile gelernt wie Tastaturen funktionieren. Die Tastatur sendet nur Keycodes, und was daraus für Zeichen entstehen entscheidet die Keymap des Betriebssystems, auf die man keinen(?) Einfluß hat. Was ich aber nicht verstehe ist, welche Instanz entscheidet über Kombinationen wie [Strg]+[Links] für tab left? Entscheidet hier auch die Keymap?

User avatar
Halvar

13 Apr 2014, 09:05

Ja, das steht auch in der Keymap des Betriebssystems.

Es gibt für wahrscheinlich alle Betriebssysteme die Möglichkeit, die Keymaps zu ändern, das Thema hatten wir ja auch schon:
http://deskthority.net/post153040.html#p153040

User avatar
Eszett

15 Apr 2014, 00:05

Ich muß sagen an technischem Hintergrunddokumentationen finde ich extrem wenig im Netz, so gut wie gar nichts. Praktisch nur ein paar technische Dokumente speziell zu Linux, aber nichts OS-übergreifendes, das mal die Grundprinzipien der Wechselwirkung und Schnittstelle zw. Tastatur und Keymap vereinfacht darstellt. Halvar, hast du einen Vorschlag für mich, wo ich meine Unbildung weiter bekämpfen kann, ohne mich für ein Informatik-Studium einzuschreiben zu müssen?

User avatar
BlueBär

16 Apr 2014, 01:07

Betriebssystem empfängt Keycode. Nun folgt:
a) Das Betriebssystem schaut in der Keymap nach, was für eine Taste das sein soll und sendet das dementsprechende Event, dass das fokussierte Programm empfängt; und/oder
b) Der empfangene Keycode wird von einem Programm mit hardwarenahen Funktionen (einem Hook) "abgefangen", verarbeitet, eventuell verändert, und eventuell an die nächste Instanz weitergesendet.
So funktioniert es ungefähr bei Windows soweit ich weiß. Wenn du noch mehr darüber wissen willst solltest du dich mit Keyloggern beschäftigen oder selber etwas programmieren (mit Fokus auf z.B. die Windows API). Schau dir vielleicht folgendes an: http://msdn.microsoft.com/en-us/library ... 85%29.aspx

User avatar
ne0phyte
Toast.

16 Apr 2014, 01:33

[- 0) Interrupt bei Tastendruck]
- 1) Keycode kommt an
- 2) Betriebssystem schickt "Benachrichtigung" an Fenster, das den Fokus hat
- 3) Anwendung bekommt Event über Tastendruck und fragt evtl. Modifier Status (Ctrl, Shift, Alt, ...) ab
- 4) Anwendung fragt das Betriebssystem, welches Zeichen gedrückt wurde - basierend auf der Eingabesprache des Benutzers
- 5) Anwendung entscheidet, dass bei <Left> mit gedrücktem <Ctrl> im Editor zB. ein Wort zurück gesprungen wird

Bei 2) sollte noch beachtet werden, dass das OS bestimmte Kombinationen komplett abfängt, so ist es unter Windows unmöglich Ctrl+Alt+Del überhaupt oder Win+L wirklich zuverlässig abzufangen.
An Stelle 4) findet quasi die Übersetzung Keycode + Modifier -> Symbol statt.

Zu Windows kann ich nicht viel sagen, aber unter Linux mapped eine eine grafische Anwendung die Tastencodes mittels API Aufruf zu einem KeySym (basierend auf der Keymap/Eingabesprache des Benutzers) und lässt sich davon eine String-Repräsentation (also zB "A") geben.

Sprich: Tastendruck -> Event/Keycode -> XGetKeyboardMapping() / XKeysymToString() -> *Irgendwas damit anstellen*

User avatar
aaron

16 Apr 2014, 21:46

Hier noch ein paar Links zum Thema:
http://deskthority.net/workshop-f7/tmk- ... t4478.html
http://www.linuxjournal.com/article/1080?page=0,0
http://www.x.org/wiki/XKB/


Du kannst auch mal nach folgenden Suchwörtern googlen: keymap, keycodes (scancode), keysymbols, modifier keys, kernel interrupt.

Ganz unbedacht sind natürlich noch Dinge wie Windowmanager, Zeichensatz, Encoding, Font, Rendering (Framebuffer, ...), usb->ps2, .... und was das aktive Programm schlussendlich damit macht (Mapping). Wenn du in einer VM oder einem Terminal per SSH arbeitest, wird es nochmal etwas komplizierter.

User avatar
Eszett

18 Apr 2014, 04:33

Freue mich über die Antworten. Kann der Controller (falls programmierbar) steuern, daß z. B. bei Drücken von [Strg]+[Q] die Keycodes von [Alt]+[F4] an das Betriebssystem gesendet werden?

User avatar
BlueBär

18 Apr 2014, 13:56

Eszett wrote:Freue mich über die Antworten. Kann der Controller (falls programmierbar) steuern, daß z. B. bei Drücken von [Strg]+[Q] die Keycodes von [Alt]+[F4] an das Betriebssystem gesendet werden?
Ja, warum nicht?

User avatar
ne0phyte
Toast.

18 Apr 2014, 14:33

Du hast dir das fast selbst beantwortet, alles was auf Ebene der Keycodes passiert, kann auch auf dem Tastaturcontroller gemacht werden. Solange das, was du drückst, nicht auf die verwendete Keymap ankommt, denn Software-seitig könnte zB. Q auf M gelegt worden sein, kannst du alles machen.
EDIT: Damit ist gemeint, dass wenn du zB Y auf Strg+Q legen willst, weil deine Anwendung bei 'Y' etwas macht, kann es sein, dass die Tastenbelegung des Betriebssystems den Y Keycode auf Z gemapped hat. Dann funktioniert das logischerweise nicht. Dass man sowas auf dem Controller macht hat ja meist den Sinn, dass es portabel ist und an jedem PC ohne weitere Software funktioniert.

So eine Umbelegung müsste man natürlich entsprechend programmieren. Wie ein Layout generell aussieht, kann man hier sehen:
Die Open Source Software TMK wurde ja schon genannt, da wird ein Layout zB so beschrieben: https://github.com/tmk/tmk_keyboard/blo ... map_hhkb.c
Da gehören noch mehr Dateien zu, damit die Definition dort so funktioniert, aber die eigentliche Belegung Taste->Keycode ist da abgebildet.

User avatar
Eszett

19 Apr 2014, 02:01

@ne0phyte Danke erstmal. Was mir noch nicht klar ist: das was der Controller sendet nennt man “Keycode”. Wie nennt man den Code, der vom Tastendruck ausgeht und beim Controller ankommt, um die physische Taste selbst zu identifizieren? Es gibt in der Controller-Firmware eine Tabelle, die diese, ich sage mal “Tastensignale” den Keycode zuordnet, bspw.
Tastensignal für [Strg] ist zugeordnet Keycode für [Strg].
Tastensignal für [Alt] ist zugeordnet Keycode für [Alt].
Tastensignal für [Shift] ist zugeordnet Keycode für [Shift].
usw.
Und diese Zuordnungen kann man dann beliebig umprogrammieren, richtig?
Last edited by Eszett on 19 Apr 2014, 02:16, edited 2 times in total.

User avatar
rindorbrot

19 Apr 2014, 02:13

Am controller selbst kommt eigentlich nur die Position des gedrückten Schalters in der Matrix an. Also z.B. row 3, column 4.

User avatar
Eszett

19 Apr 2014, 02:15

@rindorbrot, Aha, also soll ich das “Matrix-Position” nennen?

User avatar
ne0phyte
Toast.

19 Apr 2014, 02:20

Sofern ich das richtig verstanden hab, meinst du wie die Tasten beim Controller adressiert sind?
Also "wie" die einzelnen, physischen Tasten beim Controller registriert werden?

Im Optimal- und einfachsten Fall sind die Tasten in einer Matrix angeordnet, zB. so wie in dieser äußerst häßlichen Grafik:
Image

Hierbei sind A,B,C und 1,2,3 Pins am Controller.
Der Controller würde hier der Reihe nach prüfen, welche Taste gedrückt ist, indem an A, B, C nacheinander Spannung angelegt und an den 1,2,3 Pins jeweils geprüft wird, ob high oder low (Taste gedrückt/nicht gedrückt) anliegt.

Je nach Firmware prüft der Controller also X mal pro Sekunde alle Tastenzustände ab. Intern hält er den Zustand der Matrix, um die Veränderung einer Taste (gedrückt/losgelassen) erkennen zu können. In dem Fall bekommt der USB Host (= dein Computer) die Info, dass eben diese Taste gedrückt bzw. losgelassen wurde.

User avatar
Eszett

19 Apr 2014, 02:34

@ne0phyte Ja, das meine ich. Die Hausnummer der Tasten sozusagen. Also hat der Controller eine Zuordnungstabelle, in der die einzelnen Tasten einem Keycode zugeordnet sind. Wenn das so ist, dann gibt es zwei Zuordnungstabellen: eine im Controller (Tastenadressen => Keycodes) und eine im Betriebsystem (Keycodes => Zeichen). Das ist eigentlich erstmal was ich begreifen wollte.

User avatar
Grendel

19 Apr 2014, 03:02

Korrekt. Der Kontroller übersetzt die Matrix-Position in eine sog. "USB Usage" (oder "Scancode" für PS/2). Der PC übersetzt das dann in ein Zeichen.

User avatar
Eszett

19 Apr 2014, 04:26

@Grendel Dann habe ich es verstanden. Nun soll das Programm Easy AVR USB Keyboard Firmware Keymapper einem die Arbeit erleichtern. Und deshalb versuche ich mich gerade an dieser Software. Ich sehe, daß ich da einzelnen Tasten andere Keycodes zuordnen kann. Aber solche Dinge wie Tastenkombination beherrscht das Programm anscheinend nicht, oder übersehe ich da was?

User avatar
Grendel

19 Apr 2014, 07:09

Was die Firmware angeht sind "Modifier" Tasten (Shift, Ctrl, Alt, Win) auch nur Tasten. Erst der PC macht aus Shift+Y ein kleines y. Dh., der Kontroller kennt im Normalfall keine Tastenkombinationen (läßt sich natürlich hacken, ist aber nicht ganz einfach.)

User avatar
Eszett

19 Apr 2014, 07:24

@Grendel Ah, d. h. der Controller kann (ohne Hacken) beim Drücken der Tastenkombination [Strg]+[Q] nicht die Keycodes für [Alt]+[F4] senden? Das war ja meine Frage. BlueBär und ne0phyte meinten das wäre problemlos programmierbar …

User avatar
Grendel

19 Apr 2014, 10:21

Der Kontroller kann das ohne grössere Programmänderungen nur wenn Du [Strg] auf [Alt] und [Q] auf [F4] umdefinierst -- die Interpretation von Kombinationen passiert normalerweise im PC, auf Kontrollerebene sind üblicherweise alle Tasten gleich.
Last edited by Grendel on 19 Apr 2014, 10:26, edited 1 time in total.

User avatar
Eszett

19 Apr 2014, 10:24

Der Taste mit der Aufschrift “Q” den Keycode von F4 zuzuordnen macht ja keiner, der bei Verstand ist, deshalb habe ich das Beispiel gewählt ;-) Der Controller kann also eine Tastenkombination nicht als Einheit betrachten, und deshalb auch nicht umdefinieren, vom Hacken abgesehen? Das wollte ich nur wissen.

User avatar
ne0phyte
Toast.

19 Apr 2014, 11:41

Naja deine Formulierung ist da etwas schwammig. Der Controller kann natürlich so programmiert werden, dass wenn du eine bestimmte physische Taste drückst, er Ctrl+Alt+Del oder Alt+F4 oder sogar lange Zeichenfolgen sendet.
Wie schon gesagt geschieht aber die Verarbeitung, also die Auswertung was dann passiert (Modifier+Tasten = ...?) auf PC Seite, sodass das eben abhängig vom jeweiligen Rechner bzw. der verwendeten Keymap/Eingabesprache ist.

User avatar
Eszett

19 Apr 2014, 11:46

@ne0phyte Gut, dann formuliere ich es nochmal etwas genauer. Wenn ich der physischen Taste [Q] den Keycode von [Q] zugeordnet hab, und der physischen Taste [Strg] den Keycode von [Strg], kann ich dann der physischen Tastenkombination [Strg]+[Q] den Keycode von [Alt]+[F4] zuordnen? Auf dem Controller zuordnen, versteht sich.

User avatar
ne0phyte
Toast.

19 Apr 2014, 12:50

Ja das geht. Falls dich das interessiert: Die Logik dahinter die man programmieren würde sähe dann zB so aus:

WENN Strg DANN 200ms "abwarten"
WENN Q UND Strg UND Strg-Zeit < 200ms DANN Alt+F4 senden SONST Q senden
WENN Strg-Zeit > 200ms DANN Strg senden

Das ist weder vollständig noch exakt, aber die Idee dahinter ist, dass der Controller kurz abwartet, ob nach dem Strg noch ein Q kommt um nicht erst Strg und dann Alt-F4 sondern bei Strg+Q wirklich nur Alt+F4 zu senden.
Durch die Wartezeit fängt man quasi das "einzelne" Strg ab.

User avatar
rindorbrot

19 Apr 2014, 13:33

Genau, das müsste man im Controller-Code entsprechend hinterlegen.
Mit dem Easy AVR Keymapper kannst du aber den Code nicht selber anpassen um solche Dinge zu tun. Ist ja im Endeffekt auch nur eine GUI zum einfachen belegen der Tasten.

Für so "komplexere" Dinge müsstest du dich nach einer anderen Firmware umsehen. Mit der TMK Firmware z.B. sollte das möglich sein.

User avatar
Eszett

19 Apr 2014, 23:28

@ne0phyte und @rindorbrot Das leuchtet mir ein! Dann komme ich um eine from-the-scratch-Programmierung mit TMK nicht herum. Gut, dann fange ich mal an!

P. S. Das mit den Millisekunden Wartezeit ist zwar nett aber erfahrungsgemäß unzuverlässig, denn manchmal ist man eben langsam und dann kommt der Timeout und es geht nicht mehr.

Post Reply

Return to “Diskussionen auf Deutsch”