+#if wxUSE_THREADS
+ if (!wxThread::IsMain())
+ wxMutexGuiEnter();
+#endif
+
+ while (wxTheApp->ProcessIdle())
+ ;
+
+#if wxUSE_THREADS
+ if (!wxThread::IsMain())
+ wxMutexGuiLeave();
+#endif
+}
+
+//-----------------------------------------------------------------------------
+// Root window
+//-----------------------------------------------------------------------------
+
+class wxRootWindow : public wxWindow
+{
+ public:
+ wxRootWindow() : wxWindow(NULL, -1)
+ {
+ SetMGLwindow_t(MGL_wmGetRootWindow(g_winMng));
+ SetBackgroundColour(wxTHEME_COLOUR(DESKTOP));
+ }
+ ~wxRootWindow()
+ {
+ // we don't want to delete MGL_WM's rootWnd
+ m_wnd = NULL;
+ }
+
+ virtual bool AcceptsFocus() const { return FALSE; }
+
+ DECLARE_DYNAMIC_CLASS(wxRootWindow)
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxRootWindow, wxWindow)
+
+static wxRootWindow *gs_rootWindow = NULL;
+
+//-----------------------------------------------------------------------------
+// MGL initialization
+//-----------------------------------------------------------------------------
+
+static bool wxCreateMGL_WM(const wxVideoMode& displayMode)
+{
+ int mode;
+ int refresh = MGL_DEFAULT_REFRESH;
+
+#if wxUSE_SYSTEM_OPTIONS
+ if ( wxSystemOptions::HasOption(wxT("mgl.screen-refresh")) )
+ refresh = wxSystemOptions::GetOptionInt(wxT("mgl.screen-refresh"));
+#endif
+
+ mode = MGL_findMode(displayMode.GetWidth(),
+ displayMode.GetHeight(),
+ displayMode.GetDepth());
+ if ( mode == -1 )
+ {
+ wxLogError(_("Mode %ix%i-%i not available."),
+ displayMode.GetWidth(),
+ displayMode.GetHeight(),
+ displayMode.GetDepth());
+ return FALSE;
+ }
+ g_displayDC = new MGLDisplayDC(mode, 1, refresh);
+ if ( !g_displayDC->isValid() )
+ {
+ delete g_displayDC;
+ g_displayDC = NULL;
+ return FALSE;
+ }
+
+ g_winMng = MGL_wmCreate(g_displayDC->getDC());
+ if (!g_winMng)
+ return FALSE;
+
+ return TRUE;
+}
+
+static void wxDestroyMGL_WM()
+{
+ if ( g_winMng )
+ {
+ MGL_wmDestroy(g_winMng);
+ g_winMng = NULL;
+ }
+ if ( g_displayDC )
+ {
+ delete g_displayDC;
+ g_displayDC = NULL;
+ }