Можно ли перетаскивать данные из приложения gtk в другое приложение под Windows? Нравится проводник? - PullRequest
0 голосов
/ 27 апреля 2020

Я сейчас пытаюсь сделать приложение в 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 . Это ссылка на ревизию, о которой я сейчас пишу.

...