Статус кво: У меня есть пользовательский виджет (MyWidget) с окном событий.
Проблема: если я создаю, шоу, а затем, позже, скрыть и уничтожить виджет я получаю следующее сообщение из приложения:gdkmm: как уничтожить окно gdk?
Gdk-WARNING **: losing last reference to undestroyed window
Что я узнал: Я ve посмотрел в файле gdkwindow.c
, и это сообщение сообщается, когда GDK_WINDOW_DESTROYED(window) == FALSE
. Поэтому я не понимаю, как правильно разрушить окно, чтобы в итоге вызывается функция gdk_window_destroy()
. Я думал, что лучшим местом для вызова было деструктор Gdk::~Window()
. Но он пуст. Кроме того, gdk_window_destroy()
отсутствует в файле gdkwindow.cc
.
Обратные ссылки on_realize()
и on_unrealize()
приведены ниже.
class MyWidget : public Gtk::Widget
{
...
private:
Glib::RefPtr<Gdk::Window> _event_window;
...
};
void Gtk::MyWidget::on_realize()
{
GdkWindowAttr attributes;
const Allocation & allocation = get_allocation();
attributes.event_mask = GDK_BUTTON_PRESS_MASK;
attributes.x = allocation.get_x();
attributes.y = allocation.get_y();
attributes.width = allocation.get_width();
attributes.height = allocation.get_height();
attributes.wclass = GDK_INPUT_ONLY;
attributes.window_type = GDK_WINDOW_CHILD;
_event_window = Gdk::Window::create(get_parent_window(), &attributes, GDK_WA_X | GDK_WA_Y);
_event_window->set_user_data(Widget::gobj());
set_window(get_parent_window());
set_realized();
}
void Gtk::MyWidget::on_unrealize()
{
_event_window->set_user_data(NULL);
_event_window.reset();
set_realized(false);
}