]> git.saurik.com Git - wxWidgets.git/blobdiff - src/dfb/dcclient.cpp
remove unused GtkPizza members scroll_[xy]
[wxWidgets.git] / src / dfb / dcclient.cpp
index 257d73b45b8487112c0fcb6c3da87df00f017c01..3ded9ca71923dafac781a057491b42b567e7a52d 100644 (file)
 IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC)
 
 wxWindowDC::wxWindowDC(wxWindow *win)
-    : wxDC(win ? win->GetDfbSurface() : NULL)
 {
-    InitForWin(win);
+    InitForWin(win, NULL);
 }
 
-void wxWindowDC::InitForWin(wxWindow *win)
+void wxWindowDC::InitForWin(wxWindow *win, const wxRect *rect)
 {
     wxCHECK_RET( win, _T("invalid window") );
 
+    // FIXME: this should be made to work: we need to detect that the window
+    //        is not visible and in that case, a) ignore any drawing actions
+    //        and b) provide dummy surface that can still be used to get
+    //        information (e.g. text extents):
+    for ( wxWindow *w = win; w; w = w->GetParent() )
+    {
+        // painting on hidden TLW when non-TLW windows are shown is OK,
+        // DirectFB manages that:
+        if ( w->IsTopLevel() )
+            break;
+
+        wxASSERT_MSG( w->IsShown(),
+                      _T("painting on hidden window not implemented yet") );
+    }
+
+    // check if the rectangle covers full window and so is not needed:
+    if ( rect && *rect == wxRect(win->GetSize()) )
+        rect = NULL;
+
+    // obtain the surface used for painting:
+    wxIDirectFBSurfacePtr surface;
+    if ( !rect )
+    {
+        wxCHECK_RET( win->GetSize().x > 0 && win->GetSize().y > 0,
+                     _T("window has invalid size") );
+
+        surface = win->GetDfbSurface();
+    }
+    else
+    {
+        wxCHECK_RET( !rect || !rect->IsEmpty(), _T("invalid rectangle") );
+
+        DFBRectangle dfbrect = { rect->x, rect->y, rect->width, rect->height };
+        surface = win->GetDfbSurface()->GetSubSurface(&dfbrect);
+    }
+
+    if ( !surface )
+        return;
+
+    Init(surface);
     SetFont(win->GetFont());
+
+    // offset coordinates to account for subsurface's origin coordinates:
+    if ( rect )
+        SetDeviceOrigin(rect->x, rect->y);
 }
 
 //-----------------------------------------------------------------------------
@@ -63,18 +106,7 @@ wxClientDCBase::wxClientDCBase(wxWindow *win)
     wxCHECK_RET( win, _T("invalid window") );
 
     wxRect rect = win->GetClientRect();
-    DFBRectangle dfbrect = { rect.x, rect.y, rect.width, rect.height };
-
-    IDirectFBSurfacePtr winsurf(win->GetDfbSurface());
-    IDirectFBSurfacePtr subsurf;
-    if ( !DFB_CALL( winsurf->GetSubSurface(winsurf, &dfbrect, &subsurf) ) )
-        return;
-
-    Init(subsurf);
-    InitForWin(win);
-
-    // offset coordinates to account for subsurface's origin coordinates:
-    SetDeviceOrigin(rect.x, rect.y);
+    InitForWin(win, &rect);
 }
 
 //-----------------------------------------------------------------------------
@@ -86,9 +118,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC)
 wxClientDC::~wxClientDC()
 {
     // flip to surface so that the changes become visible
-    IDirectFBSurfacePtr surface(GetDirectFBSurface());
+    wxIDirectFBSurfacePtr surface(GetDirectFBSurface());
+
+    // FIXME: do this only if the surface was modified (as opposed to e.g.
+    //        used only to obtain text metrics)
     if ( surface )
-        surface->Flip(surface, NULL, DSFLIP_NONE);
+        surface->Flip(NULL, DSFLIP_NONE);
 }
 
 //-----------------------------------------------------------------------------