Wie werden die Schlüsselcodes der entsprechenden Aktion zugeordnet?

18

Nachdem ich herausgefunden hatte, wie die Zuordnung von Scan-Codes zu Schlüsselcodes mithilfe dieser Frage geändert werden udevkann , habe ich mich gefragt, wie diese Schlüsselcodes (oder Ereignisse, wenn Sie so wollen) der entsprechenden Aktion zugeordnet werden.

Wenn Sie zum Beispiel volume upauf Ihrer Tastatur drücken , wird ein Scan-Code gesendet, der dann in den volumeupSchlüsselcode umgewandelt wird. Aber wie wird dieser Schlüsselcode abgefangen, die Lautstärke erhöht und die entsprechende Benachrichtigung angezeigt?

Ich vermute, dass irgendwo ein Skript aufgerufen werden muss, also würde ich gerne wissen, wo sich diese Skripte befinden.

BEARBEITEN: Die Schlüsselcodes, die ich erwähne, sind nicht mit den Schlüsselcodes zu verwechseln xev, die ich zurückgebe, aber ich interessiere mich auch dafür;)

Gerhard Burger
quelle
3
Ich bin nicht einverstanden, zum Beispiel ist die Benachrichtigung sehr spezifisch für Ubuntu, also möchte ich wissen, wie die Benachrichtigung gesendet wurde. Ich vermute, dass irgendwo ein Skript aufgerufen werden muss, also möchte ich wissen, wo sich diese Skripte befinden.
Gerhard Burger
2
Dies ist eine gültige Ubuntu-spezifische Frage, da sich die Art und Weise, wie Ubuntu damit umgeht, im Laufe des IIRC geändert hat. Es ist sehr interessant zu wissen, wie die Abfolge der Ereignisse in Ubuntu bei einem Ereignis aussieht, bei dem ein Hotkey gedrückt wird, der die entsprechenden Aktionen auslöst. Mögliche Zwecke: Benutzerdefinierte Helligkeitssteuerung , Debuggen von
Hotkey-
2
@Seth Scheint veraltet zu sein. HAL ist längst veraltet, seit dem 10.04 . Es fehlen auch Informationen darüber, wie die Desktop-Benachrichtigungen ausgelöst werden.
Gertvdijk
1
Heute bin ich auf wiki.ubuntu.com/Hotkeys/Troubleshooter gestoßen , das einige nette Hinweise gibt (es gibt einen Link zu wiki.ubuntu.com/Hotkeys/Architecture, der sehr informativ ist). Ich denke, Stephen Ostermillers Antwort ist in die richtige Richtung, aber ich möchte diese Skripte finden und in der Lage sein, sie zu ändern;)
Gerhard Burger
1
^^ diese information scheint veraltet zu sein, keine tastenkombinationen unter gnome-settings-daemon hier ... viele hits für die helligkeit unter dem compiz abschnitt aber (ich vermute für die einheit?) wer weiß wie das notify-osdfunktioniert? Ich denke, dort werden die Helligkeitsbenachrichtigungen gesendet ...
Gerhard Burger

Antworten:

6

Ok, dies finden Sie unter https://help.ubuntu.com/community/MultimediaKeys

Wenn Sie eine Taste auf Ihrer Tastatur drücken, generiert der Linux-Kernel einen unformatierten Scancode für ihn (sofern dieser zugewiesen ist). Jeder Scancode kann einem Keycode zugeordnet werden. Dies ist auf Kernel-Ebene. X hat eine (quasi) völlig unabhängige Art, Schlüssel zuzuordnen: X liest die Kernel-Schlüsselcodetabelle beim Start und ordnet dann den Schlüsselcode seiner unabhängigen Schlüsselcodetabelle zu (er ist derselbe wie die Kernel-Schlüsselcodes, aber unterschiedlich :)). Dann kann jeder Schlüsselcode einem Schlüssel zugeordnet werden, dh einer Zeichenfolge, die einen Schlüssel darstellt oder eine Aktion vorschlägt. Damit unsere Schlüssel voll funktionsfähig sind, benötigen sie einen Kernel-Scancode / Keycode sowie einen X-Keycode / Keysym. Es mag seltsam erscheinen, aber X-Entwickler haben ihren Grund, eine vom Kernel getrennte Tastaturzuordnung beizubehalten. Es ist überhaupt nicht schwierig, nur ein ziemlich langwieriger Vorgang.

