Gdk拖放-如何使用托管DND?

时间:2019-05-30 15:39:42

标签: c gtk3 gdk

注意:我使用的是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是DND的Gdk窗口(适用于非托管方案)。

targets是一个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没有被触发有关。

任何提示都值得赞赏。

0 个答案:

没有答案