From fa28b00cdcce49eae46ac7f2c39c3c4fc6946165 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Sat, 18 Nov 2006 13:17:35 +0000 Subject: [PATCH] don't use priviledged calls in wxDFB to allow concurrent use of the display by >1 wxDFB apps git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43489 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/dfb/wrapdfb.h | 12 ++++-------- src/dfb/app.cpp | 13 ++++--------- src/dfb/dcscreen.cpp | 2 +- src/dfb/wrapdfb.cpp | 29 +++++++++++++++++++++++++++-- 4 files changed, 36 insertions(+), 20 deletions(-) diff --git a/include/wx/dfb/wrapdfb.h b/include/wx/dfb/wrapdfb.h index d4b5467a5e..3e80393326 100644 --- a/include/wx/dfb/wrapdfb.h +++ b/include/wx/dfb/wrapdfb.h @@ -426,14 +426,10 @@ struct wxIDirectFBDisplayLayer : public wxDfbWrapper return NULL; } - wxIDirectFBSurfacePtr GetSurface() - { - IDirectFBSurface *s; - if ( Check(m_ptr->GetSurface(m_ptr, &s)) ) - return new wxIDirectFBSurface(s); - else - return NULL; - } + bool GetConfiguration(DFBDisplayLayerConfig *config) + { return Check(m_ptr->GetConfiguration(m_ptr, config)); } + + wxVideoMode GetVideoMode(); bool GetCursorPosition(int *x, int *y) { return Check(m_ptr->GetCursorPosition(m_ptr, x, y)); } diff --git a/src/dfb/app.cpp b/src/dfb/app.cpp index fc5357d91f..2883ee6f54 100644 --- a/src/dfb/app.cpp +++ b/src/dfb/app.cpp @@ -67,16 +67,11 @@ void wxApp::CleanUp() static wxVideoMode GetCurrentVideoMode() { - wxVideoMode m; + wxIDirectFBDisplayLayerPtr layer(wxIDirectFB::Get()->GetDisplayLayer()); + if ( !layer ) + return wxVideoMode(); // invalid - wxIDirectFBSurfacePtr surface(wxIDirectFB::Get()->GetPrimarySurface()); - if ( !surface ) - return m; // invalid - - surface->GetSize(&m.w, &m.h); - m.bpp = surface->GetDepth(); - - return m; + return layer->GetVideoMode(); } wxVideoMode wxApp::GetDisplayMode() const diff --git a/src/dfb/dcscreen.cpp b/src/dfb/dcscreen.cpp index 114f30ba0b..6ccea5aaf3 100644 --- a/src/dfb/dcscreen.cpp +++ b/src/dfb/dcscreen.cpp @@ -31,7 +31,7 @@ // wxScreenDC //----------------------------------------------------------------------------- -#warning "FIXME: verify that wxScreenDC works in 2nd DirectFB app started" +#warning "FIXME: this doesn't work (neither single app nor multiapp core) // FIXME: maybe use a subsurface as well? IMPLEMENT_DYNAMIC_CLASS(wxScreenDC, wxDC) diff --git a/src/dfb/wrapdfb.cpp b/src/dfb/wrapdfb.cpp index afd6ee064b..eac0024b2a 100644 --- a/src/dfb/wrapdfb.cpp +++ b/src/dfb/wrapdfb.cpp @@ -98,8 +98,10 @@ void wxIDirectFB::CleanUp() wxIDirectFBSurfacePtr wxIDirectFB::GetPrimarySurface() { - wxIDirectFBDisplayLayerPtr layer(GetDisplayLayer()); - return layer ? layer->GetSurface() : NULL; + DFBSurfaceDescription desc; + desc.flags = DSDESC_CAPS; + desc.caps = DSCAPS_PRIMARY; + return CreateSurface(&desc); } //----------------------------------------------------------------------------- @@ -192,3 +194,26 @@ bool wxIDirectFBSurface::FlipToFront(const DFBRegion *region) // drawings: return Flip(region, DSFLIP_BLIT); } + +//----------------------------------------------------------------------------- +// wxIDirectFBDisplayLayer +//----------------------------------------------------------------------------- + +wxVideoMode wxIDirectFBDisplayLayer::GetVideoMode() +{ + DFBDisplayLayerConfig cfg; + if ( !GetConfiguration(&cfg) ) + return wxVideoMode(); // invalid + + if ( !((cfg.flags & DLCONF_WIDTH) && + (cfg.flags & DLCONF_HEIGHT) && + (cfg.flags & DLCONF_PIXELFORMAT)) ) + return wxVideoMode(); // invalid + + return wxVideoMode + ( + cfg.width, + cfg.height, + DFB_BITS_PER_PIXEL(cfg.pixelformat) + ); +} -- 2.45.2