desc.width = size.x;
desc.height = size.y;
m_dfbwin = layer->CreateWindow(&desc);
- if ( !layer )
+ if ( !m_dfbwin )
return false;
// add the new TLW to DFBWindowID->wxTLW map:
{
m_isBeingDeleted = true;
- wxTopLevelWindows.DeleteObject(this);
-
- if ( wxTheApp->GetTopWindow() == this )
- wxTheApp->SetTopWindow(NULL);
-
- if ( wxTopLevelWindows.empty() && wxTheApp->GetExitOnFrameDelete() )
- {
- wxTheApp->ExitMainLoop();
- }
+ // destroy all children before we destroy the underlying DirectFB window,
+ // so that if any of them does something with the TLW, it will still work:
+ DestroyChildren();
+ // it's safe to delete the underlying DirectFB window now:
wxDELETE(m_toPaint);
+ if ( !m_dfbwin )
+ return;
+
// remove the TLW from DFBWindowID->wxTLW map:
DFBWindowID winid;
if ( m_dfbwin->GetID(&winid) )
gs_dfbWindowsMap.erase(winid);
+
+ m_dfbwin->Destroy();
+ m_dfbwin.Reset();
}
// ----------------------------------------------------------------------------
bool wxTopLevelWindowDFB::Show(bool show)
{
+ // NB: this calls wxWindow::Show() and so ensures DoRefreshWindow() is
+ // called on the window -- we'll need that below
if ( !wxTopLevelWindowBase::Show(show) )
return false;
- // hide/show the window by setting its opacity to 0/full:
- m_dfbwin->SetOpacity(show ? m_opacity : 0);
-
// If this is the first time Show was called, send size event,
// so that the frame can adjust itself (think auto layout or single child)
if ( !m_sizeSet )
GetEventHandler()->ProcessEvent(event);
}
+ // make sure the window is fully painted, with all pending updates, before
+ // DFB WM shows it, otherwise it would attempt to show either empty (=
+ // black) window surface (if shown for the first time) or it would show
+ // window with outdated content; note that the window was already refreshed
+ // in the wxTopLevelWindowBase::Show() call above:
+ if ( show )
+ Update();
+
+ // hide/show the window by setting its opacity to 0/full:
+ m_dfbwin->SetOpacity(show ? m_opacity : 0);
+
if ( show )
{
wxWindow *focused = wxWindow::FindFocus();
wxFAIL_MSG( _T("invalid event type") );
break;
}
+
+ default:
+ // we're not interested in them here
+ break;
}
if ( !recipient )