Selecciones , búferes de corte y arrastrar y soltar son los mecanismos utilizados en el sistema X Window para permitir a un usuario transferir datos de una ventana a otra. Las selecciones y el búfer de corte se utilizan normalmente cuando un usuario selecciona texto u otros datos en una ventana y lo pega en otra. 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 central del sistema X Window incluye algunas solicitudes y eventos que son específicos del intercambio de selección, pero la transferencia se realiza principalmente mediante el envío de eventos y propiedades de ventana, que no son específicas de la transferencia de selección.
Se pueden transferir diferentes tipos de datos: normalmente es texto, pero también puede ser una imagen, un número, una lista de objetos, etc. A continuación sólo se considera 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 arrastrar y soltar son mecanismos activos: después de seleccionar un texto en una ventana, el cliente que maneja la ventana debe admitir activamente un protocolo para transferir los datos a la aplicación que los solicita. Por el contrario, los buffers de corte son un mecanismo pasivo: después de seleccionar algo de texto, se transfiere a un buffer 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 según lo percibe el cliente que tiene la selección, pero requiere que el xclipboard
cliente admita 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 en un formato adecuado. Si el cliente emisor se niega a hacerlo, el receptor puede solicitar un formato diferente. Por ejemplo, un fragmento de texto que representa código HTML 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. Tal negociación de formato no puede realizarse mediante mecanismos pasivos, en los que el cliente que posee la selección (y le da semántica) transfiere la selección y no participa en la transferencia posterior al 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 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 se puede realizar incluso después de que el cliente que posee los datos finalice. Esto no es posible en los mecanismos activos, que requieren que el cliente titular de 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, una 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 involucra 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 maneja la ventana debe decirle 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 solicitud de la lista anterior, y no está especificado por el protocolo X sino como una convención en el Manual de convenciones de comunicación entre clientes (ICCCM).
En particular, el cliente de destino comienza preguntando al servidor a qué ventana pertenece la selección. Luego los dos clientes transfieren la selección a través del servidor. Este intercambio implica una propiedad de una ventana y un dato arbitrario adjunto a la ventana. Si el contenido de la selección se considera lo suficientemente pequeño como para transferirlo todo de una vez, los pasos que se siguen son:
SelectionRequest
en respuesta, el servidor envía un evento al propietario actual de la selección ;ChangeProperty
; solicitud al servidorSelectionNotify
para notificar que la selección ha sido transferidaGetProperty
solicitudes al servidor;PropertyNotify
evento.Si el contenido es grande, se debe transferir en trozos. 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" en el portapapeles, por ejemplo, invocando "Copiar" en el menú "Editar" de una aplicación. Una solicitud asociada de "Pegar" da como resultado los datos de la CLIPBOARD
selección que se están utilizando.
A nivel del protocolo central, las selecciones PRIMARY
y CLIPBOARD
no difieren. Pero el xclipboard
cliente les hace comportarse de otra manera. 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 adicional para 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 ventana de la ventana raíz , nombradas CUT_BUFFER1
, etc. A diferencia de las selecciones, los búferes de corte no implican una interacción directa entre clientes. Más bien, 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 el xcb
programa permite varios tipos de acceso a los buffers de corte.
Los topes de corte se consideran obsoletos. [2]
Arrastrar y soltar en el sistema X Window está regulado por la convención Xdnd. [3] Cuando el usuario arrastra el texto seleccionado a una ventana y suelta el botón del mouse, el intercambio de datos se realiza como para la selección primaria. 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 de una ventana, espera poder saber si el texto se puede soltar o no. En particular, el objetivo debe mostrar información visual sobre si aceptará o no la caída, y el cursor debe cambiar para indicar la acción que se tomará; por ejemplo, copiar o mover.
En el protocolo Xdnd, la ventana donde se selecciona el texto y comienza el arrastre se llama fuente ; la ventana sobre la que pasa el cursor se llama objetivo . La comunicación entre la fuente y el destino es impulsada por la fuente porque la fuente "agarra" el cursor. Por lo tanto, es necesario un intercambio entre el origen y el destino para que el destino sepa siquiera que se está arrastrando y soltando. Dado que la fuente decide la forma del cursor, la fuente debe recibir una respuesta del destino para poder actualizar el cursor. Además, dado que el objetivo puede necesitar dibujar una mira para indicar dónde se producirá la caída, y dado que la aceptación de la caída puede depender de la ubicación exacta del cursor, este intercambio debe ocurrir repetidamente a medida que se mueve el cursor. De hecho, incluso si el cursor no se mueve, se deben intercambiar mensajes para permitir que el objetivo se desplace cuando el cursor esté cerca de un borde del área de visualización. De lo contrario, el usuario sólo podrá dejar caer sobre la parte visible del objetivo.
Un programa puede indicar que una ventana puede ser el objetivo de una caída creando una propiedad denominada XdndAware
que contenga la versión más alta del protocolo que admite el programa. 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 escritas sin soporte para Xdnd.
Cuando el cursor ingresa a la ventana de destino, la fuente verifica la presencia de la XdndAware
propiedad en esa ventana. Si esta propiedad está presente, comienza un intercambio:
XdndEnter
Mientras el cursor está dentro de la ventana de destino:
XdndPosition
eventos para indicarle al destino dónde se encuentra actualmente el cursorXdndStatus
eventos para indicarle a la fuente si los datos se pueden colocar en la posición actualXdndLeave
o XdndDrop
cuando el cursor ha salido de la ventana o se ha soltado el botón, respectivamenteSi el usuario cae, el objetivo solicita la selección a la fuente como de costumbre. Cuando finaliza la transferencia de la selección, el objetivo envía un XdndFinish
evento para informar a la fuente que la transferencia ha sido exitosa.
En resumen, el protocolo está 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 una entrega. 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 impulsado por el objetivo.
Lo anterior es la descripción de la convención Xdnd para arrastrar y soltar. En Motif, OffiX y Amulet se utilizan diferentes convenciones para arrastrar y soltar.
El Direct Save Protocol , abreviado XDS (por X Window Direct S ave Protocol), es un protocolo de software que permite guardar archivos arrastrándolos a las ventanas del administrador de archivos . XDS está construido sobre el protocolo XDND . [4] [5]
Los siguientes programas operan específicamente sobre mecanismos de transferencia de datos: