]> git.saurik.com Git - wxWidgets.git/blobdiff - src/univ/winuniv.cpp
fix memory leak (coverity checker CID 53)
[wxWidgets.git] / src / univ / winuniv.cpp
index 21deb2f067bb454b3a4ccb647df41d6cdff763c7..4892f9d8eb07b6e177d50c93ba448b0ce88fb4a7 100644 (file)
 // headers
 // ---------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "univwindow.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
@@ -122,13 +118,13 @@ bool wxWindow::Create(wxWindow *parent,
                       const wxString& name)
 {
     long actualStyle = style;
-    
+
     // FIXME: may need this on other platforms
 #ifdef __WXMSW__
     actualStyle &= ~wxVSCROLL;
     actualStyle &= ~wxHSCROLL;
-#endif    
-    
+#endif
+
     // we add wxCLIP_CHILDREN to get the same ("natural") behaviour under MSW
     // as under the other platforms
     if ( !wxWindowNative::Create(parent, id, pos, size,
@@ -142,8 +138,8 @@ bool wxWindow::Create(wxWindow *parent,
     // when calling the base window Create().
     wxWindowBase::SetWindowStyleFlag(style);
 
-    // if we should always have a vertical scrollbar, do show it
-    if ( style & wxALWAYS_SHOW_SB )
+    // if we allow or should always have a vertical scrollbar, make it
+    if ( style & wxVSCROLL || style & wxALWAYS_SHOW_SB )
     {
 #if wxUSE_TWO_WINDOWS
         SetInsertIntoMain( true );
@@ -156,7 +152,7 @@ bool wxWindow::Create(wxWindow *parent,
 #endif
     }
 
-    // if we should always have a horizontal scrollbar, do show it
+    // if we should allow a horizontal scrollbar, make it
     if ( style & wxHSCROLL )
     {
 #if wxUSE_TWO_WINDOWS
@@ -169,7 +165,7 @@ bool wxWindow::Create(wxWindow *parent,
         SetInsertIntoMain( false );
 #endif
     }
-    
+
     if (m_scrollbarHorz || m_scrollbarVert)
     {
         // position it/them
@@ -179,6 +175,18 @@ bool wxWindow::Create(wxWindow *parent,
     return true;
 }
 
+wxWindow::~wxWindow()
+{
+    m_isBeingDeleted = true;
+
+    // we have to destroy our children before we're destroyed because our
+    // children suppose that we're of type wxWindow, not just wxWindowNative,
+    // and so bad things may happen if they're deleted from the base class dtor
+    // as by then we're not a wxWindow any longer and wxUniv-specific virtual
+    // functions can't be called
+    DestroyChildren();
+}
+
 // ----------------------------------------------------------------------------
 // background pixmap
 // ----------------------------------------------------------------------------
@@ -304,7 +312,7 @@ bool wxWindow::DoDrawBackground(wxDC& dc)
     rect.height = size.y;
 
     wxWindow * const parent = GetParent();
-    if ( HasTransparentBackground() && parent && parent->ProvidesBackground() )
+    if ( HasTransparentBackground() && parent )
     {
         wxASSERT( !IsTopLevel() );
 
@@ -331,7 +339,7 @@ bool wxWindow::DoDrawBackground(wxDC& dc)
     }
     else
     {
-        // Draw background ouselves
+        // Draw background ourselves
         EraseBackground( dc, rect );
     }
 
@@ -426,11 +434,11 @@ void wxWindow::Refresh(bool eraseBackground, const wxRect *rectClient)
     while ( node )
     {
         wxWindow *win = node->GetData();
-        // Only refresh sub controls when it is visible 
+        // Only refresh sub controls when it is visible
         // and when it is in the update region.
         if(!win->IsKindOf(CLASSINFO(wxTopLevelWindow)) && win->IsShown() && wxRegion(rectWin).Contains(win->GetRect()) != wxOutRegion)
             win->Refresh(eraseBackground, &rectWin);
-            
+
         node = node->GetNext();
     }
 }
@@ -1100,12 +1108,12 @@ wxRect wxWindow::ScrollNoRefresh(int dx, int dy, const wxRect *rectTotal)
         wxMemoryDC dcMem;
         dcMem.SelectObject(bmp);
 
-        dcMem.Blit(wxPoint(0, 0), size, &dc, ptSource
+        dcMem.Blit(wxPoint(0,0), size, &dc, ptSource
 #if defined(__WXGTK__) && !defined(wxHAS_WORKING_GTK_DC_BLIT)
                 + GetClientAreaOrigin()
 #endif // broken wxGTK wxDC::Blit
                   );
-        dc.Blit(ptDest, size, &dcMem, wxPoint(0, 0));
+        dc.Blit(ptDest, size, &dcMem, wxPoint(0,0));
 
         wxLogTrace(_T("scroll"),
                    _T("Blit: (%d, %d) of size %dx%d -> (%d, %d)"),
@@ -1189,7 +1197,7 @@ void wxWindow::OnKeyDown(wxKeyEvent& event)
 {
 #if wxUSE_MENUS
     int key = event.GetKeyCode();
-    if ( !event.ControlDown() && (key == WXK_MENU || key == WXK_F10) )
+    if ( !event.ControlDown() && (key == WXK_ALT || key == WXK_F10) )
     {
         ms_winLastAltPress = this;
 
@@ -1306,7 +1314,7 @@ void wxWindow::OnChar(wxKeyEvent& event)
 void wxWindow::OnKeyUp(wxKeyEvent& event)
 {
     int key = event.GetKeyCode();
-    if ( !event.HasModifiers() && (key == WXK_MENU || key == WXK_F10) )
+    if ( !event.HasModifiers() && (key == WXK_ALT || key == WXK_F10) )
     {
         // only process Alt release specially if there were no other key
         // presses since Alt had been pressed and if both events happened in