Я пытаюсь использовать функции перетаскивания между виджетами в GTK3
с gtkmm
, Я использую Windows 7 x64 (msys2) и gcc 5.3.0
,
Когда я начинаю перетаскивать, курсор мыши исчезает, и в левом верхнем углу экрана отображается значок DnD. Это ошибка или что-то не так в моем коде?
Здесь вы можете увидеть очень маленькое тестовое приложение с Gtk::CheckButton
в качестве источника перетаскивания и перетаскивания назначения.
#include <iostream>
#include <gtkmm-3.0/gtkmm.h>
struct DragButton : Gtk::CheckButton{
DragButton(){
this->signal_drag_begin().connect([](const Glib::RefPtr<Gdk::DragContext>& ctx){
ctx->set_icon();
});
this->drag_source_set({Gtk::TargetEntry("testdata")});
this->drag_dest_set({Gtk::TargetEntry("testdata")});
this->signal_drag_data_get().connect(
[this](const Glib::RefPtr<Gdk::DragContext>&,Gtk::SelectionData& s,guint,guint ){
std::cout << "sending data." << std::endl;
}
);
this->signal_drag_data_received().connect(
[](const Glib::RefPtr<Gdk::DragContext>& c,int,int,const Gtk::SelectionData&,guint,guint time){
std::cout << "receiving data" << std::endl;
c->drop_finish(true,time);
}
);
}
};
int main(){
auto app = Gtk::Application::create("test");
auto settings = Gtk::Settings::get_default();
settings->set_property<Glib::ustring>("gtk-font-name","Sans 10");
Gtk::Window window;
window.set_default_size(100,50);
Gtk::Box box;
for(int i = 0; i < 3; i++){
box.pack_end(*Gtk::manage(new DragButton));
}
window.add(box);
window.show_all();
app->run(window);
}
Я заметил то же самое поведение здесь. Даже с «официальными» приложениями gnome / gtk. Например, давайте попробуем перетащить&уронить виджеты в Glade: у вас будет такой же «странный» эффект.
Я думаю, что это ошибка библиотек gtk в Windows, но я не могу представить, почему это еще не решено, учитывая перетаскивание&падение — очень полезная и используемая операция.