W jaki sposób kody klucza są mapowane na odpowiednie działanie?

18

Po zastanowieniu się, jak zmienić mapowanie kodów skanowania za pomocą kodów kluczy udev, zobacz to pytanie , zastanawiałem się, w jaki sposób te kody kluczy (lub zdarzenia, jeśli chcesz) są mapowane na odpowiednie działania.

Na przykład, jeśli naciśniesz volume upna klawiaturze, zostanie wysłany kod skanowania, który zostanie następnie przekonwertowany na volumeupkod klucza. Ale w jaki sposób przechwytuje się ten kod klucza, zwiększa głośność i wyświetla odpowiednie powiadomienie?

Domyślam się, że gdzieś trzeba wywołać skrypt, więc chciałbym wiedzieć, gdzie są te skrypty.

EDYCJA: Wspomnianych kodów kluczowych nie należy mylić ze xevzwrotami kodów kluczowych , ale ja też jestem nimi zainteresowany;)

Gerhard Burger
źródło
3
Nie zgadzam się, na przykład powiadomienie jest bardzo specyficzne dla Ubuntu, więc chcę wiedzieć, w jaki sposób powiadomienie zostało wysłane. Domyślam się, że gdzieś trzeba wywołać skrypt, więc chcę wiedzieć, gdzie są te skrypty.
Gerhard Burger,
2
To ważne pytanie specyficzne dla Ubuntu, ponieważ sposób, w jaki Ubuntu sobie z tym radził, zmienił się w latach IIRC. Bardzo interesujące jest wiedzieć, jaka jest sekwencja zdarzeń w Ubuntu po naciśnięciu klawisza skrótu uruchamiającego odpowiednie działania. Możliwe cele: niestandardowe ustawienia jasności , debugowanie problemów z klawiszami skrótu itp.
gertvdijk
2
@Seth Wydaje się nieaktualny. HAL jest przestarzały już dawno, od 10.04 . Brakuje również informacji o tym, jak uruchamiane są powiadomienia na pulpicie.
gertvdijk
1
Dzisiaj natknąłem się na wiki.ubuntu.com/Hotkeys/Rozwiązywanie problemów , które daje kilka fajnych wskazówek (istnieje link do wiki.ubuntu.com/Hotkeys/Architektura, który jest bardzo pouczający). Myślę, że odpowiedź Stephena Ostermillera jest właściwa, ale chcę znaleźć te skrypty i móc je zmienić;)
Gerhard Burger,
1
^^ ta informacja wydaje się nieaktualna, nie ma tutaj żadnych skrótów klawiszowych w gnome-settings-daemon ... Wiele trafień na jasność w sekcji compiz (zgaduję o jedność?) Kto wie, jak to notify-osddziała? Myślę, że tam wysyłane są powiadomienia o jasności ...
Gerhard Burger,

Odpowiedzi:

6

Ok, znalazłem to na https://help.ubuntu.com/community/MultimediaKeys

Kiedy naciskasz klawisz na klawiaturze, jądro Linuksa generuje dla niego surowy skancode (jeśli jest przypisany). Każdy scancode można przypisać do kodu klucza. To jest na poziomie jądra. X ma (quasi) całkowicie niezależny sposób mapowania kluczy: X odczytuje tablicę kodów jądra podczas uruchamiania, a następnie mapuje go na swoją niezależną tablicę kodów (jest taki sam jak kody kluczy jądra, ale różni się :)). Następnie każdy kod klucza można odwzorować na klucz, tzn. Ciąg znaków, który reprezentuje klucz lub sugeruje akcję. Aby więc nasze klucze były w pełni funkcjonalne, potrzebują jądra scancode / keycode oraz X keycode / keysym. Może to wydawać się dziwne, ale programiści X mają powód, aby zachować oddzielne mapowanie klawiatury od jądra. To wcale nie jest trudne, tylko dość żmudna procedura.

Więc kody są mapowane na klucze, więc gdzie są klucze? Znalazłem odpowiedź na to pytanie: Gdzie znajdę teraz listę wszystkich kluczy X? Ponieważ mówimy o klawiszach głośności, można je znaleźć w XF86keysym.hkodzie źródłowym wymienionym w odpowiedzi.

W tym pliku na moim komputerze znalazłem następujące dane dla woluminu:

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

Dziwne ... inne wartości niż cokolwiek innego, może istnieje wiele systemów do obsługi kluczy? http://crunchbang.org/forums/viewtopic.php?id=16656


Korzystam z Xubuntu i aby kontrolować klawisze, muszę ręcznie mapować akcje (jak to. Jak zmienić skróty klawiaturowe w Xubuntu? ). Jednak powiadomienia wydają się niezależne, jakby odbierały naciśnięcie klawisza i działały odpowiednio. Może to oznaczać, że inne programy w Ubuntu są skonfigurowane w ten sposób, więc nie ma potrzeby mapowania skryptów na klawisze.

Jestem więc całkiem pewien, że programy odbierają teraz klucz (więc nie można znaleźć skryptu).

W Xubuntu miałem ten problem z Pulse Audio i używając niestandardowych skryptów do zmiany głośności. Wydawało się, że Pulse przechwytuje klawisz Wycisz, klawisz Wycisz wycisza Alsa i PulseAudio, ale wyłącza wyciszenie tylko Alsy stworzonej dla interesujących obejść.


Sprawdź to na temat NotifyOSD https://wiki.ubuntu.com/NotifyOSD#Volume_changes

Jeśli spojrzysz na te diagramy: https://wiki.ubuntu.com/NotifyOSD#Architecture

Zwłaszcza ten: wprowadź opis zdjęcia tutaj

