Usando DCOP desde la línea de comandos

Por Jimmy O'Regan

Traducción al español por Raúl González Duque
el día 22 de Junio de 2004, para La Gaceta de Linux

Introducción

DCOP es el mecanismo de IPC/RPC de KDE. Si comprendes lo que significa esta frase, puedes saltarte el siguiente párrafo.

El nombre DCOP deriva de las siglas de Desktop COmmunications Protocol (Protocolo de comunicaciones de escritorio), IPC viene de las siglas de Inter-Process Communication (Comunicación entre procesos); RPC son las siglas de Remote Procedure Call (Llamada a Procedimiento Remoto). Basicamente, son formas en que dos programas pueden comunicarse entre sí, ya sea dos procesos que se encuentran en la misma máquina o a través de una red. En este sentido, DCOP es similar al OLE Automation de Microsoft: proporciona a los desarrolladores una forma simple de facilitar el acceso a las funciones disponibles en una aplicación.

KDE intentaba construir un sistema de componentes basado en CORBA (el proyecto GNOME nació apartir de este proyecto, pero se convirtió en un proyecto de escritorio debido a las desavenencias sobre la licencia de la librería de widgets Qt), pero se decidió que CORBA era demasiado complicado, y se crearon dos nuevos sistemas mas sencillos; KParts, para componentes embebidos; y DCOP.

Una aplicación que permita usar DCOP se registra al iniciarse con el demonio DCOP, y registra también sus funciones. Cuando se le hace una consulta, el demonio dcop proporciona una lista de los procesos que se están ejecutando y de las funciones que proporcionan. Esto activa una serie de aplicaciones, tal como el navegador DCOP, o el demonio DCOP to XMLRPC; pero el que vamos ver es 'dcop', que nos permite acceder a DCOP desde la shell.

A diferencia de otros sistemas, tal como Bonobo de GNOME o Automation de Microsoft, DCOP no proporciona un sistema de activación; solo los procesos que ya están corriendo son listados por DCOP. El activar la aplicación se le deja al usuario.

Este artículo trata sobre el uso de DCOP para controlar las aplicaciones de KDE desde la línea de comandos; se incluyen enlaces a información para desarrolladores al final de la página para aquellos que deseen aprender más sobre esta tecnología.

Usando DCOP desde la línea de comandos

El programa 'dcop' nos proporciona acceso al sistema DCOP desde la línea de comandos. La sintaxis de la llamada al programa es la siguiente:

dcop [aplicación] [objeto] [función] [argumentos ...]

Para comprobar que aplicaciones están disponibles, escribe 'dcop' sin argumentos

$ dcop
khelpcenter
kwin
kicker
kword-4354
kded
knotify
kio_uiserver
kalarmd
kcookiejar
konsole-4300
korgac
klauncher
kdesktop
klipper
ksmserver

Vamos a echar un vistazo a klipper, el servicio de portapapeles de KDE:

$ dcop klipper
qt
klipper

Podemos asumir que klipper es el objeto que estamos buscando; el objeto por defecto (es decir, el que estamos buscando para controlar la aplicación) tiene normalmente el mismo nombre que la aplicación, con el texto "IFace" concatenado al nombre algunas veces, o puede estar marcado como "default" (por defecto):

$dcop klipper klipper
QCStringList interfaces()
QCStringList functions()
QString getClipboardContents()
void setClipboardContents(QString s)
void clearClipboardContents()
int newInstance()
void quitProcess()

Seguramente las funciones mas interesantes entre estas sean setClipboardContents y getClipboardContents. De hecho, he estado usando setClipboardContents en una ventana de konsole para añadir la salida de la shell que tenemos arriba:

dcop klipper klipper setClipboardContents "$(dcop klipper klipper)"

Para ser honestos, este no es el mejor ejemplo, ya que es mucho mas rápido utilizar el ratón que escribir esto, pero podría ser mucho mas útil si definieramos un alias para este comando, por ejemplo:

alias klip="dcop klipper klipper setClipboardContents"

Siempre he pensado que sería muy útil poder utilizar notas post-it desde la shell - DCOP hace esto posible.

$dcop knotes KNotesIface
QCStringList interfaces()
QCStringList functions()
int newNote(QString name,QString text)
int newNoteFromClipboard(QString name)
ASYNC showNote(int noteId)
ASYNC hideNote(int noteId)
ASYNC killNote(int noteId)
QMap notes()
ASYNC setName(int noteId,QString newName)
ASYNC setText(int noteId,QString newText)
QString text(int noteId)
ASYNC sync(QString app)
bool isNew(QString app,int noteId)
bool isModified(QString app,int noteId)

Vamos a añadir una nota:

dcop knotes KNotesIface newNote "Una nota" "Quiero recordar esto"

Genial, ha aparecido una nota en amarillo.

Ahora veamos las notas que tenemos disponibles:

$dcop knotes KNotesIface notes
1->Una nota

Después de añadir unas cuantas notas sin sentido mas, quizás quiera almacenarlas en un archivo de texto, de manera que escribo un script bastante tonto que se ajuste a una idea tan tonta:

#!/bin/bash
n=$(dcop knotes KNotesIface notes|awk -F- '{print $1}'|tail -1)
dcop knotes KNotesIface notes > $1
echo >> $1
for ((i=1;i<=$n;i++));do echo -n "$i: "; dcop knotes KNotesIface text $i;echo;done >> $1

Sumario

DCOP es una forma muy potente de controlar las aplicaciones de KDE. A medida que mas y mas desarrolladores reconocen su utilidad, nos acercamos a una fusión de belleza visual para el escritorio y de posibilidades de script.

Enlaces

 


Copyright © 2003, Jimmy O'Regan. Licencia de copia http://linuxgazette.net/copying.html

Publicado en el número 97 de Linux Gazette, Diciembre 2003