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:
@@ -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
|
propagated beyond this window. Notice that wxDialog has this style on by
|
||||||
default for the reasons explained in the
|
default for the reasons explained in the
|
||||||
\helpref{event processing overview}{eventprocessing}.}
|
\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}
|
\end{twocollist}
|
||||||
|
|
||||||
\membersection{wxWindow::SetFocus}\label{wxwindowsetfocus}
|
\membersection{wxWindow::SetFocus}\label{wxwindowsetfocus}
|
||||||
|
@@ -784,6 +784,12 @@ enum wxBorder
|
|||||||
// flag on by default.
|
// flag on by default.
|
||||||
#define wxWS_EX_BLOCK_EVENTS 0x00000002
|
#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
|
* wxFrame/wxDialog style flags
|
||||||
*/
|
*/
|
||||||
|
@@ -245,9 +245,6 @@ void wxLogGui::Flush()
|
|||||||
wxString title;
|
wxString title;
|
||||||
title.Printf(titleFormat, appName.c_str());
|
title.Printf(titleFormat, appName.c_str());
|
||||||
|
|
||||||
// this is the best we can do here
|
|
||||||
wxWindow *parent = wxTheApp->GetTopWindow();
|
|
||||||
|
|
||||||
size_t nMsgCount = m_aMessages.Count();
|
size_t nMsgCount = m_aMessages.Count();
|
||||||
|
|
||||||
// avoid showing other log dialogs until we're done with the dialog we're
|
// 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
|
#if wxUSE_LOG_DIALOG
|
||||||
|
|
||||||
wxLogDialog dlg(parent,
|
wxLogDialog dlg(NULL,
|
||||||
m_aMessages, m_aSeverity, m_aTimes,
|
m_aMessages, m_aSeverity, m_aTimes,
|
||||||
title, style);
|
title, style);
|
||||||
|
|
||||||
@@ -295,7 +292,7 @@ void wxLogGui::Flush()
|
|||||||
// situation without it
|
// situation without it
|
||||||
if ( !!str )
|
if ( !!str )
|
||||||
{
|
{
|
||||||
wxMessageBox(str, title, wxOK | style, parent);
|
wxMessageBox(str, title, wxOK | style);
|
||||||
|
|
||||||
// no undisplayed messages whatsoever
|
// no undisplayed messages whatsoever
|
||||||
Clear();
|
Clear();
|
||||||
|
@@ -89,6 +89,9 @@ wxProgressDialog::wxProgressDialog(wxString const &title,
|
|||||||
int style)
|
int style)
|
||||||
: wxDialog(parent, -1, title)
|
: wxDialog(parent, -1, title)
|
||||||
{
|
{
|
||||||
|
// we may disappear at any moment, let the others know about it
|
||||||
|
SetExtraStyle(GetExtraStyle() | wxWS_EX_TRANSIENT);
|
||||||
|
|
||||||
m_windowStyle |= style;
|
m_windowStyle |= style;
|
||||||
|
|
||||||
bool hasAbortButton = (style & wxPD_CAN_ABORT) != 0;
|
bool hasAbortButton = (style & wxPD_CAN_ABORT) != 0;
|
||||||
|
@@ -198,7 +198,10 @@ int wxDialog::ShowModal()
|
|||||||
if ( !GetParent() && !(GetWindowStyleFlag() & wxDIALOG_NO_PARENT) )
|
if ( !GetParent() && !(GetWindowStyleFlag() & wxDIALOG_NO_PARENT) )
|
||||||
{
|
{
|
||||||
wxWindow *parent = wxTheApp->GetTopWindow();
|
wxWindow *parent = wxTheApp->GetTopWindow();
|
||||||
if ( parent && parent != this && parent->IsBeingDeleted() )
|
if ( parent &&
|
||||||
|
parent != this &&
|
||||||
|
parent->IsBeingDeleted() &&
|
||||||
|
!(parent->GetExtraStyle() & wxWS_EX_TRANSIENT) )
|
||||||
{
|
{
|
||||||
m_parent = parent;
|
m_parent = parent;
|
||||||
gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(parent->m_widget) );
|
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) )
|
if ( !GetParent() && !(GetWindowStyleFlag() & wxDIALOG_NO_PARENT) )
|
||||||
{
|
{
|
||||||
wxWindow *parent = wxTheApp->GetTopWindow();
|
wxWindow *parent = wxTheApp->GetTopWindow();
|
||||||
if ( parent && parent != this && parent->IsBeingDeleted() )
|
if ( parent &&
|
||||||
|
parent != this &&
|
||||||
|
parent->IsBeingDeleted() &&
|
||||||
|
!(parent->GetExtraStyle() & wxWS_EX_TRANSIENT) )
|
||||||
{
|
{
|
||||||
m_parent = parent;
|
m_parent = parent;
|
||||||
gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(parent->m_widget) );
|
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();
|
parent = wxTheApp->GetTopWindow();
|
||||||
|
|
||||||
// but don't use the window which is currently hidden as then the
|
if ( parent )
|
||||||
// dialog would be hidden as well
|
|
||||||
if ( parent && !parent->IsShown() )
|
|
||||||
{
|
{
|
||||||
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user