#include "wx/utils.h"
#include "wx/app.h"
#include "wx/settings.h"
+#include "wx/evtloop.h"
#ifdef __VMS__
#pragma message disable nosimpint
// A stack of modal_showing flags, since we can't rely
// on accessing wxDialog::m_modalShowing within
// wxDialog::Show in case a callback has deleted the wxDialog.
-static wxList wxModalShowingStack;
+// static wxList wxModalShowingStack;
// Lists to keep track of windows, so we can disable/enable them
// for modal dialogs
wxDialog::wxDialog()
{
m_modalShowing = FALSE;
+ m_eventLoop = NULL;
m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
}
return FALSE;
m_modalShowing = FALSE;
+ m_eventLoop = NULL;
m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE);
m_foregroundColour = *wxBLACK;
XtSetArg (args[0], XmNdefaultPosition, False);
XtSetArg (args[1], XmNautoUnmanage, False);
Widget dialogShell =
- XmCreateBulletinBoardDialog( parentWidget, (char*)name.c_str(),
+ XmCreateBulletinBoardDialog( parentWidget,
+ wxConstCast(name.c_str(), char),
args, 2);
m_mainWidget = (WXWidget) dialogShell;
{
m_isBeingDeleted = TRUE;
+ delete m_eventLoop;
+
if (m_mainWidget)
{
XtRemoveEventHandler((Widget) m_mainWidget, ExposureMask, FALSE,
{
XtUnmapWidget((Widget) m_mainWidget);
}
+
+ PreDestroy();
+ DoDestroy();
}
void wxDialog::DoDestroy()
else
XtUnmanageChild((Widget)m_mainWidget) ;
- XFlush(XtDisplay((Widget) wxTheApp->GetTopLevelWidget()));
- XSync(XtDisplay((Widget) wxTheApp->GetTopLevelWidget()), FALSE);
+ XFlush(XtDisplay((Widget)m_mainWidget));
+ XSync(XtDisplay((Widget)m_mainWidget), FALSE);
}
return TRUE;
Show(TRUE);
+ // after the event loop ran, the widget might already have been destroyed
+ WXDisplay* display = (WXDisplay*)XtDisplay( (Widget)m_mainWidget );
+
if (m_modalShowing)
return 0;
-
- wxModalShowingStack.Insert((wxObject *)TRUE);
+ m_eventLoop = new wxEventLoop;
m_modalShowing = TRUE;
XtAddGrab((Widget) m_mainWidget, TRUE, FALSE);
- XEvent event;
-
- // Loop until we signal that the dialog should be closed
- while ((wxModalShowingStack.Number() > 0) && ((int)(wxModalShowingStack.First()->Data()) != 0))
- {
- // XtAppProcessEvent((XtAppContext) wxTheApp->GetAppContext(), XtIMAll);
-
- XtAppNextEvent((XtAppContext) wxTheApp->GetAppContext(), &event);
- wxTheApp->ProcessXEvent((WXEvent*) &event);
-
- if (XtAppPending( (XtAppContext) wxTheApp->GetAppContext() ) == 0)
- {
- if (!wxTheApp->ProcessIdle())
- {
-#if wxUSE_THREADS
- // leave the main loop to give other threads a chance to
- // perform their GUI work
- wxMutexGuiLeave();
- wxUsleep(20);
- wxMutexGuiEnter();
-#endif
- }
- }
- }
-
- // Remove modal dialog flag from stack
- wxNode *node = wxModalShowingStack.First();
- if (node)
- delete node;
+ m_eventLoop->Run();
// Now process all events in case they get sent to a destroyed dialog
- XSync(XtDisplay((Widget) wxTheApp->GetTopLevelWidget()), FALSE);
- while (XtAppPending((XtAppContext) wxTheApp->GetAppContext()))
- {
- XFlush(XtDisplay((Widget) wxTheApp->GetTopLevelWidget()));
- XtAppNextEvent((XtAppContext) wxTheApp->GetAppContext(), &event);
+ wxFlushEvents( display );
- wxTheApp->ProcessXEvent((WXEvent*) &event);
- }
+ delete m_eventLoop;
+ m_eventLoop = NULL;
// TODO: is it safe to call this, if the dialog may have been deleted
// by now? Probably only if we're using delayed deletion of dialogs.
Show(FALSE);
m_modalShowing = FALSE;
-
- wxNode *node = wxModalShowingStack.First();
- if (node)
- node->SetData((wxObject *)FALSE);
+ m_eventLoop->Exit();
}
// Standard buttons
void wxDialog::ChangeBackgroundColour()
{
if (GetMainWidget())
- DoChangeBackgroundColour(GetMainWidget(), m_backgroundColour);
+ wxDoChangeBackgroundColour(GetMainWidget(), m_backgroundColour);
}
void wxDialog::ChangeForegroundColour()
{
if (GetMainWidget())
- DoChangeForegroundColour(GetMainWidget(), m_foregroundColour);
+ wxDoChangeForegroundColour(GetMainWidget(), m_foregroundColour);
}