fixed wxColourDialog crash
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@7698 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -103,6 +103,9 @@ protected:
|
||||
// common part of all ctors
|
||||
void Init();
|
||||
|
||||
// common part of Destroy() and ~wxDialog
|
||||
void CleanUp();
|
||||
|
||||
virtual void DoSetSize(int x, int y,
|
||||
int width, int height,
|
||||
int sizeFlags = wxSIZE_AUTO);
|
||||
|
@@ -103,6 +103,9 @@ protected:
|
||||
// common part of all ctors
|
||||
void Init();
|
||||
|
||||
// common part of Destroy() and ~wxDialog
|
||||
void CleanUp();
|
||||
|
||||
virtual void DoSetSize(int x, int y,
|
||||
int width, int height,
|
||||
int sizeFlags = wxSIZE_AUTO);
|
||||
|
@@ -504,6 +504,11 @@ void wxWindowBase::AddChild(wxWindowBase *child)
|
||||
{
|
||||
wxCHECK_RET( child, wxT("can't add a NULL child") );
|
||||
|
||||
// this should never happen and it will lead to a crash later if it does
|
||||
// because RemoveChild() will remove only one node from the children list
|
||||
// and the other(s) one(s) will be left with dangling pointers in them
|
||||
wxASSERT_MSG( !GetChildren().Find(child), _T("AddChild() called twice") );
|
||||
|
||||
GetChildren().Append(child);
|
||||
child->SetParent(this);
|
||||
}
|
||||
|
@@ -85,7 +85,7 @@ size_t wxZlibInputStream::OnSysRead(void *buffer, size_t size)
|
||||
while (m_inflate->avail_out > 0) {
|
||||
if (m_inflate->avail_in == 0) {
|
||||
|
||||
m_parent_i_stream->Read(m_z_buffer, m_z_size);
|
||||
m_parent_i_stream->Read(m_z_buffer, wxMin(m_z_size, size));
|
||||
m_inflate->next_in = m_z_buffer;
|
||||
m_inflate->avail_in = m_parent_i_stream->LastRead();
|
||||
|
||||
@@ -95,6 +95,13 @@ size_t wxZlibInputStream::OnSysRead(void *buffer, size_t size)
|
||||
m_lasterror = m_parent_i_stream->LastError();
|
||||
return 0; // failed to read anything
|
||||
}
|
||||
|
||||
if ( m_inflate->avail_in == 0 )
|
||||
{
|
||||
// EOF
|
||||
m_lasterror = wxStream_EOF;
|
||||
break;
|
||||
}
|
||||
}
|
||||
err = inflate(m_inflate, Z_FINISH);
|
||||
if (err == Z_STREAM_END)
|
||||
|
@@ -123,9 +123,6 @@ wxGenericColourDialog::wxGenericColourDialog()
|
||||
|
||||
wxGenericColourDialog::wxGenericColourDialog(wxWindow *parent,
|
||||
wxColourData *data)
|
||||
: wxDialog(parent, -1, wxT("Colour"),
|
||||
wxPoint(0, 0), wxSize(900, 900),
|
||||
wxDEFAULT_DIALOG_STYLE | wxDIALOG_MODAL)
|
||||
{
|
||||
whichKind = 1;
|
||||
colourSelection = 0;
|
||||
|
@@ -314,9 +314,7 @@ bool wxDialog::Create( wxWindow *parent,
|
||||
|
||||
wxDialog::~wxDialog()
|
||||
{
|
||||
Destroy();
|
||||
|
||||
m_isBeingDeleted = TRUE;
|
||||
CleanUp();
|
||||
|
||||
if ((wxTopLevelWindows.Number() == 0) &&
|
||||
(wxTheApp->GetExitOnFrameDelete()))
|
||||
@@ -328,13 +326,12 @@ wxDialog::~wxDialog()
|
||||
void wxDialog::SetTitle( const wxString& title )
|
||||
{
|
||||
m_title = title;
|
||||
if (m_title.IsNull()) m_title = wxT("");
|
||||
gtk_window_set_title( GTK_WINDOW(m_widget), m_title.mbc_str() );
|
||||
}
|
||||
|
||||
wxString wxDialog::GetTitle() const
|
||||
{
|
||||
return (wxString&)m_title;
|
||||
return m_title;
|
||||
}
|
||||
|
||||
void wxDialog::OnApply( wxCommandEvent &WXUNUSED(event) )
|
||||
@@ -366,7 +363,7 @@ void wxDialog::OnOK( wxCommandEvent &WXUNUSED(event) )
|
||||
else
|
||||
{
|
||||
SetReturnCode(wxID_OK);
|
||||
this->Show(FALSE);
|
||||
Show(FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -415,14 +412,21 @@ bool wxDialog::Destroy()
|
||||
|
||||
// don't leave a dangling pointer as the app top window, we can be deleted
|
||||
// any moment at all now!
|
||||
CleanUp();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void wxDialog::CleanUp()
|
||||
{
|
||||
m_isBeingDeleted = TRUE;
|
||||
|
||||
if ( wxTheApp->GetTopWindow() == this )
|
||||
{
|
||||
wxTheApp->SetTopWindow( (wxWindow*) NULL );
|
||||
}
|
||||
|
||||
wxTopLevelWindows.DeleteObject( this );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void wxDialog::OnSize( wxSizeEvent &WXUNUSED(event) )
|
||||
|
@@ -314,9 +314,7 @@ bool wxDialog::Create( wxWindow *parent,
|
||||
|
||||
wxDialog::~wxDialog()
|
||||
{
|
||||
Destroy();
|
||||
|
||||
m_isBeingDeleted = TRUE;
|
||||
CleanUp();
|
||||
|
||||
if ((wxTopLevelWindows.Number() == 0) &&
|
||||
(wxTheApp->GetExitOnFrameDelete()))
|
||||
@@ -328,13 +326,12 @@ wxDialog::~wxDialog()
|
||||
void wxDialog::SetTitle( const wxString& title )
|
||||
{
|
||||
m_title = title;
|
||||
if (m_title.IsNull()) m_title = wxT("");
|
||||
gtk_window_set_title( GTK_WINDOW(m_widget), m_title.mbc_str() );
|
||||
}
|
||||
|
||||
wxString wxDialog::GetTitle() const
|
||||
{
|
||||
return (wxString&)m_title;
|
||||
return m_title;
|
||||
}
|
||||
|
||||
void wxDialog::OnApply( wxCommandEvent &WXUNUSED(event) )
|
||||
@@ -366,7 +363,7 @@ void wxDialog::OnOK( wxCommandEvent &WXUNUSED(event) )
|
||||
else
|
||||
{
|
||||
SetReturnCode(wxID_OK);
|
||||
this->Show(FALSE);
|
||||
Show(FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -415,14 +412,21 @@ bool wxDialog::Destroy()
|
||||
|
||||
// don't leave a dangling pointer as the app top window, we can be deleted
|
||||
// any moment at all now!
|
||||
CleanUp();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void wxDialog::CleanUp()
|
||||
{
|
||||
m_isBeingDeleted = TRUE;
|
||||
|
||||
if ( wxTheApp->GetTopWindow() == this )
|
||||
{
|
||||
wxTheApp->SetTopWindow( (wxWindow*) NULL );
|
||||
}
|
||||
|
||||
wxTopLevelWindows.DeleteObject( this );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void wxDialog::OnSize( wxSizeEvent &WXUNUSED(event) )
|
||||
|
Reference in New Issue
Block a user