Jak psát Screenlety

Michal Hořejšek 9. 9. 2009

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.

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

Ohodnoťte jako ve škole:

Průměrná známka 2,88

Našli jste v článku chybu?
Zasílat nově přidané názory e-mailem
120na80.cz: Odřenina. Jakou použít dezinfekci?

Odřenina. Jakou použít dezinfekci?

Vitalia.cz: 7 nemocí očí, které musíte léčit včas

7 nemocí očí, které musíte léčit včas

Podnikatel.cz: 2000 Kč za nepřiznání online. On a další tisíce

2000 Kč za nepřiznání online. On a další tisíce

DigiZone.cz: Panasonic v Praze uvedl TV pro rok 2016

Panasonic v Praze uvedl TV pro rok 2016

Měšec.cz: Udali ho na nelegální software a přišla Policie

Udali ho na nelegální software a přišla Policie

DigiZone.cz: O2TV zve na souboj Ledecké s Myslivcovou

O2TV zve na souboj Ledecké s Myslivcovou

Podnikatel.cz: Využijte v byznysu nulové tarify

Využijte v byznysu nulové tarify

DigiZone.cz: Stream představil souboj žroutů

Stream představil souboj žroutů

Vitalia.cz: Před, nebo po snídani? Kdy je lepší čistit si zuby

Před, nebo po snídani? Kdy je lepší čistit si zuby

Vitalia.cz: Falšované masné výrobky byly v Tescu i Lidlu

Falšované masné výrobky byly v Tescu i Lidlu

DigiZone.cz: Kolik lidí sleduje hokej na webu ČT?

Kolik lidí sleduje hokej na webu ČT?

Podnikatel.cz: Konečně vývar. Skoro jako od Steva Jobse

Konečně vývar. Skoro jako od Steva Jobse

120na80.cz: Poznáte, který z léků je pravý?

Poznáte, který z léků je pravý?

Vitalia.cz: 10 rad šéfkuchařů pro perfektní grilování

10 rad šéfkuchařů pro perfektní grilování

Podnikatel.cz: Šizený guláš na pultě. Jako Lidl to nedělejte

Šizený guláš na pultě. Jako Lidl to nedělejte

120na80.cz: Co jí dělá? Sklerotizaci

Co jí dělá? Sklerotizaci

Podnikatel.cz: Internet věcí ušetří v podnikání peníze

Internet věcí ušetří v podnikání peníze

DigiZone.cz: Podzim přinese sport Viasat Ultra HD

Podzim přinese sport Viasat Ultra HD

120na80.cz: Zjistěte, zda je vaše klíště infikované

Zjistěte, zda je vaše klíště infikované

Lupa.cz: Válka e-shopů. Alza končí s Heurekou

Válka e-shopů. Alza končí s Heurekou