Las selecciones , los buffers de corte y la función de arrastrar y soltar son los mecanismos que se utilizan en el sistema X Window para permitir que un usuario transfiera datos de una ventana a otra. Las selecciones y el buffer de corte se utilizan normalmente cuando un usuario selecciona texto u otros datos en una ventana y los pega en otra. La función de arrastrar y soltar se utiliza cuando un usuario selecciona algo en una ventana, luego hace clic en la selección y la arrastra a otra ventana.
Dado que las dos ventanas pueden ser manejadas por dos aplicaciones diferentes, estos mecanismos requieren dos clientes diferentes conectados con el mismo servidor X para intercambiar datos. El protocolo principal del sistema X Window incluye algunas solicitudes y eventos que son específicos para el intercambio de selecciones, pero la transferencia se realiza principalmente mediante el envío de eventos y propiedades de ventana, que no son específicos para la transferencia de selecciones.
Se pueden transferir distintos tipos de datos: normalmente es texto, pero también puede ser una imagen, un número, una lista de objetos, etc. A continuación, se considerará únicamente el caso del texto.
Los métodos de transferencia de datos se pueden clasificar en activos y pasivos, dependiendo de si el cliente que maneja los datos seleccionados tiene que participar activamente en la transferencia a un cliente que los solicita:
Las selecciones y la función de arrastrar y soltar son mecanismos activos: después de seleccionar un texto en una ventana, el cliente que maneja la ventana debe respaldar activamente un protocolo para transferir los datos a la aplicación que los solicita. Por el contrario, los búferes de corte son un mecanismo pasivo: después de seleccionar un texto, se transfiere a un búfer de corte y permanece allí incluso si la aplicación que maneja la ventana finaliza y la ventana se destruye. El portapapeles X es un mecanismo pasivo tal como lo percibe el cliente que mantiene la selección, pero requiere que el xclipboard
cliente respalde activamente cualquier transferencia de datos posterior.
Una ventaja de los mecanismos activos es que los datos se pueden convertir a un formato diferente antes de la transferencia. En particular, el cliente que recibe los datos puede solicitar que los datos de selección se conviertan a un formato adecuado. Si el cliente emisor se niega a hacerlo, el receptor puede solicitar un formato diferente. Por ejemplo, un fragmento de código HTML que representa un texto se puede transferir como texto a un solicitante que solo puede manejar texto, pero también se puede transferir como código HTML si el solicitante puede manejarlo. Esta negociación de formato no se puede realizar mediante mecanismos pasivos, en los que el cliente que tiene la selección (y le proporciona semántica) transfiere la selección y no participa en la transferencia posterior a un cliente que la solicita.
Otra ventaja de los mecanismos activos es que se pueden transferir grandes cantidades de datos en una secuencia de transferencias en lugar de en una sola. En cambio, los mecanismos pasivos requieren que todos los datos se transfieran a algún lugar desde el propietario de la selección y luego se transfieran nuevamente al cliente que los solicita.
La ventaja de los mecanismos pasivos es que la transferencia puede realizarse incluso después de que el cliente que tiene los datos haya finalizado su relación. Esto no es posible en los mecanismos activos, que requieren que el cliente que tiene los datos participe activamente en la transferencia.
El sistema X Window admite un número arbitrario de selecciones; cada selección se identifica mediante una cadena (más precisamente, un atom
). La selección más utilizada es la PRIMARY
selección .
Las siguientes solicitudes son específicas de la transferencia de selección, aunque la transferencia también implica otras solicitudes:
El propietario de la selección suele ser la ventana en la que se encuentra el texto seleccionado, si lo hay. Cuando el usuario selecciona algún texto en una ventana, el cliente que gestiona la ventana debe indicar al servidor que la ventana es la propietaria de la selección.
Cuando el usuario intenta pegar la selección en otra ventana, el controlador de esa ventana inicia un protocolo para obtener el texto seleccionado del otro cliente. Este protocolo involucra la segunda y tercera solicitudes de la lista anterior y no está especificado por el protocolo X sino como una convención en el Manual de la Convención de Comunicación entre Clientes (ICCCM).
En particular, el cliente de destino comienza preguntando al servidor qué ventana posee la selección. Luego, los dos clientes transfieren la selección a través del servidor. Este intercambio involucra una propiedad de una ventana y un fragmento arbitrario de datos adjunto a la ventana. Si se considera que el contenido de la selección es lo suficientemente pequeño como para transferirlo de una sola vez, los pasos que se llevan a cabo son:
SelectionRequest
evento;ChangeProperty
solicitud ; al servidorSelectionNotify
para notificar que la selección ha sido transferida.GetProperty
solicitudes al servidor;PropertyNotify
evento.Si el contenido es grande, se debe transferir en fragmentos. En este caso, ambos clientes expresan interés en PropertyNotify
los eventos: de esta manera, el propietario de la selección sabe cuándo se ha leído la selección y el solicitante sabe cuándo se ha colocado otro fragmento en la propiedad.
La extensión XFixes permite a los clientes escuchar los cambios de selección. [1]
La selección más utilizada es la PRIMARY
selección, y se utiliza cuando el usuario selecciona algunos datos. La CLIPBOARD
selección se utiliza cuando el usuario selecciona algunos datos y solicita explícitamente que se "copien" al portapapeles, como por ejemplo invocando "Copiar" en el menú "Editar" de una aplicación. Una solicitud asociada de "Pegar" da como resultado que CLIPBOARD
se utilicen los datos de la selección.
A nivel del protocolo central, las selecciones PRIMARY
y CLIPBOARD
no difieren. Pero el xclipboard
cliente hace que se comporten de manera diferente. En particular, cuando otro cliente afirma la propiedad de la CLIPBOARD
selección, este programa la solicita y la muestra en una ventana. Cualquier solicitud posterior de esta selección es manejada por xclipboard
. De esta manera, el contenido de la selección sobrevive al cliente que la copió.
Los buffers de corte son otro mecanismo para transferir datos, en particular texto seleccionado. Son propiedades de la ventana raíz , llamadas CUT_BUFFER1
, etc. A diferencia de las selecciones, los buffers de corte no implican una interacción directa entre clientes. En cambio, cuando se selecciona texto en una ventana, el propietario de la ventana copia este texto en la propiedad de la ventana raíz llamada CUT_BUFFER1
. Cuando el usuario pega el texto en otra ventana, el propietario de la ventana lee esta propiedad de la ventana raíz.
El xcutsel
programa transfiere datos entre selecciones y buffers de corte, y xcb
permite varios tipos de acceso a los buffers de corte.
Los buffers de corte se consideran obsoletos. [2]
La función de arrastrar y soltar en el sistema X Window está regulada por la convención Xdnd. [3] Cuando el usuario arrastra el texto seleccionado a una ventana y suelta el botón del ratón, el intercambio de datos se realiza como en la selección principal. La función de arrastrar y soltar se complica por lo que sucede durante el arrastre. Es decir, cuando el usuario arrastra la selección a diferentes partes del escritorio o una ventana, el usuario espera poder saber si el texto se puede soltar o no. En particular, el objetivo debe mostrar una retroalimentación visual sobre si aceptará o no la acción de soltar, y el cursor debe cambiar para indicar la acción que se realizará; por ejemplo, copiar o mover.
En el protocolo Xdnd, la ventana en la que se selecciona el texto y comienza el arrastre se denomina origen ; la ventana sobre la que se desplaza el cursor se denomina destino . La comunicación entre el origen y el destino es impulsada por el origen, ya que el origen "agarra" el cursor. Por lo tanto, es necesario un intercambio entre el origen y el destino para que el destino sepa que se está produciendo el arrastrar y soltar. Dado que el origen decide la forma del cursor, el origen debe recibir una respuesta del destino para actualizar el cursor. Además, dado que el destino puede necesitar dibujar una mira de bombardeo para indicar dónde se producirá el arrastre, y dado que la aceptación del arrastre puede depender de la ubicación exacta del cursor, este intercambio debe ocurrir repetidamente a medida que el cursor se mueve. De hecho, incluso si el cursor no se mueve, se deben intercambiar mensajes para permitir que el destino se desplace cuando el cursor está cerca de un borde del área de visualización. De lo contrario, el usuario solo podrá soltar en la parte visible del objetivo.
Un programa puede indicar que una ventana puede ser el objetivo de una operación de eliminación mediante la creación de una propiedad denominada XdndAware
que contenga la versión más alta del protocolo que el programa admite. De esta manera, las aplicaciones que admiten versiones más nuevas pueden recurrir a versiones anteriores para interoperar correctamente. Además, se ignorarán todas las aplicaciones que se escriban sin compatibilidad con Xdnd.
Cuando el cursor entra en la ventana de destino, la fuente comprueba la presencia de la XdndAware
propiedad en esa ventana. Si esta propiedad está presente, se inicia un intercambio:
XdndEnter
Mientras el cursor esté dentro de la ventana de destino:
XdndPosition
eventos para indicar al destino dónde se encuentra actualmente el cursor.XdndStatus
eventos para indicarle a la fuente si los datos se pueden colocar en la posición actual.XdndLeave
o XdndDrop
cuando el cursor ha abandonado la ventana o se ha soltado el botón, respectivamenteSi el usuario abandona, el destino solicita la selección al origen como de costumbre. Cuando finaliza la transferencia de la selección, el destino envía un XdndFinish
evento para informar al origen de que la transferencia se ha realizado correctamente.
En resumen, el protocolo es controlado por la fuente, que mantiene al objetivo informado de lo que sucede con el cursor. En respuesta, el objetivo le dice a la fuente si se aceptará o no la colocación del cursor. El objetivo también debe ser informado cuando el usuario suelta el botón del mouse, ya que este evento inicia una solicitud regular de selección, que es un protocolo controlado por el objetivo.
Lo anterior es la descripción de la convención de Xdnd para arrastrar y soltar. En Motif, OffiX y Amulet se utilizan diferentes convenciones para arrastrar y soltar.
El protocolo de guardado directo , abreviado XDS ( X Window Direct Save Protocol ), es un protocolo de software que permite guardar archivos arrastrándolos a las ventanas del administrador de archivos . XDS está basado en el protocolo XDND . [4] [5]
Los siguientes programas operan específicamente sobre mecanismos de transferencia de datos: