Я сейчас пытаюсь сделать приложение в gtk + 3 для управления файлами. Цель состоит в том, чтобы иметь файловый менеджер, который специализируется на моем собственном рабочем процессе, так как я нахожу Windows File Explorer, например, слишком универсальным c.
GTK, конечно, поддерживает функцию перетаскивания, это все уже настроено и работает:
- Представление списка файлов в качестве источника перетаскивания, кодирует выбранные файлы в список файлов URI в «drag-get»
- Цель удаления в том же приложении прямо рядом со списком файлов для тестирования. Печатает данные перетаскивания в std :: cout.
- При удалении из списка файлов отображается файл-uri в окне вывода, так что все в порядке
- Удаление из Windows File Explorer показывает файл -ури в выводе windows, а! Итак, ОК
Но, как подсказывает заголовок, перетаскивание из моего списка файлов и переход в Windows Проводник файлов или любое другое приложение по этому вопросу не будет работать, курсор мыши продолжает отображать «заблокирован». 'symbol.
Я также хочу поддержать Linux. Так что я попробовал это в Manjaro vm, который работает с KDE Plasma. И падение в файловый менеджер Dolphin работает нормально.
На Windows, после некоторого поиска, я решил, что это проблема безопасности. Возможно Windows не позволяет «ненадежным» приложениям перетаскивать их между другими приложениями. Но я сделал сборку релиза, подписал ее доверенным самозаверяющим сертификатом и поместил свое приложение в C: \ Program Files. Оттуда я запускаю его, но он все еще не работает.
Это код, который устанавливает данные выбора
#define _BYTE 8
static void
drag_data_get_handl
(GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data,
guint target_type, guint time, gpointer user_data)
{
const auto* unmarshalledUserdata = static_cast<DragAndDrop::GetDragData_Userdata*>(user_data);
const gchar *name = gtk_widget_get_name (widget);
const auto string_data = unmarshalledUserdata == nullptr ? "": unmarshalledUserdata->GetData();
g_print ("%s: drag_data_get_handl\n", name);
g_assert (selection_data != NULL);
g_print (" Sending ");
switch (target_type)
{
/* case TARGET_SOME_OBJECT:
* Serialize the object and send as a string of bytes.
* Pixbufs, (UTF-8) text, and URIs have their own convenience
* setter functions */
case TARGET_STRING:
g_print ("string: %s", string_data.c_str());
gtk_selection_data_set
(
selection_data,
gtk_selection_data_get_target(selection_data),
_BYTE,
(guchar*) string_data.c_str(), //for example file:///C:/Projects/tabspls_build_msvc/TabsPlsMain/TabsPlsMain.sln
static_cast<gint>(string_data.size())
);
break;
default:
/* Default to some a safe target instead of fail. */
g_assert_not_reached ();
}
g_print (".\n");
}
Я не знаю, если это необходимо, но весь Проект можно найти на GitHub . Это ссылка на ревизию, о которой я сейчас пишу.