sobota 8. května 2010

Simulace stisku (nejen) multimediálních kláves z příkazové řádky

Speciální tlačítka na klávesnicích, jimiž je možno ovládat přehrávání hudby, hlasitost, nebo spustit kalkulačku, ale i ovládat třeba jas displeje notebooku, jsou spravována přes službu acpi. Tato tlačítka často vůbec nezachytíte nástroji jako je xev, v lepším případě přečtete surová data lezoucí z klávesnice. Pokud není v kernelu podpora, tlačítka nefungují.
Když jsem před časem připojil k Ubuntu dálkové ovládání založené na lirc, začal jsem přemýšlet o tom, jak třeba na úrovni systému ovládat hlasitost, nebo přehrávání, tak jak to dělají ta multimediální tlačítka definovaná v nastavení klávesových zkratek v Gnome. Samozřejmě mě jako první napadlo, že budu systému posílat kódy těchto tlačítek jinou cestou a bude vyhráno. Myšlenka to byla dobrá, ale špatně jsem si vyložil jeden přepínač programu xvkbd, jehož pomocí jsem tlačítka posílal a tak jsem to pro neúspěch odložil. Nicméně, řešení je triviální a lze ho použít přinejmenším od Ubuntu 8.04 Hardy výše. ...


Jak už jsem zmínil, využívám k simulaci stisku kláves program xvkbd, který není základní součástí Ubuntu, ale je v repozitářích, takže jeho instalace je otázkou jednoho příkazu. Pak již stačí posílat názvy multimediálních kláves, podle specifikace XFree86

$ xvkbd -text "\[XF86AudioNext]"
$ xvkbd -text "\[XF86AudioPlay]"
$ xvkbd -text "\[XF86AudioRaiseVolume]"
$ xvkbd -text "\[XF86Back]"
atd.

Ale i jakékoli jiné klávesy, s jejichž identifikací vám pomůže manuál a příkaz
xbindkeys -k

Například:
$ xvkbd -text "\[Alt_L]\[Right]" #Levý Alt + šipka vpravo
$ xvkbd -text "\[Alt_L]\[F10]"
$ xvkbd -text "\Cw"  #Control + w
Ale můžete posílat i celé řeťezce

$ xvkbd -text "Treba neco, co vkladate casto.. ale česky neumí"

Kódy kláves se posílají do okna, které je právě aktivní, ale pokud na ně poslouchá nadřazená autorita, jako je správce oken, odchytí si je. xvkbd umožňuje posílat klávesy i konkrétnímu oknu, viz. manuál přepínač -window.
Když už umíme "mačkat klávesy" z příkazového řádku, mohli bychom to využít a převést tuto schopnost třeba na tlačítka myši. Máme moderní myšku s fůrou tlačítek, tak co si třeba nevyhradit boční tlačítka pro ovládání hlasitosti (vpřed/vzad máme již přesunuta na naklápění kolečka :). K tomu je ideální program xbindkeys, je také v repozitáři. Je to démon, takže je potřeba ho po instalaci přidat do aplikací spouštěných po startu systému, aby fungoval i po restartu. Jinak se spouští příkazem xbindkeys. Xbindkeys používá konfigurační soubor v domovském adresáři, takže si ho vytvořte, pokud ještě nemáte:
$ gedit ~/.xbindkeysrc

a vložte do něj třeba toto:
"/usr/bin/xvkbd -text "\[XF86AudioRaiseVolume]""
 m:0x0 + b:8 #číslo tl. myši, které spouští příkaz výše

"/usr/bin/xvkbd  -text "\[XF86AudioLowerVolume]""
 m:0x0 + b:9

Pokud nemáte naklápěcí kolečko, budou vaše boční tlačítka mít pravděpodobně čísla 6 a 7. Uložte a zkuste tlačítka, která jste definovali, pokud to fungovat nebude, zkuste restartovat xbindkeys, aby se konfigurace načetla.

Možností je v linuxovém světě zpravidla více než jedna. Tu další v tomto případě nabízí v systému implementovaný program acpi_fakekey, jehož parametrem je kód klávesy, jejíž stisk má simulovat. Přehled kódů je v souboru /usr/share/acpi-support/key-constants, je to vlastně spustitelný soubor, který přiřadí jednotlivé kódy do proměnných, jejichž jména usnadňují použití - po jeho spuštění je následně možné využít jako parametr acpi_fakekey tyto proměnné. Nevýhodou je, že vše funguje jen s právy roota a musel by pak i  xbindkeys běžet s těmito právy, což není zrovna ideální, natož bezpečné.

2 komentáře:

  1. Sice starší, ale pomohlo mi to s docela výrazným problémem nezamknuté obrazovky při uspání :-)
    Takže děkuji

    OdpovědětVymazat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.