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
propagated beyond this window. Notice that wxDialog has this style on by
default for the reasons explained in the
\helpref{event processing overview}{eventprocessing}.}
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}
\end{twocollist}
\membersection{wxWindow::SetFocus}\label{wxwindowsetfocus}
// flag on by default.
#define wxWS_EX_BLOCK_EVENTS 0x00000002
// 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
*/
/*
* wxFrame/wxDialog style flags
*/
wxString title;
title.Printf(titleFormat, appName.c_str());
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
size_t nMsgCount = m_aMessages.Count();
// avoid showing other log dialogs until we're done with the dialog we're
- wxLogDialog dlg(parent,
m_aMessages, m_aSeverity, m_aTimes,
title, style);
m_aMessages, m_aSeverity, m_aTimes,
title, style);
// situation without it
if ( !!str )
{
// situation without it
if ( !!str )
{
- wxMessageBox(str, title, wxOK | style, parent);
+ wxMessageBox(str, title, wxOK | style);
// no undisplayed messages whatsoever
Clear();
// no undisplayed messages whatsoever
Clear();
int style)
: wxDialog(parent, -1, 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;
m_windowStyle |= style;
bool hasAbortButton = (style & wxPD_CAN_ABORT) != 0;
if ( !GetParent() && !(GetWindowStyleFlag() & wxDIALOG_NO_PARENT) )
{
wxWindow *parent = wxTheApp->GetTopWindow();
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) );
{
m_parent = parent;
gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(parent->m_widget) );
if ( !GetParent() && !(GetWindowStyleFlag() & wxDIALOG_NO_PARENT) )
{
wxWindow *parent = wxTheApp->GetTopWindow();
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) );
{
m_parent = parent;
gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(parent->m_widget) );
{
parent = wxTheApp->GetTopWindow();
{
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() )
+ // 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;
+ }