drag-and-drop-wayland
tauri-plugin-drag-and-drop-wayland#
Inicia operaciones de arrastrar y soltar nativas en Wayland, para que archivos y datos puedan soltarse fuera de la aplicación: en el gestor de archivos, en una terminal, en un editor o en el navegador. El arrastre lo dispara el movimiento del ratón, porque Wayland exige que la petición salga de dentro del despacho de un evento.
- Crate:
tauri-plugin-drag-and-drop-wayland - Paquete JS:
@vasakgroup/plugin-drag-and-drop-wayland - Plataforma: Linux con GTK 3 y WebKitGTK. Es para Wayland; las señales propias de X11 también se contemplan
Instalación#
| |
| |
| |
Permisos#
drag-and-drop-wayland:default, en el archivo de capacidades:
| |
El permiso por omisión habilita el único comando, start_drag. También existen
drag-and-drop-wayland:allow-start-drag y
drag-and-drop-wayland:deny-start-drag para concederlo o negarlo por separado.
API de JavaScript#
startDrag(item, icon?, options?, onEvent?): Promise<void>#
Arma un arrastre y lo entrega al próximo movimiento del ratón. Se llama con el
botón todavía apretado, desde el gesto que lo inicia, que es lo que hace que el
compositor lo acepte. La promesa se resuelve cuando el arrastre quedó armado; el
desenlace llega por onEvent.
item admite dos formas:
- Un arreglo de rutas de archivo (
["/home/quien/informe.pdf"]), que viajan comotext/uri-listy comotext/plain. - Un objeto
{ data, types }, para arrastrar datos sueltos:dataes el mismo texto para todos los tipos, o un mapa que le da a cada tipo MIME lo suyo, ytypeses la lista de tipos MIME que se ofrecen.
icon es el icono que acompaña al puntero: una ruta absoluta a un archivo de
imagen, o su contenido en base64. Cuál de las dos cosas es lo decide el contenido:
si es una ruta absoluta y el archivo existe, se lee del disco; si no, se decodifica
como base64. Si no se puede cargar, el arrastre sale igual, sin icono.
options.mode es "copy" o "move" (por omisión "copy") y no cambia lo que se
le ofrece al destino: las dos acciones se ofrecen siempre, porque en Wayland el
destino es el que elige y sin ninguna en común el compositor cancela el arrastre
en lugar de entregarlo. El parámetro es el que la interfaz usa para dibujar la
insignia de copiar o mover mientras el puntero está dentro de la ventana.
onEvent recibe un CallbackPayload cuando el arrastre termina:
result:"Dropped"o"Cancelled".action:"copy","move"onull. Es informativa.sourceShouldDelete: si el destino confirmó que se quedó con lo entregado y le toca al origen sacarlo de su lugar. Esta es la señal que autoriza borrar, y noaction: un destino puede elegir mover y después no pedir el borrado, y borrar por haber visto"move"sería perder un archivo que nadie copió a ninguna parte.cursorPos: dónde estaba el puntero al terminar, en coordenadas de pantalla.
Comandos Rust#
start_drag(app, window, item, image, options, on_event)— Arma un arrastre para que lo dispare el próximo movimiento del ratón: recibe el manejador de la aplicación y la ventana, lo que se va a entregar, el icono opcional, las opciones y el canal por el que se avisa el resultado. Está registrado comocommands::start_dragy desde la interfaz se invoca comoplugin:drag-and-drop-wayland|start_drag, que es de donde salenitem,image,optionsyonEvent.
Ejemplo#
| |
Detalles de implementación#
- Un comando de Tauri no puede iniciar un arrastre:
gtk_drag_beginnecesita estar dentro del despacho de un evento para sacar de ahí el serial del agarre del ratón, y sin ese serial el compositor descarta la petición. Por esostart_dragarma el arrastre y lo dispara un manejador demotion-notify-eventdelWebKitWebView. - Un arrastre armado vale 1500 ms. Si el movimiento no llega, porque el botón se soltó en el camino, se cancela y se avisa por el canal en lugar de quedar colgado para el próximo movimiento.
- Siempre se ofrecen
COPYyMOVE; nuncaLINKniASK, que prometerían un enlace que el origen no sabe cumplir. - Los archivos se entregan como
text/uri-listcon los URIs codificados como manda la especificación (espacios,#y?escapados) y comotext/plaincon las rutas tal cual: una terminal o un campo de texto pegan lo que reciben, y un URI codificado pegado no es ningún archivo. - Los manejadores se enganchan una sola vez por widget y no se desconectan: el destino pide los datos después del drop, y desconectar al terminar dejaba la transferencia sin quien la atendiera. Así el arrastre sigue funcionando después de una recarga del WebView.
- El final se avisa una sola vez, porque
drag-failedydrag-endpueden llegar los dos. - En Wayland no hay ninguna señal que pida borrar el original:
drag-data-deletellega solo en X11. Lo que se usa es el par que define el protocolo —terminó sin fallar y la acción negociada fue mover—, y el fallo manda sobre todo lo demás. - El comportamiento se midió con las sondas de
examples/sobre Wayfire.