pondělí 17. února 2014

xautolock - spouští programy, když se uživatel fláká

Našel jsem nedávno toto téma zahrabané v konceptech díky tomu, že jsem hledal skript, který umí čekat na aktivitu uživatele pro tu mou nahrávací automatiku a matně si pamatoval, že by tu mohl být. Tak ho vytáhnu na světlo, dokud jsou ještě X záležitosti nemrtvé. Takže bylo to takhle:

Možná se vám někdy stalo, že jste potřebovali spustit nějakou akci po určité době nečinnosti uživatele. Například zatroubit do repráků, aby se uživatel probral ze spánku, který ho přepadl po celém dni sezení nad bashovým skriptem. S tím vám může pomoct konzolový program xautolock, který si na odpadnutí uživatele s chutí počká a pak rozehraje svou hru s ohlašovatelem, zámečníkem a zabijákem. A je mazaný, umí se schovat i v koutě...


Co xautolock umí

Xautolock je spouštěč shellových příkazů, navržený primárně pro obsluhu zámku obrazovky a příbuzných záležitostí. Umí monitorovat aktivitu uživatele a provádět příkazy (přez /bin/sh) po nastavené době jeho nečinnosti (-time 1 až 60 minut). Nečinnost uživatele je dána tím, že nepoužívá žádné vstupní zařízení X serveru, klasicky klávesnici a myš. Ve skutečnosti těch příkazů umí spustit více za sebou, protože krom hlavního příkazu typu zámek (-locker), můžete definovat ještě příkaz pro upozornění (-notifier), nebo místo něj nastavit hlasitost zvukového signálu (-bell), který je automaticky použit, je-li nastaven čas upozornění (-notify počet sekund před -time), ale nikoliv samotný -notifier a nakonec je tu ještě zabiják (-killer), který může spustit další příkaz 10 až 60 minut po spuštění zámku (-killtime), za předpokladu, že program zámku do nastavené doby neskončil. Celou akci může uživatel kdykoliv přerušit tím, že pohne myší, nebo sáhne na klávesnici, neukončí se ale programy, které takto byly spuštěny.

Použití přiblíží příklad:

xautolock -time 1 \
-locker "gnome-calculator" \
-notify 5 \
-notifier 'notify-send "XAutoLock" "Pozor kalkulačka!"' \
-killtime 10 \
-killer "killall gnome-calculator"

Je to celé jeden příkaz, jen jsem to pro přehlednost rozdělil na řádky (zpětná lomítka escapují znaky nového řádku). Funguje to tak, že pokud uživatel přestane vyvíjet činnost, spustí se po minutě aplikace kalkulačka, přičemž 5 sekund předem se zobrazí notifikace (příkaz notify-send je z balíku libnotify-bin) a pokud to uživatel vydrží ještě deset minut a kalkulačka nebyla ukončena, spustí se příkaz killer, který sejme příkazem killall kalkulačky všechny.
Důležité je tedy si uvědomit, že killer je závislý na životu lockera, ostatně stejně jako celý cyklus xautolocku.

Pokud bych za příkaz spouštějící kalkulačku přidal & a tím ho spouštěl na pozadí, xautolock by okamžitě začal počítat znovu od začátku a za další minutu by spustil další kalkulačku, atd., zatímco killer by se nikdy ke slovu nedostal. Naproti tomu notifier se spouští na pozadí vždy a tak nezáleží na tom, kdy skončí.

xautolock umí běžet jen v jedné instanci a pokud ho spustíte znovu, jen vám oznámí, že už běží. Odkudkoli ho ale můžete pozastavit (přepínač -dissable), znovu povolit ( -enable), nebo ukončit ( -exit). Pokud xautolock ukončíte, nevezme s sebou do věčných lovišť i spuštěné programy, ty běží dál a jsou nezávislé i na terminálu, ze kterého byl xautolock spuštěn.

xautolock umí čekat i v koutě

Uvedené schopnosti umí xautolock rozvíjet i z rohů obrazovky, začne se pak neaktivitou uživatele zabývat jen tehdy, když je kurzor myši nějakou dobu zaparkován v rozích obrazovky, které si určíte. Například si můžete můj oblíbený kalkulátor spustit setrváním v pravém horním rohu:

xautolock -corners 0+00 -cornerdelay 0 -cornersize 20 -locker "gnome-calculator"

Můžete si určit prodlevu (pod sekundu se nedostanete ani s nulou), velikost rohu, prodlevu, než se může akce opakovat (po smrti lockera) a další drobnosti, které naleznete v manuálu.

Instalace

xautolock je v Ubuntu repozitáři Universe a nainstalujete ho klasicky:

sudo apt-get install xautolock

Když je naopak třeba čekat, až uživatel činnost projeví

Tohle je všechno pěkné, ale co kdybychom chtěli spuštěný program zase zastavit, jakmile se uživatel opět chopí klávesnice a/nebo myši? Pokud to program, který jste spustili jako lock neumí sám, bude si třeba pomoct jinak. Já jsem nenašel žádnou běžně instalovatelnou konzolovou utilitku, kterou bych k tomu použil, ale dá se vyrobit jednoduše třeba v Pythonu za použití modulu Xlib.

sudo apt-get install python-xlib

Skript pak vypadá následovně

#!/usr/bin/python

from Xlib import X
from Xlib.display import Display

display = Display(':0')
root = display.screen().root
root.grab_pointer(True,
        X.ButtonPressMask | X.ButtonReleaseMask | X.PointerMotionMask,
        X.GrabModeAsync, X.GrabModeAsync, 0, 0, X.CurrentTime)
root.grab_keyboard(True,
        X.GrabModeAsync, X.GrabModeAsync, X.CurrentTime)
display.next_event()

Skript nedělá nic jiného, než že čeká na vstup z klávesnice, nebo myši a když nějaký přijde, prostě se ukončí. Pokud si ho nazvete třeba waitxinput, nastavíte mu spustitelný příznak a strčíte do ~/bin/, či /usr/bin/, můžete ho používat jako jednoduchý trigger pro vaše shellové skripty.

Borec na konec





2 komentáře:

  1. Pěkné... Já ve skriptech používám jednoduché xprintidle, které prostě vypíše dobu, která uplynula od interakce s X, např. takto (ukázka: proveď akci jen pokud je uživatel neaktivní po dobu $IDLETIME_LIMIT:

    http://paste.ubuntu.com/6978045/

    OdpovědětVymazat
    Odpovědi
    1. Díky za tip! Tohle jsem opravdu minul.

      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.