현상 유지 : 이벤트 창이있는 사용자 정의 위젯 (MyWidget)이 있습니다.
문제 : 나는, 쇼를 만든 다음, 나중에, 숨기고 나는 응용 프로그램에서 다음과 같은 메시지가 위젯을 파괴하는 경우 :gdkmm : 어떻게 gdk 창을 파괴할까요?
Gdk-WARNING **: losing last reference to undestroyed window
내가 발견 한 무엇 : 나 ' 이 파일은 gdkwindow.c
에 있었으며 GDK_WINDOW_DESTROYED(window) == FALSE
일 때이 메시지가보고되었습니다. 그래서 이해가 안되는 것은 결국 내 창을 정확히 파기해야만 결국 gdk_window_destroy()
함수가 호출됩니다. 나는 그것을 호출하는 가장 좋은 장소는 Gdk::~Window()
소멸자라고 생각했다. 그러나 그것은 비어 있습니다. 그리고 gdkwindow.cc
파일에는 gdk_window_destroy()
이 전혀 없습니다.
콜백은 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);
}