Introducción a los plasmoides KDE 4

Plasma, el shell de escritorio de KDE 4, mejora la experiencia de escritorio con sus simples applets de Plasma, plasmoides

KDE 4 abarca muchas nuevas y apasionantes tecnologías, entre ellas Plasma, una característica que conforma el shell de escritorio de KDE 4. Observe cómo se escriben los simples applets de Plasma (conocidos como plasmoides) para mejorar ampliamente la experiencia de escritorio, y cómo un plasmoide se convierte en un simple monitor de memoria.

Martyn Honeyford, Software Engineer

Martyn Honeyford graduated from Nottingham University with a BSc in Computer Science in 1996. He has worked as a software engineer in various guises ever since. Since his international snowboarding career shows no sign of taking off, and he has yet to find a method of paying the bills by playing video games, his day job is as a Senior Java Developer for an online derivatives trading company in London.



14-06-2009

KDE, cuya sigla en inglés significa “entorno de escritorio K”, es un proyecto gratuito de software que se basa en un entorno de escritorio para sistemas similares a UNIX®. Brinda funciones y aplicaciones básicas de escritorio para las necesidades diarias, además de herramientas y documentación para que los desarrolladores puedan crear aplicaciones independientes para el sistema. El software KDE se basa en el kit de herramientas Qt. La pieza central de la cuarta serie de KDE es un escritorio rediseñado con paneles, que en conjunto se denomina Plasma, el cual integra las funcionalidades de Kicker, KDesktop, y SuperKaramba en una única pieza de tecnología.

KDE 4 ofrece una nueva esperanza

La cuarta gran versión de K Desktop Environment (KDE) fue lanzada al mercado en enero de 2008 y provocó reacciones dispares. El lanzamiento representó un emprendimiento de envergadura:

  • Gran parte del código base de KDE 3 se reescribió totalmente.
  • Se crearon numerosas nuevas tecnologías.
  • La mayor parte del código base sufrió algún tipo refactorización, ya sea en el modo, el diseño o la forma.

Si bien la versión 4.0 inicial exhibió un gran potencial, el alcance de los cambios significó que la versión no podía alcanzar una paridad con KDE3 en cuanto a las características. En consecuencia, numerosos analistas informaron que era inestable en ciertas áreas, por lo que algunos usuarios no se mostraron dispuestos a realizar el cambio de inmediato. Muchas de estas deficiencias fueron solucionadas en la versión 4.1, aunque aún había notables omisiones en cuanto a las características.

Con la versión KDE 4.2 lanzada en enero de 2009, sin embargo, se solucionaron la mayor parte de estas inquietudes, y muchos usuarios decidieron comenzar a utilizar 4.2 como su principal entorno de escritorio.

Este es un buen momento para analizar en profundidad estas nuevas características y tecnologías, ya que muchísimos usuarios tienen acceso a ellas.


KDE 4.2 renueva el escritorio

Este artículo se centra en una de las nuevas tecnologías más apasionantes: Plasma y applets de Plasma s (muchas veces conocidos como plasmoides).

La idea detrás de Plasma es simple: usted cuenta con una o más contencionesde Plasma, que son elementos visualizables capaces de contener artículos individuales tales como widgets/plasmoides y/u otras contenciones de Plasma.

Este concepto no parece demasiado innovador hasta que nos damos cuenta de que en KDE 4, todo el shell del escritorio (el escritorio principal que se presenta al usuario) es, de hecho, una contención de Plasma, y de que todos los controles conocidos, como por ejemplo la barra de tareas, la lista de tareas, el reloj, el conmutador de tareas, el Menú k, los íconos de tareas rápidas, etc., se encuentran implementados ya sea como applets de Plasma (como el reloj) o como contenciones de Plasma (barra de tareas).

Esto resulta extremadamente interesante. Brinda a los usuarios de KDE 4 un interesante potencial de personalización, permitiendo que los desarrolladores y/o las personas modifiquen prácticamente todos los aspectos de la experiencia del escritorio, alterando totalmente su comportamiento cuando sea necesario. Por ejemplo, si usted desea contar con un iniciador de aplicaciones con más capacidad que el predeterminado, podrá utilizar uno como por ejemplo Lancelot, que se encuentra actualmente en etapa de desarrollo. Si el espacio es escaso, introduzca un iniciador de aplicaciones que sea más parecido a los que se ven en los clásicos entornos de escritorio livianos (como por ejemplo XFCE) donde mediante un clic con el botón derecho del mouse se muestra un simple archivo popup, quitando el iniciador regular para proporcionar más espacio de pantalla.

