From cbdccb72dbd9bc6bb98ce02d0dd56ff11fc235c8 Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 4 Apr 2026 17:41:19 +0200 Subject: [PATCH] Fixed sandboxed Flatpak drag-and-drop by using native FileList --- Cargo.toml | 2 +- src/util.rs | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 4c43156..8a958e6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ exclude = ["/.vscode"] [dependencies] clap = { version = "4.5.51", features = ["derive"] } -gtk = { version = "0.10.1", package = "gtk4", features = ["v4_6"] } +gtk = { version = "0.10.1", package = "gtk4", features = ["v4_8"] } glib-macros = "0.21.2" opener = "0.8.3" async-channel = "2.5.0" diff --git a/src/util.rs b/src/util.rs index 732bda5..dfe902a 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,6 +1,6 @@ use gtk::gdk::{ContentProvider, DragAction, FileList}; use gtk::gio::{self, File, ListStore}; -use gtk::glib::{clone, Bytes}; +use gtk::glib::clone; use gtk::prelude::*; use gtk::{gdk, glib, DragSource, DropTarget, EventSequenceState, Widget}; @@ -33,19 +33,14 @@ pub fn generate_file_model() -> ListStore { pub fn generate_content_provider<'a>( paths: impl IntoIterator, ) -> Option { - let mut uri_list = paths - .into_iter() - .cloned() - .collect::>() - .join("\r\n"); + let files: Vec = paths.into_iter().map(|p| File::for_uri(p)).collect(); - if uri_list.is_empty() { + if files.is_empty() { return None; - } else { - uri_list += "\r\n"; - let bytes = Bytes::from(uri_list.as_bytes()); - Some(ContentProvider::for_bytes("text/uri-list", &bytes)) } + let files_list = FileList::from_array(&files); + + Some(ContentProvider::for_value(&files_list.to_value())) } /// For the -a or -A flag. pub fn setup_drag_source_all(drag_source: &DragSource, list_model: &ListStore) {