pátek 3. května 2013

Jak v KDE vyvolat hlavní menu klávesou Super může být zajímavé i pro uživatele ostatních prostředí

Máme tu nové Kubuntu a tak přidám jeden návod, jak zalepit nehoráznou absenci funkčnosti Super tlačítka. Stisknete a pustíte klávesu Super (tu s tím obrázkem wokna většinou) a vyběhne menu, tak to má fungovat a nesmí to kolidovat s jinými Super zkratkami. Již jsem to zmínil ve svém rozboru "KDE domov můj?", ale krom toho, že tam to nikdo nenajde, mnozí jistě ocení polopatický návod s příklady. A nakonec není to jen pro KDEčkaře, popsané řešení je tak univerzální, že se může hodit i uživatelům ostatních prostředí a pro libovolné klávesy. ...



Klávesa Super funguje v mnoha dnešních linuxových desktopech tak, že vyvolává hlavní nabídku prostředí. Ostatně jako ve Windows od pradávna. Nová desktopová menu umožňují okamžitě začít vyhledávat psaním a proč vůbec kvůli tomu sahat na myš, nebo trefovat nějakou multi klávesovou zkratku, když můžete uhodit jednu klávesu a rovnou začít psát, co hledáte. Protože je to ale klávesa modifikační, která se využívá v kombinaci s dalšími klávesami pro klávesové zkratky, je potřeba, aby menu vyvolal jen stisk s následným uvolněním v krátkém časovém intervalu. Umí to GNOME Shell, i prostředí na něm založená, stejně tak Unity, ale KDE nikoliv. KDE nemá žádné pevné schéma desktopu, hlavní nabídku tu může provozovat cokoliv a tato klávesa se ani sama o sobě jako klávesová zkratka použít nedá. Přitom by mohlo být zajímavé přidat do systému rovnou funkčnost - zlvolíte-li si jako klávesovou zkratku samostatnou modifikační klávesu, bude fungovat způsobem, jak bylo popsáno. Je nás každopádně mnoho, kteří by tuto Super funkčnost viděli i v KDE a tak se nakonec našel někdo, kdo to přivedl k životu.

ksuperkey

Tak se jmenuje program, který je k mání na KDE-Apps.org a který umí zprovoznit klávesu Super tak, jak jsem zmínil. Je to démon, kterého necháte spouštět při startu prostředí a který je schopen převádět stisk a uvolnění Super na libovolnou jinou klávesouvou zkratku, které rozumí X11, potažmo KDE. A můžete si dokonce definovat i libovolnou jinou klávesu, nemusí to být zrovna Super.

ksuperkey je vlastně jen lehkou modifikací xcape, celé je to napsáno v c za použití pár X11 knihoven.

Kompilace

Aktuální hotové balíčky k instalaci sice nenabídnu, ale kompilace ze zdrojového kódu je opravdu triviální a podle následujícího návodu ji zvládne i opoce.

Nejprve nainstalujte potřebné balíky:

sudo apt-get install gcc make libx11-dev libxtst-dev pkg-config

Ze stránky projektu si stáhněte zdrojový kód (tohle vede na nyní aktuální verzi, jinak dole klikátko "[download] Source....") a rozbalte kamkoliv na disk.
Pak, nejednodušeji přes Dolphina, vlezte do vybaleného adresáře a otevřte terminál (v Dolphinovi jen stisknete F4), ve kterém spustíte jediný příkaz:

make

Tím se v adresáři vytvoří nový binární soubor jménem ksuperkey a je hotovo. Tedy skoro, teď už stačí jen program otestovat a následně přidat mezi aplikace spouštěné po startu prostředí.

Test

Takže k tomu testování, jak se to vlastně používá. ksuperkey funguje jako démon na pozadí a chytá klávesy. Když je stisknuta klávesa, na kterou čeká, počítá nějaký čas (ve výchozím nastavení 500ms) a pokud je do této doby klávesa opět uvolněna (a žádná jiná nestisknuta ani neuvolněna), pošle X11 přednastavenou klávesovou zkratku, jako byste ji stiskli na klávesnici.

Nejjednodušší variantou, která bude stačit většině uživatelů (dokud se nedozví o dalších možnostech :), je spuštění bez parametrů s výchozím chováním - stisk a uvolnění levé klávesy Super vyvolá klávesovou zkratku Alt+F1. Takže si nastavíte na widget, který takto chcete aktivovat  (KickOff, Homerun, ...), tuto klávesovou zkratku a spustíte z terminálu (který stále máte otevřený v daném adresáři):

./ksuperkey

Nyní stisknete a pustíte levý Super a widget by se měl aktivovat.

Další možnosti

ksuperkey  ale umí daleko více, můžete si definovat jiné klávesy, i jiné klávesové zkratky a dokonce těch kombinací můžete definovat více najednou. Můžeme zkoušet dál, ale před každým dalším spuštěním nejprve superkey ukončete pomocí:

killall ksuperkey

Takže například následující příkaz zařídí, že krom zmíněného, bude pravý Super vyvolávat KRunner na Alt+F2, klávesou Pause/Break bude možné kdykoliv umlčet, nebo naopak odmlčet zvukový výstup a navíc bude maximální doba mezi stiskem a uvolněním snížena na 200ms

./ksuperkey -t 200 -e 'Super_L=Alt_L|F1;Super_R=Alt_L|F2;Pause=XF86_AudioMute'

Názvy kláves, které můžete použít jsou v (K)Ubuntu dostupné v těchto hlavičkových souborech

/usr/include/X11/keysymdef.h
/usr/include/X11/XF86keysym.h

Pokud jste instalovali balíky, které jsem psal na začátku, máte je již v systému, jinak jsou součástí balíku x11proto-core-dev.

Důležité je ale psát názvy kláves bez písmen XK:

XK_BackSpace     -> BackSpace
XF86XK_AudioMute -> XF86_AudioMute

Vlastně jsem si uvědomil, že nejjednodušší cestou, jak si ověřit jméno klávesy, je spuštění konzolového příkazu xev, například takto, aby to nekecalo zbytečně moc

xev | egrep -o '\(keysym.*\)'

a stisknout příslušnou klávesu. Terminál bude vypisovat kód a jméno klávesy při jejím stisku i uvolnění, dokud bude mít okno xev fokus.

Z předchozího tedy vyplývá, že můžete používat i jména multimediálních tlačítek, například já nemám na jedné klávesnici Mute, které se často hodí a Pause/Break je naopak nevyužitá a navíc má i celkem příhodné jméno. Tedy ne, že by zrovna toto nešlo nastavit přes normální systémové zkratky, berte to jen jako příklad.

Instalace

Pokud všechno funguje, dejte si soubor do vašeho domovského ~/bin/ adresáře (pokud nemáte, vytvořte), abyste mohli příkaz spouštět bez zadávání cesty. (K)Ubuntu totiž tento adresář při startu systému automaticky přidá do systémové proměnné $PATH. Pokud byste chtěli ksuperkey zpřístupnit všem uživatelům, můžete soubor umístit do /usr/bin/.

Spouštění při startu KDE

Aby se ale příkaz spouštěl při každém startu KDE automaticky, musíte si přidat v aplikaci Autostart (jak je to přeloženo do češtiny teď přesně nevím) skript, který bude příkaz spouštět, protože Autostart vložit přímo příkaz neumožňuje. Pokud vám bude stačit výchozí chování ksuperkey, můžete jen zadat cestu k němu (podle toho, kam jste ho uložili), jinak si vytvoříte třeba soubor my_superkey, a do něj vložíte svůj výtvor. V mém případě to tedy bude:

#!/bin/sh
ksuperkey -t 200 -e 'Super_L=Alt_L|F1;Super_R=Alt_L|F2;Pause=XF86_AudioMute'

Skriptu samozřejmě nastavíte spustitelný příznak a cestu k němu zadáte Autostartu:


Použití v jiných prostředích

Jistě vám již došlo, že není absolutně žádný problém s použitím tohoto démůnka v jakémkoliv prostředí založeném na X11, jen si musíte dát pozor na to, abyste se nesnažili nastavovat klávesy, které jsou již v systému tímto způsobem obsazené.
Aby se to spuštělo po startu, není potřeba v Unity, ani GS vyrábět skript, je možné to v Startup Applications přidat rovnou jako příkaz.

Další pěkná univerzální hračka, tak to má být.

5 komentářů:

  1. To je náhoda, zrovna nedávno jsem v podstatě řešil totéž, jen jsem to potřeboval zabudovat do své pythoní aplikace. Je napsaná s použitím Qt a docela by se mi líbilo, kdyby Qt knihovna měla nějaký řešení pro "global hot key", což nemá. Nakonec na to budu muset jít s pomocí Xlib, ale není to až tak úplně triviální, docela se mi bude hodit prostudování zdrojáku ksuperkey ;-)

    OdpovědětVymazat
    Odpovědi
    1. Potřebuješ reagovat na stisky kláves bez ohledu na to, co má zrovna fokus? Na nějaké případné Pythonní řešení rád podívám..

      Vymazat
    2. Chci, jak jsem napsal, pro svou aplikaci nadefinovat globální klávesovou kombinaci - jde o to, že se běžící aplikace (která samozřejmě nemá focus) má aktivovat stiskem "Win". Tou aplikací je "autohide" panel částečně skrytej na kraji desktopu a aktivuje se najetím myši. Aktivace klávesovou zkratkou má jen být takovou třešničkou na dortu...

      Vymazat
    3. Ono by třeba stačilo vyjít z tohoto příkladu a stejně jako v případě ksuperkey rozlišit, jestli jde o stisk jen jedné konkrétní klávesy. Asi se vydám tímto směrem.

      Vymazat
    4. Díky za odkaz, až se mi mozek zase vrátí do trochu funkčního stavu, tak to omrknu :) Koneckonců bych pro to měl využití taky.

      Vymazat

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.