Esta simple idea debería ser suficiente para permitir que KDE 4 se transforme en un escritorio igual para todos, dado que las distribuciones y los usuarios podrán adaptar KDE a diversas configuraciones. Por ejemplo, las máquinas más avanzadas se podrán beneficiar con applets de gran tamaño y complejidad, junto con todos sus beneficios adicionales, mientras que las máquinas con menor potencia podrán utilizar versiones más simples/livianas de los componentes necesarios, quitando los componentes que no sean útiles. En consecuencia, usted ya no tendrá que reemplazar KDE 4 por un entorno de escritorio más especializado y liviano.

Si bien estos applets de Plasma pueden resultar algo complicados, están hechos para funcionar como aplicaciones pequeñas de estilo utilitario que usted podrá abrir en todo momento, en lugar de tener que abrir aplicaciones completas. Por lo general, están incrustados en el escritorio y/o la barra de tareas. Algunos de los ejemplos más usuales son los monitores de sistemas, los programas de mensajería instantánea, las herramientas de redes sociales, etc.

Otra característica común del diseño es su relativamente poco uso del espacio de pantalla. No es conveniente que en el escritorio haya muchos plasmoides abiertos en todo momento sin superponerse. En el administrador de ventanas, no aparecen como ventanas individuales, de modo que no se puede pasar rápidamente de uno a otro ni minimizarlos.

Además de la tecnología de contención básica de Plasma, los desarrolladores de KDE han dado un paso más para construir poderosos applets de Plasma de la manera más sencilla y flexible posible. Entre las características, se puede nombrar:

  • Soporte de primer nivel para gráficos de vectores y escalares (SVG) para todos los elementos GUI. Todas las aplicaciones /los applets pueden entonces resolverse de manera independiente, con escalamiento leve. La misma aplicación se verá y funcionará bien, tanto en un monitor de alta definición de 30 pulgadas, como en una pantalla de netbook de 8 pulgadas—sin que el desarrollador tenga que realizar trabajo adicional.
  • Excelente soporte a la tematización. Se alienta profundamente a los desarrolladores a hacer referencia a todos sus recursos como por ejemplo íconos, fondos, etc., mediante rutas relativas, de manera que KDE pueda ocuparse de localizarlas en el tiempo de ejecución en base al tema seleccionado en ese momento. Esto permitirá que todos las aplicaciones de KDE 4 saquen ventaja de una mirada consistente a temas diferentes, nuevamente, sin que el desarrollador tenga que realizar trabajo adicional.
  • Soporte a múltiples lenguajes. Los plasmoides KDE 4 (como, en general, las aplicaciones de KDE) pueden escribirse en una variedad de lenguajes de programación diferentes. Este artículo se centra en C++, si bien se encuentran en desarrollo otros lenguajes que incluyen Ruby, Python, y Javascript.
  • Reutilización de componentes. KDE brinda un excelente soporte para permitir que los componentes reutilicen los servicios que cada uno de ellos provee.

Ahora que usted cuenta con ciertos conocimientos sobre Plasma, es momento de ensuciarse las manos escribiendo un plasmoide simple que se pueda agregar a nuestro escritorio de KDE 4.2.


IDE de KDevelop 4

Estas instrucciones suponen que usted está ejecutando un escritorio KDE 4.2. Es posible que todas o algunas de las instrucciones puedan aplicarse a KDE 4.1, aunque todavía no lo he confirmado.

Vayamos por partes: usted debe instalar todas las bibliotecas, los encabezados, y otros elementos del desarrollo KDE.

