Jak psát Screenlety

9. 9. 2009
Doba čtení: 5 minut

Sdílet

Screenlety jsou takové gadgety, které se umísťují na plochu a zobrazují různé informace s možností manipulace. Můžeme mít na ploše hodiny, kalkulačku, kalendář, RSS, využití disků, procesoru, pamětí a spoustu dalších a dalších informací a my si povíme, jak si takový vlastní Screenlet napíšeme.

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).

Screenlety

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 MyFirstScreen­let.py.

bitcoin_skoleni

$ 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.

Screenlety

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.

Autor článku