Also werden Keycodes auf Keysyms abgebildet. Also, wo sind die Keysyms? Ich habe folgende Frage gefunden und beantwortet: Wo finde ich derzeit eine Liste aller X-Schlüsselwörter? Da es sich um die Lautstärketasten handelt, finden Sie sie im XF86keysym.hin der Antwort genannten Quellcode.

In dieser Datei auf meinem Computer habe ich Folgendes für Volume gefunden:

#define XF86XK_AudioLowerVolume 0x1008FF11   /* Volume control down        */
#define XF86XK_AudioMute    0x1008FF12   /* Mute sound from the system */
#define XF86XK_AudioRaiseVolume 0x1008FF13   /* Volume control up          */

Seltsam ... andere Werte als alles andere, vielleicht gibt es mehrere Systeme für den Umgang mit Schlüsseln? http://crunchbang.org/forums/viewtopic.php?id=16656


Ich verwende Xubuntu, und um die Tasten zu steuern, muss ich die Aktionen manuell zuordnen (wie folgt: Wie ändere ich meine Tastaturkürzel in Xubuntu? ). Die Benachrichtigungen scheinen jedoch unabhängig zu sein, als würden sie beim Drücken einer Taste abgerufen und entsprechend gehandelt. Dies kann bedeuten, dass andere Programme in Ubuntu auf diese Weise eingerichtet werden, sodass den Tasten keine Skripte zugeordnet werden müssen.

Ich bin mir also ziemlich sicher, dass jetzt Programme auf den Schlüssel zugreifen (es sind also keine Skripte zu finden).

In Xubuntu hatte ich dieses Problem mit Pulse Audio und benutzte benutzerdefinierte Skripte, um die Lautstärke zu ändern. Es schien, als würde Pulse die Mute-Taste, die Mute-Taste Alsa und PulseAudio abfangen, aber nur Alsa wurde für interessante Problemumgehungen aktiviert .


Informieren Sie sich über NotifyOSD https://wiki.ubuntu.com/NotifyOSD#Volume_changes

Wenn Sie nach folgenden Diagrammen suchen: https://wiki.ubuntu.com/NotifyOSD#Architecture

Vor allem dieses: Bildbeschreibung hier eingeben

Es zeigt, dass es einen "Hardware Key Listener" gibt, der Form DBus oder HAL empfängt? Anschließend wird "das visuelle Element vom System abgerufen", dessen Sound- und Helligkeitssymbole sich in der Quelle von Notify-OSD befinden, und von dort aus die Blase erzeugt.


Das ist alles verrückt verwirrend, aber soweit ich es verstehe (soweit):

raw scancode (ex. e016)> keycode (ex. 160)> keysym (ex. XF86AudioMute)> gnome-settings-daemon (ex. volume-up)> dbussignal> hardware-key-listener für notify-osd (oder andere Programm hören)

Mateo
quelle
Sieht so aus, als würde das etwas bringen! Von Anfang an als CW markiert, ich vermute also, dass Sie sich noch verbessern? :)
gertvdijk
Ja, ich muss noch etwas genauer hinschauen, das Diagramm enthält viele Fragezeichen.
Mateo
Hast du es übrigens versehentlich in eine Community Wiki Antwort geschafft? Vielleicht bitten Sie einen Mod, es rückgängig zu machen ... Oh, und diese Grafiken sind höchstwahrscheinlich ein bisschen veraltet, weil HAL seit langer Zeit veraltet ist ... Nun, zumindest kommen wir irgendwohin: D
Gerhard Burger
@gertvdijk Ich weiß, aber es wäre eine Schande für all die Upvotes, die er vermissen wird;)
Gerhard Burger
1

In den meisten Fällen werden keine Skripts ausgeführt. Sie bewirken, dass Ereignisse an den Fenstermanager oder den Einstellungsdämon gesendet werden. Das einzige Mal, dass mir das Skripting in diesem Prozess bekannt ist, ist das Konfigurieren benutzerdefinierter Tastenzuordnungen. Für benutzerdefinierte Tastenkombinationen können Sie Befehlszeilen (ausführbare Dateien oder Skripts) hinzufügen und an Schlüssel binden.