Estoy utilizando ahora la versión estable actual de Kubuntu 8.10 (Intrepid Ibex), que viene de fábrica con KDE 4.1, de manera que tuve que habilitar los repositorios PPA para que obtuvieran KDE 4.2 y los encabezados (ver más detalles en http://www.kubuntu.org/news/kde-4.2). (Este paso no es necesario para los usuarios de Kubuntu 9.04, pero sí es necesario para instalar g++ y kdesdk, etc.). Obsérvese que esta versión de KDE no posee actualmente soporte de Canonical, de manera que es mejor utilizar un entorno de desarrollo en lugar de su máquina principal.

Una vez agregado el repositorio PPA, simplemente instalé el kdesdk, g++, cmake, y algunos paquetes kde-dev, de esta manera:

Listado 1. Construcción del entorno de desarrollo KDE
sudo apt-get update
sudo apt-get install kdesdk
install cmake
sudo apt-get install g++
sudo apt-get install libphonon-dev libplasma-dev

Con esto accioné todo lo que necesitaba en la máquina. Si usted usa otra distribución, deberá determinar la manera de instalar estos paquetes.

KDevelop 4 cuenta con una buena plantilla para generar automáticamente un plasmoide básico. Desafortunadamente, al momento de escribir este artículo, KDevelop 4 todavía está en beta, y no se dispone de una versión binaria para Intrepid, de modo que para utilizar esta ruta, usted deberá construirla desde la fuente siguiendo estas instrucciones relativamente simples.

SI usted no desea utilizar KDevelop, le recomiendo este excelente artículo sobre la base técnica de KDE "Getting Started,"que explica los conceptos básicos. Si usted sigue estos pasos, conseguirá un proyecto muy similar al que estamos creando con KDevelop, y podrá pasar a la sección "Modifying the sample" (modificación de la muestra)

Una vez que KDevelop esté funcionando de la manera que se muestra en la Figura 1, abra el menú Project (projecto), y seleccione New From Template (nuevo desde plantilla). Cuando aparezca el cuadro de diálogo, expanda la ramificación C++, y luego la KDE; seleccione Plasma Applet Template. A continuación, complete el Applicationname (sugiero dwPlasmoide). Luego haga clic en Siguiente y Finalizar.

Figura 1. Creación del proyecto
Project creation dialog box

El último cuadro de diálogo le pedirá que elija un directorio Installation Prefix (Prefijo de instalación) (Recomiendo $HOME/plasmoides) y un tipo de construcción (elija Release o Debug).

Con esto se creará el proyecto. Tómese algo de tiempo para analizar los archivos .cpp y .h, que están bien documentados. Además, el artículo sobre la base técnica mencionado anteriormente incluye una explicación más profunda sobre lo que hace el código.

Ahora que usted ha creado el proyecto, está preparado para construirlo. Para hacerlo, abra Project y elija build (construir) (o presione F8). La primera vez que lo haga, el comando llamará a la función configure (configurar), y luego, solamente construirá.

Suponiendo que la construcción ha resultado exitosa, seleccione Install (instalar) en el menú Project. De esta manera, se copian los archivos de instalación al directorio que usted eligió anteriormente. Si este paso se completa sin incidentes, usted estará listo para probar el plasmoide.

Antes de poder ejecutar el nuevo plasmoide, deberá informar a KDE de su existencia. En primer lugar, debe hacer que KDE conozca el directorio donde se instaló el plasmoide ($HOME/plasmoides). Esto se logra abriendo un "konsole" para fijar la variable de entorno KDEDIRS y luego ejecutando el comando kbuildsyscocoa4. Abra una terminal y escriba las líneas del Listado 2:

Listado 2. Cómo hacer que KDE conozca la ubicación del plasmoide
export KDEDIRS=$KDEDIRS:$HOME/plasmoides kbuildsyscocoa4

Ahora que KDE sabe de la existencia del plasmoide, usted podrá intentar su ejecución. plasmoidviewer es un conveniente programa utilitario que se puede emplear con fines de verificación. Es posible obtenerlo escribiendo plasmoidviewer dwplasmoid. Observe el plasmoide de muestra que se visualiza en una ventana, como lo muestra la Figura 2:

Figura 2. Su plasmoide básico
Screen shot of a basic plasmoid

Debido a que éste es un plasmoide, usted también podrá incrustarlo en el escritorio. No obstante, si intenta agregar el plasmoide en este momento (mediante el objeto de menú Add widgets que se encuentra en el escritorio), verá dwPlasmoid en la lista de plasmoides, pero cuando trate de agregarlo, no funcionará. Si bien KDEDIRS fue correctamente configurado cuando se ejecutó kbuildsyscocoa4, no fue correctamente ajustado para el entorno al iniciar el escritorio de Plasma, de manera que no puede encontrar todos los archivos necesarios.

Usted puede solucionar este inconveniente saliendo de la instancia de Plasma que se está ejecutando en este momento, y reiniciándola desde la línea de comando (utilice la que usamos anteriormente para que KDEDIRS continúe estando correctamente configurado; de lo contrario, reiníciela antes de ejecutar los comandos siguientes). Observe que de este modo de Plasma finalizará y se reiniciará, por lo cual usted deberá asegurarse de no estar hacienda nada que este proceso pueda interrumpir (por ejemplo, guarde cualquier tarea no guardada en cualquiera de los demás plasmoides). Usted puede salir de la instancia Plasma actual como se muestra en el Listado 3.

Listado 3. Cómo salir de la instancia Plasma actual
kquitapp plasma && kstart plasma

Ahora, usted estará en condiciones de agregar el plasmoide al escritorio, y podrá visualizar su ícono y mensaje simples durante todo el día. Incluso podrá agregar tres de ellos, y aprovechar las características incorporadas de escalamiento y rotación como se muestra en la Figura 3:

Figura 3. Instancias múltiples de plasmoide incrustadas en el escritorio
Screen shot of multiple instances of a plasmoid embedded in the desktop

Como alternativa a lo que acabo de mostrarle, es posible configurar el directorio de instalación como /usr (suponiendo que éste es el directorio en el cual KDE está instalado en su sistema). Esto hará que falle el paso de instalar amenos que usted ejecute KDevelop como súper usuario (o realice la instalación manual como súper usuario modificando el directorio de construcción, $HOME/projects/dwPlasmoid/build, y ejecutando sudo make install).

Nota: Si usted desea conservar estos plasmoides en su escritorio, y quiere trabajar con ellos después de un reinicio sin detener e iniciar Plasma nuevamente, deberá indicarle a KDE 4 que busque en el subdirectorio de plasmoides en el inicio. Un modo de hacerlo es agregar una línea a su archivo kde4rc (/etc/kde4rc), como se muestra en el Listado 4:

Listado 4. Cómo indicarle a KDE que busque en el directorio de plasmoides en el inicio
[Directories]prefixes=/home/martynh/plasmoids

Modificación de la muestra

Bien, ahora que tenemos un simple plasmoide, hagamos que realice tareas un poco más interesantes que simplemente mostrar texto estático. Transformemos el plasmoide en un simple monitor de memoria.

En primer lugar, trate de quitar parte del agrupamiento de la ventana quitando el ícono y el fondo. En el constructor (dwPlasmoid::dwPlasmoid), usted deberá señalar como comentario el código que configura el fondo, como se muestra en el Listado 5:

Listado 5. Cómo señalar como comentario el código que configura el fondo
//    setBackgroundHints(DefaultBackground);
//    m_svg.setImagePath("widgets/background");

A continuación, en el método de la interfaz pintar (dwPlasmoid::paintInterface), señale como comentario la parte que agrega el ícono, como se muestra en el Listado 6:

Listado 6. Cómo señalar como comentario el código que agrega el ícono
//    p->ldrawPixmap(7, 0, m_icon.pixmap((int)contentsRect.width(),
      (int)contentsRect.width()-14));
