Základní informace o Screenletech
Pokud Screenlety znáte, můžete přejít až k nadpisu První Screenlet.
Jako na začátek bych chtěl upozornit, že k použití Screenletů je třeba mít zapnutý kompozitní okenní manažer Compiz. Bez této hlavní důležité věci vám Screenlety nepůjdou či nebudou pracovat správně. Dále už jen doporučím, že je lepší je provozovat pod grafickým prostředí Gnome.
Screenlety jsou psány v programovacím jazyce Python, při čtení tohoto seriálu byste měli tento jazyk alespoň minimálně ovládat.
Více se o Screenletech můžete dočíst na jejich domovské stránce (anglicky) a spoustu dalších Screenletů naleznete na gnome-look.org (anglicky).
Jak Screenlety nainstalovat
Jelikož jsou Screenlety obvykle v repositářích, nainstalují se velice jednoduše. Stačí provést následující příkaz (pro .deb distribuce) nebo v oblíbeném správci balíčků nalézt balíček screenlets a ten nainstalovat.
$ sudo aptitude install screenlets
Po provedení instalace najdete Screenlety (tedy jejich manažer) v Ubuntu v menu Aplikace > Příslušenství >Screenlets. Zde je hlavni seznam Screenletů a nové nainstalujete jednoduše kliknutím na tlačítko Install nebo přetažením archivu nad seznam a potvrzením instalace. Dále si je zapnete pomocí zaškrtnutí check-boxu Start/Stop a aby se vám spouštěly automaticky po startu (je na mysli aktuálně vybraný Screenlet; Screenlety jako tento manažer se spouští automaticky po startu) tak zaškrtněte check-box Auto start on login.
Tímto vyhlašuji konec „nudného tlachání“ a jdeme konečně něco naprogramovat.
První Screenlet
#!/usr/bin/env python import screenlets from screenlets import DefaultMenuItem import gobject import time class MyFirstScreenlet( screenlets.Screenlet ): # zakladni meta-info o screenletu __name__ = 'My First Screenlet' # nazev __version__ = '1.0' # verze __author__ = 'Michal Horejsek' # autor __desc__ = __doc__ # dokumentace; ponechame dokumentaci samotnych screenletu __timer = None # definujeme si timer pro update width = 200 # sirka height = 40 # vyska # konstrukcni funkce def __init__( self, **keyword_args ): screenlets.Screenlet.__init__( self, width=self.width, height=self.height, **keyword_args ) # handler, ktery je zavolan, az kdyz je screenlet finalne inicializovan def on_init( self ): self.add_default_menuitems() # handler, ktery je zavolan, kdyz je screenlet namapovan def on_map( self ): if not self.__timer: self.__timer = gobject.timeout_add( 1000, self.update ) self.update() # handler, ktery je zavolan, kdyz je screenlet odmapovan def on_unmap( self ): if self.__timer: gobject.source_remove( self.__timer ) self.__timer = None # nase funkce update def update( self ): self.redraw_canvas() return True # zde vykreslujeme nas screenlet def on_draw( self, ctx ): if self.scale > 5: self.scale = 5 ctx.save() ctx.scale( self.scale, self.scale ) ctx.set_source_rgba( 1, 1, 1, 0.1 ) # nastaveni barvy (RGB a pruhlednost) self.draw_rectangle( ctx, 0, 0, self.width, self.height ) # nakresleni obdelinku jako pozadi foo = str( time.localtime()[3] ) + ':' + str( time.localtime()[4] ) + ':' + str( time.localtime()[5] ) ctx.set_source_rgba( 1, 1, 1, 1 ) # nastaveni barvy (RGB a pruhlednost) self.draw_text( ctx, 'Prave je '+foo, 10, 10, 'FreeSans', 12, 200 ) # vypsani textu ctx.restore() # toto je dulezita funkce, bez ni bychom nemohli screenlet posouvat ani # vyvolavat nabidku pravym kliknutim def on_draw_shape(self, ctx): self.draw_rectangle(ctx, 0, 0, self.width, self.height) # zde inicializujeme program a pridame do session screenletu if __name__ == "__main__": import screenlets.session screenlets.session.create_session( MyFirstScreenlet )
Jistě nebude stačit takovéto jednoduché nahlédnutí a všechny handlery a funkce, které se v tomto příkladu objevují, si vysvětlíme podrobněji.
Nejdřív ale začneme s názvem. Název Screenletu musí být uveden tak, jak je to v ukázce, to znamená, že nejdřív náš název s příponou Screenlet, tedy v tomto případe MyFirstScreenlet (můj první Screenlet). Stejně tak i název souboru.
__init__
Funkce __init__
nám slouží jako konstrukční funkce, která se provádí úplně jako první. V této funkci se musí objevit volání konstrukční třídy samotných Screenletů, kde nastavíme základní atributy jako šířku a výšku. Dále se sem také píše nastavení Screenletů (ukážeme si v nějakém dalším díle) či různé inicializační proměnné podle potřeby.
on_init
Tento handler se volá jako první po úplné inicializaci Screenletu. Zde se například inicializují položky pro kontextovou nabídku. Většinou se tam píše jen řádek z ukázky, ale někdy potřebujeme přidat vlastní další položky (o tom později). Já v tomto handleru (u Screenletu InfoPanel) ještě volám inicializaci bufferů (o tom také později).
on_map
a on_unmap
Tyto handlery se zavolají na začátku ( on_map
) nebo na konci ( on_unmap
) běhu Screenletu. Vhodné pro umístění timeru, který se nám stará o update (re-draw). Takto řešený update screenletu není jedinou správnou možností.
on_draw
Do tohoto handleru napíšeme všechno, co chceme, aby se provedlo při vykreslení Screenletu. V příštím díle si kreslení různých tvarů a textu ukážeme.
on_draw_shape
Handler on_draw_shape
je velice důležitý, protože obstarává možnost kliknout pravým tlačítkem myši a vyvolat nabídku, kterou jsme si vytvořili v handleru on_init
nebo také možnost pohybovat se Screenletem, když se nám zobrazí na obrazovce.
update
Na funkci update
jsem nezapomněl, jen se nejedná o handler, který nutně patří ke Screenletům – název funkce si můžete zvolit jaký chcete. Voláme ji každou vteřinu (nastaveno v handleru on_map
) a provede překreslení Screenletu.
Spouštění Screenletu
Tím, že napíšeme kód, samozřejmě nemáme vyhráno. Také musíme kód nějak spustit a ověřit, že to dělá to, co chceme. To provedeme tak, že kód umístíme do souboru (nejlépe s koncovkou .py) a ten poté spustíme následujícím příkazem za předpokladu, že soubor je umístěn na ploše a jmenuje se MyFirstScreenlet.py.
$ python ~/Plocha/MyFirstScreenlet.py
A spuštěný Screenlet si můžete zkontrolovat podle následujícího obrázku. Měl by vypadat úplně stejně, až na čas samozřejmě, pokud jste nijak neexperimentovali.
Příště
Tímto máme náš první jednoduchý Screenlet, který zobrazuje pouze hodiny a překresluje se každou sekundu. Doporučuji, abyste se nebáli a trošku experimentovali a v příštím díle si předvedeme, jak se kreslí různé tvary a píše text.