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.

widgety

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

Našli jste v článku chybu?
Vitalia.cz: Muž, který miluje příliš. Ženám neimponuje

Muž, který miluje příliš. Ženám neimponuje

Podnikatel.cz: „Lex Babiš“ Babišovi paradoxně pomůže

„Lex Babiš“ Babišovi paradoxně pomůže

Lupa.cz: Kde leží hardwarový pupek světa?

Kde leží hardwarový pupek světa?

Lupa.cz: Blíží se konec Wi-Fi sítí bez hesla?

Blíží se konec Wi-Fi sítí bez hesla?

120na80.cz: Co je padesátkrát sladší než cukr?

Co je padesátkrát sladší než cukr?

Lupa.cz: Patička e-mailu závazná jako vlastnoruční podpis?

Patička e-mailu závazná jako vlastnoruční podpis?

DigiZone.cz: Digi Slovakia zařazuje stanice SPI

Digi Slovakia zařazuje stanice SPI

Vitalia.cz: Tesco nabízí desítky tun jídla zdarma

Tesco nabízí desítky tun jídla zdarma

Vitalia.cz: Voda z Vltavy před a po úpravě na pitnou

Voda z Vltavy před a po úpravě na pitnou

DigiZone.cz: Parlamentní listy: kde končí PR...

Parlamentní listy: kde končí PR...

DigiZone.cz: Ginx TV: pořad o počítačových hráčích

Ginx TV: pořad o počítačových hráčích

Vitalia.cz: 5 chyb, které děláme při skladování potravin

5 chyb, které děláme při skladování potravin

Vitalia.cz: dTest odhalil ten nejlepší kečup

dTest odhalil ten nejlepší kečup

Vitalia.cz: Antibakteriální mýdla nepomáhají, spíš škodí

Antibakteriální mýdla nepomáhají, spíš škodí

DigiZone.cz: Numan Two: rozhlasový přijímač s CD

Numan Two: rozhlasový přijímač s CD

Podnikatel.cz: Byla finanční manažerka, teď cvičí jógu

Byla finanční manažerka, teď cvičí jógu

DigiZone.cz: Mordparta: trochu podchlazený 87. revír

Mordparta: trochu podchlazený 87. revír

DigiZone.cz: DVB-T2 ověřeno: seznam TV zveřejněn

DVB-T2 ověřeno: seznam TV zveřejněn

DigiZone.cz: Nova opět stahuje „milionáře“

Nova opět stahuje „milionáře“

DigiZone.cz: Světový pohár v přímém přenosu na ČT

Světový pohár v přímém přenosu na ČT