//    p->save();

Si usted vuelve a construir y a ejecutar esto como antes, verá que la ventana es ahora una ventana negra con el texto “Hello Plasmoid", como se muestra en la Figura 4:

Figura 4. Plasmoide sin fondo y sin ícono
Screen shot of a plasmoid with the background and icon removed

A continuación, usted deberá reemplazar el texto con algo que resulte un poco más útil: información en tiempo real sobre el uso de memoria del sistema.

Si usted está familiarizado con Linux®, quizás sepa que existen una serie de archivos especiales en el directorio /proc que brindan información en tiempo real sobre el sistema en ejecución. El archivo en el cual estamos interesados es /proc/meminfo. Usted podrá analizar el contenido de este archivo escribiendo el siguiente comando: cat /proc/meminfo. Este comando muestra mucha información sobre el estado actual de la memoria de su sistema.

Alteremos el programa que hemos construido para que periódicamente lea este archivo y muestre la información dentro del plasmoide. Comience por leer el archivo y extraer la información. Por suerte, la caja de herramientas Qt hace que este proceso sea relativamente sencillo.

Luego, usted deberá crear un método nuevo y agregar algunas variables de miembros a la clase. En el archivo de encabezado, usted deberá agregar el método como una ranura, como se muestra en el Listado 7 (en poco tiempo verá porqué):

Listado 7. Cómo agregar un método como una ranura
 public slots:         void updateMemoryCount();

Luego, agregue algunas nuevas variables de miembros privados, como se muestra en el Listado 8:

Listado 8. Cómo agregar nuevas variables de miembros privados
     private:
        Plasma::Svg m_svg;
        KIcon m_icon;
        int m_totalMemory;
        int m_freeMemory;
        int m_swapMemory;
        int m_freeSwapMemory;

Más tarde, coloque la implementación en el archivo cpp, como se muestra en el Listado 9:

#include <QFile>
...
void dwPlasmoid::updateMemoryCount()
{
   // open the file
   QFile file("/proc/meminfo");
   if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
   {
        exit(-1);
   }

   QTextStream in(&file);
   QString line = in.readAll();

   // remove any extraneous characters
   line = line.simplified();

   // extract the information we are interested in using a regular expression
   QRegExp regex("MemTotal: (\\d+).*MemFree: (\\d+).*SwapTotal: (\\d+)"
    ".*SwapFree: (\\d+)");   regex.indexIn(line);
   m_totalMemory = (regex.cap(1).toInt());
   m_freeMemory = (regex.cap(2).toInt());
   m_swapMemory = (regex.cap(3).toInt());
   m_freeSwapMemory = (regex.cap(4).toInt());

   // force a re-draw
   update();
}

Con este método se abre el archivo, se leen los contenidos del mismo y se extraen los valores que nos interesan utilizando una expresión regular.

A continuación, usted deberá cambiar el método para pintar (dwPlasmoid::paintInterface) a fin de agregar esta información en lugar del mensaje existente, como se muestra en el Listado 10:

Listado 10. Cómo modificar el método para pintar
   int percentageFreeMem = (m_freeMemory * 100) / m_totalMemory;
   int percentageFreeSwap = (m_freeSwapMemory * 100) / m_swapMemory;

   char message[256];

   sprintf(message,"Total Memory: %d\nFree Memory: %d\nPercent free mem: %d\n"
                   "Total Swap: %d\nFree Swap: %d\nPercent free swap: %d",
                   m_totalMemory, m_freeMemory, percentageFreeMem,
                   m_swapMemory, m_freeSwapMemory, percentageFreeSwap);

    p->setPen(Qt::white);
    p->drawText(contentsRect,
                Qt::AlignTop | Qt::AlignHCenter,
                message);
    p->restore();

Por último, coloque un llamado a updateMemoryCount en el constructor para que lea los valores iniciales de las cifras de la memoria: updateMemoryCount();.

Si usted recopila y ejecuta esta información, verá que el sistema le mostrará la utilización correcta de memoria a partir del momento en que se inicia el plasmoide, como se muestra en la Figura 5:

Figura 5. Monitor de memoria estático
Screen shot of a static memory monitor

Este es un avance, pero una visualización estática de la utilización de memoria del sistema no resulta tan interesante. La pieza final del acertijo consiste en hacer que el plasmoide se actualice periódicamente para brindar lecturas actuales en todo el ciclo de vida. Esto será sencillo porque usted declaró el método de actualización como una slot (ranura). Solamente deberá agregar lo siguiente al método init, como se muestra en el Listado 11:

Listado 11. Cómo hacer que el plasmoide se actualice periódicamente
#include <QTimer>
...
  // kick off a refresh timer
  QTimer* m_timer = new QTimer(this);
  connect(m_timer, SIGNAL(timeout()), this, SLOT(updateMemoryCount()));
  m_timer->start(1000);

De este modo se pone en funcionamiento un temporizador que funciona cada segundo y llama a la ranura updateMemoryCount.

Si usted recopila y ejecuta esta información, ¡verá que se actualizará automáticamente cada segundo!

Figura 6. Actualización dinámica de los plasmoides de la memoria incrustados en el escritorio
Screen shot of dynamically updated memory plasmoids embedded in the desktop

Observe que los valores no están necesariamente sincronizados. Estas instancias del plasmoide fueron agregadas en diferentes momentos, por lo cual cada una de ellas puso en funcionamiento a su temporizador en un momento diferente.


Conclusión

Como usted puede observar, en poco tiempo es posible programar un monitor de memoria con un nivel razonable de sofisticación que se pueda incrustar en el escritorio.

La tecnología de Plasmoide le permite programar programas utilitarios/monitores poderosos para propósitos generales. Sin embargo, resulta igualmente importante el hecho de que los plasmoides son lo suficientemente simples para permitirle programar utilitarios muy especializados que serán útiles solo para usted y que se integrarán perfectamente al entorno de su escritorio.

Espero que este artículo le sirva de inspiración para crear sus propios plasmoides de interés. Utilice la sección de comentarios que aparece más adelante para relatarme a mí y a otros usuarios sus experiencias y los resultados que obtenga.


Descargar

DescripciónNombretamaño
Code samples for this articlecode.zip23KB

Recursos

Aprender

Obtener los productos y tecnologías

  • Con el software de prueba IBM, disponible para descargar directamente desde developerWorks, construya su próximo proyecto de desarrollo en Linux.

Comentar

  • Involúcrese en la comunidad My developerWorks; con su perfil personal y su página de inicio personalizada, usted podrá adaptar developerWorks a sus intereses, e interactuar con otros usuarios de developerWorks.

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=WebSphere, Lotus
ArticleID=417817
ArticleTitle=Introducción a los plasmoides KDE 4
publish-date=06142009