Я работаю в команде разработчиков Oracle Java Swing / JavaFX, и мы столкнулись с некоторыми проблемами с функциональностью перетаскивания в JavaFX, так как мы перешли на gtk 3.20.
JavaFX использует gtk для полной обработки событий. Мы регистрируем обратный вызов с помощью gtk и получаем все события от gtk. Мы не используем g_signal, но мы установили обратный вызов, используя следующий код. Gtk выполняет вызов для всех событий мыши и клавиатуры, используя только этот один обратный вызов, и мы соответствующим образом обрабатываем это событие.
//Callback declaration
static void **process_events** (GdkEvent*, gpointer);
//Registering the callback
gdk_event_handler_set( **process_events** , NULL, NULL);
GdkScreen *default_gdk_screen = gdk_screen_get_default();
GdkWindow *root = gdk_screen_get_root_window(default_gdk_screen);
gdk_window_set_events(root, static_cast<GdkEventMask>(gdk_window_get_events(root) | GDK_PROPERTY_CHANGE_MASK));
Начиная с версии 3.20, мы не получаем никакого события перетаскивания со стороны GTK. Ниже приведены ссылки для небольших демонстраций, я имею для поведения с gtk 3.18 и gtk 3.22. Событие обнаружения перетаскивания в демоверсии инициируется искусственно JavaFX при получении движения мыши после нажатия мыши. Остальные события dnd enter, dnd over, dnd exit запускаются gtk и соответствуют событиям GDK_DRAG_ENTER, GDK_DRAG_MOTION и GDK_DRAG_LEAVE соответственно.
Вы можете легко увидеть в демонстрации, что GDK_DRAG_ENTER, GDK_DRAG_MOTION и GDK_DRAG_LEAVE не запускаются для gtk 3.20, когда мышь перемещается при нажатой кнопке мыши. Вместо этого, как только кнопка мыши отпущена, GDK_DRAG_ENTER, GDK_DRAG_MOTION и GDK_DRAG_LEAVE сработали один раз. GDK_DRAG_ENTER должен быть получен в начале dnd, а GDK_DRAG_MOTION должен многократно запускаться при движении мыши в состоянии dnd. GDK_DRAG_LEAVE в конце при отпускании кнопки мыши. Но все три события принимаются один раз при отпускании кнопки мыши.
Все хорошо работает в gtk3.18.
Gtk3.18 (~ 1 МБ): https://drive.google.com/file/d/1yogUTMHNYJFtRoJj2sFN25P-erVvuWfC/view?usp=sharing
Gtk3,20 (~ 1 МБ): https://drive.google.com/file/d/1_ntns1MFAL62fi5foW3oD-0324CroCi6/view?usp=sharing
Любые ссылки на то, что было изменено в gtk3.20, чтобы вызвать такие проблемы. Мне предложили взглянуть на wiki-gnome-org-Newcomers-DragNDropTutorial, но этот использует g_signal для регистрации обратных вызовов для dnd. У нас огромная кодовая база. Поэтому, если возможно, ищите способ заставить его работать без g_signal. Изменение нашего кода для использования g_signal будет последним средством. Пожалуйста, дайте мне знать, если от меня потребуется дополнительная информация.