X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e8759560f8c3d47d51abca114d3ef475c6b13529..2399c87ccef4649135075265c2a271860e6df327:/src/gtk/window.cpp diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index f62c235b8b..d795867315 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1905,29 +1905,18 @@ wxWindow *wxWindowBase::DoFindFocus() return wx_static_cast(wxWindow*, focus); } -//----------------------------------------------------------------------------- -// InsertChild for wxWindowGTK. -//----------------------------------------------------------------------------- - -/* Callback for wxWindowGTK. This very strange beast has to be used because - * C++ has no virtual methods in a constructor. We have to emulate a - * virtual function here as wxNotebook requires a different way to insert - * a child in it. I had opted for creating a wxNotebookPage window class - * which would have made this superfluous (such in the MDI window system), - * but no-one was listening to me... */ - -static void wxInsertChildInWindow( wxWindowGTK* parent, wxWindowGTK* child ) +void wxWindowGTK::AddChildGTK(wxWindowGTK* child) { /* the window might have been scrolled already, do we have to adapt the position */ - wxPizza* pizza = WX_PIZZA(parent->m_wxwindow); + wxPizza* pizza = WX_PIZZA(m_wxwindow); child->m_x += pizza->m_scroll_x; child->m_y += pizza->m_scroll_y; gtk_widget_set_size_request( child->m_widget, child->m_width, child->m_height); gtk_fixed_put( - GTK_FIXED(parent->m_wxwindow), child->m_widget, child->m_x, child->m_y); + GTK_FIXED(m_wxwindow), child->m_widget, child->m_x, child->m_y); } //----------------------------------------------------------------------------- @@ -2012,8 +2001,6 @@ void wxWindowGTK::Init() m_oldClientWidth = m_oldClientHeight = 0; - m_insertCallback = wxInsertChildInWindow; - m_clipPaintRegion = false; m_needsStyleChange = false; @@ -2131,6 +2118,7 @@ bool wxWindowGTK::Create( wxWindow *parent, gtk_widget_show( m_wxwindow ); } + g_object_ref(m_widget); if (m_parent) m_parent->DoAddChild( this ); @@ -2180,17 +2168,17 @@ wxWindowGTK::~wxWindowGTK() // delete before the widgets to avoid a crash on solaris delete m_imData; - if (m_wxwindow && (m_wxwindow != m_widget)) - { - gtk_widget_destroy( m_wxwindow ); - m_wxwindow = (GtkWidget*) NULL; - } - if (m_widget) { - gtk_widget_destroy( m_widget ); - m_widget = (GtkWidget*) NULL; + // Note that gtk_widget_destroy() does not destroy the widget, it just + // emits the "destroy" signal. The widget is not actually destroyed + // until its reference count drops to zero. + gtk_widget_destroy(m_widget); + // Release our reference, should be the last one + g_object_unref(m_widget); + m_widget = NULL; } + m_wxwindow = NULL; } bool wxWindowGTK::PreCreation( wxWindowGTK *parent, const wxPoint &pos, const wxSize &size ) @@ -3099,13 +3087,8 @@ bool wxWindowGTK::Reparent( wxWindowBase *newParentBase ) wxASSERT( GTK_IS_WIDGET(m_widget) ); - /* prevent GTK from deleting the widget arbitrarily */ - gtk_widget_ref( m_widget ); - if (oldParent) - { gtk_container_remove( GTK_CONTAINER(m_widget->parent), m_widget ); - } wxASSERT( GTK_IS_WIDGET(m_widget) ); @@ -3116,14 +3099,10 @@ bool wxWindowGTK::Reparent( wxWindowBase *newParentBase ) m_showOnIdle = true; gtk_widget_hide( m_widget ); } - /* insert GTK representation */ - (*(newParent->m_insertCallback))(newParent, this); + newParent->AddChildGTK(this); } - /* reverse: prevent GTK from deleting the widget arbitrarily */ - gtk_widget_unref( m_widget ); - SetLayoutDirection(wxLayout_Default); return true; @@ -3138,7 +3117,7 @@ void wxWindowGTK::DoAddChild(wxWindowGTK *child) AddChild( child ); /* insert GTK representation */ - (*m_insertCallback)(this, child); + AddChildGTK(child); } void wxWindowGTK::AddChild(wxWindowBase *child)