added wxWS_EX_TRANSIENT, added code for handling it and fixed wxLogGeneric
to avoid crashes related to creating the log dialog as child of a window which is destroyed before it is git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12781 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
ff69a290d6
commit
39cc7a0bae
@ -2068,6 +2068,10 @@ for them is found. Using this style allows to prevent them from being
|
||||
propagated beyond this window. Notice that wxDialog has this style on by
|
||||
default for the reasons explained in the
|
||||
\helpref{event processing overview}{eventprocessing}.}
|
||||
\twocolitem{\windowstyle{wxWS\_EX\_TRANSIENT}}{This can be used to prevent a
|
||||
window from being used as an implicit parent for the dialogs which were
|
||||
created without a parent. It is useful for the windows which can disappear at
|
||||
any moment as creating childs of such windows results in fatal problems.}
|
||||
\end{twocollist}
|
||||
|
||||
\membersection{wxWindow::SetFocus}\label{wxwindowsetfocus}
|
||||
|
@ -784,6 +784,12 @@ enum wxBorder
|
||||
// flag on by default.
|
||||
#define wxWS_EX_BLOCK_EVENTS 0x00000002
|
||||
|
||||
// don't use this window as an implicit parent for the other windows: this must
|
||||
// be used with transient windows as otherwise there is the risk of creating a
|
||||
// dialog/frame with this window as a parent which would lead to a crash if the
|
||||
// parent is destroyed before the child
|
||||
#define wxWS_EX_TRANSIENT 0x00000004
|
||||
|
||||
/*
|
||||
* wxFrame/wxDialog style flags
|
||||
*/
|
||||
|
@ -245,9 +245,6 @@ void wxLogGui::Flush()
|
||||
wxString title;
|
||||
title.Printf(titleFormat, appName.c_str());
|
||||
|
||||
// this is the best we can do here
|
||||
wxWindow *parent = wxTheApp->GetTopWindow();
|
||||
|
||||
size_t nMsgCount = m_aMessages.Count();
|
||||
|
||||
// avoid showing other log dialogs until we're done with the dialog we're
|
||||
@ -263,7 +260,7 @@ void wxLogGui::Flush()
|
||||
{
|
||||
#if wxUSE_LOG_DIALOG
|
||||
|
||||
wxLogDialog dlg(parent,
|
||||
wxLogDialog dlg(NULL,
|
||||
m_aMessages, m_aSeverity, m_aTimes,
|
||||
title, style);
|
||||
|
||||
@ -295,7 +292,7 @@ void wxLogGui::Flush()
|
||||
// situation without it
|
||||
if ( !!str )
|
||||
{
|
||||
wxMessageBox(str, title, wxOK | style, parent);
|
||||
wxMessageBox(str, title, wxOK | style);
|
||||
|
||||
// no undisplayed messages whatsoever
|
||||
Clear();
|
||||
|
@ -89,6 +89,9 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
|
||||
int style)
|
||||
: wxDialog(parent, -1, title)
|
||||
{
|
||||
// we may disappear at any moment, let the others know about it
|
||||
SetExtraStyle(GetExtraStyle() | wxWS_EX_TRANSIENT);
|
||||
|
||||
m_windowStyle |= style;
|
||||
|
||||
bool hasAbortButton = (style & wxPD_CAN_ABORT) != 0;
|
||||
|
@ -198,7 +198,10 @@ int wxDialog::ShowModal()
|
||||
if ( !GetParent() && !(GetWindowStyleFlag() & wxDIALOG_NO_PARENT) )
|
||||
{
|
||||
wxWindow *parent = wxTheApp->GetTopWindow();
|
||||
if ( parent && parent != this && parent->IsBeingDeleted() )
|
||||
if ( parent &&
|
||||
parent != this &&
|
||||
parent->IsBeingDeleted() &&
|
||||
!(parent->GetExtraStyle() & wxWS_EX_TRANSIENT) )
|
||||
{
|
||||
m_parent = parent;
|
||||
gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(parent->m_widget) );
|
||||
|
@ -198,7 +198,10 @@ int wxDialog::ShowModal()
|
||||
if ( !GetParent() && !(GetWindowStyleFlag() & wxDIALOG_NO_PARENT) )
|
||||
{
|
||||
wxWindow *parent = wxTheApp->GetTopWindow();
|
||||
if ( parent && parent != this && parent->IsBeingDeleted() )
|
||||
if ( parent &&
|
||||
parent != this &&
|
||||
parent->IsBeingDeleted() &&
|
||||
!(parent->GetExtraStyle() & wxWS_EX_TRANSIENT) )
|
||||
{
|
||||
m_parent = parent;
|
||||
gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(parent->m_widget) );
|
||||
|
@ -196,11 +196,18 @@ bool wxTopLevelWindowMSW::CreateDialog(const wxChar *dlgTemplate,
|
||||
{
|
||||
parent = wxTheApp->GetTopWindow();
|
||||
|
||||
// but don't use the window which is currently hidden as then the
|
||||
// dialog would be hidden as well
|
||||
if ( parent && !parent->IsShown() )
|
||||
if ( parent )
|
||||
{
|
||||
parent = NULL;
|
||||
// don't use transient windows as parents, this is dangerous as it
|
||||
// can lead to a crash if the parent is destroyed before the child
|
||||
//
|
||||
// also don't use the window which is currently hidden as then the
|
||||
// dialog would be hidden as well
|
||||
if ( (parent->GetExtraStyle() & wxWS_EX_TRANSIENT) ||
|
||||
!parent->IsShown() )
|
||||
{
|
||||
parent = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user