Bitte sehen Sie diese Antwort, die ich auf eine Frage zum Sichern von Tastenkombinationen in Ubuntu geschrieben habe: Wo werden GNOME-Tastenkombinationen gespeichert? Ich habe ein Skript, das alle Tastaturbelegungen, einschließlich der benutzerdefinierten Tastaturbelegungen, sichert oder wiederherstellt. Wenn Sie das Skript ausführen, können Sie sehen, wo in dconf die Tastaturbelegungen gespeichert sind und welche Anwendung über das Schlüsselereignis benachrichtigt wird.

Stephen Ostermiller
quelle
Wie werden dann die Desktop-Benachrichtigungen ausgelöst?
Gerhard Burger
Ich glaube, dass der Gnome Setting Daemon dafür verantwortlich ist, diese beispielsweise bei Lautstärke und Helligkeit auszulösen.
Stephen Ostermiller
2
Ich habe Ihr Skript ausgeführt, aber alles, was es zu tun scheint, ist, die Verknüpfungen abzurufen, auf die Sie über Systemeinstellungen> Tastatur> Verknüpfungen zugreifen können. Ich habe beispielsweise keinen Hinweis auf die Helligkeit gefunden.
Gerhard Burger
cooles Skript zum Abrufen von Shoutcut-Schlüsseln.
Mateo
0

Die Antwort bezieht sich auf Treiber .

Jede Hardware muss über einen Treiber verfügen, um mit dem Betriebssystem interagieren zu können.

Zitieren http://www.linuxforu.com/2010/11/understanding-linux-device-drivers/ :

Ein Fahrer steuert, verwaltet, steuert, lenkt und überwacht die Entität unter seinem Befehl. Was ein Bustreiber mit einem Bus macht, macht ein Gerätetreiber mit einem Computergerät (jeder an einen Computer angeschlossenen Hardware) wie einer Maus, einer Tastatur, einem Monitor, einer Festplatte, einer Webkamera, einer Uhr und vielem mehr.

Ferner kann ein "Pilot" eine Person oder sogar ein von einer Person überwachtes automatisches System sein (beispielsweise ein Autopilotensystem in Verkehrsflugzeugen). In ähnlicher Weise kann eine bestimmte Hardware von einer Software (einem Gerätetreiber) gesteuert werden, oder sie kann von einem anderen Hardwaregerät gesteuert werden, das wiederum von einem Softwaregerätetreiber verwaltet werden kann. Im letzteren Fall wird ein solches Steuergerät üblicherweise als Gerätesteuerung bezeichnet. Da dies ein Gerät selbst ist, wird häufig auch ein Treiber benötigt, der üblicherweise als Bustreiber bezeichnet wird.

Ein Gerät verfügt über ein Geräteregister, in dem die Steuer- / Statusbits und Datenbits gespeichert sind. Wann immer Daten übertragen werden müssen, werden diese normalerweise durch Setzen der Datenbits gesendet.

Wenn Sie also eine Taste auf Ihrer Tastatur drücken, werden einige Daten in die Registrierkasse geschrieben. Diese Bits werden vom Gerätetreiber gelesen und die entsprechende Aktion wird ausgeführt. Dies ist die kurze Erklärung.

Links:

Grün
quelle
3
Ähm ... Ich glaube nicht, dass die Fahrer wirklich eine Vorstellung von der Bedeutung der Taste haben, die ich auf meiner Tastatur drücke. Für einige spezielle Hotkey-Geräte in Notebooks ist möglicherweise ein Treiber erforderlich. Dies gilt jedoch nicht für normale Multimedia-Hotkeys wie "Lauter". Dies muss in einem allgemeineren Bereich des Kernels / X / DE behandelt werden. Ich denke auch, dass die Referenzen in Bezug auf die Programmierung von Linux-Kernertreibern sehr breit sind.
Gertvdijk
Ich denke, für die meisten modernen Tastaturen verwendet Ubuntu den evdevTreiber, aber ich sehe nicht, wie das hier hilfreich wäre ...
Gerhard Burger