OSD, escribiendo en el escritorio

Llevo un par de tardes mirando qué alternativas hay en GNOME para pintar texto en pantalla, es decir OSD, y he pensado ponerlo aquí en plan receta por si a alguien le resulta de utilidad y sobre todo para tenerlo a mano cuando me haga falta.

Básicamente, he encontrado dos cosas que tienen buena pinta:

XOSD

Paquetes:

  • libxosd2
  • xosd-bin

Se trata de una librería para X con una buena documentación con ejemplos. Permite hacer cosas muy interesantes aparte de escribir texto:

  • Elección de colores, fuentes, sombra
  • Escribir en dos líneas
  • Pintar barras horizontales (como las típicas de volumen) o sliders
  • Se puede hacer scroll
  • Tiene una utilidad para consola llamada osd_cat con la que puedes escribir en pantalla desde un script shell.

Y lo mejor de todo es que hay bindings para Python que se llaman PyOSD. El paquete Debian se llama python-osd. Aquí pongo un ejemplo básico de uso de XOSD usando estos bindings:

import pyosd
 
osd = pyosd.osd()
osd.set_colour("red")
osd.display("hola")
osd.show()

Con pydoc pyosd puedes ver algo de documentación sobre el módulo, escueta pero útil. De todos modos, la documentación de la librería C es perfectamente aplicable, salvando las distancias.

gnome-osd

Paquetes:

  • gnome-osd

Es un componente GNOME muy inspirado en XOSD y por eso comparten algunas características:

  • Color, fuente, sombra
  • Se puede usar desde consola, con un programa llamado gnome-osd-client

Aunque tiene algunas ventajas respecto a XOSD:

  • Permite utilizar marcado Pango en el texto.
  • Se pueden animar la entrada y salida del texto
  • Tiene transparencias simuladas
  • Color de fondo

También tiene algunas desventajas: no tiene scroll, varias lineas ni permite “pintar” barras.

El componente está escrito en Python, así que se puede utilizar como un módulo del siguiente modo:

import gtk, pango
from gnomeosd.gosd import osd
 
w = osd("<b>hola</b>", "#000000", "#80ff80", pango.FontDescription("sans serif 48"),
         use_markup=True, drop_shadow=True)
w.show()
gtk.main()

Sin embargo, esta forma de usarlo es bastante precaria y se pierden muchas de sus posibilidades. Lo más adecuado es utilizar el componente mediante su interfaz bonobo o dbus, y eso tiene la ventaja de que el cliente puede estar escrito en varios lenguajes: C, Java, Ruby, C#, Python, etc. Este es un ejemplo para utilizarlo con Bonobo (el sistema de componentes de GNOME) desde un cliente Python:

import bonobo
 
osd = bonobo.get_object("OAFIID:GNOME_OSD", "IDL:Bonobo/Application:1.0")
osd.ref()
osd = bonobo.AppClient(osd)
osd.msg_send("show", ["<b>hola</b>", 1000])

En /usr/share/python-support/gnome-osd/gnomeosd/client.py puedes encontrar la forma de hacerlo con DBUS.

El texto que se indica puede ser un XML que tiene algunos atributos adicionales a los de Pango. El formato del mensajes es:

<message ..atributos..> …texto con marcado pango… </message>

Los atributos posibles son:

  • id
  • inherit
  • animations
  • avoid_panels
  • drop_shadow
  • ellipsize
  • enable_sound
  • hide_on_hover
  • hide_timeout
  • osd_fake_translucent_bg
  • osd_font
  • osd_halignment
  • osd_vposition
  • sound_sample

Cuando se utiliza este XML hay que invocar un función diferente llamada show-full. El equivalente al ejemplo anterior sería:

mport bonobo
 
osd = bonobo.get_object("OAFIID:GNOME_OSD", "IDL:Bonobo/Application:1.0")
osd.ref()
osd = bonobo.AppClient(osd)
osd.msg_send("show-full", ['<message id="sample" hide_timeout="1000"><b>hola</b></message>'])

Más información en “man gnome-osd-client“ y en el árbol /apps/gnome-osd de gconf, accesible con:

$ gconf-editor /apps/gnome-osd

Otros

Si conoces otra alternativa que cubra la funcionalidad básica de éstas, por favor, deja un comentario, gracias.