Pokazuje, że istnieje „odbiornik kluczy sprzętowych”, który otrzymuje dane z DBus lub HAL? Następnie „pobiera element wizualny z systemu”, który ikony dźwięku i jasności znajdują się w źródle Notify-OSD, a następnie tworzy bańkę stamtąd.


To wszystko jest szalone mylące, ale o ile rozumiem (do tej pory):

raw scancode (np. e016)> kod klucza (np. 160)> keyym (np. XF86AudioMute)> demon ustawień gnome (np. zwiększanie głośności)> sygnał DBus> detektor kluczy sprzętowych dla powiadomień-osd (lub innych słuchanie programu)

Mateo
źródło
Wygląda na to, że to się gdzieś dostaje! Oznaczony jako CW od początku, więc myślę, że wciąż się poprawiasz? :)
gertvdijk
tak, muszę przyjrzeć się więcej, na diagramie jest wiele znaków zapytania.
Mateo
Czy przy okazji przypadkowo udzieliłeś odpowiedzi na wiki społeczności? Może poproś mod, aby go cofnął ... Aha, a te wykresy najprawdopodobniej są trochę nieaktualne, ponieważ HAL jest przestarzałe od dawna ... Cóż, przynajmniej gdzieś się dostaniemy: D
Gerhard Burger
@gertvdijk Wiem, ale szkoda byłoby dla wszystkich entuzjastów, za którymi będzie tęsknił;)
Gerhard Burger
1

W większości przypadków nie są uruchamiane skrypty. Powodują wysyłanie zdarzeń do menedżera okien lub demona ustawień. Jedyny raz, kiedy jestem świadomy skryptów w tym procesie, to konfigurowanie niestandardowych powiązań klawiszy. W przypadku niestandardowych skrótów klawiszowych możesz dodać wiersze poleceń (pliki wykonywalne lub skrypty) i powiązać je z kluczami.

Proszę zobaczyć odpowiedź, którą napisałem na pytanie dotyczące tworzenia kopii zapasowych skrótów klawiszowych w Ubuntu: Gdzie są przechowywane skróty klawiaturowe GNOME? Mam skrypt, który tworzy kopię zapasową lub przywraca wszystkie skróty klawiszowe, w tym niestandardowe. Po uruchomieniu skryptu można zobaczyć, gdzie w dconf są przechowywane skróty klawiszowe i która aplikacja jest powiadamiana o kluczowym zdarzeniu.

Stephen Ostermiller
źródło
w jaki sposób uruchamiane są powiadomienia na pulpicie?
Gerhard Burger
Uważam, że demon ustawień gnome jest odpowiedzialny za uruchamianie tych, na przykład w przypadku głośności i jasności.
Stephen Ostermiller
2
Uruchomiłem skrypt, ale wszystko, co wydaje się robić, to uzyskiwanie skrótów, do których można uzyskać dostęp za pomocą opcji Ustawienia systemowe> Klawiatura> Skróty. Nie znalazłem na przykład odniesienia do jasności.
Gerhard Burger,
fajny skrypt do uzyskiwania klawiszy „wykrzykiwania”.
Mateo,
0

Odpowiedź dotyczy kierowców .

Każdy sprzęt musi mieć sterownik, aby mógł współpracować z systemem operacyjnym.

Cytując http://www.linuxforu.com/2010/11/understanding-linux-device-drivers/ :

Kierowca prowadzi, zarządza, kontroluje, kieruje i monitoruje jednostkę pod jej dowództwem. To, co sterownik magistrali robi z magistralą, sterownik urządzenia robi z urządzeniem komputerowym (dowolnym sprzętem podłączonym do komputera), takim jak mysz, klawiatura, monitor, dysk twardy, kamera internetowa, zegar i inne.

Ponadto „pilotem” może być osoba lub nawet automatyczny system monitorowany przez osobę (na przykład system autopilota w samolotach pasażerskich). Podobnie, konkretny sprzęt może być kontrolowany przez oprogramowanie (sterownik urządzenia) lub może być kontrolowany przez inne urządzenie sprzętowe, którym z kolei może zarządzać sterownik urządzenia programowego. W tym drugim przypadku takie urządzenie sterujące jest zwykle nazywane kontrolerem urządzenia. Jest to samo urządzenie, często również wymaga sterownika, który jest powszechnie określany jako sterownik magistrali.

Urządzenie ma rejestr urządzenia, który przechowuje bity kontroli / stanu i bity danych. Ilekroć niektóre dane muszą zostać przesłane, zwykle są wysyłane przez ustawienie bitów danych.

Za każdym razem, gdy naciśniesz jakiś klawisz na klawiaturze, niektóre dane są zapisywane w rejestrze. Te bity są odczytywane przez sterownik urządzenia i wykonywane jest odpowiednie działanie. To jest krótkie wyjaśnienie.

Spinki do mankietów:

Zielony
źródło
3
Uhm ... Nie sądzę, żeby kierowcy mieli pojęcie o znaczeniu klawisza, który naciskam na klawiaturze. Niektóre specjalne klawisze skrótów w notebookach mogą wymagać do tego sterownika - ale nie obejmuje to zwykłych skrótów multimedialnych, takich jak „zwiększanie głośności”. Musi to być omówione w bardziej powszechnym obszarze jądra / X / DE. Myślę też, że odniesienia do programowania sterowników urządzeń jądra systemu Linux są bardzo szerokie.
gertvdijk
Myślę, że dla większości nowoczesnych klawiatur Ubuntu używa evdevsterownika, ale nie widzę w jaki sposób byłoby pomocne tutaj ...
Gerhard Burger