Gdk Drag-and-Drop - Как использовать управляемый DND? - PullRequest
0 голосов
/ 30 мая 2019

Примечание: я использую GDK DND, а не GTK.

Я не могу заставить работать управляемый GDK DND (для бэкэнда X11).Сигналы «отмена», «выпадение выполнено» и «действие изменено» работают, но я не получаю сигнал GDK_SELECTION_REQUEST.

Я использую этот способ:

GdkDevice *device = gdk_device_manager_get_client_pointer(
                gdk_display_get_device_manager(
                    gdk_display_get_default()));

GdkDragContext *ctx = gdk_drag_begin_for_device(src_window, device, targets);

src_windowэто окно Gdk для DND (оно работает по сценарию без управления).

target это GList:

*list = g_list_append(*list, TARGET_UTF8_STRING_ATOM);
*list = g_list_append(*list, TARGET_MIME_TEXT_PLAIN_ATOM);
*list = g_list_append(*list, TARGET_STRING_ATOM);

TARGET_UTF8_STRING_ATOM = gdk_atom_intern_static_string("UTF8_STRING");
TARGET_MIME_TEXT_PLAIN_ATOM = gdk_atom_intern_static_string("text/plain");
TARGET_STRING_ATOM = gdk_atom_intern_static_string("STRING");

Тогда я сделаю это управляемым:

gdk_drag_context_manage_dnd(ctx, src_window, actions);

действия - это GDK_ACTION_COPY |GDK_ACTION_MOVE |GDK_ACTION_LINK

Затем я подключаю сигналы:

g_signal_connect(ctx, "cancel",
    G_CALLBACK(dnd_cancel_callback), NULL);

g_signal_connect(ctx, "drop-performed",
    G_CALLBACK(dnd_drop_performed_callback), NULL);

g_signal_connect(ctx, "action-changed",
    G_CALLBACK(dnd_action_changed_callback), NULL);

Все сигналы работают, но DND не работает успешно (нет передачи данных).Я подозреваю, что это связано с тем, что GDK_SELECTION_REQUEST не был запущен.

Любая подсказка приветствуется.

...