El curioso clipboard (portapapeles) de Linux

Hace unos días, escribiendo un script para PHP-cli (PHP for command line interface), me surgió la necesidad de capturar datos del portapapeles de Linux, ya que dicho script debía procesar datos recuperados del portapapeles en caso de no tener un argumento de entrada.

Al tratarse de PHP, a priori, no existen extensiones que copien o guarden datos en el portapapeles, ya que es un lenguaje que inicialmente estaba orientado a crear aplicaciones web, y en dichos entornos, no tiene sentido un portapapeles. Además, el portapapeles es un componente relacionado con el entorno gráfico y lo normal es que en los servidores Linux orientados a web no se instalen las librerías X (librerías standard del servidor gráfico de Linux XLib)

Desde hace bastante tiempo, con la introducción de la SAPI cli en PHP, es posible crear scripts que se ejecuten directamente desde la linea de comandos y por ende, se pueden crear programas que se ejecuten también en cualquier distro con Escritorio (con sus correspondiente entorno grafico X funcionando).

Como he dicho antes, no existen extensiones de PHP que manejen el portapapeles de X, por lo que para poder continuar mi proyecto tenia dos posibles alternativas: utilizar algún binario como xclip que recupera o copia datos del portapapeles llamándolo desde PHP con la función “exec” por ejemplo, o bien, crear una extensión PHP en C adaptando el código fuente de xclip.

littletux_bumper.sh-600x600

Como la primera opción me parecía un pelín chapucera, me bajé el código fuente de xclip para examinar sus tripas y poder reutilizar su código en una nueva extension de PHP.

Tras unos minutos echando un vistazo a su código fuente y buscando info en Google, me encuentro que el portapapeles de Linux tiene más opciones que Windows y que estas han sido heredadas por retrocompatibilidad con sistemas antiguos.

Por un lado, existe el XA_CLIPBOARD que sería el portapapeles clásico al estilo de Windows, donde con comandos como “Copiar” o “Pegar”, se transfieren datos hacia y desde el portapapeles. Dentro de este portapapeles, se puede guardar texto plano o estructuras mas complejas como HTML. Un demonio (servicio de Linux) se encarga de mantener en memoria los datos para tenerlos siempre disponibles en caso que el programa origen donde se ejecuto el comando “Copiar” se haya cerrado.

Pero por otro lado, existen “otro tipo de portapapeles” como XA_PRIMARY, por ejemplo, basados en selección y no en comandos como los clasicos “Copiar” y “Pegar”. En una de las aplicaciones seleccionas algo y en la otra (la aplicación donde vayas a “Pegar” el texto) simplemente presionas el botón de en medio del ratón(es decir, pulsando el botón de la rueda del scroll vertical situado entre los dos botones principales)

mouse-middle-button-click-center-fernando-paladini-tutorial

Pero es que además, hay mas tipos, como XA_SECONDARY, otros heredados que no se suelen utilizar pero que se mantienen por retrocompatibilidad, o incluso aplicaciones (basadas en linea de comandos) que utilizan sus propias implementaciones del portapapeles, ya que han sido pensadas para ser utilizadas en entornos basados en terminal sin la necesidad de servidores gráficos. Entre estas últimas cabe destacar, emacs, vim o screen.

Como veis, el mundo del portapapeles en Linux está lleno de posibilidades, aunque para la extensión de PHP que estoy desarrollando me centraré principalmente en “Copiar” y “Pegar” texto plano a XA_CLIPBOARD, por ahora.

Si queréis profundizar un poco más un poco más en el tema os dejo algunos links con información de interés (en Inglés):

http://www.jwz.org/doc/x-cut-and-paste.html

http://standards.freedesktop.org/clipboards-spec/clipboards-latest.txt

http://os.livejournal.com/811721.html

Si te ha gustado y quieres compartir esta página..